Delphi和Word之間的編程

http://search.csdn.net/Expert/topic/2498/2498249.xml?temp=.6766474  
  [url]http://search.csdn.net/Expert/topic/772/772760.xml?temp=.791073[/url]  
  [url]http://search.csdn.net/Expert/topic/1430/1430589.xml?temp=.2160456[/url]  
   
  上面的資料你看了應該就可搞定了
[b]1、VBA代碼含義[/b]  
   
  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系統。  
   
  [b]2、Word中內嵌的Com技術[/b]  
   
  能夠說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代碼提示,全部異常處理均須要本身編寫,可能編寫時探索性知識比較多。  
   
  [b]3、Word宏編輯器[/b]  
   
  Word可以真正地進行VBA代碼的編輯,能夠編寫窗體、函數。  
   
  進入Word宏編輯器的方法:工具->宏->Visual   Basic編輯器,可進入Visual   Basic編輯器界面。  
   
  Word的Visual   Basic編輯器界面和真正的Visual   Basic編輯器基本相同,在此再也不向詳述。  
   
  在VBA代碼中,能夠添加用戶窗體、模塊、類模塊。用戶窗體、模塊、類模塊的概念和Visual   Basic  
   
  徹底相同。註釋也與Visual   Basic徹底相同。  
   
  能夠將光標停留在窗體、模塊的任何一個子程序上,直接按「F5」運行當前子程序。  
   
  [b]4、Word的宏的概述[/b]  
   
  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]5、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   書籤  
[b]1、Delphi程序啓動Word[/b]         採用CreateOleObjects的方法來啓動Word,調用VBA代碼,具體實現過程爲:         首先使用GetActiveOleObject('Word.Application')判斷當前內存中是否存在Word程序,若是存在,         則直接鏈接,若是沒有Word程序,則使用CreateOleObject('Word.Application')啓動Word         [b]2、Delphi程序新建Word文稿[/b]         格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)         Template:   使用模板的名稱,         NewTemplate:   新建文檔的類型,True表示爲模板,False表示爲文檔         DocumentType:   文檔類型,默認爲空白文檔         Visible:   打撈的窗口是否可見         舉例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:.dot',NewTemplate:=False);         [b]3、Delphi程序打開Word文稿[/b]         格式: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);         [b]4、Delphi程序保存Word文稿[/b]         格式: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);         [b]5、從數據庫讀取文件到本地硬盤和從本地硬盤讀取文件到數據庫[/b]         在數據庫上使用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;         [b]6、全局消息的定義[/b]         由於word和Delphi程序是兩個軟件,相互之間通信比較麻煩,因此使用全局消息的方法進行。         全局消息必須首先註冊,Windows返回系統空閒的消息號,當註冊的消息相同時,         Windows系統返回同一個值,這樣就保證了使用這個消息號在兩個程序之間通信。         定義消息的辦法:         szMessageString:   pchar   =   'XIDIAN_11_Stone';         FMyJoinMessage   :=   RegisterWindowMessage(szMessageString);         發送消息的方法:         SendMessage(對方句柄,消息,消息附帶短變量,消息附帶長變量)         [b]7、Delphi程序接收消息的方法[/b]         Delphi接收消息有兩種,一是重載特定消息,二是重載WndProc函數,在裏面選擇相應消息進行處理。         法一,每次只能處理一條消息,而法二可以同時處理多條消息。         對於法二,聲明以下:         procedure   WndProc(var   Message:   TMessage);override         必須注意,使用時須要在處理完本身消息處理後繼承WndProc(Message)函數,不然系統會崩潰!         [b]8、Word中Combo對話框的動態生成以及Change事件[/b]         創建類模塊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)         [b]9、一些Word的事件[/b]         VBA代碼中處理的Word事件有:Document_Close         Application事件中須要處理的有:DocumentBeforeClose,DocumentChange。         Document_Close:事件在文檔關閉時產生事件         DocumentBeforeClose:在文檔被關閉之前先於Word判斷文檔是否保存,給出相應提示並進行相應處理。         DocumentChange:文檔切換,在文檔從本身修改的文稿和其餘人修改的文稿之間切換產生事件,         主要處理設置文檔權限等。         來自:DragonPC_???,   時間:2001-12-1   21:44:00,   ID:758037         寫的不錯,可是我想說一些不一樣的話,         CreateOLEObject建立的variant類型變量,運行期才經過IDispatch接口進行方法調用,因此沒有Code   Insight,         開發效率、運行效率都要差一點。(IDispatch接口是爲適合Automation技術開發的,比COM更高級,更抽象)         [url]http://www.delphibbs.com/delphibbs/dispq.asp?lid=680785[/url]         [url]http://www.delphibbs.com/delphibbs/dispq.asp?lid=420919[/url]         Delphi   Servers   組件和Import   Library是一回事來着,使用Import   Library會更加通用一點,除了Word,         其它的支持Automation的應用程序均可以使用,好比Autocad、IE等等。可是Import   Library有不少的bug,         常常出錯。這一點玩過COM編程的人都知道,但我仍是推薦使用這套技術進行COM或者Automation工做,效         率高的多。hubdog是這方面的專家,大家能夠等他來介紹介紹。         最後我推薦Binh   Ly的站點,他是Borland的COM專家,若是常常逛Borland的Automation新聞組,你確定認         識他,站點有不少介紹和工具下載,你們能夠本身看看。Delphi   4編程技術內幕的做者Chris   Clvert也是         箇中好手,他的站點資料多多。         [url]http://www.techvanguards.com/[/url]         [url]http://www.delphibbs.com/delphibbs/dispq.asp?lid=738352[/url]         ***********         一、可使用VBA屏蔽掉相應功能的Office事件,以下,屏蔽了FileSave(保存)選項         Sub   FileSave()         '裏面什麼都不須要加,若是你須要他執行保存的時候還執行別的,那麼添加,同時加上下面這句話         '   Word.ActiveDocument.Save         End   Sub         二、使用Delete方法,能夠刪除此屬性,Visible還能夠再次顯示,而Delete就……         三、對於實現特定功能,沒有必要這麼作,你能夠將全部VBA代碼生成一個dot模板,其餘文檔         創建/打開的時候以他爲基本模板就能夠了。  
相關文章
相關標籤/搜索