WM_CHANGECBCHAIN 消息在其他觀察器退出時觸發,根據被移除觀察器位置決定處理:
procedure TClipSaveForm.WMChangeCBChain(var Msg: TWMChangeCBChain);
begin
if Msg.Remove = NextViewerHandle then
NextViewerHandle := Msg.Next
else if NextViewerHandle <> 0 then
SendMessage(NextViewerHandle, Msg.Msg, Msg.Remove, Msg.Next);
Msg.Result := 0;
end;
procedure TClipSaveForm.Button1Click(Sender: TObject); // 關閉
begin Close; end;
procedure TClipSaveForm.Button2Click(Sender: TObject); // 最小化
begin WindowState := wsMinimized; end;
procedure TClipSaveForm.SpeedButton1Click(Sender: TObject); // 查看
begin View := True; Image1.Picture.Bitmap := MyBitmap; end;
procedure TClipSaveForm.SpeedButton2Click(Sender: TObject); // 隱藏
begin View := False; Image1.Picture.Bitmap := nil; end;
message 關鍵字),自定義組件開發將深入討論基於 Windows 消息機制。兩應用程序通過傳遞 DDE 消息進行會話,完成數據請求/應答/傳輸。角色:服務端(數據提供者)、客戶端(請求/接收者)。會話由客戶端發起,廣播 WM_DDE_INITIATE 指明所需應用程序/主題,擁有數據的服務端響應,會話開始。請求數據時需同時指明應用程序名、主題名、項目名——DDE 三大核心概念。
直接使用 Windows DDE 消息/API 編程棘手,雖有 DDE 管理庫 (ddeml.dll) 減輕負擔,但仍不輕松。Delphi 以巧妙設計使 DDE 應用開發如同普通程序般快捷方便。
四大組件封裝所有 DDE 功能:
| 組件 | 用途 |
|---|---|
| TDDEClientConv | 客戶端建立/維護 DDE 會話 |
| TDDEClientItem | 客戶端建立/維護數據交換通道 |
| TDDEServerConv | 服務端響應 DDE 會話 |
| TDDEServerItem | 服務端維護數據交換通道 |
前兩者構建客戶端,後兩者構建服務端。同時擁有則雙角色兼備。
TDDEClientConv/TDDEServerConv 處理會話,包含 DDE 服務(服務端名稱,通常為 EXE 文件名去 .EXE,如 Word 6.0 為 WINWORD,ReportSmith 為 Report Smith,以文檔為準)和 DDE 主題(包含聯接信息的數據單元,通常為帶擴展名的完整文件名,如 c:\excel\Example\sale.xls。Delphi 服務端默認主題為包含數據窗體標題,使用 DDEServerConv 時則以其名稱為主題)。
TDDEClientItem/TDDEServerItem 處理數據傳輸通道。DDE 項目格式取決於服務端(如電子表格單元格、數據庫字段)。Delphi 服務端項目為關聯的 DDEServerItem 組件名稱。
僅支持文本數據及命令/宏傳輸,不支持圖像數據。VB 略勝一籌,但文本數據應用最廣,圖像可用剪貼板/OLE 實現,影響有限。
客戶端發起會話,請求/接收數據,可發送數據/命令/宏控制服務端。
DDEClientConv.ConnectMode 設置:
| 值 | 含義 |
|---|---|
| ddeAutomatic | 運行中包含組件的窗口創建時自動建立聯接 |
| ddeManual | 僅調用 OpenLink 時建立聯接 |
DDEClientConv、DDEClientItem 並命名DDEClientItem.DdeConv 為 DDEClientConv 名稱(設計時屬性觀察器選擇,運行時賦值字符串)DDEClientConvRequestData 申請獲取數據