如何访问具有相同名称的父属性

时间:2013-03-01 12:17:30

标签: delphi inheritance properties setter

我需要在表单的FormStyle属性更改之前进行一些处理,但TForm.SetFormStyle(属性setter)是私有的,是否有某种方法可以覆盖属性但仍然可以访问父类属性?

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

1 个答案:

答案 0 :(得分:6)

这会创建一个新属性,而不是覆盖现有属性。事实上,不可能覆盖属性。如果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;

这样做的问题是您的属性不会取代.dfm文件中的TForm属性。读取.dfm文件时,FormStyle引用TForm属性。如果您引用TMyForm,则可以在运行时设置属性。

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

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