0

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

这就是我想要实现的

  1. 获取链接到特定 DataSource 的所有组件,例如.
  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 回答 1

3

我不确定您要解决什么问题,因为将TDataSource.AutoEdit属性设置为应该会自动禁用控件中的False编辑,直到您手动将.DataSet.StatedsEditModes

话虽如此,这将满足您的要求。它使用访问器类来访问 a 中的protected DataLinks列表TDataSource,然后检查它是否是 aTFieldLink以及它是否具有ReadOnly属性。

// 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;
于 2013-06-29T17:38:43.840 回答