设计可调节大小的程序界面7 – 一些注意事项

https://labview.qizhen.xyz/

有些控件不能改变尺寸

LabVIEW中并非所有的控件都大小可调。大多数尺寸固定的控件都是用来给子VI输入输出参数的,不会用到用户界面上。但也有一些会用于界面,尤其是一些系统风格的控件,比如单选框、复选框控件等。

image

有些控件必须保持长宽比

大多数LabVIEW控件可以分别设置它们的高度和宽度。但有一些控件,比如仪表盘、旋钮等,它们的形状是固定的,只能是正圆。也就是无论大小如何,长宽始终保持一比一。

对于这样的控件是不能使用“Scale Object with Pane”,“Fit Control to Pane”的,LabVIEW对于这类控件大小的自动调整存在bug。对于它们,只能使用编程的方式调整尺寸。

image

界面最小尺寸

无论采用哪种方式调整界面布局,最好都为界面设置一个最小尺寸。因为任何控件都不可能无限小,所以整个界面缩的太小对于用户也是没有意义的。

image

广告

设计可调节大小的程序界面6 – 借助分隔栏调整控件的位置与尺寸

https://labview.qizhen.xyz/

对于比较复杂的界面,借助于分隔栏同样可以不编程就调整控件的尺寸和位置。我们用下面这样一个比较复杂的界面为例:

image_thumb5

这个界面包含五个控件,假设界面要求如下:水箱、油箱、波形图三个控件需按比例随界面尺寸调整,但他们三个控件之间的距离,以及它们距离界面边框的距离不能变化;信息框的长度随界面调整,但高度不变;停止按钮尺寸保持不变,且始终在界面右下角。

我们可以使用分隔栏来定位每个控件的位置。我为了方便在编辑时调整控件尺寸,以及确保控件尺寸和位置在多次调整界面大小后仍然准确,设置了较多的分隔栏。原则是让每个需调整尺寸的控件都有一个可以撑满的窗格。 之后,在控件的右键菜单中选择“Fit Control to Pane”,让它们的尺寸始终与窗格保持一致。

image_thumb9

水箱、油箱、波形图、信息四个控件都需要设置为撑满窗格,而停止按钮由于大小不变,不需要有此设置。

我做的例子是比较极端的情况,一般来说不设置这么多分隔栏也可以,只要能保持每个窗格内只有一个跟随界面调整的控件就可以了。

界面上各个控件变化方式不同,全在于分隔栏对齐方式的设置。下图是分隔栏对齐方式的设置:

image_thumb15

实际用户的界面一般不会希望显示这么多的分隔栏,可以参考前文介绍的分隔栏隐藏方法将其隐藏。

设计可调节大小的程序界面5 – 仅改变一个主控件的尺寸

https://labview.qizhen.xyz/

大多数程序界面上,只需要有一个能够缩放的控件撑满屏幕就可以了,其它控件没必要调整,只要他们的布局不乱就好。

比如对于有一个波形图控件和一个停止按钮控件组成的界面,我们只需要波形图随界面尺寸的调整而变化。那么我们只要在这个控件右键菜单中选中它的“随方格缩放”属性就可以了。每个界面方格只能有一个控件被设置成随方格缩放。

被设置成这一属性的控件四个边沿的延长线都被深色标注出来了。当界面尺寸被调整时,控件四边到相应的VI前面板四边的距离是不变的,只有被这个四条深色实现包裹出来的矩形区域的尺寸会随界面一起变化。这样一来,可以保证程序的主控件随界面尺寸变化,而其它的控件位置保持稳定。

image_thumb17

若主控件有多个,比如说界面上有两个同等重要的波形控件,那么只要把两个主控件Group在一起。由多个控件绑成的组,在外观布局上的行为属性与单个的控件是类似的。把这个组设为“随窗格缩放”,组里的控件就都可以随界面尺寸一起变化了。

image_thumb6

当界面尺寸发生变化,上图中的“开始”和“停止”按钮之间的距离也会变动,因为他们一个靠近边界线左端,另一个靠近右端。若需要这两个按钮的相对距离保持不变,也把它们绑成一组就可以了。

豆豆逛街

最近每个周末都领豆豆去商店逛。

俺们坐的是地铁
DSC02236

从肇嘉浜路出发,一站就到徐家汇了。
DSC02229

玩具店里好东西真多啊。豆豆看上了一个“歌唱小精灵”,可惜这个玩具不适合小小宝。后来豆豆又看上人家的小钢琴了:
DSC02244

