Delphi 구성 요소 개발 자습서 (4) 구성 요소 생성 과정 (TWinControl에서 계승된 구성 요소)

16070 단어 Delphi
제2장에서 저는 procedure Create Params(var Params: Tcreate Params)를 사용했던 것을 기억합니다.이 함수로 합시다!왜 나는 이 함수를 사용하여 그 정렬을 실현할 것인가!지금 바로 내막을 파헤쳐 보자!이 과정은 사실 창을 구축할 때 호출된다. 물론 내가 말한 것은 TWin control에서 계승된 구성 요소를 대상으로 한 것이고 TGraphi control 등에서 계승된 것은 이것이 없다.이 함수의 생성도 윈도 구성 요소 라이브러리 특유의 것이다. 만약에 관리로서 윈도 프로그래밍의 기초가 있다면 이것은 쉽게 이해할 수 있다. 윈도 프로그래밍을 할 때 이 창 클래스를 등록하기 전에 우리는 하나의 창 클래스에 일련의 참수를 지정할 것이다. 이CreateParams 함수는 이 등록 과정이 발생하기 전에 생성 과정에 파라미터를 지정하는 데 목적을 둔다.
CreateParams의 출처를 설명하기 전에 구성 요소가 생성되어 사용자 앞에 나타나는 과정을 간략하게 설명해야 합니다.이것은 항상 엉키는 문제로 내가 어떻게 말해야 할지 모르겠다.구성 요소는 모두Form에 의존하는 것이기 때문에 구성 요소를 표시하려면 가장 중요한 것은 구성 요소가 의존하는 용기를 표시하는 것이다. 그러면 가장 중요한 것은Form의 창설을 보고 표시하는 과정을 봐야 한다.창의 창설 과정에 대해 참고할 수 있습니다누런 블로그. 여기서 제가 그에게 세분화를 해 드리면 우리의 업무 전개에 편리합니다!이 세분화는 그가 설명한 다섯 번째 단계, 즉 그가 말한 것이다
    TWinControl Handle TWinControl . GetHandle;
Property Handle; 。

 
5 、 Handle , :(TWinControl)
     Handle->GetHandle->HandleNeeded

 
