喫茶XRAYトップページ

[▲前のスレッド]

[1221] Wordの制御についてご教示下さい返信 削除
2007/4/29 (日) 17:40:13 satot
お初に来店させて頂きます。satotと申します。
コーヒーと山が好きな、病院勤務のおっさんです。
早速ですが、ワード操作フォームに教えて頂きながら
    wkWordApp := WordApplication1;
    wkWordDoc := DataModule1.WordDocument1;
    CreateFile(wkWordApp, wkWordDoc, FilePath,'文書1');

    ReplaceBookMark(wkWordApp, wkWordDoc,
                     '氏名',wkStr);
    wkWordApp.Visible := True;
    wkWordApp.Activate;

※CreateFileで、文書1を開き、
※ReplaceBookMarkで、ブックマーク'氏名'を、wkStrで置き換える

というものですが、自アプリで文書を開いた場合はうまく制御
できるのですが、これを、他のアプリがすでに開いている
'文書2'を、制御できるようにする方法はありますでしょうか。
お休み(?)中のところ、申し訳ありませんが、ご教示いただけない
でしょうか。(Word制御に関しては、超名人とお見受けいたしました。)



[1222] Re:Wordの制御についてご教示下さい返信 削除
2007/4/30 (月) 12:04:38 Mr.XRAY
▼ satotさん

いらっしゃいませ.レスが遅くなり申し訳ありません.

>コーヒーと山が好きな、病院勤務のおっさんです。

あれっ,同じですね.ただ私は今まったくといっていいほど山に行ってい
ません.現役の頃であれば,この時期は穂高あたりでしょうね.
でも私は病院勤務じゃないんです.

もしかしたら意味をとり違えているかもしれませんが,
まず,ワード操作フォームから,同時に2つの文書を表示できません.
つまり,操作可能なのは一つの文書のみです.
これは,WebBrowser上で表示しているための制限です(OleContinerでも同じ).

TWordApplicationで起動中のワードを操作するには
TWordApplicationのConnectKindがckRunningOrNewであれば自動的に接続
してくれます.ただし,以下のように意図的に接続すれば,操作は明確
になるでしょう.

//=============================================================================
//  現在起動中(Running)のワードに接続
//  ワードが起動していない時の処理を追加する必要があるだろう
//  ワード起動中の確認は,ワードのバージョンによって違う場合がある
//  http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/B_Property.htm
//  のリスト1が参考になるかも
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     FilePath : OleVariant;
begin
     WordApplication1.ConnectKind:=ckRunningInstance;

     WordApplication1.Connect;
     WordApplication1.Visible:=True;
     WordDocument1.ConnectTo
                   (WordApplication1.ActiveDocument as _document);
end;
//=============================================================================
//    [終了]ボタン
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
     Close;
end;
//=============================================================================
//    終了処理(Delphi言語の例外で停止が無効でないとtry〜end部分無効)
//    FormのOnCloseイベント
//    Wordの切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     try
       //テストなので保存確認は無視
       WordDocument1.Saved:=True;

       WordDocument1.Close;
       WordDocument1.Disconnect;
       WordApplication1.Quit;
       WordApplication1.Disconnect;
     except
     end;
end;
//=============================================================================
//  接続したワードの文書のキャレット位置に 東京都 という文字列を挿入
//  挿入後
//=============================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
     pUnit: OleVariant;
     pCount: OleVariant;
begin
     WordApplication1.Selection.InsertAfter('東京都');
     pUnit:=wdSentence;
     pCount:=1;
     WordApplication1.Selection.Move(pUnit,pCount);
end;

ワードを起動後または,このコード実行後にワードを起動したり,
Button1をクリックしたから,Button4をクリックしたり,
Button1をクリックせずに,Button4をクリックしたり,
複数の文書を開いて実験してみて下さい.

それと,質問の際は,是非ご自分の開発環境を書いて下さいね.
これは以下の理由からです.

(1)適当な解決方法がWindowsやDelphiのバージョンによって違うかもしれない.
(2)その環境で動作(動作しないも含め)の確認ができる.
   私と他の方の貴重な情報となる.

よろしく.
satotoさんも,ここに書いているということは,この連休の山行は...



[1223] Re2:Wordの制御についてご教示下さい返信 削除
2007/5/1 (火) 00:38:42 satot
▼ Mr.XRAYさん
satotです。早速大変ご丁寧にご教示いただきありがとう
ございます。
今帰ったところで、少しアルコール入りで、神聖なDelphi
に申し訳ないので、明日、一番に実験してみます。