商店逛累了,豆豆跑去下馆子。饭馆名叫麦当劳,可惜里面没有豆豆能吃的东西。豆豆休淘气了一会儿就走了。
DSC02261

豆豆玩了一天,浑身是汗。回家赶快洗澡
DSC02190

洗完澡睡一觉,豆豆最近喜欢趴着睡
DSC02276

最近天热,豆豆在家里穿上肚兜了。
DSC02096

设计可调节大小的程序界面4 – 等比例改变所有控件的尺寸

https://labview.qizhen.xyz/

如果界面简单,只有一个窗格,当界面尺寸变化时,界面所有控件都可以按比例调整自身大小,则只要在VI属性中设置一条“按窗口大小缩放所有控件尺寸”就可以了。

image_thumb14

这样设置之后的效果是整个界面按比例缩放,所有的控件都一同变化。但是它并不太精确,反复调整界面尺寸几次,再回复到最初的大小,可能会发现有些控件尺寸有少许改变。这是因为前面板的尺寸和控件的尺寸都只能是整数,这样每次调整界面后,控件与前面板尺寸的比例都会有所变化。也就是说每次界面调整都会引入误差,累积误差还是比较明显的。

设计可调节大小的程序界面3 – 编程调整控件的位置尺寸等属性

https://labview.qizhen.xyz/

在我自己编写过的VI中,用作界面的并不多:一个项目中,可能只有几个VI的界面需要显示给用户看,其它几百个VI都只用得到程序框图。由于涉及界面的VI并不多,但凡需要调整界面尺寸的,我都是使用了在程序中动态调整控件的尺寸与位置的方法。当程序接收到PaneSize这一事件后,根据新的界面的尺寸,重新计算每个控件的位置和大小。

比如下面这个程序界面包含一个波形图控件和一个停止按钮。

image_thumb2

当用户改变界面尺寸时,我们希望停止按钮始终停靠在界面右下角,而波形图控件则撑满剩下的界面空间。这些变化都可以通过编程来设置,示例程序如下:

image_thumb11

使用编程的方式使控件布局符合变化的界面尺寸,其优点是调整精确稳定。有些控件,比如仪表盘控件,只能通过这种编程的方式才能准确调整其大小。编程的缺点是较为繁琐。对于比较简单的界面,可以考虑使用分隔栏帮助界面布局,省去编程的繁琐。

设计可调节大小的程序界面2 – 窗格和分隔栏

每个VI有一个前面板(Panel),每个前面板又可以是由多个窗格(Pane)组成的。默认情况下,比如新建一个VI,这个VI的前面板就是有单个一个窗格组成的。由于大多数情况,每个面板只有一个窗格,以至于很多人都忽略了窗格的存在。但是在编程时,一定要意识到:LabVIEW程序中的控件是摆放在窗格上,而不是前面板上的;窗格才是摆放在前面板上的。

使用分隔栏可以在前面板上分割出更多的窗格来。分隔栏在控件选板“[xx风格]->Containers”中。分隔栏有横竖之分,可以把原有的方块按照不同方向分成两块。控件无论被放在哪个窗格里,对程序功能都没有影响,只对程序外观有影响。

当前面板的大小改变时,分隔栏也可以跟着移动。在分隔栏的鼠标右键菜单中可以设置一个状态栏跟随面板的哪个边沿一起移动,或者是按比例移动。

image_thumb3

在分隔栏的右键菜单最后两项用来设置分隔栏两侧窗格的一些属性。比如,界面划分成窗格后通常不需要显示窗格内的拖动条,在这里可以在这里找到相应设置的子菜单禁止其显示。

在分隔栏的属性也可以通过程序在运行状态下通过程序来设置。它算然不像控件那样在程序框图上有个接线端,但却仍然可以使用右键菜单创建它的属性节点和调用节点。有了这些属性和方法,就可以在程序中调整分隔栏的位置等属性了。比如下面这段程序可以从左到右挪动上图状态栏的位置。

image_thumb1

在程序运行时,用户仍然可以再界面上移动分隔栏。若不希望用户改变分隔栏位置,可以在分隔栏的右键菜单中选中“Lock”,这样分隔栏的位置就被锁定了。

分隔栏没有隐藏属性。若希望程序运行时看不到分隔栏,可以通过改变分隔栏颜色来达到“隐藏”的目的。首先,把分隔栏的风格改为经典“Classic”,然后把它的颜色染成与程序框图相同,这样就程序运行时就看不到分割栏了。顺便提一句,分隔栏两侧的窗格是可以有不同背景色的。

窗格也是没有隐藏属性的。在程序运行时需要隐藏某个窗格,只要调整它周围分隔栏的位置,把这个窗格缩起来就行了。

 

 

 

 

设计可调节大小的程序界面1

程序的界面应该有多大呢?如果程序可能会被很多用户使用,就难免会运行在各类尺寸的屏幕上。如果界面太大,小尺寸的显示屏就无法完全显示;如果界面太小,对于大显示屏来说又是一种浪费。从用户体验的角度考虑,最好程序的界面尺寸是可调的,用户可以选择适合自己的任意尺寸。

程序界面尺寸发生变化,界面上的控件也必须随之调整。控件跟随界面尺寸变化有两种方式:

一种是控件尺寸需要跟随调整的。数据量较大的控件,比如波形显示控件,表格,大文本框等,常常需要调整尺寸以获得尽量大的显示区域。

而有些控件的尺寸最好是固定的,比如按钮,选择框等控件。它们虽然不需要调整尺寸,但是当界面尺寸变化时,它们的位置可能需要调整以获得最佳界面布局。

我打算接下来几天比较一下各种动态调整界面布局的方法,帮助程序员选择最适合当前程序的方法。

豆豆叫爸爸

虽然豆豆早就能发出“爸”这个音了,但他一直不太爱说这个字。直到最近一个星期,他突然就喜欢上叫“爸爸”了,时不时就叫几声。难道是因为我最近哄他玩的很开心?豆豆也能发“妈”的音了,但也几乎不怎么说。周末我又心血来潮,让豆豆叫“Daddy”,他居然就daddy, daddy的叫起来了。豆豆妈在一旁嫉妒的不得了。

《寻路中国》读后感

有一阵子没怎么读书了。最近找到了一个比较适合阅读的零散时间:上下班的地铁上。为了方便携带,我还特意买了一部Kindle(电纸书)。Kindle到手后,就随意在网上找了几部书来看。可能这本《寻路中国》是比较热门的新书,最先下载的几本书里就有它。

我看的是这本书的英文原版《Country Driving: A Journey Through China form Farm to Factory》,作者:Peter Hessler,这是我读过的第一部非科技类的英文原版书。科技类的书侧重介绍内容,词汇和语法都比较基础,即便英语水平不高,也较容易读懂。文艺类的书,语言本身也是看点之一,通常都比写得比较花哨,读起来难度就大了。还记得我大学那会,刚考过4级就以为自己可以阅读英文原著了,于是去书店随手买了一本,不幸却是《基督山伯爵》。回到寝室读了一页,一半的单词都不认识。我一下子就伤到了,从此再没读过英文原版小说。不过这本《Country Driving》属于纪实文学,比小说的语言朴素,没有太多文邹邹的修饰。而所写的故事又是发生在中国的,不存在文化差异,所以我读得还算比较顺畅。

《Country Driving》写的是一位美国作家在中国真实经历,就连书中的人物都是实名的。全书分三个部分:第一部分是作者两次沿着长城走向自驾游的见闻;第二部分记录了北京附近一户村民几年里的生活变化;最后一部分记录的是浙江一家民营工厂里工人们的生活。

书中翔实记载了村民和工人们的生活环境,经济收入,每日作息,乃至他们的心理活动,思想斗争等。我虽然生在中国,但也不曾接触过村民和农民工们的生活,所以读起来很有新鲜感。比如说中描述了一次村基层换届选举的过程:这种选举普通村民是没份参加的,但即便是党员也对现任的无能又腐败的村支书表示不满,企图另选他人。镇政府了解到这一情况后,派人到村里找党员逐个谈话,要求他们投票给现任支书。实际结果就是选举形同虚设。

外国人写中国的事,一大优点就是能够发现那些我们早已习以为常的不合理的地方吧。纵观全书,我不觉得作者对中国有偏见,但是他对于一些落后思想和制度的嘲讽还是非常辛辣的,不知道这些意味是否会在中文译本中体现出来。

中国人的起源

据说在汉族人特有的身体特征中,最具普遍性的是複型小指甲:一只脚或双脚的小脚趾甲是分成左右两片的。我观察了一下身边的亲人,看他们是否符合这一特征。就我观察的的有限的几个人来说,南方(江南)人複型小指甲比较明显,北方人不明显。我自己身上南北方的基因各占一半:我记得我小时候是有複型小指甲的,可是今天举起脚丫来一看,竟然没了。老婆家祖上好几代都生活在山东,她就没有複型小指甲。豆豆也没有,豆豆身上还是北方基因占主的。

