喫茶XRAYトップページ


[876] DelphiでWord操作の質問です。返信 削除
2006/8/8 (火) 19:08:43 ちいんけ
マスター お久しぶりです。

ちいんけ@東京です。
つまらない質問で申し訳無いのですが、教えていただきたいことがあります。

Delphi7.1Entで作成したAPPで、Word形式でレポートを吐き出す
コードを書いてるのですが、どうしても分からないことがあります。

Wordの操作はServersタブにあるTWordApplicationとTWordDocumentを
使用して、新規文書作成、画像貼り付け、別名保存までは問題なく
動作している状態です。

そこで、
Wordの自動マクロ記録で〔編集〕->〔ジャンプ〕(1ページ目に
飛ぶ)という単純なマクロを吐き出させた結果が以下のとおりで
このコードを元にDelphiで処理させようとして躓いています。

Sub Macro5()
  Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="1"
  Selection.Find.ClearFormatting
  With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = False
    .MatchFuzzy = True
  End With
End Sub

このマクロ記録を私なりにDelphiで書き直すと

with WordApplication1 do begin
  Selection.GoTo_(wdGoToPage, wdGoToNext, EmptyParam,  '1');
  Selection.Find.ClearFormatting;
  with Selection.Find do begin
    Text := '';
    Replacement.Text := '';
    Forward := True;
    Wrap := wdFindContinue;
    Format := False;
    MatchCase := False;
   MatchWholeWord := False;
    MatchByte := False;
    MatchAllWordForms := False;
    MatchSoundsLike := False;
    MatchWildcards := False;
    MatchFuzzy := True;
  end;
end;

上コードの2行目にある”wdGoToPage”というOleVariant変数が
はいる引数で型エラーでストップしてしまいます。
Word_TLBのユニットを作成して、Word_TLB.pasのなかに
wdGoToPage変数を検索すると確かに存在します。

どうすれば、wdGoToPage等の定義された変数が使えるようになるの
でしょうか?

ご存知でしたら教えていただけると非常にありがたいのですが、、、

どうぞよろしくお願い致します。

ちいんけ@

[877] Re:DelphiでWord操作の質問です。返信 削除
2006/8/8 (火) 21:01:33 Mr.XRAY
▼ ちいんけさん
> マスター お久しぶりです。

どうも,こちらこそお久しぶりです.最近開発が沈滞ぎみです.
陳謝.

wdGoToPage これから調べてみます.しばらくお待ちください.


[878] Re:DelphiでWord操作の質問です。返信 削除
2006/8/8 (火) 21:21:46 Mr.XRAY
▼ ちいんけさん

> Word_TLBのユニットを作成して、Word_TLB.pasのなかに
> wdGoToPage変数を検索すると確かに存在します。


Wordの操作はServersタブにあるTWordApplicationとTWordDocumen
を使用する場合は,_TLBは関係ありません.
TWordApplicationコンポを配置するとusesにWord2000.pasが追加されます.
この中にあります.
(Delphiインストール時にOfficeのバージョンを2000にした時)

>type
>  WdGoToItem = TOleEnum;
>const
>  wdGoToBookmark = $FFFFFFFF;
>  wdGoToSection = $00000000;
>  wdGoToPage = $00000001;


試してみました.FormにTWordApplicationを一つ配置して,

procedure TForm1.Button1Click(Sender: TObject);
begin
     ShowMessage(IntTostr(Word2000.wdGoToPage));
     //ShowMessage(IntTostr(wdGoToPage)); でも同じ
end;

とすると,確かに1という文字が表示されます.


[879] Re2:DelphiでWord操作の質問です。返信 削除
2006/8/9 (水) 10:18:29 ちいんけ
▼ Mr.XRAYさん

お忙しい中、ありがとうございました。

お陰さまで解決することができました。

//oleVariantの仮配列を宣言しておき
var
  oleVs: array [0..20] of oleVariant;

with WordApplication1 do begin
  //各変数ごとにoleVariant値を代入して
  oleVs[0] := wdGoToPage;
  oleVs[1] := wdGoToNext;
  oleVs[3] := '1';
  //引数に指定することで
  Selection.GoTo_(oleVs[0], oleVs[1], EmptyParam,  oleVs[3]);
end;

//解決することができました。

それにしても全ての処理に対応するのに時間がかかります。
マスターの環境では、こんな前処理は必要なく、Word2000に
定義されたoleVariant変数が関数の引数指定できるのでしょうか?

ふぅ

ちいんけ@東京


[880] Re3:DelphiでWord操作の質問です。返信 削除
2006/8/9 (水) 18:24:08 Mr.XRAY
▼ ちいんけさん

動けば正義です(笑)

> それにしても全ての処理に対応するのに時間がかかります。

ワードの操作関係は,どれもかなり時間がかかるようです.ただ,利用者が
直接編集可能という利点があるのではないかと思います.
個人的には,極力書類は定型化すべきと考えています.

> マスターの環境では、こんな前処理は必要なく、Word2000に
> 定義されたoleVariant変数が関数の引数指定できるのでしょうか?

できています.ワード操作フォームで同様のコードを使用しています.

ちいんけさんのコードのusesにはWord2000とかはないのでしょうか.


[881] Re4:DelphiでWord操作の質問です。返信 削除
2006/8/10 (木) 00:52:38 ちいんけ
▼ Mr.XRAYさん

> ちいんけさんのコードのusesにはWord2000とかはないのでしょうか.

これがあるんですよ、、、Word2000

別変数に移して代入できるということは、いったいどういうことなのか
さっぱりわかりません。そろそろDelphi7をリフレッシュした方がいい
時期かもしれません。

同じマシンにDelphi2005(使ってません)がインストールしてあるのを
思い出したので、試してみます。

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

ちいんけ@


[882] Re5:DelphiでWord操作の質問です。返信 削除
2006/8/10 (木) 09:59:53 ちいんけ
原因が判明しました。

WordApplication1.Selection.GoTo_メソッド等の引数は
参照形式(var付き)なので、変数宣言したものに
一旦代入しないと引数に代入できないことが分かりました。

お騒がせしました。

ちいんけ@

[883] Re6:DelphiでWord操作の質問です。返信 削除
2006/8/10 (木) 20:10:08 Mr.XRAY
▼ ちいんけさん

> 参照形式(var付き)なので、変数宣言したものに
> 一旦代入しないと引数に代入できないことが分かりました。


おおっ,よかった.お役に立たなくてゴメンなさい.
う〜む.気づきませんでした.くやしい〜!!

INCM/CMT
Cyclamen v3.82