4

TListBox のように設計された TCustomDBGrid の子孫を作成しようとしています。私が変更したいことの 1 つは、Options プロパティのデフォルトです。TCustomDBGrid は Options を次のように定義します。

property Options: TDBGridOptions read FOptions write SetOptions
  default [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines,
  dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit];

私のクラスでそれをオーバーライドしようとしています

  property Options: TDBGridOptions default
     [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];

動作しません。コンパイラは、 defaultではなく、型の後にreadまたはwriteを想定しています。問題は、TCustomDBGrid で FOptions と SetOptions が両方とも非公開として定義されており、保護されていないことです。

「継承されたオプション」を呼び出す独自の get および set メソッドを作成する必要がありますか、またはこれを行う簡単な方法はありますか?

4

2 に答える 2

10

タイプを指定しないでください。その後、デフォルトを変更できます。また、コンストラクターで Options プロパティをこの既定値に設定する必要があることも覚えておいてください。以下のコードは実際にはデフォルトを設定しません。値がそのような場合にプロパティ値をストリーミングしないように通知するだけです。

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];
于 2008-12-03T20:53:33.827 に答える
2

それはdbgridで作成されたランタイムでは機能しません...これを参照してください(BDS 2006のDelphi言語ガイドから):


プロパティ値は、デフォルト値に自動的に初期化されません。つまり、デフォルト ディレクティブは、プロパティ値がフォーム ファイルに保存されるタイミングのみを制御し、新しく作成されたインスタンスのプロパティの初期値は制御しません。


設計時のフォーム上のコンポーネントについては、問題はないと思います。しかし、実行時に作成されたコントロールでは、コンストラクターでオーバーライドを行う方が良い (つまり、より安全である) と思います。

constructor Create(Aowner:TComponent);
begin  
  inherited;
  Options := [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];
end;

物事を正しく行うには、デフォルトのディレクティブも実行します。

property Options default  [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
                           dgCancelOnExit];
于 2008-12-03T21:44:57.860 に答える