Delphi 구성 요소 개발 자습서 (4) 구성 요소 생성 과정 (TWinControl에서 계승된 구성 요소)
16070 단어 Delphi
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
;
이를 통해 알 수 있듯이 이 재건 과정은 만약에 당신이 용기 컨트롤러이고 내부에 많은 하위 컨트롤러가 있다면 이 방식으로 어떤 효과를 실현하고 효율이 항상 낮기 때문에 용기류는 재건 방법을 빈번하게 사용하는 것을 권장하지 않습니다!
지금까지 구성 요소의 생성 과정에 대한 설명이 끝났습니다. 전문가의 지적을 환영합니다!
구성 요소 자습서 카탈로그
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.