【问题标题】:Get all components linked to a datasource获取链接到数据源的所有组件
【发布时间】:2013-06-27 02:54:44
【问题描述】:

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

这就是我想要达到的目标

  1. 获取链接到特定数据源的所有组件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

提前感谢您的帮助

【问题讨论】:

  • 链接中显示的解决方案有什么问题?
  • @Uwe Raabe 你能否提供一些解释,至少对我来说,解决方案不够清楚..
  • 您到底有什么不清楚的地方?询问您不了解哪些特定行的具体问题。否则你的问题意味着“给我读一本教科书”,这不是好问题。 catb.org/~esr/faqs/smart-questions.html

标签: delphi dataset datasource delphi-2010


【解决方案1】:

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

话虽如此,这将满足您的要求。它使用访问器类访问TDataSource 中的protected DataLinks 列表,然后检查它是否为TFieldLink 以及是否具有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;

【讨论】:

  • Ken White 谢谢,事实上我不知道TDataSource.AutoEdit 你的代码给了我很多我需要的关于Delphi 版本的东西,它是D2010 我之前忘了提...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多