이Handle Needed는 언제 처음 호출되었는지, 사실 그는 GetHandle 때 처음 호출한 것이 아니라 창에 표시되기 전, 즉 Visible가 변화하는 과정에서 처음 호출한 것이다. 이Visible의 변화는 Delphi가Form 자원 파일의 속성을 읽은 후에 터치한다(이 속성 읽기 과정은 참고할 수 있다Delphi의 지속적인 메커니즘 탐색.Visible이라는 속성 변화가 촉발하는 과정을 살펴보자. 이 속성은 Tcontrol에 정의되어 있고 속성 변화에 대응하는 과정은

  
    
procedure TControl.SetVisible(Value: Boolean);
begin
if FVisible <> Value then
begin
VisibleChanging;
FVisible :
= Value;
Perform(CM_VISIBLECHANGED, Ord(Value),
0 );
RequestAlign;
end ;
end ;

이로써 속성이 변할 때 CM 을 보낸 것을 볼 수 있다VISIBLECHANGE의 소식이 나간 후에 우리는 이 소식의 촉발 과정에 다시 간다

  
    
procedure TWinControl.CMVisibleChanged( var Message: TMessage);
begin
if not FVisible and (Parent <> nil ) then RemoveFocus(False);
if not (csDesigning in ComponentState) or
(csNoDesignVisible
in ControlStyle) then UpdateControlState;
end ;

이 과정은 Tcontrol에도 있지만 TWinControl에서 다시 쓰여졌기 때문에 TWinControl만 보여 줍니다.Visible가 변할 때 Update ControlState 함수를 호출하여 컨트롤 상태를 업데이트합니다. 그리고 이 업데이트 과정에서 다른 업데이트 컨트롤러가 표시하는 함수 Update Showing만 호출합니다. Update Showing 이 과정을 살펴보겠습니다.

  
    
procedure TWinControl.UpdateShowing;
var
ShowControl: Boolean;
I: Integer;
begin
ShowControl :
= (FVisible and ( not (csDesigning in ComponentState) or not (csDesignerHide in ControlState)) or
((csDesigning
in ComponentState) and not (csDesignerHide in ControlState)) and
not (csNoDesignVisible in ControlStyle)) and
not (csReadingState in ControlState) and not (csDestroying in ComponentState);
if ShowControl then
begin // ,FHandle 0, CreateHandle ,
// Windows !
if FHandle = 0 then CreateHandle;
if FWinControls <> nil then
for I : = 0 to FWinControls.Count - 1 do
TWinControl(FWinControls[I]).UpdateShowing;//
end ;
if FHandle <> 0 then
if FShowing <> ShowControl then
begin
FShowing :
= ShowControl;
try
SetPerformingShowingChanged(Self);
try
Perform(CM_SHOWINGCHANGED,
0 , 0 );
finally
ClearPerformingShowingChanged(Self);
end ;
except
FShowing :
= not ShowControl;
raise ;
end ;
end ;
end ;

CreateHandle 과정에서 CreateWnd를 호출했습니다. 그리고 CreateWnd는 위에서 설명한 CreateParams를 호출해서 표준 컨트롤에 파라미터를 전달합니다.위에서 컨트롤의 최종 용기 포름의 생성부터 디스플레이 과정까지 말했듯이 일반 컨트롤의 생성 디스플레이 과정도 사실 포름의 생성 디스플레이 과정과 같다!다만 TForm의 디스플레이는 속성을 읽은 후에 터치하고 일반적인 컨트롤러는 그가 있는 용기에서 터치한다. 즉, 위의 Update Showing 과정 중의 실현 과정이다. 뒤에 하위 컨트롤러를 두루 훑어보고 그들의 디스플레이를 업데이트한다. 처음 보일 때Create Handle 과정을 터치하기 때문에 Windows 모듈의 실제 생성 과정은 실제적으로 모듈의 첫 번째 디스플레이 과정에서 만들어져야 한다.우리가 Create를 호출할 때가 아니라 Delphi에서 Create를 호출할 때 이 구성 요소에 초기화 정보와 각종 매개 변수를 제공할 뿐입니다.여기까지 말하자면 제2장에서의CreateParams의 실현 방법도 상당히 자연스럽다. 왜냐하면CreateParams에서Edit에 다른 확장 양식을 지정할 때 실제로 Windows의 실제 Edit 컨트롤은 실제로 만들어지지 않았기 때문이다.그러면 새로운 스타일을 지정하고 그가 만들 때 우리가 지정한 확장 스타일을 갖추게 된다.그리고 새로운 스타일을 설정할 때 RecreateWnd 방법을 사용했습니다. 이 방법의 목적은 문장을 재구성하는 것입니다. 즉, Windows 구성 요소를 재구성하는 것입니다. 이 함수의 실현 과정은 상당히 간단합니다. 단지 하나의 구성 요소 재구성 메시지를 보내는 것입니다. CMRECREATEWND, 그리고 이 메시지 과정의 실현 방법을 살펴봅시다.

  
    
procedure TWinControl.CMRecreateWnd( var Message: TMessage);
var
WasFocused: Boolean;
begin
WasFocused :
= Focused;//
UpdateRecreatingFlag(True);// , , , ,
//
try
DestroyHandle;// ,
UpdateControlState;// , , , 。
finally
UpdateRecreatingFlag(False);//
end ;
if WasFocused and (FHandle <> 0 ) then
Windows.SetFocus(FHandle);// , ,
end ;

이를 통해 알 수 있듯이 이 재건 과정은 만약에 당신이 용기 컨트롤러이고 내부에 많은 하위 컨트롤러가 있다면 이 방식으로 어떤 효과를 실현하고 효율이 항상 낮기 때문에 용기류는 재건 방법을 빈번하게 사용하는 것을 권장하지 않습니다!
지금까지 구성 요소의 생성 과정에 대한 설명이 끝났습니다. 전문가의 지적을 환영합니다!
 
구성 요소 자습서 카탈로그

좋은 웹페이지 즐겨찾기