基于Windows操作系统的通用状态指示器设计
2018-03-21张翔宇蔡文斋刘剑锋
张翔宇 蔡文斋 刘剑锋
摘 要 本文设计了数个通用状态指示函数,用于解决Windows环境下应用程序中各种状态指示问题。这些函数利用界面可视组件设计,包含各种状态指示所需的参数并使用变体数组类型作为输入。定义了一组公有数据数组作为函数与实际工程应用的内存交换区,调用前将界面元素及协议提示信息传递给该交换区,以便于多次调用时调用方式一致。设计了可视条件参数,该参数可控制状态指示个数。设计了一款调用函数的调试程序,能在实际工程函数调用前给出调用效果。以上函数可结合具体工程项目通信协议快速调用,从而提高开发者效率。
【关键词】状态指示器 标签组件 形状组件 图形组件 协议
任何控制类或相关应用项目软件开发时,都会遇到这样的问题:在通讯协议中,使用某些字节表示状态变化。这样的状态表示字节在通讯协议中可能占几个字节,字节中每一位代表一种状态。每个字节就可代表8个具体物理参数状态。在工程项目中,假定通信协议中有7个状态字节,那么就有7*8=56种状态指示,这就需要设计并制作出这56个状态指示图标。并以不同的颜色表示相应的状态(例如,绿色代表正常,红色代表异常)。当工程项目改变后,通讯协议随之发生变化。开发者则又要依据工程要求编写大量的状态指示代码。
本文试图针对形式各异的通讯协议,设计一种在Windows操作系统下的通用状态指示器,以节省大量的代码工作量,提高程序开发效率。
现代的开发工具中,可视化状态指示组件较多,本文以Rad Studio XE10.0中的Delphi语言为例展开讨论。
1 状态指示器基本内容
状态指示器通常情况下信息表示应该为:状态输入值、告警信息级别、告警指示形状、背景颜色、前景颜色、字体前景颜色、字体背景颜色、可视性控制变量等。
状态指示器经常使用可视组件的标签组件、形状组件、图形组件来表达。本文使用这三种可视组件制作了4个通用函数来表达工程中各种状态指示问题。其中,3个函数用于各种“2值”逻辑状态指示问题,1个函数用于各种告警级别逻辑指示问题。
1.1 “2值”逻辑问题
状态输入参数值为典型的“2值”逻辑问题。例如,为0代表正常,为1代表异常。
1.2 告警级别逻辑问题
该信息为多值逻辑问题,例如表示天气状况的指示问题,“0”代表晴天,“1”代表小雨,“2”代表中雨,“3”代表大雨等。在这种逻辑下,雨天表示方法就要使用不同颜色。
1.3 其它问题
在使用形状组件和图形组件作指示器时,函数参数中哑元应为:状态输入参数、形状参数、状态指示前景颜色、状态指示背景颜色,应具备可视控制参数。如果带Hit支持功能(当鼠标移动到这个图形时能够自动指示)则应该设计正确指示标题、错误指示标题。
2 通用状态指示器函数设计
共设计三个函数。此三个函数形式相仿,分别使用Timage组件、Tshape组件和Tlabel组件作为界面可视组件表示状态指示,其中输入字节表示一次性处理8种状态,所以其它哑元参数为动态指针型。
下面以标签组件Tlabel作为例说明该通用函数形式化参数设计方法。状态输入参数为1字节,表示8个指示状态,该函数调用后同时处理8个状态指示,状态信息级别参数表达在异常情况下告警级别。部分代码段为:
Procedure DisplayLableLamp(
InputB:Byte;//输入字节
Modellevel:Byte;//状态信息级别
RzLabel:Array of TRzLabel;//界面可视组件
BackColor:Array of TColor;//背景颜色
FrontColor:Array of TColor;//前景颜色
PenColor:Array of TColor;//字体前景颜色
PenErrColor:Array of TColor;//字体背景颜色
Visible:Array of Boolean;//可视性控制变量
OKCaption:Array of String;//正确提示字符串
ErrorCaption:Array of String);//异常告警提示字符串
来一段实际代码,判断输入某位为1或者0时的处理。
var
i:integer;
begin
if (InputB and $01)=$01 then
begin
RzLabel[0].Color:=FrontColor[0];
RzLabel[0].caption:=OKCaption[0];
RzLabel[0].Font.Color:=PenColor[0];
end
else
begin
Case Modellevel of
0:begin
RzLabel[0].Color:=BackColor[0];
RzLabel[0].caption:=ErrorCaption[0];
RzLabel[0].Font.Color:=PenErrColor[0];
end;
......//其它情況处理代码略。
end;
......//其它位处理代码略。
end;
For I:=0 To 7 do
RZlabel[i].visible:=visible0[i];//可视性控制。
3 调用方法
3.1 参数赋值
函数写为动态数组引入参数形式,在实际使用时,工程开发者首先预留出实际调用实参接口,在调用函数前,首先依据具体工程的协议定义赋值实参变量,将界面对应的标签或者形状组件名赋给对应实参变量。
因为函数与开发界面无关,所以在真实调用函数前,才知道哪个指示等代表哪个实体标签组件或者形状组件。
3.2 调用代码
下面为一段真实调用的例子代码。
//-----------公用变量-------------------
Shape:Array[0..7] of TShape;
RzLabel:Array[0..7] of TRzLabel;
BackColor:Array[0..7] of TColor;
FrontColor:Array[0..7] of TColor;
PenColor:Array[0..7] of TColor;
PenErrColor:Array[0..7] of TColor;
Visible0:Array[0..7] of Boolean;
OKCaption:Array[0..7] of String;
ErrorCaption:Array[0..7] of String;
begin
//CALL 调用按钮,在实际调用前依据通信协议及界面元素名称赋值给公用变量。
Shape[0]:= Shape1;//实际形状组件
Shape[1]:= Shape2;
......
RzLabel[0]:=RzLabel24;//实际标签组件,界面元素
RzLabel[1]:=RzLabel25;
......
inputB:=RzNumericEdit1.IntValue;//测试输入数据,或者协议中某状态字节输入变量。
Modellevel:=ModellevelByte;//状态信息级别
Visible0[0]:=RzCheckBox9.Checked;//测试可视控制组件,
Visible0[1]:=RzCheckBox10.Checked;
......
OKCaption[0]:=RzEdit1.Text;//測试正确提示
OKCaption[1]:=RzEdit2.Text;
......
ErrorCaption[0]:=RzEdit9.Text;//测试异常提示
ErrorCaption[1]:=RzEdit10.Text;
......
FrontColor[0]:=RzColorComboBox1.SelectedColor;//测试前景色设置
FrontColor[1]:=RzColorComboBox2.SelectedColor;
.......
BackColor[0]:=RzColorComboBox9.SelectedColor;
BackColor[1]:=RzColorComboBox10.SelectedColor;//测试背景色设置
......
PenColor[0]:=RzColorComboBox17.SelectedColor;//测试字体前景颜色设置
PenColor[1]:=RzColorComboBox18.SelectedColor;
......
PenErrColor[0]:=RzColorComboBox25.SelectedColor;//测试字体背景
PenErrColor[1]:=RzColorComboBox26.SelectedColor;
......
//----------调用函数---------------------
DisplayLableLamp(InputB,
Modellevel,
RzLabel,
BackColor,
FrontColor,
PenColor,
PenErrColor,
Visible,
OKCaption,
ErrorCaption);
end;
3.3 标签可视化处理
函数参数为动态数组,每一个输入字节位都对应一个参数值。实际调用时同时控制8个状态指示。每一个都可以单独设置表现效果。
下面说明如果应用监控程序中只有22种状态指示时如何调用函数的方法。注意该函数每次处理8个状态,可视性控制变量控制到底有几个显示。这样,当只有22位状态时,函数仍处理为24个状态指示,开发者需要在界面上放置24个可视组件,调用时将2个多余的可视组件Visible参数设置为假,这样界面上就只显示22个状态指示。这样,在工程应用中,无论多少状态指示问题,都可以用这一个函数统一方法处理,不过是多次调用而已。
4 调试样例编程
为了调试出这个通用函数,设计了一个专用调试界面,通过界面按位输入组件及其它输入参数设置可以调出各种指示效果。在应用程序界面设计前,就可以给出各种未来指示效果,这样在应用程序开发时就提前设计出了实际效果。图1为某天线伺服控制的监控程序中某8个状态指示位调用例子效果。
这三个通用函数解决了各种状态指示问题,特别是使用Tshape和Timage时可以制作为状态各异的效果。如果希望作出更专业的效果,可以将这些组件换成专业的第三方组件包中的相应组件。例如Raize组件包等,这样制作出的状态指示将会更酷炫。
形状与图形函数(应用Timage组件和Tshape组件)同理。
5 结语
本文介绍了使用Delphi XE10开发工具设计的一套状态指示统一函数处理方法,与具体控制工程项目无关。在实际使用中,结合具体控制项目协议定义,只需赋值各参数与界面元素一致。调用时自动给出效果,这种处理方法解决了所有这一类问题。本文给出的调用例子可以给出每一位的表现效果,在正式开发程序之前,就可以提前看到执行效果并观察各种字体、配色等是否合适。
应用其它语言开发时,如果使用该方法设计出相似的功能函数同样可以解决各种状态指示问题,构造的通用函数可在多个工程项目中使用。这将节约大量有关状态指示需要处理的代码段编程,大幅提升编程效率。
参考文献
[1]蔡文斋.实时监控程序的实验室快速调试开发[J].计算机与网络,2015(02):58-62.
[2]蔡文斋.全抽象监控软件实现[J].飞行器测控学报,2009(04):65-68.
[3]王艳平(著).Windows網络与通信程序设计(第2版)[M].北京:人民邮电出版社,2009(01):203-210.
[4]蔡文斋,王录选.跟踪、随动系统监控软件设计[J].现代电子技术,2007(03):29-31.
[5]周爱民(著).Delphi源代码分析[M].北京:电子工业出版社,2004(09):193-205.
[6]苏春晓,王鹏.基于网络的数字示波器远程集中软件平台[J].太赫兹科学与电子信息学报,2014,12(06):884-889.
[7]赵晓玲(著).可视化程序设计—Delphi [M].北京:机械工业出版社,2005(01):251-258.
[8]周爱民(著).Delphi源代码分析[M].北京:电子工业出版社,2004(09):193-205.
[9]Jeffrey Richter(著),王书洪,刘光明(译).Windows高级编程指南(第3版)[M].北京:清华大学出版社,1999(01):263-269.
[10]朱汉民(著).Delphi7高级应用开发教程[M].北京:科学出版社,2006(01):215-218.
作者简介
张翔宇(1983-),河北省秦皇岛市人。硕士学位。工程师。主要研究方向为遥感信息接收与处理、计算机仿真等。
蔡文斋(1962-),陕西省西安市人。工程硕士。高级工程师。主要研究方向为航天测控工程开发研究、工程控制类应用开发研究,软件测试等。
刘剑锋(1972-),黑龙江省绥化市人。博士学历。高级工程师。主要研究方向为航天测控工程开发研究,遥感信息处理等。
作者单位
1.北京市遥感信息研究所 北京市 100011
2.中国电子科技集团公司第39研究所 陕西省西安市 710065