我需要在表单的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
答案 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
,则可以在运行时设置属性。
因此,虽然上面的代码将编译,但我不认为它会解决您的问题。我已经回答了如何从派生类访问继承属性的直接问题,但我认为我没有解决你的实际问题。
我的直觉是你提出的设计和上面的代码是一个坏主意。由于修改表单样式会导致窗口重新创建,因此您真正需要的是覆盖CreateParams
或CreateWnd
。