我目前正在尝试使用RTTI提供的其他组件的状态来更改拥抱组件的属性,但我无法弄清楚如何检索之间的所有链接 DataSource和DataAware组件......
这就是我想要实现的目标
如果组件接受ReadOnly属性(通过使用RTTI我猜)我想根据DataSet状态更改属性:
if DataSource.DataSet.state = dsbrowse then Component[i].ReadOnly := True
if DataSource.DataSet.state = dsEdit then Component[i].ReadOnly := False
提前感谢您的帮助
答案 0 :(得分:3)
我不确定您要解决的问题是什么,因为将TDataSource.AutoEdit
属性设置为False
会自动禁用控件中的编辑,直到您手动将DataSet.State
更改为dsEditModes
中的其中一个。
话虽如此,这将做你所要求的。它使用访问者类访问protected
中的DataLinks
TDataSource
列表,然后检查它是TFieldLink
还是ReadOnly
} property。
// No Delphi version provided, so uses "older style" RTTI
uses
TypInfo, DB, DBCtrls;
type
THackDataSource=class(TDataSource); // accessor class
procedure SetDataSetControlsReadOnly(const DataSource: TDataSource);
var
i: Integer;
DS: THackDataSource;
DL: TDataLink;
EnableIt: Boolean;
begin
EnableIt := DataSource.State in dsEditModes;
DS := THackDataSource(DataSource.DataSet);
for i := 0 to DS.DataLinks.Count - 1 do
begin
DL := DS.DataLinks[i];
if DL is TFieldDataLink then
begin
if IsPublishedProp(DL, 'ReadOnly') then
SetOrdProp(DL, 'ReadOnly', Ord(EnableIt));
end;
end;
end;