程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi建立通訊與數據交換服務器—Transceiver技術剖析(下)(3)

用Delphi建立通訊與數據交換服務器—Transceiver技術剖析(下)(3)

編輯:Delphi

iv. 運行時實例化對象數組

每一個對象數組的元素個數由Port Builder在運行時管理,如果用戶通過Transceiver Console定義了一些某種類型的Port,Port Builder將按照其個數和各自參數實例化該對象數組。否則,該對象數組將不會被實例化。在Source類型的Port對象中,Name屬性被設置為'Receive'+Port ID 的形式,在之後的數據接收觸發中,這將有助於Data Dispatcher定位對象和對不同類型的Port對象進行統一調度。Tag屬性被用來向Channel Controller提供其所在Channel的target ID信息。

以下是Port Builder中對comSource對象數組的實例化部分

begin //Create COM/ Receive Port
itmp:=high(comSource)+1;
// 獲取comSource的當前最大個數,itmp為integer變量
SetLength(comSource,itmp+1); // 添加一個comSource數組成員
comSource [itmp]:=TCOMPort.Create(self);// 實例化成員
comSource[itmp].Name:= 'Receive'+inttostr(isource);
//設置Name屬性為'Receive'+Port ID,isource為整型的當前PortID
comSource [itmp].Tag:= itarget;//設置為其所在Channel的target ID
NullTest:=rece.FIElds['Address'].value;
//得到系統配置COMFace的值,NullTest為Variant變量
if (NullTest <>null) and (trim(NullTest)<>'') then
begin
comSource [itmp].ComFace:=NullTest; //將有效值賦與ComFace
NullTest:=rece.FIElds['interval'].value;
//得到系統配置中COM對象獲取數據的觸發時間間隔
SetTimer(application.handle,isource,NullTest*60000,nil);
//為當前Port建立用於定時收取數據的觸發時鐘, isource為Port ID
end
else
comSource [itmp].Tag:=-1;//初始化失敗,標識為無效Port
end;

comSource是用於在一定的時間間隔後對ComFace中定義的接口進行調用並獲取數據的Source類Port,相應comTarget的實現與其類似,只是由於向comTarget的ComFace提交數據是一個實時過程,所以不需要用到觸發間隔,省略建立時鐘的兩條語句即可。其它類型的Port對象創建和初始化大同小異。如,另一個MailTarget實現片段:

begin //Create SMTP/Send Port
itmp:=high(MailTarget)+1;
SetLength(MailTarget,itmp+1);
MailTarget[itmp]:=TIdSMTP.Create(self);
MailTarget[itmp].Name:=’send’+ inttostr(itarget);
MailTarget[itmp].Tag:=3;// 設置為Target Port類型標識
NullTest:=rece.FIElds['Address'].value; //郵件服務器地址
if (NullTest <>null) and (trim(NullTest)<>'') then
MailTarget[itmp].Host :=NullTest
else bValid:=false;
NullTest:=rece.FIElds['Port'].value; //郵件服務器端口
if NullTest <>null then
(if NullTest<>0 then MailTarget[itmp].Port :=NullTest)
else bValid:=false;
NullTest:=rece.FIElds['user'].value;//登錄用戶名
if NullTest <>null then
MailTarget[itmp].UserId :=NullTest
else bValid:=false;
NullTest:=rece.FIElds['passWord'].value;//登錄口令
……………
……………
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved