Delphi與Word之間的融合技術
一、VBA程式碼含義
Microsoft Word是一個整合化環境,是美國微軟公司的字處理系統,但它絕對不只是一個字處理系統,它整合了Microsoft Visual Basic,可以透過程式設計來實現對Word功能的擴充。
Microsoft Visual Basic在word中的程式碼即Word的宏,透過撰寫Word宏,可實現一些文件處理的自動化,如實作文件的自動備份、隨身碟等,可擴充Word文件的功能,因此,能夠充分利用Word的特性,甚至使Word成為自己軟體的一部分。
Word的宏既有有利的一部分,因為它能夠幫助我們實現文件的自動化,但是Word的宏也不是純粹的有利,有時它可能危害我們的文件、電腦系統甚至網絡,從最開始的Taiwan NO1宏病毒到現在的Melissa巨集病毒,從最開始的簡單的提示,耗盡系統資源到現在的亂發電子郵件,將個人的信息發送到網路上,甚至向硬碟的Autoexec.bat(自動批次檔)中加入Deltree C: -y,破壞整個Windows系統。
二、Word中內嵌的Com技術
可以說Word是對Com技術支援最好的軟體,這樣說似乎是太極端了一點,但是Word提供的強大的程式介面技術卻能夠是我們透過程式控制Word的任何一部分。無論是文件的開啟、儲存、列印或文件中表格的自動繪製。
透過程式軟體,可以靈活的操縱word,這裡只以Borland Delphi為例,進行詳細描述:
1、 在Delphi中呼叫Word軟體/檔案的方法
在Word中呼叫Word軟體,歸納起來有三種方法:
。透過Delphi的控制TOleContainer 將Word嵌入
a.使用Delphi提供的Servers控制項呼叫Word,使用Word的屬性
b.透過真正的Com技術,將Office軟體目錄中檔案MSWORD9.OLB中的類別庫全部導入Delphi中,利用Com技術編程
c.使用CreateOleObject將啟動Word,然後以Ole方式控制Word。
2、對幾種方法的難易度的判別
a.透過Delphi的控制TOleContainer 將Word嵌入
這是最簡單的Ole嵌入,能夠直接將Word文件調用,只需要使用ToleContainer.Run就可以將Word文件直接啟動。且這樣啟動的Word文檔與Delphi程式是一個整體(從介面上看),但是它存在不可克服的缺點,即不能透過Delphi控制Word文檔,也就無法實現將靈活操縱Word的目的。
b.使用Delphi提供的Servers控制項呼叫Word,使用Word的屬性
使用Delphi的Servers控制項來操縱Word,在程式設計時Delphi能夠實作程式碼提示,整體來看能夠較好的實作Delphi對Word的控制,但是還有一些Word的功能不能在Delphi中呼叫(例如自己寫的VBA宏代碼)。且實作功能時本來在VBA程式碼中可選則參數在Delphi呼叫的時候必須添加,否則,連編譯都不能通過。本方式啟動的Word與Delphi程式分屬兩個窗體。此辦法僅能作為一個參考。
c.透過真正的Com技術,將Office軟體目錄中檔案MSWORD9.OLB中的類別庫全部導入Delphi中,利用Com技術程式設計利用真正的Com技術,將MsWord9.OLD檔案類別庫導入,然後利用Com技術進行使用。整體上類似使用Delphi的Servers控件,稍微比Servers控件麻煩,優缺點與Servers控件相同。
d.使用CreateOleObject將啟動Word,然後以Ole方式控制Word。
本辦法是使用以CreateOleObjects方式呼叫Word,實際上還是Ole,但是這種方式能夠真正做到完全控制Word文件,能夠使用Word的所有屬性,包括自己編寫的VBA巨集程式碼。
與Servers控制和com技術相比,本方法能夠真正地使用Word的各種屬性,和在VBA中編寫自己的程式碼基本上一樣,可以缺省的程式碼也不需要使用。本方式啟動的Word與Delphi程式分屬兩個窗體。缺點是使用本方法沒有Delphi程式碼提示,所有異常處理均需要自己編寫,可能編寫時探索性知識比較多。
三、Word巨集編輯器
Word能夠真正地進行VBA程式碼的編輯,可以寫窗體、函數。
進入Word巨集編輯器的方法:工具->巨集->Visual Basic編輯器,可進入Visual Basic編輯器介面。 Word的Visual Basic編輯器介面和真正的Visual Basic編輯器基本上相同,在此不再詳述。在VBA程式碼中,可以新增使用者窗體、模組、類別模組。使用者窗體、模組、類別模組的概念和Visual Basic完全相同。註解也與Visual Basic完全相同。
可以將遊標停留在窗體、模組的任何一個子程式上,直接按「F5」來執行目前子程式。
四、Word的宏的概述
Word充分地將文件編輯和VB結合起來,真正實現文件的自動化。使用Word編程,類似於使用Visual Basic,不同的是,在Word中,能夠直接運行某一個子程序,直接看見結果,Word的宏,只能解釋運行,而Visual Basic,現在已經能夠編寫成真正的機器碼,從程式碼的保護上來說,應該盡可能地減少Word的VBA程式碼數量,尤其是關鍵的程式碼。
VBA宏,可分成四種:
1、和命令名相同的宏
如FileSave,FileOpen,如果在VBA程式碼中包含與Word同名的函數,則直接執行這些VBA程式碼,忽略Word本身的指令。
2、Word內特定的宏
這些巨集包含AutoExec(啟動Word 或載入全域範本)、AutoNew(每次新文件時)、AutoOpen(每次開啟已有文件時)、AutoClose(每次關閉文件時),AutoExit(退出Word 或卸載全域模板時)。
如果VBA程式碼中含有這些名稱的函數,則滿足對應的條件,對應程式碼就會自動執行。
3、對應事件的VBA宏
這些宏是由事件觸發的宏,如Document_Close在文件關閉的時候觸發事件,Document_New在新文件的時候觸發,Document_Open在開啟文件的時候觸發。
4、獨立的宏
自己寫的VBA程式碼,也就是不屬於上面幾種情況的VBA程式碼,可以被其他VBA程式碼調用,更重要的是,可以被其他程式調用。
這樣,我們就可以屏棄Word自動執行的宏,透過Delphi直接呼叫對應宏來達到目的。
[b]五、Word指令巨集的詳細描述[/b]
Word本身的命令函數包含很多,但是無論是word聯機幫助還是MSDN幫助,都沒有這方面的介紹,因此只能憑自己的實驗取探索,初步探測的函數如下:
宏名解釋註釋
FileNew 新建
FileNewDefault 新建空白文檔
FileSaveAs 另存為
FileOpen 打開
FileClose 關閉
FilePRint 列印
FilePrintPreview 列印預覽
ToolsCustomize 工具列裡面的自訂
ToolsOptions 工具選項
ToolsRevisions 反白顯示修訂
ToolsReviewRevisions 接受或拒絕修訂
ToolsRevisionMarksAccept 接受修訂
ToolsRevisionMarksReject 拒絕修訂
ToolsRevisionMarksToggle 修訂
ToolsMacro 巨集
ToolsRecordMacroToggle 錄製新宏
ViewSecurity 安全性
ViewVBCode 查看VB編輯器環境
FileTemplates 模板和可加載項
ToolsProtectUnprotectDocument 解除對文件的保護
InsertHyperlink 插入超級鏈接
EditHyperlink 編輯超級鏈接
DeleteHyperlink 刪除超級鏈接
EditLinks 查看、刪除鏈接
EditPasteAsHyperlink 貼上超級鏈接
FormatStyle 樣式
EditBookMark 書籤
OleWord時一些用用的程式碼
一、Delphi程式啟動Word
採用CreateOleObjects的方法來啟動Word,呼叫VBA程式碼,具體實作過程為:
首先使用GetActiveOleObject('Word.application')判斷目前記憶體中是否存在Word程序,如果存在,則直接連接,如果沒有Word程序,則使用CreateOleObject('Word.Application')啟動Word
二、Delphi程式新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名稱,
NewTemplate: 新建文檔的類型,True表示為模板,False表示為文檔
DocumentType: 文檔類型,預設為空白文檔
Visible: 打撈的視窗是否可見
範例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:/Temlate.dot',NewTemplate:=False);
三、Delphi程式開啟Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
Format,Encoding,Visible)
FileName: 文檔名稱(包含路徑)
Confirmconversions: 是否顯示檔案轉換對話框
ReadOnly: 是否以唯讀方式開啟文檔
AddToRecentFiles: 是否將檔案新增至"檔案"選單底部的最近使用檔案清單中
PassWordDocument: 開啟此文件時所需的密碼
PasswordTemplate: 開啟此範本時所需的密碼
Revert: 如果文檔已經,是否重新開啟文檔
WritePasswordDocument: 儲存文件變更時所需的密碼
WritePasswordTemplate: 儲存對範本進行變更時所需的密碼
Format: 開啟文件時所需使用的文件轉換器
Encoding: 所使用的文檔代碼頁
Visible: 開啟文件的視窗是否可見
舉例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);
四、Delphi程式保存Word文稿
格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword, ReadOnlyRecommended,
EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData,
SaveAsAOCELetter)
FileName: 檔案名稱。預設為目前資料夾和檔案名稱。
FileFormat 文檔保存的格式。
LockComments 如果為True,則此文件只允許進行批註。
Password 開啟文件時的口令。
AddToRecentFiles 如果為True,則將文件新增至"文件"功能表中最近使用的文件清單中。
WritePassword 保存文件的修改所需的口令。
ReadOnlyRecommended 如果為True,在每次開啟文件時,Word 將建議使用者採用唯讀方式。
EmbedTrueTypeFonts 如果為True,則將文件與TrueType 字型一起儲存。
SaveNativePictureFormat 如果為True,則從其他系統平台(例如Macintosh)匯入的圖形僅儲存其Windows 版本。
SaveFormsData 若為True,則將窗體中使用者輸入的資料存為一筆資料記錄。
SaveAsAOCELetter 如果文件包含一個附加,當此屬性值為True 時,將文件儲存為一篇AOCE 信箋(同時儲存郵件)。
舉例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
AddToRecentFiles=False);
五、從資料庫讀取檔案到本機硬碟和從本機硬碟讀取檔案到資料庫
在資料庫上使用Image二進位欄位保存,使用Stream流的方式。
建立文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
儲存到資料庫的Image欄位:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
從資料庫讀取檔案到本機硬碟:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
釋放檔案流:
Word_FileStream.Free;
六、全域訊息的定義
因為word和Delphi程式是兩個軟體,彼此之間通訊比較麻煩,所以使用全域訊息的方法進行。全域訊息必須先註冊,Windows傳回系統空閒的訊息號,當註冊的訊息相同時,Windows系統傳回同一個值,這樣就保證了使用這個訊息號在兩個程式之間通訊。
定義訊息的辦法:
szMessageString: pchar = 'XIDIAN_11_Stone';
FMyJoinMessage := RegisterWindowMessage(szMessageString);
發送訊息的方法:
SendMessage(對方句柄,訊息,訊息附帶短變量,訊息附帶長變量)
七、Delphi程式接收訊息的方法
Delphi接收訊息有兩種,一是重載特定訊息,二是重載WndProc函數,在裡面選擇對應訊息處理。
法一,每次只能處理一則訊息,而法二能夠同時處理多個訊息。
對於法二,聲明如下:
procedure WndProc(var Message: Tmessage);override
必須注意,使用時需要在處理完自己訊息處理後繼承WndProc(Message)函數,否則系統會崩潰!
八、Word中Combo對話框的動態產生以及Change事件
建立類別模組Combohander,在內部定義事件
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox
定義Combo控制項產生事件的模組
Dim ctlComboBoxHandler As New ComboBoxHandler
產生Combo對話框
Set Cbo_ChooseDoc = CommandBars("新增的選單").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
進行檔案句柄設置,以產生Combo_Change事件
Set ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc
產生事件後,在類別模組Combohander內選擇ComboBoxEvent的Change事件,即可書寫事件代碼
Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
九、一些Word的事件
VBA程式碼中處理的Word事件有:Document_Close
Application事件中需要處理的有:DocumentBeforeClose,DocumentChange。
Document_Close:事件在文件關閉時產生事件
DocumentBeforeClose:在文件關閉以前先於Word判斷文件是否儲存,給予對應提示並進行對應處理。
DocumentChange:文件切換,在文件從自己修改的文稿和其他人修改的文稿之間切換產生事件,主要處理設定文件權限等