來源:互聯網網民 2006-01-31 23:49:56
評論Delphi MDI應用程序高級技巧三則(一)http://www.netgocn.com
本文介紹幾個Delphi MDI應用程序的編程技巧,雖然純屬技巧,但是本文的方法在正常編程時,通常會被編譯器認爲是錯誤的或是違背編程環境缺省許可值的。不過有時爲了一些特殊的用途或特殊的視覺效果,按下述的方法一試,可以在明知不可違而違之的情況下,得到很好的結果。
下述各示例均在Delphi6、Windows2000下完成,對涉及的控件命名是任意的,僅爲方便說明問題。
一、子窗口的隱藏
在Delphi編程環境下,MDI子窗口在運行期間可以動態地被創建和銷毀,但是不能夠被隱藏,如果試圖通過Visible屬性或Hide方法隱藏子窗口,編譯器將報出“Cannot hide an MDI Child Form.”的錯誤提示!
如果某個子窗口中承載了很多要保留的數據而不能銷毀,但又暫時不想要它出現在屏幕上時,最好的方法就是將其隱藏,待需要時再將其顯示出來則可。下面兩種方法可以隱藏和顯示子窗口,並避開了編譯器的報錯提示。
1) 使用Windows API函數ShowWindow(),示例代碼如下:
ShowWindow(ChildForm.Handle, SW_HIDE); // 隱藏子窗口
ShowWindow(ChildForm.Handle, SW_RESTORE); // 顯示子窗口
說明:使用Windows API直接隱藏子窗口,其子窗口的Visible屬性和其顯示狀態是不一至的。當子窗口不可見時,其Visible屬性可能仍然是True。
2) 直接設置子窗口的Visible屬性
此時,首先要在需要隱藏的子窗口中重載TCustomForm的VisibleChanging方法,並在其實現過程中屏蔽掉繼承代碼,否則編譯器將在隱藏子窗口時報錯。
然後就可以直接設置這個子窗口的Visible屬性爲False或True來隱藏或顯示它了。示例如下:
a) 子窗口部分
…
type
TChildForm = class(TForm)
private
procedure VisibleChanging; override;//重載
…
end;
…
procedure TChildForm.VisibleChanging;
begin
{使用組件屬性隱藏子窗口時,需要重載此過程,並且不執行任何繼承代碼,否則將報錯}
//inherited; 不能執行此語句!
end;
b) 隱藏或顯示子窗口
ChildForm.Visible:=false;//隱藏子窗口
ChildForm.Visible:=true; //顯示子窗口
說明:直接使用組件屬性隱藏或顯示子窗口,子窗口的Visible屬性和其顯示狀態是一至的。筆者認爲這樣做要安全一些。
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
Delphi MDI應用程序高級技巧三則(一)[url=http://www.netgocn.com]http://www.netgocn.com[/url]
本文介紹幾個Delphi MDI應用程序的編程技巧,雖然純屬技巧,但是本文的方法在正常編程時,通常會被編譯器認爲是錯誤的或是違背編程環境缺省許可值的。不過有時爲了一些特殊的用途或特殊的視覺效果,按下述的方法一試,可以在明知不可違而違之的情況下,得到很好的結果。
下述各示例均在Delphi6、Windows2000下完成,對涉及的控件命名是任意的,僅爲方便說明問題。
一、子窗口的隱藏
在Delphi編程環境下,MDI子窗口在運行期間可以動態地被創建和銷毀,但是不能夠被隱藏,如果試圖通過Visible屬性或Hide方法隱藏子窗口,編譯器將報出“Cannot hide an MDI Child Form.”的錯誤提示!
如果某個子窗口中承載了很多要保留的數據而不能銷毀,但又暫時不想要它出現在屏幕上時,最好的方法就是將其隱藏,待需要時再將其顯示出來則可。下面兩種方法可以隱藏和顯示子窗口,並避開了編譯器的報錯提示。
1) 使用Windows API函數ShowWindow(),示例代碼如下:
ShowWindow(ChildForm.Handle, SW_HIDE); // 隱藏子窗口
ShowWindow(ChildForm.Handle, SW_RESTORE); // 顯示子窗口
說明:使用Windows API直接隱藏子窗口,其子窗口的Visible屬性和其顯示狀態是不一至的。當子窗口不可見時,其Visible屬性可能仍然是True。
2) 直接設置子窗口的Visible屬性
此時,首先要在需要隱藏的子窗口中重載TCustomForm的VisibleChanging方法,並在其實現過程中屏蔽掉繼承代碼,否則編譯器將在隱藏子窗口時報錯。
然後就可以直接設置這個子窗口的Visible屬性爲False或True來隱藏或顯示它了。示例如下:
a) 子窗口部分
…
type
TChildForm = class(TForm)
private
procedure VisibleChanging; override;//重載
…
end;
…
procedure TChildForm.VisibleChanging;
begin
{使用組件屬性隱藏子窗口時,需要重載此過程,並且不執行任何繼承代碼,否則將報錯}
//inherited; 不能執行此語句!
end;
b) 隱藏或顯示子窗口
ChildForm.Visible:=false;//隱藏子窗口
ChildForm.Visible:=true; //顯示子窗口
說明:直接使用組件屬性隱藏或顯示子窗口,子窗口的Visible屬性和其顯示狀態是一至的。筆者認爲這樣做要安全一些。