DDE 聯接通常由客戶端發起,但服務端可將聯接信息複製到剪貼板,供客戶端粘貼建立會話:
DDEServerItem.CopyToClipboard,將 Text/Lines 屬性值與 DDE 聯接信息放入剪貼板DDEServerConv 三大事件:
OnOpen、OnClose:會話建立/終止觸發(同 7.3.7)OnExecuteMacro:響應客戶端發送的宏命令,參數 Msg 保存命令字符串,可在處理過程中決定響應動作DDEServerItem 單一事件 OnPokeData:響應客戶端發送的數據(客戶端調用 PokeData/PokeDataLines)。處理中可將數據保存到關聯的文本控件。
procedure Form1.OnDDEServerItemPokeData(Sender: TObject);
begin
ListBox1.Items := DDEServerItem1.Lines;
end;
功能:① 剪貼板輸出聯接信息 ② TMemo 作為數據源 ③ 接收客戶端數據 ④ 根據宏命令改變運行狀態。
關鍵屬性:DDETestItem.ServerConv := DDETestTopic;Bevel1.Align=alTop、Memo1.Align=alClient 保證窗口縮放美觀。
數據源同步(Memo1.OnChange):
procedure TDdeSrvrForm.doOnChange(Sender: TObject);
begin
if not FInPoke then
DDETestItem.Lines := Memo1.Lines;
end;
FInPoke 標識是否正在處理客戶端數據發送,避免無效反送。
剪貼板輸出聯接:
procedure TDDESrvrForm.CopyClick(Sender: TObject);
begin
DDETestItem.CopyToClipboard;
end;
接收客戶端數據(DDETestItem.OnPokeData):
procedure TDDESrvrForm.doOnPoke(Sender: TObject);
begin
FInPoke := True;
Memo1.Lines := DDETestItem.Lines;
FInPoke := False;
end;
宏命令處理(DDETestTopic.OnExecuteMacro):定義五種命令:CopyDDE、Clear、WS_Normal、WS_Minimized、WS_Maximized,分別用於複製聯接、清空內容、改變窗口狀態。
procedure TDdeSrvrForm.doMacro(Sender: TObject; Msg: TStrings);
var Cmd: String; i: Integer;
begin
Cmd := ''; if Msg.Count = 0 then Exit;
for I := 0 to Msg.Count-1 do
begin
Cmd := Msg.Strings[i];
if UpperCase(Cmd) = 'COPYDDE' then DDETestItem.CopyToClipboard
else if UpperCase(Cmd) = 'CLEAR' then Memo1.Text := ''
else if UpperCase(Cmd) = 'WS_NORMAL' then WindowState := wsNormal
else if UpperCase(Cmd) = 'WS_MINIMIZED' then WindowState := wsMinimized
else if UpperCase(Cmd) = 'WS_MAXIMIZED' then WindowState := wsMaximized
else MessageDlg('Invalid Command', mtWarning, [mbOK], 0);
end;
end;
配套 DDE 客戶端程序驗證服務端,同時提供完整客戶端設計實例:接收數據保存至 DDEDat (TMemo),發送數據/宏命令輸入於 PokeDat,兩按鈕發送,兩菜單項建立新聯接/粘貼聯接。