关于人类起源,世界公认的观点是单一起源说,也就是:目前世界上所有的人类都起源自非洲,并在不太久远之前(大约7万年前),人类才从非洲走出来,扩散到世界各地。唯一与此矛盾的是中国官方的观点,也就是目前中国教科书上采用的理论,他们认为:世界上其他人种都是非洲猴子变的,唯独中国人是中国猴子变的。若中国人的祖宗独树一帜,很多问题会变得容易解释一些,比如:为什么别国百姓可以走在康庄大桥上,而中国百姓必须在河里摸石头?因为别人是旱猴子变的,而中国人是水猴子变的呗。

我个人还是更相信世界主流的观点,因为这一理论有一个坚实的证据,就是DNA的比对结果。对比两个人DNA的差距,可以计算出他们最近的共同祖先生活在什么年代;综合世界各地人类DNA的比对结果还可以推算出人类迁徙的路径。前些天看了BBC的一个科教节目,其中介绍了中国人的起源。历史上,先后有两批人类祖先先后迁徙到了中国境内,中国人种南北的差异巨大,很可能是因为他们的祖先在7万年前就分化开了。

7万年前,人类离开非洲,踏上亚洲这片土地后,就立刻分散开来,向各个不同的方向开拓。其中的一支,顺着印度洋沿岸,一路向东迁移。直到大陆的最东头,然后折向北方进入中国,这是大约5万年前的事。这一支人的皮肤颜色较深,颧骨较高。

另一路从非洲出来的原始人一直向北走,直达西伯利亚,然后就在那定居了。直到2万年前地球气候开始变冷,西伯利亚变成终年不化的冰川,这一支原始人只得南下求生,从北方进入中国境内。北方寒冷的气候使得这一群人皮肤颜色变浅,脸变扁平,眼睛变小了。这就是蒙古人种的由来。

虽然南方原始人进入中国早了几万年,但看今天中国人的外貌,还是北方来的基因占了主导地位。

豆豆是运动健将

胎动每小时3到5次即达到正常,豆豆在妈妈肚里那会儿,一小时动上三五十次都没问题。医生说这类小宝将来适合做运动员。

豆豆体力超好,每天上串下跳,一刻不停。前两天给他洗澡的时候,他又开始疯狂的踢水。我说咱们这回就让他玩个够,看看他到底能坚持踢多久。于是,他考在我手臂上,两腿交替蹬水蹬了七八分钟,终于累了。我想,这下累到你了吧,可以歇下来好好洗澡了。结果他脚累了玩手:身子往前一倾,开始用手扑腾水。一会手累了,再往后一靠,开始踢水。如此往复几次,地板上水漫金山,爷爷实在受不了了,一把按住他的脚丫,开始强行给他洗澡。

豆豆现在狂爱举高高,只要我朝他伸开双臂说一句“举高高”,他马上就会兴奋的尖叫,然后俩腿猛蹬。由于举高高哄的他很开心,他现在跟老爸感情极好,常常抱着我又啃又亲。

豆豆学会玩手了。现在如果让他“挠”一个,他就会举起小手握拳,张开,握拳再张开。豆豆是个右撇子,目前还只会挠右手。

豆豆抱着爸爸的大腿:
DSC02088

天黑了以后给我租住的房屋窗外照了张像,上海的夜晚亮如白昼
DSC02070

反馈节点 3 – 子VI有多个实例

今天又想到一个问题,于是编程序验证了一下。如果一个包含反馈节点的VI在主VI中有多个调用实例,那么它们之间是共享一个移位寄存器呢,还是每个实例有自己的移位寄存器呢?

这是子VI:
image

这是主VI:
image

程序运行结果如下:
image

看来它们是分享了同一个移位寄存器。

甚至子VI在不同的循环中被调用,它们也还是共用同一个顶层移位寄存器。比如下图这个程序:
image

运行结果:
image

只有把子VI设置成为每个实例都生成副本的可重入运行方式时,不同的子VI实例才会有独立的移位寄存器。

之前介绍的反馈节点内容:https://ruanqizhen.wordpress.com/2008/08/20/循环结构的反馈节点https://ruanqizhen.wordpress.com/2011/05/22/反馈节点

Lucene contrib(贡献软件)下常用模块的功能