この掲示板ではDelphiに無関係な話題も有り、な様ですので
お礼かたがた自己紹介をかねてすこし。
>ここに書いているということは,この連休の山行は...
そうなんですよ、涸沢にテントを置いて、北穂に行く予定が
Wordにつまずいてだめになりました(ウソ)。昨年10月の
大荒の天気の後、涸沢で見事な三段紅葉に会ってから、五月
にまた登ろうと思っていました。実は、私は関西在住です。
昔は、夜行急行ちくま〇〇号でよく、大糸線に行きました。
夜行急行が無くなり関西からは信州が遠くなりました。
13:30と16:00に松本に着くバスがありますが、何かマヌケな
感じで、昨秋は、夜行バスで長野に行き、松本まで始発で
戻ってきました。帰りは、上高地発13:00に乗るべく走って
下りました。ヤッパリ全国に行ける夜行があった国鉄が
懐かしいな。そんな訳で、昼連休の渋滞の中を走るバスと
少し気温が高そうなので、雪崩も少し心配でもう少しあとに
する事にしました。
>是非ご自分の開発環境を書いて下さいね
うっかりしました。申し訳ありません。
Delphi6、Word2002、Word2003です。
状況は、電子カルテ上で例えば、診断書を書くのに自作
でWord文書の雛形を用意し、氏名、住所、生年月日などは
電子カルテ側がWordを開いたあと、文字置換で記入します。
残りの、例えば休業期間等をDelphi製の自アプリで計算し、
雛形に埋め込んだブックマークを計算結果で置き換えたい。
というものです。そこで置き換える際、電子カルテが開いて
いる文書(文書名は既知)をDelphiで制御できるか、と言う
のが課題でした。




[1224] Re3:Wordの制御についてご教示下さい返信 削除
2007/5/1 (火) 07:20:48 Mr.XRAY
▼ satotさん

> 大荒の天気の後、涸沢で見事な三段紅葉に会ってから、五月

山の話は全て昔話しになってしまいますが,
(若い連中に5年以上は大昔と言われてしまいます)
三段紅葉みましたか.いいですね.ちょうど10月の連休の頃がベストですね.
これも年によってだいぶ紅葉(ナナカマド)の色づきが違います.
ちょうどその頃前の日に積もった雪に朝日が反射して,それは見事なモルゲン
ロートだったことがあります.感動ものでした.
穂高も不思議ですよね.上高知から横尾の標高差たった100mの長い道(現役の
頃は約2時間)があまり苦にならない(冬はちょっと苦しい?).梓川と自然の中
を歩くせいでしようか.

5月の連休の穂高もいいですよね.鯉のぼりを飾っているテントもあり,
にぎやかです.
天気がよければ一日中,雪の上で昼寝するのもいいです.

> いる文書(文書名は既知)をDelphiで制御できるか、と言う
> のが課題でした。


対象のPCでワード文書が一つだけしか開いてなければなんとかなると思います.
私も複数の文書に対してはやったことがありません.
ではでは,山ヤの根性でがんばってください.
あの苦しみを考えれば....  なんてね.

[1227] Re4:Wordの制御についてご教示下さい返信 削除
2007/5/3 (木) 15:03:14 satot
▼ Mr.XRAYさん
satotです
ご丁寧に教えていただいたのに、お礼が遅くなって申し訳ありません。
教えてばっかりおじさん、では来店お断りと言われかねないので
何とか格闘しておりましたが、一つだけ未解決です。
他アプリで開いた(中には当方が埋め込んだブックマークあり)
文書に対して、設定されたブックマークをreplaceするにあたり、
1).Wordが起動しているか
2).文書が開かれているか
3).その文書が目的の文書か
の3点をチェックする必要があると思います。
そこで、
1).は
if WordApplication1.Visible=False then
で、Wordが起動しているか
3).は
if WordDocument1.Name<>目的文書 then
で、その文書が目的の文書か、がチェックできるようですが、
2).の、文書が開かれているかどうかを取得する方法が
どうしてもわかりません。仕方ないので、3).の前に
WordDocument1.ConnectTo
     (WordApplication1.ActiveDocument as _document); を実行して
文書が開かれていなければ、エラーになるので、それを
on E: EOleSysError do
で捕捉して処理すれば何とかなるようですが、一つも文書が開かれて
いない状態を知る方法がありそうなのですが、Delphiのコード補完
を使ってもうまく捜せませんでした。
残念ながら
EnumChildWindows(Handle,Addr(EnumChildWndProc),0);
の方法は、使い方がよく理解できませんでした。
今年は少し暖かいようですが、5月の連休の北穂沢は雪崩の心配は
ないのでしょうか。




[1228] Re5:Wordの制御についてご教示下さい返信 削除
2007/5/3 (木) 21:36:27 Mr.XRAY
▼ satotさん

> ご丁寧に教えていただいたのに、お礼が遅くなって申し訳ありません。

