0

複数の TcxGrids がオンになっているプロジェクトがあります。私のプロジェクトのグリッドのクラス階層構造は次のとおりです。

TForm->TPanel->TcxPageControl->TcxTabSheet(サブクラス化)->TcxGrid->TcxGridLevel->TcxGridDBBandedTableView

私のサブクラス化された TcxTabSheet では、新しいプロパティ "ReadOnly" を追加しました。これは、設定時にタブシート コントロールをループし、それらをそれぞれ有効/無効に設定します。

TcxGrid コントロールの有効なプロパティが true に設定されている場合、ユーザーはグリッドをまったく操作できなくなります (ナビゲートを含む)。

読み取り専用でありながらナビゲート可能なグリッド コントロールを実現するには、TcxGridDBBandedTableView で OptionsData.Editing プロパティを設定する必要があるようです。

RTTIのオプションが残っていると思う疎結合の方法でこれを行いたいことを考慮に入れるまでは、十分に単純です。

フォーム コントロールをループする次のコードを作成しました (タブ コントロールまたはコンポーネントをループしても、TcxGridDBBandedTableView にアクセスできません)。コントロールが見つかったら、RTTI を介してその編集プロパティを設定できます。その TcxGridDBBandedTableView が、それが置かれている TabSheet に属しているかどうかを判断できないようです。

var
  compIdx: Integer;
begin
  for compIdx := 0 to Pred(ComponentCount) do
    if (Components[compIdx].ClassNameIs('TcxGridDBBandedTableView')) then
      SetOrdProp(GetObjectProp(Components[compIdx], 'OptionsData'), 'Editing', Ord(not FReadOnly));
end;

TL;DR cxgrid がどの pagectrl タブにあるかを特定し、ユニットの uses 句に devexpress ユニットを追加せずにその TableView.OptionsData.Editable プロパティを設定するにはどうすればよいですか。

4

1 に答える 1

0

フォームが所有するコンポーネントを繰り返し処理しています。それは間違ったアプローチだと思います。所有権ではなく、親子関係を確認する必要があります。特に、フォームに所有していないコントロールを含めることが完全に可能であるためです。したがって、あなたのアプローチは、コントロール、特に動的に作成されたコントロールを見つけることができない可能性があります。

したがって、タブシート(または実際にウィンドウコントロール)がある場合は、次のようにその子を反復処理できます。

for i := 0 to TabSheet.ControlCount-1 do
  DoSomething(TabSheet.Controls[i]);

ターゲットグリッドコントロールがタブシートの直系の子孫である場合は、これで十分です。階層の深さが1レベルを超える場合は、再帰的なソリューションが必要になります。その再帰的な解決策は、演習として残しておきます。

コントロールがあり、その中にあるタブシートを見つけたい場合は、親チェーンを上に移動する必要があります。このような:

function GetParentOfClass(Control: TControl; AClass: TWinControlClass): TWinControl;
var
  Control: TWinControl;
begin
  while Assigned(Control) and not (Control is AClass) do
    Control := Control.Parent;
  Result := TWinControl(Control);
end;
于 2013-02-08T15:45:42.190 に答える