Lucene 是一个开源的搜索引擎,它的基本功能是对文本建立索引,帮助快速找到包含关键字的文档。Lucene被广泛的应用到了各种软件中,目前当需要在软件中添加搜索功能时,工程师都首先会想到借助Lucene。虽然Lucene只具备基本的文本索引和搜索功能,但广大工程师在实际应用中对它进行了扩展,添加了大量高级功能,并且将他们的改进贡献了出来。一些最为常用的功能也被收录到了Lucene的发布包中,被放置在contrib文件夹下。

网上对这些附加的模块的介绍比较少,我最近自己研究了一下它们的功能。用于我工作中使用的是Lucene.net,所以我只查看了.net版Lucene所带的功能,可能比java版得要少。

  • Analyzers\Lucene.Net.Analyzers\AR
    阿拉伯语 Analyzer
  • Analyzers\Lucene.Net.Analyzers\BR
    巴西语 Analyzer
  • Contrib.Net
    提供了一个按字母分词的分析器,可以用于子字符串搜索
  • DistributedSearch
    这个项目居然连个工程文件也没提供,所以我也没实验它。从名字来看,大概可以做分布式搜索的。
  • FastVectorHighlighter.Net
    这是一个用于在目标文档中高亮关键词的库。它的功能较Highlighter.Net更为复杂。但是在我所实验的 Lucene.net 2.9.2版本中,它存在严重bug,根本无法使用。
  • Highlighter.Net
    具备简单的高亮关键词的功能。可以把索引中保存的文本拿出来,然后把搜索词从中挑出来。
  • Queries.Net
    这个工具包由多个功能组成:
    • MoreLikeThis
      输入一段文字,然后它可以根据输入的文本生成一个查询语句,在索引库中查找与输入文本类似的文档。它可以用来制作推荐系统:用户找到了一个文档之后,我根据这个文档的内容给用户推荐一些类似的文档。
    • FuzzyLikeThis
      一个用于模糊查找的查询解析器,与lucene自带的FuzzyQuery功能类似,但是使用起来更加简便。
    • BoostingQuery
      允许在查询的时候,设置“上下文词”和提升分数。若搜到的目标文档中包含有“上下文词”,则对目标文档的得分做相应提升(也可以使降低)。
    • TermsFilter
      可以设定一组词作为过滤器,把包含了任意一个词的文档滤出来。
  • Similarity.Net
    包含了MoreLikeThis这一功能。与Queries.Net中那个MoreLikeThis一摸一样。
  • Snowball.Net
    用于词根搜索。西方语言,一个词义会有名词动词等不同词性,在做词根搜索,忽略一个词语的词性和时态,把包含这个词任何一种变换形式的文档都搜出来。
  • Spatial.Net
    为搜索加入距离限制。可以用于地理信息搜索,比如搜索当前位置一公里范围内的加油站。
  • SpellChecker.Net
    如果用户查询的词找不到答案,很可能是拼写错了。这个模块可以给出正确拼写建议。
  • WordNet.Net
    实现同义词搜索。WordNet也是一个开源软件,它是一个字典,也包含了查同义词的功能。

Scratch编程语言 1

八戒2师兄的提示,玩了一下Scratch这个软件。我前面介绍的Modit软件正是模仿了Scratch的编程方法和界面风格,所以两者在编程习惯上完全一致。但这两种软件是应用在完全不同的领域的。

Scratch是由麻省理工开发的一款图形化编程语言,针对儿童,专用于编程实现简单动画效果。我在Scratch的社区下载了几个小朋友们编写的动画游戏,还是非常有趣的。这让我想起了我小时候曾经看到过的LOGO编程语言,从计算机刚刚开始普及,人们就没有忽视如何帮助儿童来学习编写程序。

我猜专为儿童设计的编程语言,短期经济效益不会很高。毕竟除了厂商,愿意为软件开发工具付费的个人不会太多。但这项投资的长期回报是不可忽略的,学生们长大毕业之后,会把曾经的编程经验带入工作中。Modit作为一个纯工业领域的行业软件,完全采纳了Scratch的语法,可见说Scratch的影响力已经从教育迈向了商业领域。

LabVIEW也有针对学生使用的版本,还有和乐高合作生产的专供儿童编程玩乐高玩具的LabVIEW版本。但我觉得不足的是,即便是为学生们使用的LabVIEW依然保持着强烈的测控背景,依然在强调数据采集、测量、控制等功能。如果学生们一提到LabVIEW就想到测控,无疑会限制他们使用LabVIEW的热情和创新。而Scratch这种用来做动画的工具肯定会比做测控的软件更受孩子们欢迎。其实LabVIEW也可以搞个专门编写动画的版本给小朋友们的,让孩子们从小就习惯LabVIEW的语法,以后就离不开它了。