Microsoft Word 內建強大的 COM 自動化介面,讓 Delphi 可完整控制文件建立、編輯、列印、郵件合併等功能。本文系統整理四種整合方式優劣、核心物件模型操作、資料庫二進位欄位存取 Word 檔、全域訊息跨程序通訊、動態工具列建立等實戰技巧。
| 方式 | 元件/技術 | 優點 | 缺點 |
|---|---|---|---|
| 1. 嵌入式 | TOleContainer | 最簡單,文件內嵌於表單,視覺整合度高 | 無法以程式控制 Word 物件模型 |
| 2. 伺服器元件 | Delphi 產生的 Word 伺服器包裝元件 | 支援程式碼提示,開發效率高 | 無法呼叫自訂 VBA 巨集;選用參數必須全部填寫 |
| 3. 純 COM 匯入 | 匯入 MSWORD9.OLB 類型庫 | 功能完整,屬早期綁定 | 部署需註冊類型庫;選用參數同樣需全填 |
| 4. 執行期繫結 (推薦) | CreateOleObject('Word.Application') | 完整存取所有屬性/方法/自訂巨集;選用參數可省略 | 無程式碼提示;例外處理需自行撰寫 |
var
WordApp: Variant;
begin
try
WordApp := GetActiveOleObject('Word.Application');
except
WordApp := CreateOleObject('Word.Application');
end;
WordApp.Visible := True;
// 新建 (可指定範本)
Doc := WordApp.Documents.Add(Template:='C:\Template.dot', NewTemplate:=False);
// 開啟
Doc := WordApp.Documents.Open(FileName:=DocFile, ReadOnly:=False, AddToRecentFiles:=False);
// 另存新檔
WordApp.Documents.SaveAs(FileName:=DocFile, FileFormat:=wdFormatDocument, AddToRecentFiles:=False);
uses ADODB, Classes;
// 將 Word 檔存入資料庫 Image/Blob 欄位
var FS: TFileStream;
begin
FS := TFileStream.Create(TargetName, fmOpenWrite or fmCreate);
try
FS.Position := 0;
TBlobField(AdoQuery1.FieldByName('DocContent')).SaveToStream(FS);
finally
FS.Free;
end;
end;
// 從資料庫讀取 Blob 存成 Word 檔
var FS: TFileStream;
begin
FS := TFileStream.Create(TargetName, fmOpenWrite or fmCreate);
try
FS.Position := 0;
TBlobField(ADOQuery1.FieldByName('DocContent')).LoadFromStream(FS);
finally
FS.Free;
end;
end;
Delphi 主程式與 Word (或 VBA) 互為獨立進程,使用 RegisterWindowMessage 取得唯一訊息 ID,雙方以 SendMessage 交換資料。
// 註冊 (雙方相同字串可取得同一 ID)
const MsgStr = 'MYAPP_WORD_SYNC_123';
var MsgID: Cardinal;
MsgID := RegisterWindowMessage(PChar(MsgStr));
// 發送
SendMessage(TargetHwnd, MsgID, WPARAM, LPARAM);
// Delphi 接收 (重寫 WndProc)
procedure WndProc(var Message: TMessage); override;
begin
if Message.Msg = MsgID then
begin
// 處理 Word 傳來的資料
HandleWordMessage(Message.WParam, Message.LParam);
end
else
inherited;
end;
ComboHandler 捕捉 ComboBox 事件' 類別模組 ComboHandler
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox
Private Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
' 使用者選擇文件清單時觸發
ThisDocument.Application.Run 'DelphiSyncMessage', Ctrl.Text
End Sub
Dim ctlHandler As New ComboHandler
Dim cbo As CommandBarComboBox
Sub CreateDocPicker()
Set cbo = CommandBars("我的工具列").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
cbo.AddItem "文件一.doc", 1
cbo.AddItem "文件二.doc", 2
Set ctlHandler.ComboBoxEvent = cbo ' 連接事件
End Sub
| 巨集名稱 | 功能 |
|---|---|
| FileNew | 新建文件 |
| FileOpen | 開啟文件 |
| FileSaveAs | 另存新檔 |
| FilePrint | 列印 |
| FilePrintPreview | 列印預覽 |
| ToolsOptions | 選項設定 |
| ViewVBCode | 開啟 VBA 編輯器 |
| InsertHyperlink | 插入超連結 |
| FormatStyle | 樣式設定 |
AutoExec:Word 啟動/全域樣板載入AutoOpen:開啟文件時AutoClose:關閉文件時Document_Close:文件關閉事件 (VBA 事件模型)DocumentBeforeClose:應用程式層級關閉前事件,可攔截存檔提示DocumentChange:文件切換事件WordApp.Version 相容性。WordApp.Quit; WordApp := Unassigned; 避免殘留 WINWORD.EXE 進程。Delphi 整合 Word 的最佳實務是「執行期繫結 + Variant 型別 + 全域訊息同步」。雖失去設計期提示,卻換來最大彈性:可呼叫任意 VBA 巨集、省略選用參數、動態建立 UI。搭配資料庫 Blob 存取,即可構建完整的文件管理、報表產生、郵件合併系統。