0

フォームの FormStyle プロパティを変更する前に何らかの処理を行う必要がありますが、TForm.SetFormStyle (プロパティ セッター) はプライベートです。プロパティをオーバーライドする方法はありますが、親クラスのプロパティにアクセスすることはできますか?

TMyForm = class(TForm)
private
  procedure MySetFormStyle(Style: TFormStyle);
public
  property FormStyle: TFormStyle read Parent.FormStyle write MySetFormStyle;
end;

TMyForm.MySetFormStyle(Style: TFormStyle);
begin
  if Parent.FormStyle <> Style then
    DoSomething;

  Parent.FormStyle := Style; 
end;

私はデルファイ2010を使用しています

4

1 に答える 1

7

これにより、既存のプロパティをオーバーライドするのではなく、新しいプロパティが作成されます。実際、プロパティをオーバーライドすることはできません。仮想の場合SetFormStyleは、セッターをオーバーライドできます。

ただし、継承されたプロパティにアクセスできます。このような:

type
  TMyForm = class(TForm)
  private
    function GetFormStyle: TFormStyle;
    procedure SetFormStyle(Value: TFormStyle);
  public
    property FormStyle: TFormStyle read GetFormStyle write SetFormStyle;
  end;

function TMyForm.GetFormStyle: TFormStyle;
begin
  Result := inherited FormStyle;
end;

procedure TMyForm.SetFormStyle(Value: TFormStyle);
begin
  if Value <> FormStyle then
  begin
    DoSomething;
    inherited FormStyle := Value; 
  end;
end;

TFormこれに関する問題は、プロパティが .dfm ファイル内のプロパティを置き換えないことです。.dfm ファイルを読み込む場合FormStyle、プロパティを参照しTFormます。への参照がある場合は、実行時にプロパティを設定できますTMyForm

したがって、上記のコードはコンパイルされますが、問題が解決するとは思いません。派生クラスから継承されたプロパティにアクセスする方法の直接の質問に答えましたが、実際の問題を解決したとは思いません。

私の直感では、提案された設計と上記のコードは悪い考えです。フォーム スタイルを変更するとウィンドウが再作成されるため、おそらく本当に必要なのは、CreateParamsまたはCreateWnd.

于 2013-03-01T12:20:41.163 に答える