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;