Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年07月02日] [更新 2013年06月30日] Delphi サンプルプログラム集
432_TWordApplication によるワード操作の基本例
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Word 2007
432_Word_TWordApp.zip [1,190 KB] 2013年06月30日版 (EXE 同梱)



  • 2011年04月21日
  • 動作確認環境変更
  • 2013年06月30日
  • Windows 7 U64(SP1) + Delphi XE Proで動作確認




01_TWordApplication によるワード操作の基本例


拙作のワード操作フォームExでは,この TWordApplication を使用しています.その動作の基本がここで紹介するサンプルコードです.
単にワードというアプリケーションを起動するだけであれば,本ページのようなコードは必要ありません.[485_アプリの起動とファイルを開く関数] の記事あるいは,その記事中のリンクを参考にしてください.

基本的な操作はエクセルの場合とほとんど同じです.エクセルの場合はブックを,ワードの場合は文書を開くことになります.このサンプルは単に「テスト文書」という文書を表示するだけです.文書を開くメソッドの引数は,使用する [Servers] タブのコンポーネントによって違いがあります.既に起動中のワードに接続する方法等はエクセルの操作コードを参考にしてください.

このサンプルコードとワード操作フォームEx のオブジェクトの対応は下表のようなっています.ワード操作フォームEx では,これらのオブジェクトを実行時に生成しています.


このページのコード ワード操作フォームEx
WordApplication1 (TWordApplication) wdfWordApp (TWordApplication)
WordDocument1 (TWordDocument) wdfWordDoc (TWordDocument)



図1
設計時画面
  • [Servers] タブの以下を配置
    TWordApplication
    TWordDocument
図2
実行例

リスト1
ワードを表示する基本コード
unit Word_TWordAppUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, Word2000;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    WordApplication1: TWordApplication;
    WordDocument1: TWordDocument;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  操作しやすいように,このFormを最前面に表示
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.FormStyle := fsStayOnTop;
end;

//=============================================================================
//  FormのOnCloseイベント
//  終了処理(Delphi言語の例外で停止が無効でないとtry~end部分無効)
//  Wordの切断
//  try~except,endを使用しているのは,このフォームを閉じる前にワードを終了して
//  してしまった場合を考慮して
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    if WordApplication1.Documents.Count > 0 then begin
      WordDocument1.Close;
      WordDocument1.Disconnect;
    end;

    //Quitがないと,WINWORD.EXEのプロセスがメモリ上に残ってしまう
    WordApplication1.Quit;
    WordApplication1.Disconnect;
  except
  end;
end;

//=============================================================================
//  [ワードを新規起動]ボタン
//  Wordアプリケーションの接続と指定文書の表示
//  Openメソッドの引数の数はインストールしている[Servers]タブのOfficeのパッケ
//  ージによって異なる.このコードはWord2000の場合.WordXPの場合は後3つ必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  FilePath : OleVariant;
begin
  FilePath := ExtractFilePath(Application.ExeName) + 'テスト文書.doc';
  WordApplication1.Connect;
  WordApplication1.Visible := True;

  //文書を開く
  WordApplication1.Documents.Open(FilePath,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam,
                                  EmptyParam);

  //開いている文書に接続し,それをWordDocument1オブジェクトとする
  WordDocument1.ConnectTo(WordApplication1.ActiveDocument as WordDocument);
end;
//=============================================================================
//  [終了]ボタン
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

//=============================================================================
//  現在表示中の文書のフルパス名を表示
//  WordDocument1(TWordDocument)の使用例の1つとして
//  ワード操作の他のコードは,拙作ワード操作フォームExのソースコードまたは
//  オンライン・マニュアル参照
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
var
  ADocName : String;
begin
  ADocName := WordDocument1.FullName;
  Application.MessageBox(PChar(ADocName), '文書のパス名');
end;

end.




02_オブジェクトに OleVariant 型を使用するコード


上のコードでは,Open メソッドの引数のほとんどにデフォルト値 (EmptyParam) を用いています.以下の様に,OleVariant 型を使用すると引数を省略できます.

リスト2
Open メソッドに OleVartint を使用した例
//=============================================================================
//  [ワードを新規起動]ボタン
//  Wordアプリケーションの接続と指定文書の表示
//
//  OleVariant型を使用すると引数を省略可能.ここではOpenメソッドで使用
//  この方法だと,使用する[Servers]タブのバージョンに関係ないコードが使用可能
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  FilePath : OleVariant;
  ADoc     : OleVariant;
begin
  FilePath := ExtractFilePath(Application.ExeName) + 'テスト文書.doc';
  WordApplication1.Connect;
  WordApplication1.Visible := True;

  //文書を開く
  ADoc := WordApplication1.Documents;
  ADoc.Open(FileName := FilePath);

  //開いている文書に接続し,それをWordDocument1オブジェクトとする
  WordDocument1.ConnectTo(WordApplication1.ActiveDocument as WordDocument);
end;




02_[ ツールパレット ] 等に Servers がない場合


Delphi のバージョンによっては,初期状態では,TWordApplication や TExcelApplication 等のコンポーネントが使用できないことがあります.
この場合,下図のような [コンポーネントパレット] あるいは [ツールパレット] に [Servers] タブが存在しません.

  • 図3
  • コンポーネントパレットの [Servers] タブ

図4
ツールパレットの [Servers]
  • この図は Delphi XE4 Pro のもの

このような場合は,[コンポーネント] [パッケージのインストール] で下図のダイアログを表示して, [Microsoft Office XXX オートメーション...] というパッケージをチェックします.
これらのパッケージは複数ある場合があります.使用可能なのは 1 つだけです.
Delphi XE2 以降には,Office2010 用のファイルも用意してありますが,パッケージとしては用意されていません.Delphi XE4 には,Offfice 2010 用のパッケージが用意されています.パッケージのインストールを実行すれば使用可能となります.


図5
インストール済みパッケージ
  • [コンポーネント] [パッケージのインストール] で表示されるダイアログ
  • Microsoft Office XXX オートメーションのどちらかをチェックする
  • 両方同時には使用できない