起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1382|回复: 15

【搞定】[请求]如何控制用lDataSheetArea.EditorRepeatMode 方法输出的单元格的访问

[复制链接]
发表于 2006-12-28 10:42:11 | 显示全部楼层 |阅读模式
我使用lDataSheetArea.EditorRepeatMode 方法将自定义数据集中的数据输出出来(如下面代码所示),我需要在程序中对输出的数据进行访问权限控制,有的单元格中的数据要求可写,有的只能是只读。我该如何控制?
         //输出自定义数据集中的数据
    datasheet.Areas.Clear;
         lDataSheetArea := datasheet.Areas.Add(TAreaType.atDBArea) as TDataSheetArea;
         lDataSheetArea.DataSetDefID := userDataSet.ID;
         lDataSheetArea.DataSetID := userDataSet.ID;
         lDataSheetArea.BoundsRect := Classes.Bounds(intTableToLeft+1, intTableToTop+arrColIdList.count+1, colCount+ArrRowIdList.Count, 1);//(intTableToLeft+ArrRowIdList.Count, intTableToTop+arrColIdList.count, intTableToLeft+ArrRowIdList.Count+colCount, intTableToTop+arrColIdList.count+rowCount);
         lDataSheetArea.TitleRows := 0;
         lDataSheetArea.EditorRepeatCount := rowCount;
         lDataSheetArea.EditorRepeatMode := TEditorRepeatMode.ermLimit;
回复

使用道具 举报

 楼主| 发表于 2006-12-28 11:00:22 | 显示全部楼层
我曾经测试了一下如何定位到lDataSheetArea.EditorRepeatMode 方法输出的单元格,测试代码如下,但却得到如图所示的效果:连续的三行单元格会跨过数据的输出区域!可见这个方法不能定位输出的单元格。
   TDataSheet(TSheetDoc(DocView1.Doc).Sheet).Cells[6,9].Value:= 'mmm1';
   TDataSheet(TSheetDoc(DocView1.Doc).Sheet).Cells[6,10].Value:= 'mmm2';//该单元格数据没能在datasheet中输出
   TDataSheet(TSheetDoc(DocView1.Doc).Sheet).Cells[6,11].Value:= 'mmm3';


玩了,图又贴不上了!!
回复 支持 反对

使用道具 举报

发表于 2006-12-28 11:30:18 | 显示全部楼层
楼主,对单元格的只读控制,在设计文档时定义:
这是对单元格的属性定义,不是对数据区域的定义
lFieldCell.Styles := lFieldCell.Styles + [TCellStyle.csReadOnly];

另外,建议对数据的权限控制,采用数据策略来实现(如:字段的只读定义),不要在数据的表现上进行处理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 13:29:46 | 显示全部楼层
我的情况有些特殊,需要将读写权限控制到单元格而不是字段,同一个字段中,满足不同条件的记录,对于该字段有不同读写权限,所以控制数据集对我的需求来讲粒度粗了些。不知有没有控制到单元格的方法,只要你能提供一种能够取得该单元格的位置我就能实现这个功能。有没有函数可以取得特定单元格的位置即行列号?
回复 支持 反对

使用道具 举报

发表于 2006-12-28 13:57:13 | 显示全部楼层
1、表格文档比较特殊,只有设计时能够定位,一旦打开后,就不能定位了。

2、你的需求可以通过对数据集的ReadOnlyFields属性操作来实现
NameSpace: Business.Model    ClassDelcare: Business.Model.TBizDataSet
--------------------------------------------------------------------------------
property ReadOnlyFields: Business.System.TStrings;

或者直接设置相关字段的ReadOnly
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 15:16:14 | 显示全部楼层
同样ReadOnlyFields这个方法也只能控制某个字段是只读的,而不能控制满足条件的的某几条记录的该字段对应的值是只读的呀
回复 支持 反对

使用道具 举报

发表于 2006-12-28 17:56:36 | 显示全部楼层
楼主,你可以在记录集的滚动事件里写代码控制阿,在同一时间只能编辑一条记录,所以每滚动一次记录,重新设置一次只读属性,是完全可以满足的你的需求的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-28 18:03:29 | 显示全部楼层
谢谢!不过能给段示例代码么?记录集的滚动事件是什么名字?
回复 支持 反对

使用道具 举报

发表于 2006-12-29 09:17:58 | 显示全部楼层
楼主,数据集的滚动事件是AfterScroll
下面的例子是:
记录滚动后判断,当前记录是否审核同意,如果同意就所有字段只读,不允许修改,否则所有字段取消只读,允许修改。

procedure TSJJCLDemoXX.DataSetCLDemoSJJAfterScroll(DataSet: TDataSet);
var
  lFieldCount, i : integer;
begin
  lFieldCount := DataSet.FieldCount;
  if DataSet.FieldByName('审核意见').AsString = '同意' then
    for i := 0 to lFieldCount -1 do
        DataSet.Fields.ReadOnly := True
  else
    for i := 0 to lFieldCount -1 do
        DataSet.Fields.ReadOnly := False;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-29 09:52:54 | 显示全部楼层
在测试,谢谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-3 15:35 , Processed in 0.039380 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表