本文引用地址:
http://m.butianyuan.cn/article/201701/337081.htmEvent Structure 也是一種選擇結(jié)構(gòu),程序根據(jù)發(fā)生的事件決定執(zhí)行哪一個頁面的程序。此時,LabVIEW 的界面編寫與 Visual Basic 的界面程序有些類似。
一. 按照產(chǎn)出源來區(qū)分事件的種類
按照事件的產(chǎn)生源來區(qū)分,LabVIEW有以下幾種事件:
圖1:配置事件
1.應(yīng)用程序事件(),這類事件主要反映整個應(yīng)用程序狀態(tài)的變化,例如:程序是否關(guān)閉,是否超時等。
2. VI事件(),這類事件反映當(dāng)前VI狀態(tài)的改變。例如:當(dāng)前VI是否被關(guān)閉,是否選擇了菜單中的某一項等等。
3.動態(tài)事件(Dynamic),用于處理用戶自己定義的或在程序中臨時生成的事件。
4.區(qū)域事件(Pane)和分割線事件(Splitter)是LabVIEW 8中新添加的特性。LabVIEW 8中,用戶可以把一個VI的前面板分割成幾份,這兩類事件用來處理用戶對某個區(qū)域或區(qū)域分割線的狀態(tài)的改變。
圖2:面板上劃分區(qū)域
5.控件事件(Control)是最常用的一種事件,用于處理某個控件狀態(tài)的改變。例如,控件值的改變,或者鼠標(biāo)鍵盤的操作。
打開上述的“edit events”框,只要選定了某一個事件產(chǎn)生源,其相應(yīng)的所有事件均排列在右側(cè)events框中。
有時候,多個事件產(chǎn)生源會對同一個用戶操作分別產(chǎn)生相應(yīng)事件。比如在某一控件上按下鼠標(biāo),區(qū)域事件和控件事件都會發(fā)出鼠標(biāo)按下(Mouse Down)事件。LabVIEW 按以下規(guī)則順序產(chǎn)生不同的事件:
? 鍵盤相關(guān)的事件(Key Down, Key Up, etc.)只在當(dāng)前選中(Key Focused)的控件上產(chǎn)生;
? 鼠標(biāo)相關(guān)的事件(Mouse Down, etc.)按照從外向里的順序發(fā)出。例如,區(qū)域的鼠標(biāo)按下事件先于控件的鼠標(biāo)按下事件發(fā)出;結(jié)構(gòu)的鼠標(biāo)按下事件先于先于結(jié)構(gòu)內(nèi)控件的鼠標(biāo)按下事件發(fā)出。
?值改變事件按照從內(nèi)向外的順序發(fā)出。結(jié)構(gòu)(Cluser)內(nèi)控件的值改變事件先于結(jié)構(gòu)的值改變事件發(fā)出。
二. 按照發(fā)出時間區(qū)分事件的種類
按照事件的發(fā)出時間來區(qū)分,LabVIEW的事件可分為通知型事件(Notify Event)和過濾型事件(Filter Event)。
通知型事件是在LabVIEW處理完用戶操作之后發(fā)出的,比如用戶利用鍵盤操作改變了一個字符串,LabVIEW 在改變了該控件的值之后,發(fā)出一個值改變(Value Changed)通知型事件,告訴事件結(jié)構(gòu),控件的值被改變了。如果事件結(jié)構(gòu)內(nèi)有處理該事件的框架,則程序轉(zhuǎn)去執(zhí)行該框架。
過濾型事件是在 LabVIEW 處理用戶操作之前發(fā)出的,并等待相對應(yīng)的事件框架執(zhí)行完成之后,LabVIEW 再處理該用戶操作。這類事件的名稱之后都有一個問號。例如鍵盤按下?事件(Key Down? Event),當(dāng)用戶處理該事件時,控件的值還沒有被改變,因此,用戶可以在該事件對應(yīng)的事件框架內(nèi)決定是否讓 LabVIEW先處理該事件,或改變鍵盤按下的值之后再讓LabVIEW繼續(xù)處理該事件。
可以明顯地看出,過濾型事件比相應(yīng)的通知型事件要先發(fā)出。
當(dāng)同一VI的程序框圖上有多于一個的事件結(jié)構(gòu)時,通知型事件是同時被發(fā)往所有的事件結(jié)構(gòu)的,而過濾型事件則是按順序、依次發(fā)往每一個事件結(jié)構(gòu)的。但是,在同一VI上放置多個事件結(jié)構(gòu)是沒有必要,而且極易引起錯誤的。所以應(yīng)該避免在同一VI上使用多個事件結(jié)構(gòu)。
下面舉例說明如何使用通知型事件。我們經(jīng)常需要使用到這樣的字符串控件:控件用于輸入電話號碼,因此只接收數(shù)字和橫線,對其他按鍵不起反應(yīng)。LabVIEW沒有直接提供此種控件,但是它們可以利用通知型事件被方便地實(shí)現(xiàn)出來。
圖3:利用 Key Down? 事件實(shí)現(xiàn)電話號碼控件
這個例子可以在這里下載:Phone Number Control.vi
三. 動態(tài)事件
在初始狀態(tài)下,打開事件配置(Edit Events)對話框,動態(tài)事件下的一欄是空的。因為動態(tài)事件只有注冊過之后才能使用。與事件相關(guān)的操作在函數(shù)選欄的 Programming -> Dialog & User Interface -> Events 下面。
用于注冊事件的節(jié)點(diǎn)是事件注冊節(jié)點(diǎn)(Register For Events)。需要注冊某一事件時,先為它的產(chǎn)生者生成一個引用節(jié)點(diǎn),然后將引用節(jié)點(diǎn)與事件注冊節(jié)點(diǎn)的下方區(qū)域相連,再選取所需的事件。如下例:
圖4:注冊動態(tài)事件
對于當(dāng)前VI上的控件或區(qū)域等類型的事件,一般來說可以在事件結(jié)構(gòu)中靜態(tài)地被選擇,所以不需要再動態(tài)注冊一遍。但有時,當(dāng)前VI的程序框圖已經(jīng)過于復(fù)雜,我們希望在子 VI 里去處理某些控件的事件。這時就可以把控件的引用傳入子 VI,在子 VI 中動態(tài)注冊所需事件。在子 VI 的事件結(jié)構(gòu)中處理相應(yīng)的事件。
四. 用戶自定義的事件
用戶自定義的事件是動態(tài)事件的一種。用戶自定義的事件不基于任何一個LabVIEW對象,它是使用創(chuàng)建用戶事件節(jié)點(diǎn)(Create User Event)生成出來的。并且,用戶可以選擇不同的事件數(shù)據(jù)類型。
五. ActiveX控件的事件
ActiveX 控件的事件不能直接被LabVIEW的事件結(jié)構(gòu)所截獲。ActiveX 事件需要用注冊事件回調(diào) VI 節(jié)點(diǎn)(Register Event Callback)來為某一事件指定一個VI。當(dāng)事件發(fā)生時,執(zhí)行被注冊的 VI。我們也可以利用注冊事件回調(diào) VI 節(jié)點(diǎn)為某一 LabVIEW 自身的事件注冊一個回調(diào) VI,但是出于運(yùn)行效率,和程序可讀性等方面的考慮,最好不要這樣使用。
評論