摘 要:本文介紹了用動態(tài)創(chuàng)建MPI(Multi-Page Interface)的方法實現(xiàn)多業(yè)務窗口,用動態(tài)創(chuàng)建自定義DBCtrlGrid組件的方法實現(xiàn)呼叫告警監(jiān)控面板。
關(guān)鍵詞:Dephi7 動態(tài);MPI;DBCtrlGrid
中圖分類號:X924.3
多標簽頁、窗格式監(jiān)控面板比較直觀和方便,可以用在多種監(jiān)控系統(tǒng)上。
呼叫告警系統(tǒng)監(jiān)控面板,通過權(quán)限控制動態(tài)創(chuàng)建一定數(shù)量的標簽頁(一般不再關(guān)閉),然后將各個房間(也可以是各個監(jiān)控點)的資料和狀態(tài)在窗格中顯示出來,后臺定時掃描數(shù)據(jù)庫,如有告警或者異常狀態(tài)則背景用紅色表示,用來提醒、處理告警,本文嘗試用福利院(醫(yī)院)呼叫告警系統(tǒng)的一個監(jiān)控模塊來介紹用動態(tài)創(chuàng)建MPI的方法實現(xiàn)多業(yè)務窗口,并用動態(tài)創(chuàng)建自定義DBCtrlGrid組件的方法實現(xiàn)呼叫告警監(jiān)控面板。
1 自定義控件類
1.1 自定義DBCtrlGrid控件類,在繼承TDBCtrlGrid控件的基礎上,增加了數(shù)據(jù)源、數(shù)據(jù)集、圖像類,和動態(tài)感知控件以及定時器。用來定時掃描后臺Oracle 數(shù)據(jù)庫中房間的狀態(tài),顯示在自定義DBCtrlGrid中,自定義DBCtrlGrid控件類中對基類的構(gòu)造函數(shù)進行的重載,以方便傳遞動態(tài)SQL參數(shù),用來實現(xiàn)不同院名數(shù)據(jù)的獲取。
//自定義TDBCtrlGrid控件,很重要要用自定義控件的panel屬性;
TMDBG=class(TDBCtrlGrid)
ds:TDataSource;//數(shù)據(jù)源
orq: TOraQuery; //連接Oracle數(shù)據(jù)庫
img:TImage;//顯示小人圖標
name:TDBText ;//顯示人名
room:TDBText;//顯示房間號
tm:TTimer;//定時器
private
v_sql:string;//SQL語句
public
//構(gòu)造函數(shù)重載 增加初始化參數(shù),Str_Sql是SQL語句,ASession是ORACLE連接session
constructor Create(Aowner:TComponent;Str_Sql :string;ASession :TOraSession);overload;
destructor Destroy();override;//覆蓋析構(gòu)函數(shù),主要用做控件對象的釋放
procedure MyPaintPanel(DBCtrlGrid: TDBCtrlGrid;Index: Integer);//重繪Panel顏色
procedure Mytimer(Sender: TObject);//定時器自定義過程
end;
MyPaintPanel過程重新實現(xiàn)了TDBCtrlGrid的OnPaintPanel事件,Mytimer過程重新實現(xiàn)Ttimber的Ontimer事件。
1.2 自定義TtabSheet用于動態(tài)創(chuàng)建頁面,嵌于TpageControl中
TMYTabSheet = class(TTabSheet)//自定義 TTabSheet
DbCtrlGrid:TMDBG;//自定義TMDBG類
Public
//構(gòu)造函數(shù)重載
constructor Create(Aowner:TComponent;Str_Sql :string;ASession :TOraSession);overload;
destructor destroy();override;//析構(gòu)函數(shù)覆蓋
end;
2 編碼實現(xiàn)
動態(tài)創(chuàng)建MYTabSheet和MYDBCtrlGrid控件,將MYDBCtrlGrid嵌入MYTabSheet,然后再將MYTabSheet賦給PageControl控件,形成一個標簽業(yè)務界面。
TMDBG構(gòu)造函數(shù),初始化成員。
constructor TMDBG.create(Aowner: TComponent; Str_Sql: string;
ASession: TOraSession);
begin
inherited create(Aowner);//繼承
v_sql:=Str_Sql;
ds:=TDataSource.Create(self);//此處self 是TMDBG,TMDBG控制該對//象的生存周期
orq:= TOraQuery.Create(self);
img:=TImage.Create(self);
name:=TDBText.Create(self) ;
room:=TDBText.Create(self) ;
orq.Session:=ASession;//本例子使用了ODAC控件,此處需要連接OraSession控件
ds.DataSet:= orq;
self.DataSource:=ds;// TMDBG的數(shù)據(jù)源
name.DataSource:=ds;//數(shù)據(jù)源
name.Parent:=Self.Panel;//重要Parent必須是Self.Panel才能每個窗格內(nèi)都顯示出來
name.DataField:='elder_name';//數(shù)據(jù)源中的字段,老人人名
name.Transparent:=true;//設置背景透明
room.DataSource:=ds;
room.Parent:=Self.Panel;
room.DataField:='ELDER_ROOM_ID';//數(shù)據(jù)源中房間號
room.Font.Size:=12;//設置為12號字體
room.Font.Style:=[fsBold];//加粗
img.Parent:=self.Panel;//重要,Parent必須是Self.Panel才能每個窗格內(nèi)都顯示出來否則//只可能顯示出一個圖像
orq.SQL.Clear;
orq.SQL.Text:=v_sql;//傳遞動態(tài)SQL語句
orq.Prepared:=true;
orq.Open;//打開查詢數(shù)據(jù)集
tm:=TTimer.Create(Self);
tm.Interval:=5000;//掃描間隔時間
Self.OnPaintPanel:=MyPaintPanel;//TDBCtrlGrid的OnPaintPanel事件實現(xiàn)過程重新實現(xiàn)
tm.OnTimer:=Mytimer; // Ttimer的OnTimer事件實現(xiàn)過程重新實現(xiàn)
tm.Enabled:=true;
end;
3 結(jié)束語
通過本文,可實現(xiàn)動態(tài)創(chuàng)建MPI界面和基于TDBCtrlGrid控件的監(jiān)控窗格,經(jīng)過進一步改進該監(jiān)控界面還能用于程控交換監(jiān)控、設備監(jiān)控、以及視頻監(jiān)控等系統(tǒng)。本例子在Delphi7和WinXP環(huán)境下通過。
參考文獻:
[1]劉藝.Delphi面向?qū)ο缶幊趟枷隱M].北京:機械工業(yè)出版社,2004.