こちらこそ。
ワードの起動のチェックというは、ワードのハンドルを取得して、失敗すれば
起動していないという方法があります。

var
     WordHandle : THandle;
begin
     WordHandle:=FindWindow('OpusApp',nil);
     if WordHandle=0 then begin
        ShowMessage('ワードが起動していないよ');
     end;

という感じです。OpusAppというのはどう調べるとのかと言うと、
EnumChildWindows等を使用します。
これは、Halbow資料館の以下を参考にして下さい。このページの一番下の
WindowTree.lzh・#95;ウンロードすると簡単にウィンドウのリストが見られます。

http://homepage2.nifty.com/Mr_XRAY/Halbow/VCL06.html

単にワードが起動していなければ実行しないという方針であれば、エラーを
トラップするという考え方もあります。
動けば正義という考えですね。

     try
     WordApplication1.Connect;
     WordApplication1.Visible:=True;
     WordDocument1.ConnectTo
                   (WordApplication1.ActiveDocument as _document);
     except
       ShowMessage('ワードが起動していなのでやめた');
     end;

開発アプリの仕様にもよりますが、
CreateProcess
ShellExecute
等で必ずワードを起動してから操作するという考え方もありかも知れません。

> 教えてばっかりおじさん、では来店お断りと言われかねないので

いえいえ、来る者拒まず、去るもの追わずです。

> 今年は少し暖かいようですが、5月の連休の北穂沢は雪崩の心配は

涸沢の場合、可能性が高いのは、北穂沢上部ですが、過去に死亡者がでたも
のがあります。事故にあったのは南稜ではなく北穂沢を登っていた連中です
(雪があるので北穂沢を直接登った方が速いし気持ちいい)。
テント場までは来ませんでした。

この時期、涸沢で雪崩事故に会う可能性制はかなり低いです、
ただ冬は登りにも下りにも利用する人はいません。槍沢は冬期の下りに使うこ
とがあります(速いから)。ただし吹雪の時は要注意です(笑)。




[1229] Re6:Wordの制御についてご教示下さい返信 削除
2007/5/3 (木) 22:19:07 satot
▼ Mr.XRAYさん
 satotです。たびたびありがとうございます。
あと一つ、wordが起動している状態で、文書が開いているかどうか
を調べる方法がないでしょうか。

>雪があるので北穂沢を直接登った方が速いし
北穂沢を登れるのはいつ頃まででしょうか。
>槍沢は冬期の下りに使うことがあります
一度冬の上高地で、1週間位テント生活をしたいのですが.....
冬の上高地はアプローチが長いので、冬は南アルプスか、八ヶ岳に
しか登った事はありません。(ラッセル不要なので楽です)
ところで、Halbowさんどうされているでしょうネ
ずいぶんていねいに教えて頂きました。
ではでは、

[1230] Re7:Wordの制御についてご教示下さい返信 削除
2007/5/4 (金) 01:06:26 Mr.XRAY
▼ satotさん

> あと一つ、wordが起動している状態で、文書が開いているかどうか
> を調べる方法がないでしょうか。


こいつは難しそうです.ワードのバージョンによって違いますが,確か
word2003でしたね.

http://homepage2.nifty.com/Mr_XRAY/Delphi/plWord/B_Property.htm

このページの一番下がそうなんですが.実際のWord2003でのコードとなると
HDDのどににあるか,そして2003の環境を立ち上げる必要があるので,確認は
... ,がんばってください (笑)

> 一度冬の上高地で、1週間位テント生活をしたいのですが.....

今は暮れから正月にかけて大正池の旅館がやっていますから,少しは人がいます.
写真撮影の方がほとんどです.冬は,坂巻まではタクシーが入ってくれます.
中の湯(釜トンネルの入り口,売店)が登山計画書の提出場所です.
(昔は木村小屋)
でも寂しいですぜ.河童橋付近は.梓川が風の通り道で...
風が唸っていますぜ.
ちょっと厳しいですが,横尾まで,雪の状態がよければ一日で入れます.
多分.でも冬期小屋(無人)が利用できますので(・#95;ルマストーブあり),
快適です.

> 冬の上高地はアプローチが長いので、冬は南アルプスか、八ヶ岳に
> しか登った事はありません。(ラッセル不要なので楽です)


南も北岳の方は,年によって結構なラッセルがありました.でも昔ということ
かな? 今は私が現役の頃より積雪量が少ないですからね.

http://www.geocities.jp/team84page/
私の所属する山の会のサイトです.たまには見てやって下さい.
私は恐くて覗けません(笑).

> ところで、Halbowさんどうされているでしょうネ

全く連絡とれていません.
実はお会いする機会があったのですが,私の都合であえなかったのです.
お会いしていれば,連絡先もわかったと思うのですが...



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