| 導購 | 订阅 | 在线投稿
分享
 
 
 

深入VCL源碼研究DELPHI窗體的創建和關閉

來源:互聯網網民  2006-09-15 06:28:00  評論

一、窗體的建立

在DELPHI中,我們通常使用Application.CreateForm(TForm2, Form2)和TForm.create來創建窗體,我們幾乎無法區別這兩種方法差異,更何況,我們更多的時候都是在使用TForm.create來生成子窗體。

不過,仔細觀察VCL源碼,你會發現,其實兩者區別很大。

深入VCL源碼研究DELPHI窗體的創建和關閉
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
深入VCL源碼研究DELPHI窗體的創建和關閉
var
深入VCL源碼研究DELPHI窗體的創建和關閉
Instance: TComponent;
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
Instance := TComponent(InstanceClass.NewInstance);
深入VCL源碼研究DELPHI窗體的創建和關閉
TComponent(Reference) := Instance;
深入VCL源碼研究DELPHI窗體的創建和關閉
try
深入VCL源碼研究DELPHI窗體的創建和關閉
Instance.Create(Self);
深入VCL源碼研究DELPHI窗體的創建和關閉
except
深入VCL源碼研究DELPHI窗體的創建和關閉
TComponent(Reference) := nil;
深入VCL源碼研究DELPHI窗體的創建和關閉
raise;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
if (FMainForm = nil) and (Instance is TForm) then
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
TForm(Instance).HandleNeeded;
深入VCL源碼研究DELPHI窗體的創建和關閉
FMainForm := TForm(Instance);
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉

深入VCL源碼研究DELPHI窗體的創建和關閉

深入VCL源碼研究DELPHI窗體的創建和關閉
constructor TCustomForm.Create(AOwner: TComponent);
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
GlobalNameSpace.BeginWrite;
深入VCL源碼研究DELPHI窗體的創建和關閉
try
深入VCL源碼研究DELPHI窗體的創建和關閉
CreateNew(AOwner);
深入VCL源碼研究DELPHI窗體的創建和關閉
if (ClassType <> TForm) and not (csDesigning in ComponentState) then
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
Include(FFormState, fsCreating);
深入VCL源碼研究DELPHI窗體的創建和關閉
try
深入VCL源碼研究DELPHI窗體的創建和關閉
if not InitInheritedComponent(Self, TForm) then
深入VCL源碼研究DELPHI窗體的創建和關閉
raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
深入VCL源碼研究DELPHI窗體的創建和關閉
finally
深入VCL源碼研究DELPHI窗體的創建和關閉
Exclude(FFormState, fsCreating);
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
if OldCreateOrder then DoCreate;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
finally
深入VCL源碼研究DELPHI窗體的創建和關閉
GlobalNameSpace.EndWrite;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉

深入VCL源碼研究DELPHI窗體的創建和關閉

Form1 := TForm1.Create(Application); 是先調用TForm1的Create方法, 然後賦值 給Form1變量。而Application.CreateForm(TForm1, Form1); 他會先得到一個Instance的指針, 把這個指針賦值給Form1, 然後是Form1.Create(Application). 這Tform1.create的區別在于, 在TForm1的OnCreate事件中, 我們可以使用Form1這個變量。

千萬不要小瞧這點區別。例如你的程序有多個窗體,各個子窗體都是在需要的時候通過Tform1.create動態生成的,你想在FormOnCreate事件中對窗體上的edit1賦值text屬性,那麽你不能直接使用Form1.edit1.text := 'wudi_1982',你可以使用self.edit1.text 或者直接使用edit1.text。此時,你可能會想,可以直接用edit1.text,我爲什麽要多寫form1.edit1.text呢?這裏除了了解兩者的區別,更重要的在于,如果你的程序中有一個函數,函數並非寫在窗體類中,此函數調用了form上的信息,而在初始化的時候,你又必須調用它,如果不明白此中道理,可能就這個問題,就要讓你調試好長時間,關于這方面的例子我就不寫了。在DELPHI的DEMO程序中,又一個關于ListView的,其中就有類似的情況,只不過那個DEMO程序只有一個窗體,用不到Tform.create,如果有興趣,你可以把那個例程添加到一個已存在的工程中,然後用兩種不同的方法生成,你就會發現問題了。

二、窗體的關閉

通常情況下,我們對于程序中子窗體的關閉,大多是使用close方法或者直接點擊窗體右上角的關閉按鈕。那麽對于VCL的窗體,它真的“關閉”了嗎?在默認情況下,答案是否定的。觀察VCL源碼,你會發現,那個關閉只能算做隱藏。至于怎麽測試,我想你知道。

要徹底關閉窗體並釋放資源,就要調用他的free方法(模式窗體的常用辦法),或者在onclose事件中,設置Action := caFree(無模式窗體的常用辦法),如果窗體還要通過並且將自身賦值爲nil。關于爲什麽手動做form1 := nil的操作,我這裏就不多說了,

深入VCL源碼研究DELPHI窗體的創建和關閉
TCloseAction = (caNone, caHide, caFree, caMinimize);
深入VCL源碼研究DELPHI窗體的創建和關閉

