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

了解Visual Foxpro 的事件運作(轉貼)

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



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

第 1 樓

發表發表於: 星期六 五月 03, 2003 6:05 pm    文章主題: 了解Visual Foxpro 的事件運作(轉貼) 引言回覆

了解Visual Foxpro 的事件運作

   一、Visual Foxpro的核心事件
   Visual Foxpro為程式物件定義了許多事件來完成程式的功能,多數物件都具有以下核心事件: 事件名稱 發生時刻
Init 當對象被創建時
Click 當用滑鼠點擊物件時
Dbclick 當用滑鼠雙擊物件時
Destory 當物件從記憶體中釋放時
Gotfocus 當物件得到焦點時
InteravtiveChange 當用戶用鍵盤或滑鼠改變物件的值時
KeyPress 當用戶擊鍵盤時
LostFocus 當物件失去焦點時
MouseDown 當按下滑鼠左鍵時
MouseMove 當滑鼠指標在物件上移動時
MouseUp 當釋放滑鼠左鍵時
Valid 在物件失去焦點之前
When 在物件得到焦點之前


   事件代碼表示事件發生時所要執行的命令或程式,要放在相應的物件事件中,當該物件事件觸發時就會執行該事件內的代碼,來完成預定的功能。

   編寫事件代碼時,需要注意兩條規則:

   (1)每個物件的事件觸發是獨立的,容器物件(如表單、選項組等)不能處理它所包含的物件的事件。例如,在表單上放置一個命令按鈕。當點擊命令按鈕時,不會執行表單的Click事件,而僅執行命令按鈕的Click事件。

   (2)如果某個物件事件沒有相應的事件代碼,則系統會逐層向上檢查其父類是否有與此事件相關的事件代碼,若有則執行,而該層以上的與此事件相關的代碼不會被執行。若該物件有事件代碼,則系統只執行它的代碼,而不會再向它的上層去尋找相應的事件代碼,即不會再執行其父類的事件代碼。但可以在該物件的事件代碼中使用Dodefault( )函數,強制執行其父類的事件代碼。

   二、事件發生的順序

   當一個物件事件發生時,可能會引起其他事件的發生,因此,理解事件發生的順序也是非常重要的。觀察事件執行順序的簡單方法是在Debuuger工具中設置事件跟蹤開關,這樣,程式執行過程中的事件執行順序就會顯示在Debugger的事件跟蹤視窗中。下面我們用一個例子來說明事件執行的順序。在Visual Foxpro中新建一個表單Form1,加入兩個文本框Text1、Text2,和兩個命令按鈕Cmd1、Cmd2,TAB鍵次序為Text1、Text2、Cmd1、Cmd2,如下圖所示。


   打開Visual Foxpro的Debugger視窗(Tools/Debugger),在Debugger視窗中選擇Tools/Event Tracking...,彈出Event Tracking...對話方塊,如下圖所示。


   設置要跟蹤的事件,OK,然後打開Debug Output視窗(Window/Output)。回到Visual Foxpro運行上面建立的表單,事件執行過程會顯示在Debug Output視窗中,如下圖所示。


   從上圖可以看出,運行表單時,事件的執行順序為: 對 象 事 件
form1
dataenvironment
text1
text2
cmd1
cmd2
form1
form1
text1
form1
text1 Load()
Init()
Init()
Init()
Init()
Init()
Init()
Activate()
When()
GotFocus()
GotFocus()


   下面的事件是去察看Debugger視窗時發生的。表單運行以後,如果在Text1中輸入資料,則會交替執行KeyPress和InteractiveChange事件,如果輸入完畢,按Enter或TAB鍵,則執行Text1的KeyPress事件,然後執行Valid事件,最後執行LostFocus事件。

   下面我們來看看關閉表單時事件執行的順序。假設單擊Cmd1關閉表單, 則事件執行的順序為: 對 象 事 件
