2013-03-01 208 views
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

回答

6

,创建一个新的属性,而不是重写现有属性。事实上,它不可能覆盖属性。如果SetFormStyle是虚拟的,那么你可以覆盖setter。

虽然您可以访问继承的属性。就像这样:

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

+0

是的,在运行时改变风格绝对是一个坏主意,但开发我应用程序的人不知道更好,所以现在我必须处理它。也许我应该重新命名DoSomething准备因为AllHellAreGonnaBreakLoose。 – 2013-03-01 13:12:50

相关问题