張翔宇 蔡文齋 劉劍鋒
摘 要 本文設(shè)計(jì)了數(shù)個(gè)通用狀態(tài)指示函數(shù),用于解決Windows環(huán)境下應(yīng)用程序中各種狀態(tài)指示問題。這些函數(shù)利用界面可視組件設(shè)計(jì),包含各種狀態(tài)指示所需的參數(shù)并使用變體數(shù)組類型作為輸入。定義了一組公有數(shù)據(jù)數(shù)組作為函數(shù)與實(shí)際工程應(yīng)用的內(nèi)存交換區(qū),調(diào)用前將界面元素及協(xié)議提示信息傳遞給該交換區(qū),以便于多次調(diào)用時(shí)調(diào)用方式一致。設(shè)計(jì)了可視條件參數(shù),該參數(shù)可控制狀態(tài)指示個(gè)數(shù)。設(shè)計(jì)了一款調(diào)用函數(shù)的調(diào)試程序,能在實(shí)際工程函數(shù)調(diào)用前給出調(diào)用效果。以上函數(shù)可結(jié)合具體工程項(xiàng)目通信協(xié)議快速調(diào)用,從而提高開發(fā)者效率。
【關(guān)鍵詞】狀態(tài)指示器 標(biāo)簽組件 形狀組件 圖形組件 協(xié)議
任何控制類或相關(guān)應(yīng)用項(xiàng)目軟件開發(fā)時(shí),都會(huì)遇到這樣的問題:在通訊協(xié)議中,使用某些字節(jié)表示狀態(tài)變化。這樣的狀態(tài)表示字節(jié)在通訊協(xié)議中可能占幾個(gè)字節(jié),字節(jié)中每一位代表一種狀態(tài)。每個(gè)字節(jié)就可代表8個(gè)具體物理參數(shù)狀態(tài)。在工程項(xiàng)目中,假定通信協(xié)議中有7個(gè)狀態(tài)字節(jié),那么就有7*8=56種狀態(tài)指示,這就需要設(shè)計(jì)并制作出這56個(gè)狀態(tài)指示圖標(biāo)。并以不同的顏色表示相應(yīng)的狀態(tài)(例如,綠色代表正常,紅色代表異常)。當(dāng)工程項(xiàng)目改變后,通訊協(xié)議隨之發(fā)生變化。開發(fā)者則又要依據(jù)工程要求編寫大量的狀態(tài)指示代碼。
本文試圖針對(duì)形式各異的通訊協(xié)議,設(shè)計(jì)一種在Windows操作系統(tǒng)下的通用狀態(tài)指示器,以節(jié)省大量的代碼工作量,提高程序開發(fā)效率。
現(xiàn)代的開發(fā)工具中,可視化狀態(tài)指示組件較多,本文以Rad Studio XE10.0中的Delphi語言為例展開討論。
1 狀態(tài)指示器基本內(nèi)容
狀態(tài)指示器通常情況下信息表示應(yīng)該為:狀態(tài)輸入值、告警信息級(jí)別、告警指示形狀、背景顏色、前景顏色、字體前景顏色、字體背景顏色、可視性控制變量等。
狀態(tài)指示器經(jīng)常使用可視組件的標(biāo)簽組件、形狀組件、圖形組件來表達(dá)。本文使用這三種可視組件制作了4個(gè)通用函數(shù)來表達(dá)工程中各種狀態(tài)指示問題。其中,3個(gè)函數(shù)用于各種“2值”邏輯狀態(tài)指示問題,1個(gè)函數(shù)用于各種告警級(jí)別邏輯指示問題。
1.1 “2值”邏輯問題
狀態(tài)輸入?yún)?shù)值為典型的“2值”邏輯問題。例如,為0代表正常,為1代表異常。
1.2 告警級(jí)別邏輯問題
該信息為多值邏輯問題,例如表示天氣狀況的指示問題,“0”代表晴天,“1”代表小雨,“2”代表中雨,“3”代表大雨等。在這種邏輯下,雨天表示方法就要使用不同顏色。
1.3 其它問題
在使用形狀組件和圖形組件作指示器時(shí),函數(shù)參數(shù)中啞元應(yīng)為:狀態(tài)輸入?yún)?shù)、形狀參數(shù)、狀態(tài)指示前景顏色、狀態(tài)指示背景顏色,應(yīng)具備可視控制參數(shù)。如果帶Hit支持功能(當(dāng)鼠標(biāo)移動(dòng)到這個(gè)圖形時(shí)能夠自動(dòng)指示)則應(yīng)該設(shè)計(jì)正確指示標(biāo)題、錯(cuò)誤指示標(biāo)題。
2 通用狀態(tài)指示器函數(shù)設(shè)計(jì)
共設(shè)計(jì)三個(gè)函數(shù)。此三個(gè)函數(shù)形式相仿,分別使用Timage組件、Tshape組件和Tlabel組件作為界面可視組件表示狀態(tài)指示,其中輸入字節(jié)表示一次性處理8種狀態(tài),所以其它啞元參數(shù)為動(dòng)態(tài)指針型。
下面以標(biāo)簽組件Tlabel作為例說明該通用函數(shù)形式化參數(shù)設(shè)計(jì)方法。狀態(tài)輸入?yún)?shù)為1字節(jié),表示8個(gè)指示狀態(tài),該函數(shù)調(diào)用后同時(shí)處理8個(gè)狀態(tài)指示,狀態(tài)信息級(jí)別參數(shù)表達(dá)在異常情況下告警級(jí)別。部分代碼段為:
Procedure DisplayLableLamp(
InputB:Byte;//輸入字節(jié)
Modellevel:Byte;//狀態(tài)信息級(jí)別
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);//異常告警提示字符串
來一段實(shí)際代碼,判斷輸入某位為1或者0時(shí)的處理。
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 調(diào)用方法
3.1 參數(shù)賦值
函數(shù)寫為動(dòng)態(tài)數(shù)組引入?yún)?shù)形式,在實(shí)際使用時(shí),工程開發(fā)者首先預(yù)留出實(shí)際調(diào)用實(shí)參接口,在調(diào)用函數(shù)前,首先依據(jù)具體工程的協(xié)議定義賦值實(shí)參變量,將界面對(duì)應(yīng)的標(biāo)簽或者形狀組件名賦給對(duì)應(yīng)實(shí)參變量。
因?yàn)楹瘮?shù)與開發(fā)界面無關(guān),所以在真實(shí)調(diào)用函數(shù)前,才知道哪個(gè)指示等代表哪個(gè)實(shí)體標(biāo)簽組件或者形狀組件。
3.2 調(diào)用代碼
下面為一段真實(shí)調(diào)用的例子代碼。
//-----------公用變量-------------------
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 調(diào)用按鈕,在實(shí)際調(diào)用前依據(jù)通信協(xié)議及界面元素名稱賦值給公用變量。
Shape[0]:= Shape1;//實(shí)際形狀組件
Shape[1]:= Shape2;
......
RzLabel[0]:=RzLabel24;//實(shí)際標(biāo)簽組件,界面元素
RzLabel[1]:=RzLabel25;
......
inputB:=RzNumericEdit1.IntValue;//測(cè)試輸入數(shù)據(jù),或者協(xié)議中某狀態(tài)字節(jié)輸入變量。
Modellevel:=ModellevelByte;//狀態(tài)信息級(jí)別
Visible0[0]:=RzCheckBox9.Checked;//測(cè)試可視控制組件,
Visible0[1]:=RzCheckBox10.Checked;
......
OKCaption[0]:=RzEdit1.Text;//測(cè)試正確提示
OKCaption[1]:=RzEdit2.Text;
......
ErrorCaption[0]:=RzEdit9.Text;//測(cè)試異常提示
ErrorCaption[1]:=RzEdit10.Text;
......
FrontColor[0]:=RzColorComboBox1.SelectedColor;//測(cè)試前景色設(shè)置
FrontColor[1]:=RzColorComboBox2.SelectedColor;
.......
BackColor[0]:=RzColorComboBox9.SelectedColor;
BackColor[1]:=RzColorComboBox10.SelectedColor;//測(cè)試背景色設(shè)置
......
PenColor[0]:=RzColorComboBox17.SelectedColor;//測(cè)試字體前景顏色設(shè)置
PenColor[1]:=RzColorComboBox18.SelectedColor;
......
PenErrColor[0]:=RzColorComboBox25.SelectedColor;//測(cè)試字體背景
PenErrColor[1]:=RzColorComboBox26.SelectedColor;
......
//----------調(diào)用函數(shù)---------------------
DisplayLableLamp(InputB,
Modellevel,
RzLabel,
BackColor,
FrontColor,
PenColor,
PenErrColor,
Visible,
OKCaption,
ErrorCaption);
end;
3.3 標(biāo)簽可視化處理
函數(shù)參數(shù)為動(dòng)態(tài)數(shù)組,每一個(gè)輸入字節(jié)位都對(duì)應(yīng)一個(gè)參數(shù)值。實(shí)際調(diào)用時(shí)同時(shí)控制8個(gè)狀態(tài)指示。每一個(gè)都可以單獨(dú)設(shè)置表現(xiàn)效果。
下面說明如果應(yīng)用監(jiān)控程序中只有22種狀態(tài)指示時(shí)如何調(diào)用函數(shù)的方法。注意該函數(shù)每次處理8個(gè)狀態(tài),可視性控制變量控制到底有幾個(gè)顯示。這樣,當(dāng)只有22位狀態(tài)時(shí),函數(shù)仍處理為24個(gè)狀態(tài)指示,開發(fā)者需要在界面上放置24個(gè)可視組件,調(diào)用時(shí)將2個(gè)多余的可視組件Visible參數(shù)設(shè)置為假,這樣界面上就只顯示22個(gè)狀態(tài)指示。這樣,在工程應(yīng)用中,無論多少狀態(tài)指示問題,都可以用這一個(gè)函數(shù)統(tǒng)一方法處理,不過是多次調(diào)用而已。
4 調(diào)試樣例編程
為了調(diào)試出這個(gè)通用函數(shù),設(shè)計(jì)了一個(gè)專用調(diào)試界面,通過界面按位輸入組件及其它輸入?yún)?shù)設(shè)置可以調(diào)出各種指示效果。在應(yīng)用程序界面設(shè)計(jì)前,就可以給出各種未來指示效果,這樣在應(yīng)用程序開發(fā)時(shí)就提前設(shè)計(jì)出了實(shí)際效果。圖1為某天線伺服控制的監(jiān)控程序中某8個(gè)狀態(tài)指示位調(diào)用例子效果。
這三個(gè)通用函數(shù)解決了各種狀態(tài)指示問題,特別是使用Tshape和Timage時(shí)可以制作為狀態(tài)各異的效果。如果希望作出更專業(yè)的效果,可以將這些組件換成專業(yè)的第三方組件包中的相應(yīng)組件。例如Raize組件包等,這樣制作出的狀態(tài)指示將會(huì)更酷炫。
形狀與圖形函數(shù)(應(yīng)用Timage組件和Tshape組件)同理。
5 結(jié)語
本文介紹了使用Delphi XE10開發(fā)工具設(shè)計(jì)的一套狀態(tài)指示統(tǒng)一函數(shù)處理方法,與具體控制工程項(xiàng)目無關(guān)。在實(shí)際使用中,結(jié)合具體控制項(xiàng)目協(xié)議定義,只需賦值各參數(shù)與界面元素一致。調(diào)用時(shí)自動(dòng)給出效果,這種處理方法解決了所有這一類問題。本文給出的調(diào)用例子可以給出每一位的表現(xiàn)效果,在正式開發(fā)程序之前,就可以提前看到執(zhí)行效果并觀察各種字體、配色等是否合適。
應(yīng)用其它語言開發(fā)時(shí),如果使用該方法設(shè)計(jì)出相似的功能函數(shù)同樣可以解決各種狀態(tài)指示問題,構(gòu)造的通用函數(shù)可在多個(gè)工程項(xiàng)目中使用。這將節(jié)約大量有關(guān)狀態(tài)指示需要處理的代碼段編程,大幅提升編程效率。
參考文獻(xiàn)
[1]蔡文齋.實(shí)時(shí)監(jiān)控程序的實(shí)驗(yàn)室快速調(diào)試開發(fā)[J].計(jì)算機(jī)與網(wǎng)絡(luò),2015(02):58-62.
[2]蔡文齋.全抽象監(jiān)控軟件實(shí)現(xiàn)[J].飛行器測(cè)控學(xué)報(bào),2009(04):65-68.
[3]王艷平(著).Windows網(wǎng)絡(luò)與通信程序設(shè)計(jì)(第2版)[M].北京:人民郵電出版社,2009(01):203-210.
[4]蔡文齋,王錄選.跟蹤、隨動(dòng)系統(tǒng)監(jiān)控軟件設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2007(03):29-31.
[5]周愛民(著).Delphi源代碼分析[M].北京:電子工業(yè)出版社,2004(09):193-205.
[6]蘇春曉,王鵬.基于網(wǎng)絡(luò)的數(shù)字示波器遠(yuǎn)程集中軟件平臺(tái)[J].太赫茲科學(xué)與電子信息學(xué)報(bào),2014,12(06):884-889.
[7]趙曉玲(著).可視化程序設(shè)計(jì)—Delphi [M].北京:機(jī)械工業(yè)出版社,2005(01):251-258.
[8]周愛民(著).Delphi源代碼分析[M].北京:電子工業(yè)出版社,2004(09):193-205.
[9]Jeffrey Richter(著),王書洪,劉光明(譯).Windows高級(jí)編程指南(第3版)[M].北京:清華大學(xué)出版社,1999(01):263-269.
[10]朱漢民(著).Delphi7高級(jí)應(yīng)用開發(fā)教程[M].北京:科學(xué)出版社,2006(01):215-218.
作者簡介
張翔宇(1983-),河北省秦皇島市人。碩士學(xué)位。工程師。主要研究方向?yàn)檫b感信息接收與處理、計(jì)算機(jī)仿真等。
蔡文齋(1962-),陜西省西安市人。工程碩士。高級(jí)工程師。主要研究方向?yàn)楹教鞙y(cè)控工程開發(fā)研究、工程控制類應(yīng)用開發(fā)研究,軟件測(cè)試等。
劉劍鋒(1972-),黑龍江省綏化市人。博士學(xué)歷。高級(jí)工程師。主要研究方向?yàn)楹教鞙y(cè)控工程開發(fā)研究,遙感信息處理等。
作者單位
1.北京市遙感信息研究所 北京市 100011
2.中國電子科技集團(tuán)公司第39研究所 陜西省西安市 710065