2011年10月16日,第一稿
9.6 图形化语言设计模式之五——用户界面事件处理器
在第8.4.2节中,我们简单的介绍了事件驱动的基本原理。下面针对LabVIEW中所提供的设计模式之五——用户界面事件处理器,进行更多的讨论。
9.6.1 用户界面事件处理器
顾名思义,用户界面事件处理器就是用来处理应用程序中的GUI事件。也就是说,现在来自于GUI用户响应是通过用户事件处理机制来实现的。在过去,在事件处理机制没有引入之前(LabVIEW 6.1发布之前),处理这类响应通常采用的是轮询技术。关于轮询与事件结构之间的优缺点前面已经谈到过,这里就不在进行相关的讨论了。
获得用户界面事件处理器设计模式的方法很简单,在LabVIEW启动界面选择:
》新建(更多...)
》VI
》基于模板
》框架
》设计模式
》用户界面事件处理器
参见下图。
获得用户界面事件处理器设计模式的方法很简单,在LabVIEW启动界面选择:
》新建(更多...)
》VI
》基于模板
》框架
》设计模式
》用户界面事件处理器
参见下图。
用鼠标双击该模板即可打开一个用户界面事件处理器,参见下图。
使用这个用户界面事件处理器模板,一般具有一定LabVIEW编程基础的用户基本上都能够完成一些简单的设计任务。
下面我们通过几个具体的实际应用实例来进一步了解事件处理的程序设计方法。
下面我们通过几个具体的实际应用实例来进一步了解事件处理的程序设计方法。
9.6.2 用户界面事件处理器应用之一——鼠标双击事件
在前面版设计中,我们希望能够响应用户的鼠标双击事件。比如:用鼠标双击某控件后,实现该控件的“即时帮助”中的内容显示。
下面我们就来看这个例子。
下面我们就来看这个例子。
例:9.6.2-1 鼠标双击事件
该例子的前面板上有一个数值显示器控件和一个按键开关(停止)控件。我们期待鼠标双击数值控件后,显示“即时帮助”信息窗;当鼠标单击前面板的其他位置时,该信息窗关闭;当按下停止按键时程序停下来。前面板图参见下图。
我们对以下三个用户界面事件进行了处理。
(1)“Stop”:值改变——发出运行程序退出
(2)“电压数值显示”:鼠标按下——鼠标双击事件发生,开启“即时帮助”窗口
(3)“Pane”:鼠标按下——鼠标单击前面板事件发生,关闭“即时帮助”窗口
各事件处理程序,参见下图。
(1)“Stop”:值改变——发出运行程序退出
(2)“电压数值显示”:鼠标按下——鼠标双击事件发生,开启“即时帮助”窗口
(3)“Pane”:鼠标按下——鼠标单击前面板事件发生,关闭“即时帮助”窗口
各事件处理程序,参见下图。
感兴趣的可以在这里下载该实例程序。
| 9.6.2-1_.rar | |
| File Size: | 9 kb |
| File Type: | rar |
9.6.3 用户界面事件处理器应用之二——用户按键操作
一般我们设计的应用程序的基本流程如下图所示。
其中:
Top VI.vi(Main.vi)——是首个运行的程序(它类似于C语言中的“Main”函数),一般被用来引导用户界面的初始化(提供应用程序名称、版本号等)、导入INI文件、用户信息初始化等等。该程序运行结束时(关闭之前),通过Call_Subvi动态调入App.vi主应用程序。并一直等待用户的下一步操作。
Call_Subvi.vi——完成动态调用App.vi应用程序,并打开和运行App.vi,同时关闭Top VI.vi(Top VI.vi退出,显示App.vi的前面版)。实际上是一种程序流程控制权转交,所以在流程图中用单方向箭头表示。
App.vi——程序运行流程的控制者。采用事件结构处理来自[Test_1]、[Test_2]、[Test_3]、[Test_4]以及[退出测试]等用户界面按键的响应。
Call_Subvi_Do.vi——也是程序动态调用的一种形式,他根据用户的实际操作结果来动态调用Test_1.vi( 或Test_2.vi、 Test_3.vi、 Test_4.vi)中的某一个测试程序。直到该测试程序运行结束后返回App.vi,进一步等待其它按键按下。所以在程序流程图中用双箭头表示。
如果[退出测试]按下,整个应用程序退出。
Test_1.vi( 或Test_2.vi、 Test_3.vi、 Test_4.vi)——不同的测试程序,每个测试程序中可能包含状态机、生产者/消费者等结构。
按照这样的思路,我们创建一个名子为:LV2010(GUI_Event_Key)的文件夹。在该文件夹下包含所有VI。参见下图。
Top VI.vi(Main.vi)——是首个运行的程序(它类似于C语言中的“Main”函数),一般被用来引导用户界面的初始化(提供应用程序名称、版本号等)、导入INI文件、用户信息初始化等等。该程序运行结束时(关闭之前),通过Call_Subvi动态调入App.vi主应用程序。并一直等待用户的下一步操作。
Call_Subvi.vi——完成动态调用App.vi应用程序,并打开和运行App.vi,同时关闭Top VI.vi(Top VI.vi退出,显示App.vi的前面版)。实际上是一种程序流程控制权转交,所以在流程图中用单方向箭头表示。
App.vi——程序运行流程的控制者。采用事件结构处理来自[Test_1]、[Test_2]、[Test_3]、[Test_4]以及[退出测试]等用户界面按键的响应。
Call_Subvi_Do.vi——也是程序动态调用的一种形式,他根据用户的实际操作结果来动态调用Test_1.vi( 或Test_2.vi、 Test_3.vi、 Test_4.vi)中的某一个测试程序。直到该测试程序运行结束后返回App.vi,进一步等待其它按键按下。所以在程序流程图中用双箭头表示。
如果[退出测试]按下,整个应用程序退出。
Test_1.vi( 或Test_2.vi、 Test_3.vi、 Test_4.vi)——不同的测试程序,每个测试程序中可能包含状态机、生产者/消费者等结构。
按照这样的思路,我们创建一个名子为:LV2010(GUI_Event_Key)的文件夹。在该文件夹下包含所有VI。参见下图。
有关程序代码这里仅给出了两种动态调用的程序代码,其它程序代码感兴趣的可以在这里下载。
| lv2010gui_event_key.rar | |
| File Size: | 701 kb |
| File Type: | rar |
这种通过按键开关切换选择不同测试程序的方法,对于只有少量测试分支的应用程序设计是简单而有效的。当测试项目类别多于一个,测试分支较多的的情况就显得不适用了。解决这类问题的方法就是选择菜单形式的事件处理方式。
9.6.4 用户界面事件处理器应用之三——用户菜单操作
用户界面事件处理程序——菜单操作的程序流程与图9-35所示的程序流程相同,我们只是将其中的App.vi进行了一些设计上的改动,其它的子vi保持不变。
所以,本节中我们仅讨论App.vi的程序设计问题。
与上节操作基本相同,我们首先创建一个名称为:LV2010(GUI_Event_Menu)的文件夹。并将 LV2010(GUI_Event_Key)文件夹中所有文件拷贝到 LV2010(GUI_Event_Menu)的文件夹中。
然后我们重新设计LV2010(GUI_Event_Menu)文件夹中的App.vi。
下面我们就来开始设计菜单式GUI事件处理程序。
首先,打开LV2010(GUI_Event_Menu)文件夹中的App.vi,并开始修改该vi的属性。
在自定义窗口外观选项中选择:
勾选<显示菜单栏>选项。参见下图。
所以,本节中我们仅讨论App.vi的程序设计问题。
与上节操作基本相同,我们首先创建一个名称为:LV2010(GUI_Event_Menu)的文件夹。并将 LV2010(GUI_Event_Key)文件夹中所有文件拷贝到 LV2010(GUI_Event_Menu)的文件夹中。
然后我们重新设计LV2010(GUI_Event_Menu)文件夹中的App.vi。
下面我们就来开始设计菜单式GUI事件处理程序。
首先,打开LV2010(GUI_Event_Menu)文件夹中的App.vi,并开始修改该vi的属性。
在自定义窗口外观选项中选择:
勾选<显示菜单栏>选项。参见下图。
下面开始设计运行菜单,打开App.vi。首先清除掉原有的按键开关Test_1至Test_4,然后选择文件栏中的“编辑”》“运行时菜单”,参见下图。
用鼠标双击上图中的“运行时菜单”,开发系统会弹出一个“菜单编辑器”,在这里编辑运行时菜单。见下图。
将原来的“默认”选项修改为“自定义”。并将该文件(GUI_Event_menu.rtm)保存到文件夹中。
如何进行菜单的设计许多书籍都做过介绍,这里就不谈了。具体结构参见下图。它包含了一个Test主菜单和相对应的四个子菜单。
如何进行菜单的设计许多书籍都做过介绍,这里就不谈了。具体结构参见下图。它包含了一个Test主菜单和相对应的四个子菜单。
它的程序框图设计也很简单,也是采用事件处理方式,先设定一个“菜单选择(用户)”的事件结构。在这个事件结构下通过一个case结构来选择不同的Test_x程序。程序框图参见下图。
按上图设计好菜单程序后。运行Top.vi,可以看到下图所示的程序界面。可见,原来的按键切换方式已经用菜单的方式来代替了。运行结果是完全一样的。
试运行一下程序,感觉如何?如果测试项目分类较多选择这种方式还是相对好些。
| lv2010gui_event_menu.rar | |
| File Size: | 696 kb |
| File Type: | rar |