本文引用地址:
http://dyxdggzs.com/article/201701/337081.htmEvent Structure 也是一種選擇結構,程序根據發(fā)生的事件決定執行哪一個(gè)頁(yè)面的程序。此時(shí),LabVIEW 的界面編寫(xiě)與 Visual Basic 的界面程序有些類(lèi)似。
一. 按照產(chǎn)出源來(lái)區分事件的種類(lèi)
按照事件的產(chǎn)生源來(lái)區分,LabVIEW有以下幾種事件:

圖1:配置事件
1.應用程序事件(),這類(lèi)事件主要反映整個(gè)應用程序狀態(tài)的變化,例如:程序是否關(guān)閉,是否超時(shí)等。
2. VI事件(),這類(lèi)事件反映當前VI狀態(tài)的改變。例如:當前VI是否被關(guān)閉,是否選擇了菜單中的某一項等等。
3.動(dòng)態(tài)事件(Dynamic),用于處理用戶(hù)自己定義的或在程序中臨時(shí)生成的事件。
4.區域事件(Pane)和分割線(xiàn)事件(Splitter)是LabVIEW 8中新添加的特性。LabVIEW 8中,用戶(hù)可以把一個(gè)VI的前面板分割成幾份,這兩類(lèi)事件用來(lái)處理用戶(hù)對某個(gè)區域或區域分割線(xiàn)的狀態(tài)的改變。

圖2:面板上劃分區域
5.控件事件(Control)是最常用的一種事件,用于處理某個(gè)控件狀態(tài)的改變。例如,控件值的改變,或者鼠標鍵盤(pán)的操作。
打開(kāi)上述的“edit events”框,只要選定了某一個(gè)事件產(chǎn)生源,其相應的所有事件均排列在右側events框中。
有時(shí)候,多個(gè)事件產(chǎn)生源會(huì )對同一個(gè)用戶(hù)操作分別產(chǎn)生相應事件。比如在某一控件上按下鼠標,區域事件和控件事件都會(huì )發(fā)出鼠標按下(Mouse Down)事件。LabVIEW 按以下規則順序產(chǎn)生不同的事件:
? 鍵盤(pán)相關(guān)的事件(Key Down, Key Up, etc.)只在當前選中(Key Focused)的控件上產(chǎn)生;
? 鼠標相關(guān)的事件(Mouse Down, etc.)按照從外向里的順序發(fā)出。例如,區域的鼠標按下事件先于控件的鼠標按下事件發(fā)出;結構的鼠標按下事件先于先于結構內控件的鼠標按下事件發(fā)出。
?值改變事件按照從內向外的順序發(fā)出。結構(Cluser)內控件的值改變事件先于結構的值改變事件發(fā)出。
二. 按照發(fā)出時(shí)間區分事件的種類(lèi)
按照事件的發(fā)出時(shí)間來(lái)區分,LabVIEW的事件可分為通知型事件(Notify Event)和過(guò)濾型事件(Filter Event)。
通知型事件是在LabVIEW處理完用戶(hù)操作之后發(fā)出的,比如用戶(hù)利用鍵盤(pán)操作改變了一個(gè)字符串,LabVIEW 在改變了該控件的值之后,發(fā)出一個(gè)值改變(Value Changed)通知型事件,告訴事件結構,控件的值被改變了。如果事件結構內有處理該事件的框架,則程序轉去執行該框架。
過(guò)濾型事件是在 LabVIEW 處理用戶(hù)操作之前發(fā)出的,并等待相對應的事件框架執行完成之后,LabVIEW 再處理該用戶(hù)操作。這類(lèi)事件的名稱(chēng)之后都有一個(gè)問(wèn)號。例如鍵盤(pán)按下?事件(Key Down? Event),當用戶(hù)處理該事件時(shí),控件的值還沒(méi)有被改變,因此,用戶(hù)可以在該事件對應的事件框架內決定是否讓 LabVIEW先處理該事件,或改變鍵盤(pán)按下的值之后再讓LabVIEW繼續處理該事件。
可以明顯地看出,過(guò)濾型事件比相應的通知型事件要先發(fā)出。
當同一VI的程序框圖上有多于一個(gè)的事件結構時(shí),通知型事件是同時(shí)被發(fā)往所有的事件結構的,而過(guò)濾型事件則是按順序、依次發(fā)往每一個(gè)事件結構的。但是,在同一VI上放置多個(gè)事件結構是沒(méi)有必要,而且極易引起錯誤的。所以應該避免在同一VI上使用多個(gè)事件結構。
下面舉例說(shuō)明如何使用通知型事件。我們經(jīng)常需要使用到這樣的字符串控件:控件用于輸入電話(huà)號碼,因此只接收數字和橫線(xiàn),對其他按鍵不起反應。LabVIEW沒(méi)有直接提供此種控件,但是它們可以利用通知型事件被方便地實(shí)現出來(lái)。

圖3:利用 Key Down? 事件實(shí)現電話(huà)號碼控件
這個(gè)例子可以在這里下載:Phone Number Control.vi
三. 動(dòng)態(tài)事件
在初始狀態(tài)下,打開(kāi)事件配置(Edit Events)對話(huà)框,動(dòng)態(tài)事件下的一欄是空的。因為動(dòng)態(tài)事件只有注冊過(guò)之后才能使用。與事件相關(guān)的操作在函數選欄的 Programming -> Dialog & User Interface -> Events 下面。
用于注冊事件的節點(diǎn)是事件注冊節點(diǎn)(Register For Events)。需要注冊某一事件時(shí),先為它的產(chǎn)生者生成一個(gè)引用節點(diǎn),然后將引用節點(diǎn)與事件注冊節點(diǎn)的下方區域相連,再選取所需的事件。如下例:

圖4:注冊動(dòng)態(tài)事件
對于當前VI上的控件或區域等類(lèi)型的事件,一般來(lái)說(shuō)可以在事件結構中靜態(tài)地被選擇,所以不需要再動(dòng)態(tài)注冊一遍。但有時(shí),當前VI的程序框圖已經(jīng)過(guò)于復雜,我們希望在子 VI 里去處理某些控件的事件。這時(shí)就可以把控件的引用傳入子 VI,在子 VI 中動(dòng)態(tài)注冊所需事件。在子 VI 的事件結構中處理相應的事件。
四. 用戶(hù)自定義的事件
用戶(hù)自定義的事件是動(dòng)態(tài)事件的一種。用戶(hù)自定義的事件不基于任何一個(gè)LabVIEW對象,它是使用創(chuàng )建用戶(hù)事件節點(diǎn)(Create User Event)生成出來(lái)的。并且,用戶(hù)可以選擇不同的事件數據類(lèi)型。
五. ActiveX控件的事件
ActiveX 控件的事件不能直接被LabVIEW的事件結構所截獲。ActiveX 事件需要用注冊事件回調 VI 節點(diǎn)(Register Event Callback)來(lái)為某一事件指定一個(gè)VI。當事件發(fā)生時(shí),執行被注冊的 VI。我們也可以利用注冊事件回調 VI 節點(diǎn)為某一 LabVIEW 自身的事件注冊一個(gè)回調 VI,但是出于運行效率,和程序可讀性等方面的考慮,最好不要這樣使用。
評論