text1
cmd1
text1
cmd1
cmd1
cmd1
cmd1
form1
cmd2
cmd1
text2
text1
form1
dataenvironment
dataenvironment Valid()
When()
LostFocus()
GotFocus()
Click()
Valid()
When()
Destroy()
Destroy()
Destroy()
Destroy()
Destroy()
Unload()
AfterCloseTables()
Destroy()


   三、得到和失去焦點

   在應用程式開發中,表單通常是用戶對資料進行操作的介面。通常利用文本框、選擇框、列表框等控制物件來顯示、輸入或修改資料庫中的資料。有效的控制資料編輯的流程、資料物件焦點的轉移,是建立用戶友好的應用程式的重要部分。表單中默認的物件之間焦點的轉移是按照所設定的TAB次序進行的,但多數情況下,這種默認的次序往往滿足不了應用的需要。比如說,我們可能要根據用戶的選擇來決定焦點要轉移到哪個物件,而不是按照TAB的次序來轉移焦點。如果不理解Visual Foxpro如何來控制物件的焦點,就會感到處理流程不容易控制。

   涉及焦點的事件有四個,它們是:When、GotFocus、Valid、LostFocus和一個方法SetFocus。當物件試圖得到焦點時,會先執行When事件,如果When事件返回真(.T.),該物件就會得到焦點,否則不會得到焦點。因此,在When事件中編寫事件代碼,來控制是否讓該物件得到焦點。

   但是,ListBox和ComboBox兩個控制物件對When事件的回應有些不同。在這兩個控制中,每次用滑鼠或箭頭鍵在列出的專案之間移動時都會執行When事件。因此,如果需要編寫著兩個控制的When事件代碼,需要特別注意它們的差別。

   失去焦點的過程與得到焦點的過程類似,當一個物件要失去焦點時會先執行Valid事件,如果Valid事件返回真(.T.),該物件就會失去焦點,並執行LostFocus事件,否則該物件不會失去焦點。Valid事件還可以返回整數值,如果返回0,物件不會失去焦點;如果返回正整數值,焦點會轉移到整數值所指定的往下第幾個物件;如果返回負整數值,焦點會轉移到整數值所指定的往上第幾個物件。因此,可以在Valid事件中編寫事件代碼來判斷輸入值是否有效,設定返回值是真還是假,來決定是否允許控制物件失去焦點。

   還有一個命令可用於控制物件焦點的轉移,NoDefault,這條命令可阻止Visual Foxpro執行事件默認的行為。例如在用文本框輸入資料時,如果按Enter鍵,文本框會失去焦點,焦點會轉移到下一個物件。如果不想讓文本框失去焦點,可在文本框的KeyPress事件中插入一條NoDefault命令,按Enter鍵文本框也不會失去焦點。如果在NoDefault後面再加一條SetFocus命令,焦點就會轉移到你需要的物件上去。

   四、何時更新資料

   Visual Foxpro是一個資料庫應用開發環境,它提供了許多功能強大易於使用的資料綁定能力。多數控制物件都可以通過設置它的ControlSource屬性與資料表的特定欄位綁在一起,這樣當控制物件的值發生改變時,會自動更新ControlSource所指定的資料欄位的值。

   但是值的更新也是發生在某個特定時刻,明確理解資料值更新何時發生,對於靈活運用控制物件實現預定的功能是很有幫助的。在Visual Foxpro中,控制物件更新它的ControlSource值是在Valid事件觸發之前的時刻發生的,如果Valid事件沒有觸發,ControlSource的值不會更新。前面我們已經解釋過,Valid事件的觸發是在控制物件試圖失去焦點時發生,我們通常是在Valid事件中檢查輸入值的有效性,但即使判斷值是無效的,不讓控制失去焦點,但由於觸發了Valid事件,因此,ControlSource的值也已經改變了。下面我們做一個簡單的測試,觀察一下資料值變化的情況。建立一個表單,放一個文本框,文本框的ControlSource屬性設置為資料表的某一個欄位。假設該欄位原來的值是“OLD”,我們要把它改為“NEW”,用Debugger工具跟蹤資料變化過程。在文本框的Gotfocus事件中加入下面的代碼:

   DebugOut "Event Name: Gotfocus ControlSource: "; + Evaluate(This.ControlSource) + " value: " + This.value

   同樣,在文本框的InteractiveChange、KeyPress、Valid和LostFocus事件中都加上上面的代碼,只是要把事件名GotFocus換成相應的事件名稱。
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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