喫茶XRAYトップページ

[スレッド全体
]

[4631] OLEObjectによるWORD操作返信 削除
2011/4/15 (金) 17:33:35 yumapa
いつもお世話になります。
7年振りに投稿させて頂きました。

WORDやEXCELをOLEにて操作するアプリに興味があり
いつもサンプルプログラムを参考にさせて頂いております。
ありがとうございます。

何年経っても低レベルな私のスキルではどうにもならず、
色々と調べてもみたのですが、解決策を見つけることも
できませんした。
是非ともアドバイスをお願い致します。

さて、標記のとおり「OLEObjectによるエクセル操作」する
アプリに取り組んでおります。
   WordApplication, WordDocument: Variant;

   WordApplication := CreateOleObject('Word.Application');
    WordApplication.Visible := True;
    WordDocument := WordApplication.Documents.Open(
                    ExtractFilePath(Application.ExeName) +
                    '\文書.doc');
として接続しております。

この場合に、WORDアプリケーション右上の「閉じる」ボタンが
押された場合のイベントを元アプリで取得して、ある処理を
させたいと思います。

「他のアプリケーションの終了を待つ」という部分については
サンプルも数多く見付けられるのですが、今回、私が実現したいのは
アプリが終了する以前の「閉じる」ボタンが押された時のイベントを
取得したいのです。

ご教授頂けましたら幸いです。

[4633] Re:OLEObjectによるWORD操作返信 削除
2011/4/15 (金) 21:30:42 Mr.XRAY
> アプリが終了する以前の「閉じる」ボタンが押された時のイベントを
> 取得したいのです。


これは,今回の場合,Microsoft Word(ワード)の右上の[×]ボタンという
ことですよね.
ううっ,難しそう... さて...

Windows XPなら,なんとかなるかな?
Windows 7だと,う〜む.


[4634] Re2:OLEObjectによるWORD操作返信 削除
2011/4/16 (土) 08:56:18 yumapa
▼ Mr.XRAYさん

お世話になっております。
私のようにレベル向上しない万年素人にとって、Mr.XRAYさんの
ホームページは詳しく解説して頂いている上、豊富なサンプルも
利用させて頂けるので、大変助けて頂いておりますm(__)m

> これは,今回の場合,Microsoft Word(ワード)の右上の[×]ボタンという
> ことですよね.


そのとおり[×]ボタンのことです。

何も分かっていない素人は、させたい動作を実現するために
そのプロセスの難易度やセオリーを考慮せず、単純な思いつきだけで
あーしたい、こーしたい、と口にしてしまいお恥ずかしいです(^^;
何かアドバイスだけでも頂けたら幸いですm(__)m


[4637] Re3:OLEObjectによるWORD操作返信 削除
2011/4/16 (土) 19:01:11 Mr.XRAY
▼ yumapaさん

昨日はちょっと酔っていましたので,読み直したら,

>この場合に、WORDアプリケーション右上の「閉じる」ボタンが
>押された場合のイベントを元アプリで取得して、ある処理を
>させたいと思います。


ということですので,元のアプリの
例えば,[Servers]タブのTWordDocumentコンポを使用していたら,
そのOnCloseイベントに必要な処理を記述すれば,できるような気がします.
もし,動的にTWordDocumentを生成している場合は,イベントを定義します.

その他,
もし,TWordApplicationのOnDocumentBeforeColoseイベントで処理を記述
しても,同様の処理が可能だと思います.
ただし,どちらのイベントを使用するかによって,多少,発生のタイミング
が違うようです.確認してみてください.

また,TWordApplicationのConnectKindの値によっては,これらのイベントは
既に起動中のワード文書を閉じる際にも発生します.

時間があれば,テストしてみますが,多分,何とかなるでしょう.


[4641] Re4:OLEObjectによるWORD操作返信 削除
2011/4/16 (土) 23:33:28 Mr.XRAY
動作確認しました.

Windows XP(SP3)
Delphi 2010(UP5)
[Servers]タブのコンポーネント類は,Microsoft Office 2000...
実際に操作したワードは,Word 2007

テストに使用したコードは,
[432_TWordApplicationによるワード操作の基本例]
http://mrxray.on.coocan.jp/Delphi/plSamples/432_Word_TWordApp.htm
ただし,

procedure TForm1.Button3Click(Sender: TObject);
var
    ADocName : String;
begin
    ADocName := WordDocument1.FullName;
    Application.MessageBox(PAnsiChar(ADocName),'情報',MB_OK);
    //ここのPAnsiCharをPCharに変更(Delphi 2010でテストしたので)
end;

とりあえず以上です.他の環境での動作確認は必要があればということで.


[4642] Re5:OLEObjectによるWORD操作返信 削除
2011/4/17 (日) 09:32:09 yumapa
▼ Mr.XRAYさん

いつも、お世話になります。

[Servers]タブのコンポーネントを使用する方法に
変更して対応してみることにします。

ご教授ありがとうございました。


[4645] Re6:OLEObjectによるWORD操作返信 削除
2011/4/17 (日) 11:13:52 Mr.XRAY
▼ yumapaさん

> [Servers]タブのコンポーネントを使用する方法に
> 変更して対応してみることにします。


あらっ,ごめんなさい.

WordApplication := CreateOleObject('Word.Application');

となっていましたね.というか,タイトルにOLEObjectと書いてありますね.
失礼.でしたら,自分でイベントを定義してください.

WordApplication.OnDocumentBeforeClose := 自分で定義した関数名;
                ^^^^^^^^^^^^^^^^^^^^^
                OLEObjectで生成した場合,ここは違うのかな(不明)
                Word2000.pas内等を参照してください

参考までに,[Servers]タブのコンポ(Word2000の場合)のイベントの
スケルトンは以下のようにできます.
VBAのヘルプか,実際に[Servers]タブのコンポを配置して,空のイベントを
作成して確認してください.自分で作成した関数名の引数とその順序は一致
する必要があります.

VBAのヘルプは,
http://mrxray.on.coocan.jp/Delphi/Others/Office2000Help.htm

procedure TForm1.WordApplication1DocumentBeforeClose(ASender: TObject;
  const Doc: _Document; var Cancel: WordBool);
begin
//
end;

procedure TForm1.WordDocument1Close(Sender: TObject);
begin
//
end;



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82