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