获取链接到数据源的所有组件

时间:2013-06-29 11:49:35

标签: delphi dataset datasource delphi-2010

我目前正在尝试使用RTTI提供的其他组件的状态来更改拥抱组件的属性,但我无法弄清楚如何检索之间的所有链接 DataSource和DataAware组件......

这就是我想要实现的目标

  1. 获取与特定DataSource链接的所有组件like
  2. 遍历所有这些组件。
  3. 如果组件接受ReadOnly属性(通过使用RTTI我猜)我想根据DataSet状态更改属性:

    if DataSource.DataSet.state = dsbrowse then Component[i].ReadOnly := True
    if DataSource.DataSet.state = dsEdit then Component[i].ReadOnly := False

  4. 提前感谢您的帮助

1 个答案:

答案 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;