深入VCL源碼研究DELPHI窗體的創建和關閉
procedure TCustomForm.Close;
深入VCL源碼研究DELPHI窗體的創建和關閉
var
深入VCL源碼研究DELPHI窗體的創建和關閉
CloseAction: TCloseAction;
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
if fsModal in FFormState then
深入VCL源碼研究DELPHI窗體的創建和關閉
ModalResult := mrCancel
深入VCL源碼研究DELPHI窗體的創建和關閉
else
深入VCL源碼研究DELPHI窗體的創建和關閉
if CloseQuery then
深入VCL源碼研究DELPHI窗體的創建和關閉
begin
深入VCL源碼研究DELPHI窗體的創建和關閉
if FormStyle = fsMDIChild then
深入VCL源碼研究DELPHI窗體的創建和關閉
if biMinimize in BorderIcons then
深入VCL源碼研究DELPHI窗體的創建和關閉
CloseAction := caMinimize else
深入VCL源碼研究DELPHI窗體的創建和關閉
CloseAction := caNone
深入VCL源碼研究DELPHI窗體的創建和關閉
else
深入VCL源碼研究DELPHI窗體的創建和關閉
CloseAction := caHide;
深入VCL源碼研究DELPHI窗體的創建和關閉
DoClose(CloseAction);
深入VCL源碼研究DELPHI窗體的創建和關閉
if CloseAction <> caNone then
深入VCL源碼研究DELPHI窗體的創建和關閉
if Application.MainForm = Self then Application.Terminate
深入VCL源碼研究DELPHI窗體的創建和關閉
else if CloseAction = caHide then Hide
深入VCL源碼研究DELPHI窗體的創建和關閉
else if CloseAction = caMinimize then WindowState := wsMinimized
深入VCL源碼研究DELPHI窗體的創建和關閉
else Release;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉
end;
深入VCL源碼研究DELPHI窗體的創建和關閉

深入VCL源碼研究DELPHI窗體的創建和關閉

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
一、窗體的建立 在DELPHI中,我們通常使用Application.CreateForm(TForm2, Form2)和TForm.create來創建窗體,我們幾乎無法區別這兩種方法差異,更何況,我們更多的時候都是在使用TForm.create來生成子窗體。 不過,仔細觀察VCL源碼,你會發現,其實兩者區別很大。 [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Instance: TComponent; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Instance := TComponent(InstanceClass.NewInstance); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] TComponent(Reference) := Instance; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] try [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Instance.Create(Self); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] except [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] TComponent(Reference) := nil; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] raise; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if (FMainForm = nil) and (Instance is TForm) then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] TForm(Instance).HandleNeeded; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] FMainForm := TForm(Instance); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]constructor TCustomForm.Create(AOwner: TComponent); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] GlobalNameSpace.BeginWrite; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] try [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] CreateNew(AOwner); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if (ClassType <> TForm) and not (csDesigning in ComponentState) then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Include(FFormState, fsCreating); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] try [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if not InitInheritedComponent(Self, TForm) then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] raise EResNotFound.CreateFmt(SResNotFound, [ClassName]); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] finally [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Exclude(FFormState, fsCreating); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if OldCreateOrder then DoCreate; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] finally [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] GlobalNameSpace.EndWrite; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] Form1 := TForm1.Create(Application); 是先調用TForm1的Create方法, 然後賦值 給Form1變量。而Application.CreateForm(TForm1, Form1); 他會先得到一個Instance的指針, 把這個指針賦值給Form1, 然後是Form1.Create(Application). 這Tform1.create的區別在于, 在TForm1的OnCreate事件中, 我們可以使用Form1這個變量。 千萬不要小瞧這點區別。例如你的程序有多個窗體,各個子窗體都是在需要的時候通過Tform1.create動態生成的,你想在FormOnCreate事件中對窗體上的edit1賦值text屬性,那麽你不能直接使用Form1.edit1.text := 'wudi_1982',你可以使用self.edit1.text 或者直接使用edit1.text。此時,你可能會想,可以直接用edit1.text,我爲什麽要多寫form1.edit1.text呢?這裏除了了解兩者的區別,更重要的在于,如果你的程序中有一個函數,函數並非寫在窗體類中,此函數調用了form上的信息,而在初始化的時候,你又必須調用它,如果不明白此中道理,可能就這個問題,就要讓你調試好長時間,關于這方面的例子我就不寫了。在DELPHI的DEMO程序中,又一個關于ListView的,其中就有類似的情況,只不過那個DEMO程序只有一個窗體,用不到Tform.create,如果有興趣,你可以把那個例程添加到一個已存在的工程中,然後用兩種不同的方法生成,你就會發現問題了。 二、窗體的關閉 通常情況下,我們對于程序中子窗體的關閉,大多是使用close方法或者直接點擊窗體右上角的關閉按鈕。那麽對于VCL的窗體,它真的“關閉”了嗎?在默認情況下,答案是否定的。觀察VCL源碼,你會發現,那個關閉只能算做隱藏。至于怎麽測試,我想你知道。 要徹底關閉窗體並釋放資源,就要調用他的free方法(模式窗體的常用辦法),或者在onclose事件中,設置Action := caFree(無模式窗體的常用辦法),如果窗體還要通過並且將自身賦值爲nil。關于爲什麽手動做form1 := nil的操作,我這裏就不多說了, [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]TCloseAction = (caNone, caHide, caFree, caMinimize); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]procedure TCustomForm.Close; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]var [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] CloseAction: TCloseAction; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if fsModal in FFormState then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] ModalResult := mrCancel [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] else [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if CloseQuery then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] begin [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if FormStyle = fsMDIChild then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if biMinimize in BorderIcons then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] CloseAction := caMinimize else [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] CloseAction := caNone [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] else [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] CloseAction := caHide; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] DoClose(CloseAction); [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if CloseAction <> caNone then [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] if Application.MainForm = Self then Application.Terminate [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] else if CloseAction = caHide then Hide [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] else if CloseAction = caMinimize then WindowState := wsMinimized [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] else Release; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]end; [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url] [url=/bbs/detail_501023.html][img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img][/url]
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有