Delphi と Word の融合テクノロジー
1. VBAコードの意味
Microsoft Word は、米国 Microsoft Corporation の統合環境であり、単なるワープロ システムではありません。Microsoft Visual Basic が統合されており、プログラミングによって Word の機能を拡張できます。
Word の Microsoft Visual Basic のコードは Word のマクロです。Word マクロを記述することで、文書の自動バックアップや保存など、一部の文書処理の自動化を実現し、Word 文書の機能を拡張できます。したがって、Word を独自のソフトウェアの一部にしても、Word の機能を最大限に活用できます。
Word のマクロには文書の自動化に役立つため、いくつかの利点がありますが、純粋に有益というわけではありません。台湾 NO1 マクロ ウイルスをはじめ、現在の Melissa マクロ ウイルスは、文書、コンピュータ システム、さらにはネットワークに悪影響を及ぼす可能性があります。最初に表示される単純なプロンプトにより、システム リソースが枯渇し、ランダムな電子メールが送信され、個人情報がネットワークに送信され、さらにはハードディスク上の Autoexec.bat (自動バッチ ファイル) に送信されます。 -y、Windows システム全体を破壊します。
2. Word に組み込まれた Com テクノロジー
Word は COM テクノロジを最もよくサポートしているソフトウェアであると言えます。これを言うのは少し極端ですが、Word が提供する強力なプログラミング インターフェイス テクノロジを使用すると、プログラムを通じて Word のあらゆる部分を制御できます。文書を開いたり、保存したり、印刷したり、表を自動的に描画したりする場合も同様です。
プログラミング ソフトウェアを使用すると、Word を柔軟に操作できます。ここでは、Borland Delphi を例に挙げて詳しく説明します。
1. Delphi で Word ソフトウェア/ファイルを呼び出す方法
Word で Word ソフトウェアを呼び出すには、次の 3 つの方法があります。
。 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 を埋め込む
これは、Word 文書を直接呼び出すことができる最も単純な Ole 埋め込みです。ToleContainer.Run を使用するだけで Word 文書を直接起動できます。そして、このようにして起動された Word 文書は(インターフェースの観点からは)Delphi プログラムと統合されていますが、Delphi を介して Word 文書を制御することができず、Word を柔軟に操作するという目的を達成できないという克服できない欠点があります。達成される。
b. Delphi が提供する Servers コントロールを使用して Word を呼び出し、Word のプロパティを使用します。
Delphi のサーバー コントロールを使用して Word を制御すると、Delphi はプログラミング中にコード プロンプトを実装できます。ただし、Delphi で呼び出すことができない Word の関数もまだいくつかあります。 )マクロコード)。また、関数が元々 VBA コード内でオプションである場合は、Delphi を呼び出すときにパラメーターを追加する必要があります。追加しないと、コンパイルも通過しません。このようにして開始された Word プログラムと Delphi プログラムは、それぞれ 2 つの形式に属します。この方法は参考としてのみ使用できます。
c. 実際の Com テクノロジを使用して、Office ソフトウェア ディレクトリ内のファイル MSWORD9.OLB 内のすべてのクラス ライブラリを Delphi にインポートし、Com テクノロジを使用してプログラミングし、実際の Com テクノロジを使用して MsWord9.OLD ファイル クラス ライブラリをインポートしてから、Com を使用します。技術をプログラムに使用します。全体的には、Delphi の Servers コントロールを使用するのと似ていますが、Servers コントロールよりも少し面倒です。利点と欠点は、Servers コントロールと同じです。
d. CreateOleObject を使用して Word を起動し、Ole モードで Word を制御します。
このメソッドは、CreateOleObjects メソッドを使用して Word (実際には Ole) を呼び出すことですが、このメソッドは Word ファイルを完全に制御し、自分で作成した VBA マクロ コードを含む Word のすべてのプロパティを使用できます。
サーバー コントロールや COM テクノロジと比較して、この方法では Word のさまざまなプロパティを実際に使用できます。基本的には VBA で独自のコードを記述するのと同じであり、既定のコードを使用する必要はありません。このようにして開始された Word プログラムと Delphi プログラムは、それぞれ 2 つの形式に属します。欠点は、この方法を使用する場合、Delphi コード プロンプトが表示されず、すべての例外処理を自分で記述する必要があり、記述する際にさらに探索的な知識が必要になる可能性があることです。
3. Wordマクロエディタ
Word では、VBA コードを編集し、フォームや関数を作成できます。
Word マクロ エディターに入る方法: [ツール] -> [マクロ] -> [Visual Basic Editor] を選択して、Visual Basic エディター インターフェイスに入ります。 Word の Visual Basic エディタ インターフェイスは、基本的に実際の Visual Basic エディタと同じであるため、ここでは詳しく説明しません。 VBA コードでは、ユーザー フォーム、モジュール、クラス モジュールを追加できます。ユーザー フォーム、モジュール、クラス モジュールの概念は、Visual Basic の概念とまったく同じです。コメントも Visual Basic とまったく同じです。
フォームまたはモジュールの任意のサブルーチンにカーソルを置き、「F5」を直接押すと、現在のサブルーチンを実行できます。
4. Word マクロの概要
Word は文書編集と VB を完全に組み合わせて、文書を真に自動化します。 Word を使用したプログラミングは、Visual Basic を使用するのと似ています。違いは、Word では特定のサブルーチンを直接実行して結果を直接確認できるのに対し、Visual Basic は実際のプログラムに記述できることです。コード保護の観点から、Word の VBA コード、特にキー コードの数をできる限り減らす必要があります。
VBA マクロは次の 4 つのタイプに分類できます。
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 ヘルプもこの点については説明していないため、独自の実験を通じてのみ調べることができます。最初に調べた関数は次のとおりです。
マクロ名説明コメント
ファイル新規新規
FileNewDefault は新しい空のドキュメントを作成します
ファイル名前を付けて保存名前を付けて保存
ファイル開く開く
ファイル閉じる閉じる
ファイル印刷印刷
FilePrintPreview 印刷プレビュー
ツールカスタマイズツールバーのカスタマイズ
ツールオプションツールオプション
ツールリビジョンリビジョンを強調表示する
ToolsReviewRevisions リビジョンの承認または拒否
ToolsRevisionMarksAccept リビジョンを受け入れる
ToolsRevisionMarksReject リビジョンを拒否
ツールリビジョンマークリビジョンの切り替え
ツールマクロマクロ
ツール記録マクロ切り替え新しいマクロの記録
ViewSecurity セキュリティ
ViewVBCode VB エディタ環境の表示
FileTemplates テンプレートとアドオン
ToolsProtectUnprotectDocument ドキュメントの保護を解除します
InsertHyperlink ハイパーリンクを挿入
EditHyperlink ハイパーリンクを編集する
ハイパーリンクの削除ハイパーリンクの削除
EditLinks リンクの表示と削除
EditPasteAsHyperlink ハイパーリンクを貼り付けます
FormatStyle スタイル
EditBookMark ブックマーク
OleWord で使用されるいくつかのコード
1. Delphi プログラムが Word を起動します
CreateOleObjects メソッドを使用して Word を起動し、VBA コードを呼び出します。具体的な実装プロセスは次のとおりです。
まず、GetActiveOleObject('Word.application') を使用して、現在のメモリに Word プログラムがあるかどうかを確認し、存在する場合は、CreateOleObject('Word.Application') を使用して Word を起動します。
2. 新しい Word 文書を作成する Delphi プログラム
形式: WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
テンプレート: 使用するテンプレートの名前。
NewTemplate: 新しいドキュメントのタイプ。True はテンプレートを表し、False はドキュメントを表します。
DocumentType: ドキュメント タイプ、デフォルトは空白のドキュメントです
Visible: サルベージされたウィンドウが表示されるかどうか
例: Doc_Handle:=Word_Ole.Documents.Add(Template:='C:/Temlate.dot',NewTemplate:=False);
3. Delphi プログラムが Word 文書を開きます
形式: WordDocuments.Open(FileName,confirmConversions,ReadOnly,PassWordDocument,
パスワード テンプレート、Revent、WritePasswordDocument、WritePassWordTemplate、
フォーマット、エンコーディング、可視)
FileName: ドキュメント名 (パスを含む)
confirmconversions: ファイル変換ダイアログボックスを表示するかどうか
ReadOnly: ドキュメントを読み取り専用モードで開くかどうか
AddToRecentFiles: [ファイル] メニューの下部にある最近使用したファイルのリストにファイルを追加するかどうか
PassWordDocument: このドキュメントを開くために必要なパスワード
PasswordTemplate: このテンプレートを開くために必要なパスワード
元に戻す: ドキュメントがすでに存在する場合、それを再度開くかどうか
WritePasswordDocument: ドキュメントへの変更を保存するために必要なパスワード
WritePasswordTemplate: テンプレートを変更するために必要なパスワードを保存します。
形式: ドキュメントを開くために必要なファイルコンバーター
エンコーディング: 使用されるドキュメント コード ページ
Visible: ドキュメントを開くウィンドウが表示されるかどうか
例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);
4. Word文書を保存するDelphiプログラム
形式: WordDocuments.SaveAs(ファイル名、ファイル形式、ロックコメント、パスワード、
AddToRecentFiles、WritePassword、ReadOnlyRecommended、
EmbedTrueTypeFonts、SaveNativePictureFormat、SaveFormsData、
AOCEL として保存)
ファイル名: ファイル名。デフォルトは現在のフォルダーとファイル名です。
FileFormat ドキュメントが保存される形式。
LockComments True の場合、このドキュメントではコメントのみが許可されます。
パスワード 文書を開くときのパスワード。
AddToRecentFiles True の場合、ファイル メニューの最近使用したドキュメントのリストにドキュメントを追加します。
WritePassword ドキュメントを変更するために必要なパスワードを保存します。
ReadOnlyRecommend True の場合、Word は文書を開くたびに読み取り専用モードを推奨します。
EmbedTrueTypeFonts True の場合、文書を TrueType フォントで保存します。
SaveNativePictureFormat True の場合、他のシステム プラットフォーム (Macintosh など) からインポートされたグラフィックスは Windows バージョンのみが保存されます。
SaveFormsData True の場合、ユーザーがフォームに入力したデータはデータ レコードとして保存されます。
SaveAsAOCELetter ドキュメントに添付ファイルが含まれている場合、このプロパティが True の場合、ドキュメントは AOCEL レターとして保存されます (電子メールも保存されます)。
例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
AddToRecentFiles=False);
5. データベースからローカル ハード ディスクにファイルを読み取り、ローカル ハード ディスクからデータベースにファイルを読み取ります。
Image バイナリ フィールドを使用してデータベースに保存し、Stream メソッドを使用します。
ファイル ストリームを作成します。
Word_FileStream:=TFileStream.Create(Target_Name、fmOpenWrite または fmCreate);
Word_FileStream.Position:=0;
データベースに保存された画像フィールド:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
データベースからローカル ハードディスクにファイルを読み取ります。
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
ファイル ストリームを解放します。
Word_FileStream.Free;
6. グローバルメッセージの定義
WordとDelphiは別のソフトなので相互に通信するのが面倒なのでグローバルメッセージ方式を採用しています。グローバル メッセージは最初に登録する必要があり、登録されたメッセージが同じ場合、Windows はシステムのアイドル メッセージ番号を返します。これにより、このメッセージ番号が 2 つのプログラム間の通信に使用されるようになります。
メッセージを定義する方法:
szMessageString: pchar = 'XIDIAN_11_Stone';
FMyJoinMessage := RegisterWindowMessage(szMessageString);
メッセージの送信方法:
SendMessage (相手ハンドル、メッセージ、メッセージには短い変数が付属、メッセージには長い変数が付属)
7. Delphi プログラムがメッセージを受信する方法
Delphi が受信するメッセージには 2 つのタイプがあります。1 つは特定のメッセージをオーバーロードするもので、もう 1 つは WndProc 関数をオーバーロードして、処理する対応するメッセージを選択するものです。
方法 1 は一度に 1 つのメッセージのみを処理できますが、方法 2 は同時に複数のメッセージを処理できます。
方法 2 の場合、ステートメントは次のようになります。
プロシージャ WndProc(var Message: Tmessage);オーバーライド
これを使用する場合、独自のメッセージを処理した後に WndProc(Message) 関数を継承する必要があることに注意してください。継承しないとシステムがクラッシュします。
8. WordでのコンボダイアログボックスとChangeイベントの動的生成
クラス モジュール Comboander を作成し、内部でイベントを定義する
Office.CommandBarComboBox としてパブリック WithEvents ComboBoxEvent
Combo コントロールによって生成されるイベントを定義するモジュール
新しい ComboBoxHandler としての Dim ctlComboBoxHandler
「コンボを生成」ダイアログボックス
Set Cbo_ChooseDoc = CommandBars("追加されたメニュー").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
Combo_Change イベントを生成するファイル ハンドルを設定します。
ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc を設定します。
イベントが生成されたら、クラスモジュールComboanderのComboBoxEventのChangeイベントを選択してイベントコードを記述します。
Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
9. いくつかの Word イベント
VBA コードで処理される Word イベントは次のとおりです。
Application イベントで処理する必要があるのは、DocumentBeforeClose、DocumentChange です。
Document_Close: イベントは、ドキュメントが閉じられたときにイベントを生成します。
DocumentBeforeClose: 文書を閉じる前に、Word は文書が保存されているかどうかを判断し、対応するプロンプトを表示し、対応する処理を実行します。
DocumentChange: ドキュメントの切り替え時に、自分が変更したドキュメントと他人が変更したドキュメントを切り替えるときにイベントが生成されます。主にドキュメントの権限の設定などを処理します。