2009-08-24 6 views
1

TDateTimePicker의 글꼴을 기울임 꼴로 설정할 수 있습니까?TDateTimePicker.Font.Style을 Delphi 5에서 기울임 꼴로 설정하는 중 오류가 발생했습니다.

„Control” has no parent window. 

이 델파이 5 기능, 아니면 내가 뭔가 잘못하고있는 중이 야 :이 코드

var 
    DatEdit : TDateTimePicker; 
begin 
    //I know Canvas is a stupid name for TPanel 
    DatEdit:=TDateTimePicker.Create(Canvas); 

    DatEdit.OnEnter := CtrlInputProc; 
    DatEdit.OnExit := CtrlExitProc; 
    DatEdit.Enabled := false; 
    DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic]; //this line creates an exception 
    DatEdit.Parent := Canvas; 

end; 

그리고 때마다 코드에서 그 일을하고하는 것은 EInvalidOperation 예외가 메시지와 함께 발생합니다, 마지막 줄을 실행 ?

답변

7

예, 뭔가 잘못하고 있습니다. :)

윈도우 기반 컨트롤의 일부 측면에서는 컨트롤을 컨테이너 윈도우에 배치해야합니다. 이것은 대개 기본 Window 클래스 자체 (VCL 클래스가 아니라 컨트롤을 나타내는 MS Windows 윈도우 객체)의 일부 요구 사항을 반영합니다.

DatEdit.OnEnter := CtrlInputProc; 
    DatEdit.OnExit := CtrlExitProc; 
    DatEdit.Enabled := false; 
    DatEdit.Parent := Canvas; 
    DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic]; 

글꼴이 성공적으로 설정 될 수 있는지 모르겠어요 :이 발생하기 때문에 당신이 Font.Style을 변경하기 전에이 경우

, 단순히 부모 속성의 과제를 이동 이런 방식으로 이탤릭체로 표시되지만, 적어도 예외를 해결해야합니다.

업데이트 : 처음으로 컨트롤 부모를 설정하는 한 글꼴이 기울임 꼴로 만들 수 있음을 확인했습니다. (델파이 2009를 사용했지만, 델파이 5에서 작동하지 않는다면 놀라실 것입니다.)

참고 : 나는 을 강력하게에 "Canvas"패널 컨트롤의 다른 이름을 추천합니다.

부록 : -------는

그것은 차례로해야 창 핸들을 (필요 CMFontChanged() 메시지 핸들러 InvalidateRect() 호출 인 컨트롤은 부모가된다). 당신이 절대적으로 글꼴을 수정부모를 설정 할 수 있도록해야하는 경우

, 당신은 TDateTimePicker에서 자신의 제어 클래스를 파생하고 CMFontChanged() 메시지에 대한 응답을 구현할 수있는 컨트롤이 부모가되지 않는 한 상속 행동 억제 :

type 
    TMyDateTimePicker = class(TDateTimePicker) 
    protected 
    procedure CMFontchanged(var Message: TMessage); message CM_FONTCHANGED; 
    end; 


    procedure TMyDateTimePicker.CMFontchanged(var Message: TMessage); 

    procedure AdjustHeight; 
    var 
     DC: HDC; 
     SaveFont: HFont; 
     SysMetrics, Metrics: TTextMetric; 
    begin 
     DC := GetDC(0); 
     try 
     GetTextMetrics(DC, SysMetrics); 
     SaveFont := SelectObject(DC, Font.Handle); 
     GetTextMetrics(DC, Metrics); 
     SelectObject(DC, SaveFont); 
     finally 
     ReleaseDC(0, DC); 
     end; 
     Height := Metrics.tmHeight + (GetSystemMetrics(SM_CYBORDER) * 8); 
    end; 

    begin 
    if HasParent then 
     inherited 
    else 
     AdjustHeight; 
    end; 

참고 그 AdjustHeight() PROC 편집증은 개인 방법 TDateTimePicker에서 재생됩니다. Font.Style 만 변경하는 경우이 코드를 재생할 필요가 없으며 코드를 제거 할 수 있습니다. 그러나 글꼴의 다른 속성을 변경하면 컨트롤의 크기가 올바른지 확인해야합니다 .

당신이 전화

는이 경우에 해당 절차의 로컬 복사본을 호출 할 필요가 없기 때문에 개인 AdjustHeight() 메커니즘을 호출을 물려 받았다.

+0

부모에게이 구성 요소를 넣는 것은 나중에 purpouse에 의해 수행됩니다. 나는 종종 컨트롤 (TFrame의 자손)을 만들고 나중에 부모에 배치합니다. 저에게 이상한 것은 무엇입니까? 동일한 애플리케이션에서 TEdit 또는 TComboBox와 거의 동일한 코드를 사용하고 작동합니다. 그렇다면 TDateTimePicker가 Font.Style을 변형 할 때 Parent를 설정해야하는 이유는 무엇입니까? – smok1

+0

BTW : "Canvas"라는 이름이 대체 될 가능성이 큽니다. – smok1

+0

소스를 간략히 살펴보면 (예 : TEdit와 TDateTimePicker의 주요 차이점은 Comctrls에서 TDateTimePicker (TDateTimePicker.CMFontChanged()) 글꼴을 수정하면 컨트롤 자체가 무효화되므로 결과적으로 창 핸들. 해당 창 핸들을 얻으려면 기본 창 개체를 만들어야하며 컨테이너 창을 알고 있어야합니다. 창 핸들이 있는지 테스트하고 창 핸들이있는 경우에만 무효화하면이 문제를 피할 수 있습니다. 그러나이 세분화는 현재 구현의 일부가 아닙니다. – Deltics