VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

解決VFP執行檔一閃而過的情形(轉貼)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 1 樓

發表發表於: 星期日 五月 04, 2003 8:54 pm    文章主題: 解決VFP執行檔一閃而過的情形(轉貼) 引言回覆

[轉貼]
筆者在兩年多的新聞組生活中,曾數十次遇到過初學者對VFP的表單視窗屬性所提出的問題,特別是"為何系統編譯後運行時一閃而過"的問題,更是被頻繁地提出。現根據我的經驗進行一下總結,以幫助初學者打掉這只攔路虎。
  其實,這個問題之所以被頻繁地提出,並非是由於初學者的理解能力有問題,而實在是VFP的設計混亂所致,以至於造成初學者理解上的混亂。筆者曾在"濟南萬千"的"軟體、編程、資料庫"新聞組就此問題發過"視窗問題到此為止"的帖子,反響很大,現根據該帖進行整理,修正補足該帖中的一些不準確之處及遺漏。
  本文所提"表單視窗屬性",是指那些不但影響表單本身的特徵(例如長寬等),而且對表單之外、項目之中的其他"元件"有影響的表單屬性,它們包括如下三個:
[list=a] 屬性 意義 可選值(黑體為預設值)
DeskTop 指定表單是否包含在VFP主視窗中 F./.T.
WindowType 指定表單物件運行時的動作 0-無模式/1-模式
ShowWindow 指定在創建過程中表單視窗顯示表單或工具欄 0-在螢幕中/1-在頂層表單中/3-做為頂層表單
[/list]

