Delphi Programming / Object Pascal
[掲載 2009年06月11日] [更新 2013年11月20日] ワード操作フォームEx |
ワード操作フォームEx 参考コード類
ワードの文書のハンドル値 |
動作確認等 |
Windows 7 U64(SP1) + Delphi XE Pro + Word 2010 |
例えば以下のコードで取得できます.
ワード操作フォームEx では,フォームのキャプションに,拡張子を除いた文書名を表示しています.このテストでは,ワード自身で文書を開いた時と同じ文書名を取得して表示してみました. |
|
図1
実行例 |
|
図2
docx 形式の文書の場合
|
implementation
{$R *.dfm}
var
WordDocHandle : HWND;
//=============================================================================
// フォームを表示する時の処理
//=============================================================================
procedure TplWordFormEx2.FormShow(Sender: TObject);
begin
//表示する文書の指定
wdfFileFullPath := 'テスト文書.doc';
//元のOnShowを実行
inherited;
end;
//=============================================================================
// フォームを閉じる時の処理
//=============================================================================
procedure TplWordFormEx2.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
//保存したことにしてしまう
if wdfFileOpened then wdfWordDoc.Saved := True;
//元の処理を実行
inherited;
end;
//-----------------------------------------------------------------------------
// EnumChildWindows関数のコールバック関数
//
// 文書のハンドルの取得
// 確認のために,取得した内容をMemo1に表示している
// Word2007以上では拡張子がdocの場合,[互換モード]の字が入る
//-----------------------------------------------------------------------------
function EnumWindowProc(AWnd: hWnd; lPalam: LPARAM): Boolean;Stdcall;
var
TheText : Array[0..MAX_PATH-1] of char;
DocName : String;
TextStr : String;
begin
Result := True;
DocName := String(lPalam);
if (GetWindowText(AWnd, TheText, MAX_PATH) <> 0) then begin
if IsWindowVisible(AWnd) then begin
TextStr := TheText;
plWordFormEx2.Memo1.Lines.Add(TextStr);
if (Pos(DocName,TextStr) > 0) and (Pos('Microsoft', TextStr) = 0) then begin
Result := False;
WordDocHandle := AWnd;
exit;
end;
end;
end;
end;
//=============================================================================
// 表示中のワードの文書ハンドルをEnumChildWindowsのコールバック関数で取得
// ワードはPanelLeft(TPanel)をParentとして表示している
// そこでその子ウィンドウを検索
//=============================================================================
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
ADocName : String;
begin
Memo1.Lines.Clear;
if wdfWordApp.Documents.Count > 0 then begin
ADocName := wdfWordDoc.Name;
EnumChildWindows(PanelLeft.Handle, @EnumWindowProc, LPARAM(PChar(ADocName)));
if WordDocHandle <> 0 then begin
MessageBox(Handle, PChar(IntToStr(WordDocHandle)), '情報', MB_ICONINFORMATION);
end;
end;
end;
//=============================================================================
// 表示中のワードのハンドル
//=============================================================================
procedure TplWordFormEx2.Button2Click(Sender: TObject);
begin
MessageBox(Handle, PChar(IntToStr(wdfWordHandle)), '情報', MB_ICONINFORMATION);
end;
|