複数の 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 プロパティを設定するにはどうすればよいですか。