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;

我用的是delphi 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.

所以,虽然上面的代码会编译,但我不希望它会解决你的问题。我已经回答了如何从派生类访问继承属性的直接问题,但我认为我没有解决您的实际问题。

我的直觉是您提出的设计和上面的代码是一个坏主意。由于修改表单样式会导致重新创建窗口,也许您真正需要的是覆盖CreateParamsCreateWnd.

于 2013-03-01T12:20:41.163 回答