| VFP編譯后運(yùn)行時(shí)一閃而過(guò)的原因及解決方法 本文所指的"表單窗口屬性"是指那些不但影響表單本身的特征,而且對(duì)表單之外、項(xiàng)目之中的其它"元件"有影響的表單屬性, 它們是:  屬性               意義                               可選值(黑體為默認(rèn)值)   DeskTop            指定表單是否包含在VFP主窗口中              .F.或.T.   WindowType         指定表單對(duì)象運(yùn)行時(shí)的動(dòng)作                0-無(wú)模式/1-模式  ShowWindow         指定在創(chuàng)建過(guò)程中表單窗口顯示表單或工具欄 0-在屏幕中/1-在頂層表單中/3-做為頂層表單   下面針對(duì)上述表單屬性以及VFP中"桌面(DeskTop)、屏幕(Screen)、表單(Form)"等概念進(jìn)行介紹。
   1.表單是一個(gè)對(duì)象,外觀表現(xiàn)上是一個(gè)窗口。VFP的主窗口也可以說(shuō)是一個(gè)"表單"對(duì)象,它有一個(gè)固定的名字叫"_Screen","_Screen"是一個(gè)特殊的表單對(duì)象;  2."ShowWindow"是規(guī)定表單在"顯示方面的從屬關(guān)系"的屬性 ShowWindow屬性實(shí)際上僅有兩種選擇:"作為頂層表單"與"在頂層表單中"。為了表達(dá)方便,我們把具有前者屬性值的表單稱為"頂層表單",后者稱為"從屬表單"。二者在顯示方面的不同地位是:頂層表單在Windows任務(wù)欄上有一席之地,從屬表單卻沒(méi)有這種待遇;頂層表單最小化時(shí),從屬表單隨之被隱藏,當(dāng)頂層表單關(guān)閉后,從屬表單隨之關(guān)閉。 ShowWindow的第三種選擇"在屏幕中(默認(rèn))"僅是"在頂層表單中"的一個(gè)特例,即為"在_Screen這個(gè)特定的頂層表單中"之意,選擇此種屬性值時(shí),它一定是個(gè)"從屬表單"了。_Screen具有"頂層表單"的一切顯示特征。
  從屬表單不能獨(dú)立地被顯示,必須與他的"主表單"一起顯示,這個(gè)"主表單"要么是一個(gè)頂層表單要么是VFP的窗口(_Screen)。不需要為一個(gè)"從屬表單"指定一個(gè)"主表單","從屬表單"打開時(shí),自動(dòng)選擇當(dāng)前的活動(dòng)頂層表單作為其"主表單",當(dāng)然,如果選擇了"在屏幕中",則這個(gè)從屬表單自然就以_Screen為其主表單了。
   3."DeskTop"是規(guī)定表單在"顯示方面的活動(dòng)范圍"的屬性。
  DeskTop僅對(duì)"從屬表單"有意義,當(dāng)從屬表單的DeskTop=.f.時(shí),它只能顯示在它的"頂層表單"的尺寸之內(nèi),當(dāng)這個(gè)頂層表單的尺寸比它的尺寸還小時(shí),它將會(huì)被部分地遮?。划?dāng)從屬表單的DeskTop=.t.時(shí),它的活動(dòng)范圍將不受它的頂層表單尺寸的限制,它可以顯示在電腦屏幕的任何地方甚至之外。但不管它的位置離其頂層表單多遠(yuǎn),一旦頂層表單最小化了,它會(huì)立即順從地從電腦屏幕上消失。
   4."ShowWindows"是規(guī)定表單被執(zhí)行時(shí)的程序動(dòng)作的屬性 
  分兩種情況: 
  (1)當(dāng)表單的ShowWindow為"在屏幕中"和"在頂層表單中"時(shí): a.當(dāng)WindowType="模式"時(shí),執(zhí)行表單(DO FORM)后使得表單取得焦點(diǎn),并且一直到它被關(guān)閉,在此期間,它的父窗口對(duì)象(可能是_Screen或一個(gè)頂層表單)的菜單系統(tǒng)及其所屬的子表單都不能用。就是說(shuō),在表單存在期間,它將一直霸占著焦點(diǎn). b.當(dāng)WindowType="無(wú)模式"時(shí),表單存在期間不會(huì)霸占焦點(diǎn)。有一個(gè)例外,當(dāng)DeskTop=.t.時(shí),執(zhí)行它時(shí)會(huì)使系統(tǒng)菜單失效,而DeskTop=.f.時(shí)則不會(huì)。 
  (2)當(dāng)表單的ShowWindow為"做為頂層表單"時(shí): 表單的WindowType屬性不管是有模式還是無(wú)模式,都不會(huì)霸占焦點(diǎn)。
   5.一般情況,用戶的應(yīng)用系統(tǒng)需要一個(gè)主表單(主窗口),您可以將_Screen作為這個(gè)主窗口,也可以將項(xiàng)目中的某個(gè)"頂層表單"做為"主窗口",很難說(shuō)那種更好。但在此筆者建議使用VFP主窗口做為用戶系統(tǒng)的主窗口,這樣可能會(huì)省去一些麻煩,因?yàn)閂FP的很多工具條窗口被設(shè)計(jì)成只能開在_Screen中,例如在打印預(yù)覽工具條等。
  程序編譯成EXE后,前者啟動(dòng)時(shí)先顯示VFP主窗口,后者直接顯示程序員自己設(shè)計(jì)的頂層表單。對(duì)于后者,為屏蔽VFP主窗口,一定要在Config.fpw寫入Screen=off(Config.fpw應(yīng)加入到項(xiàng)目中,這樣連編后它將被包含進(jìn)EXE中,這一來(lái)可減少提供安裝文件的數(shù)量,二來(lái)也可避免被用戶更改)。 另一方面,很多應(yīng)用系統(tǒng)程序都喜歡有一個(gè)漂亮的或曰自以為漂亮的啟動(dòng)封面,然后再進(jìn)入主控界面。如果一方面不希望在顯示自己的啟動(dòng)封面前有VFP主窗口搶鏡頭,另一方面又想讓VFP主窗口做為程序的主控界面時(shí),解決辦法是:設(shè)計(jì)一個(gè)"頂層表單"做為啟動(dòng)封面,config.fpw中仍須寫Screen=off,然后在啟動(dòng)封面展示夠了自己的魅力之后,用一句_Screen.Show將_Screen打回原形。
   6.ShowWoindow與DeskTop屬性僅規(guī)定了Form在顯示方面的特征,而在"對(duì)象"這一更加高級(jí)的層面上,"頂層表單"與"從屬表單"彼此是平級(jí)的,而_Screen雖然在顯示方面與"頂層表單"具有相同的地位,但在對(duì)象層面卻是高一級(jí)的東西,所有表單,不管你是"頂層表單"還是"從屬表單",都是它的子對(duì)象。
   7."為什么我的程序編譯后一閃而過(guò)?" 這個(gè)問(wèn)題有兩種可能性,第一種是程序執(zhí)行完成并退出,第二種是程序正在執(zhí)行,但界面被隱藏。對(duì)于第二種情況,可直接按"Ctrl-Alt-Del"鍵觀察到。造成這兩種情況的原因如下: 先看下面的一段示例程序,假如下面的示例程序是項(xiàng)目的主程序,并且應(yīng)用項(xiàng)目以VFP主窗口做為自己的主窗口。
   *環(huán)境設(shè)置 
   Do Form myScreen &&啟動(dòng)封面表單 _
   Screen.Show &&顯示VFP主窗口 
   Do myMenu.mpr &&安裝菜單系統(tǒng) 
   RETURN
   為達(dá)到在顯示啟動(dòng)封面之前不顯示VFP主窗口的目的,在Config.fpw中已寫Screen=off,當(dāng)程序執(zhí)行到Do Form myScreen這一句時(shí),如果表單myScreen的ShowWindows屬性被設(shè)為"在屏幕中",則不管是在開發(fā)環(huán)境還是在編譯環(huán)境下,程序都將停下來(lái),表單被顯示在_Screen中,而_Screen被隱藏了,因此表單跟著也被隱藏了,所以在屏幕上什么也看不見(jiàn)。這就是第二種情況的產(chǎn)生原因。為了避免這種錯(cuò)誤的出現(xiàn),必須將myScreen表單的ShowWindow的屬性設(shè)為"做為頂層表單",這樣就可使在_Screen被隱藏的情況下,myScreen仍然可以被顯示出來(lái)。但請(qǐng)注意,在此情況下,Do Form myScreen這句話執(zhí)行后,程序并不能停下來(lái),而是順序地執(zhí)行下去,一直到執(zhí)行到RETURN后程序退出,這也就是著名的"一閃而過(guò)"現(xiàn)象了。為此必須在程序中包含事件處理命令Read Events使程序停下來(lái),如下:
  *環(huán)境設(shè)置
   Do Form myScreen &&啟動(dòng)封面表單 
   Read Events &&開始事件處理:使啟動(dòng)封面停下來(lái) 
   _ Screen.Show &&顯示VFP主窗口 
   Do myMenu.mpr &&安裝菜單系統(tǒng) 
   Read Events &&開始事件處理 
   RETURN
   程序執(zhí)行Do Form myScreen后,將啟動(dòng)封面顯示在屏幕上,然后向下執(zhí)行到Read Events開始事件處理,此時(shí)啟動(dòng)封面表單必須由用戶關(guān)閉或由表單事件關(guān)閉,否則程序?qū)⒁恢蓖T赗ead Events這一句上。不管myScreen表單由誰(shuí)關(guān)閉,在關(guān)閉代碼中必須包含一句Clear Events的停止事件處理命令,以便開始執(zhí)行Read Events的下一句指令,順序執(zhí)行完成_Screen.Show及Do myMenu.mpr后,用戶的主界面就建立完成,同理,此處還需要一個(gè)事件處理命令讓程序再次停下來(lái),開始菜單系統(tǒng)的命令處理,一般情況,菜單系統(tǒng)中將包含的"退出"項(xiàng),其中有"Clear Events"清除事件處理代碼,從而停止第二條"Read Events"事件處理命令,退出整個(gè)系統(tǒng)。 
 | 
|  |