2013-03-01 5 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; 

Я использую Delphi 2010

ответ

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; 

Проблема в том, что ваша собственность не будет вытеснять TForm свойства в .dfm файлов. Когда считываются файлы .dfm, FormStyle ссылается на свойство TForm. Вы можете установить свое свойство во время выполнения, если у вас есть ссылка на TMyForm.

Итак, пока код выше будет компилироваться, я не ожидаю, что он решит вашу проблему. Я ответил на прямой вопрос о том, как получить доступ к унаследованному свойству из производного класса, но я не думаю, что решил свою актуальную проблему.

Мои инстинкты в том, что предлагаемый вами дизайн и код выше - плохая идея. Поскольку изменение стиля формы приведет к повторному созданию окна, возможно, вам действительно нужно переопределить CreateParams или CreateWnd.

+0

Да, изменение стиля во время выполнения - определенно плохая идея, но люди, которые разработали приложение, которое я выполняю, не знали лучше, поэтому теперь мне приходится иметь дело с ним. Возможно, я должен переименовать DoSomething в PrepareBecauseAllHellAreGonnaBreakLoose. –

Смежные вопросы