2017-05-09 5 views
3

TFrame 하위 클래스가 CM_ENABLEDCHANGED) 사용할 수 없습니다.재정은 다음과

첫 번째 아이디어는 가상 메서드 TControl.SetEnabled을 재정의하는 것이 었습니다. 그 구현을 살펴보면 실제로 값이 다를 때 제어 메시지 CM_ENABLEDCHANGED을 수행하는 것을 보았습니다.

올바른 방법으로 프레임의 Enabled 상태를 툴바에 적용하는 방법에 대해서는 잘 모르겠습니다.
일반적인 방법은 무엇입니까? 이 질문에 기본적으로 의견을 기반으로 하듯이, 내가 그것을 바꿔 보자 최우선 SetEnabled 또는 CM_ENABLEDCHANGED 처리 중 어떤 장점과 단점

이 있습니까?


것, 나는 나 자신의 생각 :

  • 재정 SetEnabled : 나는 새 값이 이전 값에서 차이가 있는지, 다시 확인해야 할 것입니다
    • . 그것은 중복 될 것입니다. (- 나에게 머리 스플리터를 호출 - 어느 성능에 큰 영향을,하지만 것 나에게 냄새가 난다.)
  • CM_ENABLEDCHANGED 처리 :이 메시지에 대한 코드를 상속 서스테인 어떻게
    • 를? 이 메시지에 대한 구현은 적어도 TControlTWinControl입니다. 내가 수업 시간에 메시지를 처리한다면 여전히 처형 당할 것인가? TCustomHistoryFrame? CM_ENABLEDCHANGED 처리
+2

는 프레임이 창 핸들이 있습니까? 아니면 그냥 부모에게 컨트롤을 주입합니까? 어떤 경우에는 패널 전체를 많이 감싸고 비활성화 할 수 있습니다. –

+1

@DavidHeffernan 나는 당신을 올바르게 이해하는지 잘 모르겠습니다. 모든'TWinControl' 자손 (예 :'TFrame')은 TWinControl.CreateWindowHandle에 의해 윈도우 핸들을 얻습니다. 반면에 프레임은 물론 시각적 구성 요소 래퍼의 일종입니다. 모든 것을 (특히'tbMainFunction'을)'TPanel'에 넣으면, 그걸 사용 불가능하게하는 것과 똑같은 문제는 없을까요? –

+0

'TFrame'이 윈도우 화되었는지 아닌지 확실하지 않았습니다. –

답변

5

올바른 솔루션입니다. 이러한 CM_... 메시지는 하위 클래스가 기본 클래스에서 선언 된 속성의 변경 내용에 응답 할 수 있도록 특별히 설계되었습니다. 예를 들어

:

TCustomHistoryFrame = class(TFrame) 
    tbMainFunction: TToolBar; 
private 
    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; 
end; 

procedure TCustomHistoryFrame.CMEnabledChanged(var Message: TMessage); 
begin 
    inherited; 
    tbMainFunction.Enabled := Enabled; 
end; 

또는 :

TCustomHistoryFrame = class(TFrame) 
    tbMainFunction: TToolBar; 
protected 
    procedure WndProc(var Message: TMessage); override; 
end; 

procedure TCustomHistoryFrame.WndProc(var Message: TMessage); 
begin 
    inherited; 
    if Message.Msg = CM_ENABLEDCHANGED then 
    tbMainFunction.Enabled := Enabled; 
end; 
+0

첫 번째 예제에서는 상속 된 'CMEnabledChanged'가 실행됩니다. 기본 클래스에서는 private 임에도 불구하고? 나는 그것을 내일 시도 할 것이다. +1 특히 VMT 오염에 대한 암시.우리는 가능한 한 오염을 피해야합니다. –

+1

첫 번째 예에서는 가시성에 관계없이 기본 처리기가 실행됩니다 (예). –

+1

왜 DMT를 오염시키는 것이 VMT를 오염시키는 것보다 낫습니까? –