在程序的设计中,遇到了一个需求,就是我的面板上需要有一个按钮,按下按钮后弹出一个窗口,在新窗口中有一个二维的表格,用户可编辑二维表格中的数据,最后可以通过保存按钮选择路径保存该组数据,保存的格式为*.csv,方便后续的读取操作。下面来给大家分享一下我的制作过程。
一.窗口vi的制作
首先,要实现弹窗,除了使用Labview自带的对话框函数外,都得先自己创建一个窗口,即有窗可弹。我们的任务是实现二维数组的保存,因此我们就创建一个新的vi,在其中添加二维数组的电子表格,实现数据的输入,接着再运用Write To Spreadsheet File.vi(图一)这个函数进行电子表格的写入操作。
图一
我们可以看到该函数有许多的参数需要我们设置,依次将这些参数根据需要设置好后,就完成了一个最简单的程序,运行后可以直接把电子表格写入固定预设好的路径。但是如果用该函数自带的路径对话框,出现的对话框可调范围比较窄,因此我们需要在文件路径前增加一个选择路径的文件对话框函数(图二),我们可以看到这个函数对于对话框的参数设置比较详细。
图二
在设置好相应参数后,再加一个循环,并且添加保存按钮后,就做成了简易的文件保存的小程序。如下图(图三):
图三
但是这个程序存在有如下问题:
1. 保存按钮按下后布尔值改变,出现无限循环保存的情况。
解决方法:将按钮的动作调成单击时触发,如下图(图四):
图四
这样就可以在系统读取按钮变化后返回初始状态。
2.弹出选择路径对话框后,如果按下取消按钮,则系统会报错。
解决方法:开始的时候尝试了使用错误擦除函数,但是当针对文件对话框函数的错误被擦除后,因为Write To Spreadsheet File.vi函数的文件路径没有接收到参数,所以又弹出了一个选择路径的对话框,该对话框不是我们需要的,而且关闭后报错,所以擦出错误这条路是行不通的。第二种方法是巧用if else语句,因为当在选择路径的对话框下点取消后,必定会产生一个错误,所以我们就可以将情况分为有错误的情况(点击取消)和正常情况(保存确认),这种二分支的结构刚好可以使用if else语句,当正常情况下执行Write To Spreadsheet File.vi函数,而错误情况下不执行该函数,这样既消除了错误,也避免了Write To Spreadsheet File.vi函数带来的二次弹窗,改动后的程序如下图(图五):
图五
前面板如下图(图六):
图六
二.弹窗程序的实现
制作完窗口vi后,我们需要将窗口vi保存为一个子vi,在我们的主程序中通过一个按钮来调用,实现弹窗。
在引用中,我们也是通过if else语句判断按钮的状态来实现的。
首先,我们在前面板添加一个按钮,如图七:
图七
接着对按钮进行一些必要的设置,如图八:
图八
我们便可以通过一系列对vi调用的函数进行调用,包括vi路径的选择,vi前面板的打开以及vi的运行。最后可以通过一个while语句保持对按钮状态的实时读取。编好的程序如下图(图九):
图九
但是在程序的运行中,存在以下问题:
当弹出子vi并且执行完保存的步骤后,点击右上角的关闭按钮关闭该窗口,如果再次点击按钮调用该vi时,系统就会报错,如下图(图十)所示:
图十
错误代码为1198,错误的原因在于我们只是关闭了窗口,却没有中断这个vi的运行,它任然在后台继续运行,因此再去调用的时候就出现了错误。要解决这个问题,我们要做的就是在销毁窗口的时候同时结束这个vi的进程,但是如果让用户去主动点一下停止,然后再去关闭窗口的话,用户体验就会很差,而且有的用户会因为不知道流程二导致系统出错,因此需要解决的是关闭窗口必须和结束进程同步,二者的动作只能由一个按钮去控制。要解决这个问题,第一种方法是直接设置vi的属性,在vi属性设置栏里边有窗口外观的选项,在该选项卡里有一个自定义选项,可以自定义窗口外观,如图(图十一)所示,在自定义外观里选中调用时显示前面板和如之前未打开则在运行后关闭这两个选项,便可以实现。但是在实际运行中却因为某些原因这个功能失败了,因此我尝试了第二种方法。
图十一
第二种方法是直接使用代码去实现,首先,对于窗口vi,我们禁用关闭按钮,使用户不能使用关闭按钮来直接关闭窗口,接着禁用程序的运行和终止按钮,使用户不能通过该按钮来直接终止程序,导致程序结束运行但是窗口还在显示这种错误。在禁用完这些按钮后,我们发现程序无法关闭了,这显然也是不行的,我们可以直接使用一段代码来实现程序的终止和窗口的关闭。我们还记得在写窗口vi的时候,我们使用了while语句来实现程序的持续运行以及对表格上二维数据的实时监测,而while语句通过布尔量来实现循环的跳出,若该循环跳出则程序结束,因此我们可以在此处动手,实现当布尔量发生变化时,既程序关闭时销毁窗口,在这里我们用到的同样是if else语句,以及vi服务器引用这个函数,在该函数上右键→创建→vi类的方法→前面板→关闭,即可实现一个前面板的关闭功能,如图十二所示:
图十二
在有个这个功能后,我们需要将它和程序的结束按钮连接起来,实现同步动作,使用条件语句,当关闭按钮按下时,销毁窗口并且停止程序的运行。如下图(图十三)所示:
图十三
当关闭按钮没有动作时,其布尔值为假,直接传递给while循环,当关闭按钮按下,布尔值变为真,就先执行关闭前面板,然后停止程序运行,这样即可解决这个问题。
如果您想了解跟多虚拟仪器的信息,敬请登录www.hkaco.com或发邮件到hw@hkaco.com与我联系。
ltt_111629626 2015-10-10 12:03
用户1766950 2015-10-10 11:10
用户1649855 2015-10-10 11:07
用户377235 2015-10-10 11:06
用户377235 2015-10-10 11:06
用户1842468 2015-10-10 11:04
用户1702890 2015-10-10 11:04