0

現在、RTTI が提供するものを使用して、他のコンポーネントの状態に応じて hug コンポーネントのプロパティを変更しようとしていますが、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

そうは言っても、これはあなたが求めていることを行います。アクセサー クラスを使用しprotected DataLinksて a のリストにアクセスし、それが であるかどうか、およびプロパティがあるかTDataSourceどうかを確認します。TFieldLinkReadOnly

// 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 に答える