下面針對上述表單屬性以及VFP中"桌面(DeskTop)、螢幕(Screen)、表單(Form)"等概念談一談我的理解。正因為VFP在此方面的設計混亂,也就決定了我不能系統地、有條理地分析這些問題,我做的只能是闡述一些事實。
   1.表單是一個物件,外觀表現上是一個視窗。VFP的主視窗也可以說是一個"表單"物件,它有一個固定的名字叫"_Screen","_Screen"是一個特殊的表單物件;
   2."ShowWindow"是規定表單在"顯示方面的從屬關係"的屬性 ShowWindow屬性實際上僅有兩種選擇:"作為頂層表單"與"在頂層表單中"。為了表達方便,我們把具有前者屬性值的表單稱為"頂層表單",後者稱為"從屬表單"。二者在顯示方面的不同地位是:頂層表單在Windows任務欄上有一席之地,從屬表單卻沒有這種待遇;頂層表單最小化時,從屬表單隨之被隱藏,當頂層表單關閉後,從屬表單隨之關閉。 ShowWindow的第三種選擇"在螢幕中(默認)"僅是"在頂層表單中"的一個特例,即為"在_Screen這個特定的頂層表單中"之意,選擇此種屬性值時,它一定是個"從屬表單"了。_Screen具有"頂層表單"的一切顯示特徵。
   從屬表單不能獨立地被顯示,必須與他的"主表單"一起顯示,這個"主表單"要麼是一個頂層表單要麼是VFP的視窗(_Screen)。不需要為一個"從屬表單"指定一個"主表單","從屬表單"打開時,自動選擇當前的活動頂層表單作為其"主表單",當然,如果選擇了"在螢幕中",則這個從屬表單自然就以_Screen為其主表單了。
   3."DeskTop"是規定表單在"顯示方面的活動範圍"的屬性。
   DeskTop僅對"從屬表單"有意義,當從屬表單的DeskTop=.f.時,它只能顯示在它的"頂層表單"的尺寸之內,當這個頂層表單的尺寸比它的尺寸還小時,它將會被部分地遮住;當從屬表單的DeskTop=.t.時,它的活動範圍將不受它的頂層表單尺寸的限制,它可以顯示在電腦螢幕的任何地方甚至之外。但不管它的位置離其頂層表單多遠,一旦頂層表單最小化了,它會立即順從地從電腦螢幕上消失。
   4."ShowWindows"是規定表單被執行時的程式動作的屬性
   分兩種情況:
   (1)當表單的ShowWindow為"在螢幕中"和"在頂層表單中"時: a.當WindowType="模式"時,執行表單(DO FORM)後使得表單取得焦點,並且一直到它被關閉,在此期間,它的父視窗物件(可能是_Screen或一個頂層表單)的功能表系統及其所屬的子表單都不能用。就是說,在表單存在期間,它將一直霸佔著焦點. b.當WindowType="無模式"時,表單存在期間不會霸佔焦點。有一個例外,當DeskTop=.t.時,執行它時會使系統功能表失效,而DeskTop=.f.時則不會。
   (2)當表單的ShowWindow為"做為頂層表單"時: 表單的WindowType屬性不管是有模式還是無模式,都不會霸佔焦點。
   5.一般情況,用戶的應用系統需要一個主表單(主視窗),您可以將_Screen作為這個主視窗,也可以將專案中的某個"頂層表單"做為"主窗口",很難說那種更好。但在此筆者建議使用VFP主視窗做為用戶系統的主視窗,這樣可能會省去一些麻煩,因為VFP的很多工具條視窗被設計成只能開在_Screen中,例如在列印預覽工具條等。
   程式編譯成EXE後,前者啟動時先顯示VFP主視窗,後者直接顯示程式師自己設計的頂層表單。對於後者,為遮罩VFP主視窗,一定要在Config.fpw寫入Screen=off(Config.fpw應加入到項目中,這樣連編後它將被包含進EXE中,這一來可減少提供安裝檔的數量,二來也可避免被用戶更改)。 另一方面,很多應用系統程式都喜歡有一個漂亮的或曰自以為漂亮的啟動封面,然後再進入主控介面。如果一方面不希望在顯示自己的啟動封面前有VFP主視窗搶鏡頭,另一方面又想讓VFP主視窗做為程式的主控介面時,解決辦法是:設計一個"頂層表單"做為啟動封面,config.fpw中仍須寫Screen=off,然後在啟動封面展示夠了自己的魅力之後,用一句_Screen.Show將_Screen打回原形。
  6.ShowWoindow與DeskTop屬性僅規定了Form在顯示方面的特徵,而在"物件"這一更加高級的層面上,"頂層表單"與"從屬表單"彼此是平級的,而_Screen雖然在顯示方面與"頂層表單"具有相同的地位,但在物件層面卻是高一級的傢伙,所有表單,不管你是"頂層表單"還是"從屬表單",都是它的子物件,這想起來就叫人糊塗,還是趕緊不想的好。
   7."為什麼我的程式編譯後一閃而過?" 這個問題有兩種可能性,第一種是程式執行完成並退出,第二種是程式正在執行,但介面被隱藏。對於第二種情況,可直接按"Ctrl-Alt-Del"鍵觀察到。造成這兩種情況的原因如下: 我們先看下面的一段示例程式,假如下面的示例程式是專案的主程序,並且應用專案以VFP主視窗做為自己的主視窗。
   *環境設置
   Do Form myScreen &&啟動封面表單 _
   Screen.Show &&顯示VFP主視窗
   Do myMenu.mpr &&安裝功能表系統
   RETURN
   為達到在顯示啟動封面之前不顯示VFP主視窗的目的,在Config.fpw中已寫Screen=off,當程式執行到Do Form myScreen這一句時,如果表單myScreen的ShowWindows屬性被設為"在螢幕中",則不管是在開發環境還是在編譯環境下,程式都將停下來,表單被顯示在_Screen中,而_Screen被隱藏了,因此表單跟著也被隱藏了,所以在螢幕上什麼也看不見。這就是第二種情況的產生原因。為了避免這種錯誤的出現,必須將myScreen表單的ShowWindow的屬性設為"做為頂層表單",這樣就可使在_Screen被隱藏的情況下,myScreen仍然可以被顯示出來。但請注意,在此情況下,Do Form myScreen這句話執行後,程式並不能停下來,而是順序地執行下去,一直到執行到RETURN後程式退出,這也就是著名的"一閃而過"現象了。為此必須在程式中包含事件處理命令Read Events使程式停下來,如下:
  *環境設置
   Do Form myScreen &&啟動封面表單
   Read Events &&開始事件處理:使啟動封面停下來
   _ Screen.Show &&顯示VFP主視窗
   Do myMenu.mpr &&安裝功能表系統
   Read Events &&開始事件處理
   RETURN
   程式執行Do Form myScreen後,將啟動封面顯示在螢幕上,然後向下執行到Read Events開始事件處理,此時啟動封面表單必須由用戶關閉或由表單事件關閉,否則程式將一直停在Read Events這一句上。不管myScreen表單由誰關閉,在關閉代碼中必須包含一句Clear Events的停止事件處理命令,以便開始執行Read Events的下一句指令,順序執行完成_Screen.Show及Do myMenu.mpr後,用戶的主介面就建立完成,同理,此處還需要一個事件處理命令讓程式再次停下來,開始功能表系統的命令處理,一般情況,功能表系統中將包含的"退出"項,其中有"Clear Events"清除事件處理代碼,從而停止第二條"Read Events"事件處理命令,退出整個系統。
  
   以上經驗恐有謬誤,敬請批評!
   最後,VFP是個所謂"讓我歡喜讓我憂"的東東,有時百依百順,有時莫名其妙。未曾戀愛過的男性最適合習之,以便為今後的戀愛打下堅實的心理基礎。
回頂端
檢視會員個人資料 發送私人訊息
Ruey



註冊時間: 2003-03-12
文章: 1698
來自: tunglo

第 2 樓

發表發表於: 星期日 五月 04, 2003 9:00 pm    文章主題: 引言回覆

主程式最好加入---->ON SHUTDOWN

SET DELETED ON
SET TALK OFF

ON SHUTDOWN myShutDown()

_VFP.Visible = .T.
_SCREEN.WindowState = 2

DO FORM myForm

READ EVENTS
ON SHUTDOWN




FUNCTION myShutDown
IF MESSAGEBOX("Close System?",4+32+256,_SCREEN.Caption) = 7
RETURN
ENDIF
QUIT
RETURN .T.
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作