2013-03-01 2 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이 가상이면 세터를 무시할 수 있습니다.

하지만 상속 된 속성에 액세스 할 수 있습니다. 이처럼 :

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 파일을 읽을 때 FormStyleTForm 속성을 나타냅니다. TMyForm에 대한 참조가있는 경우 런타임에 속성을 설정할 수 있습니다.

위의 코드는 컴파일되지만 사용자의 문제를 해결할 것이라고는 기대하지 않습니다. 파생 된 클래스에서 상속 된 속성에 액세스하는 방법에 대한 직접적인 질문에 답했습니다. 그러나 실제 문제를 해결했다고는 생각하지 않습니다.

나의 본능은 당신의 제안 된 디자인과 위의 코드가 나쁜 생각이라는 것입니다. 양식 스타일을 수정하면 윈도우가 다시 생성되므로 실제로 필요한 것은 CreateParams 또는 CreateWnd을 무시하는 것입니다.

+0

예, 런타임에 스타일을 변경하는 것은 분명히 나쁜 생각이지만, 현재 내가 애매한 앱을 개발 한 사람들은 더 잘 알지 못해 이제는 해결해야합니다. 아마도 DoSomething의 이름을 PrepareBellauseAllHellAreGonnaBreakLoose로 변경해야합니다. –

관련 문제