VFP是內带數據庫引擎的事件驅動編程語言。面向對象編程模式是爲事件驅動而生的,Windows系統是基於事件的操作系統。事件驅動與代碼驅動的不同之處,是前者的嚮應流程是不確定的,它由近乎隨機的事件觸發每一個動作,由於不能假定事件之間的發生是有次序和必然邏輯的,所以它每一次應答,都應該相對獨立,難以依賴前後動作;後者則不同,程序的過程幾乎是固定的,所有動作都在代碼安排之下,幾乎不受事件打斷。簡單地説,事件驅動編程思想的立足點或世界觀,是這個世界不由我決定,是我適應環境,代碼驅動編程思想則是世界在我掌控之中。這幾乎是對立的世界觀,一般説,程序員傾向於接納與自己哲學觀點相同的方法論,事件驅動可歸於客觀主義,代碼驅動可歸於主觀主義,事實上,觀察程序員的編程傾向,的確可以發現他做人處事的哲學態度,往往是與此相符的。
事件驅動,由於出發點就不預測程序從那裏開始、路徑如何,所以它通常總是處於等待狀態(與控制臺或命令窗口的等待不同,控制臺是等待指令,但事件驅動程序是等待各種事件的發生,接獲指令祇是事件之一)。故而,這類程序的主體控制結構,必定是死循環,永遠在“空”轉,循環之中不斷地檢測內定的事件是否已被觸發,如果觸發,就把該消息發送給設計好的處理該事件的模塊,對應的模塊處理好之後,把結果消息返回給主控循環,主控循環再根據其反饋決定下一步流程。
熟悉Windows編程的人都知道,Windows程序就由兩個程序段組成,一個是主控死循環,它就是在空轉檢測消息,另一個是消息處理程序,前者把檢測到的消息發給後者進行處理。如果這樣的程序不是死循環,那麽程序把事件應答處理完,就會自動結束,這就是“一閃即逝”現象的原因。當VFP啟動了一個窗體(Form)之後,如果不接著啟動一個死循環把自己留住,就被操作系統回收了——所有在Windows下編程的IDE中啟動cmd窗口運行控制臺程序結束之後要附加一個等待按鍵的動作也是這個原因,因爲其宿主cmd窗口在程序結束後被操作系統沒收了。
VFP的機制與此相同,故而若啟動的Form不是模式窗體,那麽就必須在啟動Form之後,用READ EVENT指令開啟“事務處理”流程,這個所謂的事務處理,其實就是Windows程序要求的那個死循環。
因此,在VFP中,若是用DO FORM指令開始的表單程序,此表單必須是模式窗體,否則它會一閃即逝——在VFP IDE Screen中,它已把控制權交還Screen;若編譯後脫離VFP執行,則是一閃即逝。故而,若表單不是模式表單,則必須用代碼在DO FORM之後再加一句READ EVENTS,這就是有時必須用PRG啟動程序的原因。若是直接從表單啟動程序,由於沒有合適的辦法在表單某個事件之後啟動事務處理流程(時序上在READ EVENTS之後的代碼必須在CLEAR EVENTS之後才會接續執行,而在表單的事件中,沒什麽事件是可以讓你這樣掛起的),這是很多初學者都會遇到的問題,而不少人“學到”之後,也是不大清楚問題到底是如何解決的。
在表單外READ EVENTS,在表單內CLEAR EVENTS,這是必然的邏輯。
事件驅動,由於出發點就不預測程序從那裏開始、路徑如何,所以它通常總是處於等待狀態(與控制臺或命令窗口的等待不同,控制臺是等待指令,但事件驅動程序是等待各種事件的發生,接獲指令祇是事件之一)。故而,這類程序的主體控制結構,必定是死循環,永遠在“空”轉,循環之中不斷地檢測內定的事件是否已被觸發,如果觸發,就把該消息發送給設計好的處理該事件的模塊,對應的模塊處理好之後,把結果消息返回給主控循環,主控循環再根據其反饋決定下一步流程。
熟悉Windows編程的人都知道,Windows程序就由兩個程序段組成,一個是主控死循環,它就是在空轉檢測消息,另一個是消息處理程序,前者把檢測到的消息發給後者進行處理。如果這樣的程序不是死循環,那麽程序把事件應答處理完,就會自動結束,這就是“一閃即逝”現象的原因。當VFP啟動了一個窗體(Form)之後,如果不接著啟動一個死循環把自己留住,就被操作系統回收了——所有在Windows下編程的IDE中啟動cmd窗口運行控制臺程序結束之後要附加一個等待按鍵的動作也是這個原因,因爲其宿主cmd窗口在程序結束後被操作系統沒收了。
VFP的機制與此相同,故而若啟動的Form不是模式窗體,那麽就必須在啟動Form之後,用READ EVENT指令開啟“事務處理”流程,這個所謂的事務處理,其實就是Windows程序要求的那個死循環。
因此,在VFP中,若是用DO FORM指令開始的表單程序,此表單必須是模式窗體,否則它會一閃即逝——在VFP IDE Screen中,它已把控制權交還Screen;若編譯後脫離VFP執行,則是一閃即逝。故而,若表單不是模式表單,則必須用代碼在DO FORM之後再加一句READ EVENTS,這就是有時必須用PRG啟動程序的原因。若是直接從表單啟動程序,由於沒有合適的辦法在表單某個事件之後啟動事務處理流程(時序上在READ EVENTS之後的代碼必須在CLEAR EVENTS之後才會接續執行,而在表單的事件中,沒什麽事件是可以讓你這樣掛起的),這是很多初學者都會遇到的問題,而不少人“學到”之後,也是不大清楚問題到底是如何解決的。
在表單外READ EVENTS,在表單內CLEAR EVENTS,這是必然的邏輯。
[此贴子已经被作者于2016-2-8 19:00编辑过]
授人以渔,不授人以鱼。