4

Delphi から Word テンプレートを開いて編集できるようにする必要があります (Word を使用) テンプレートを開くことはできますが、Word はそれをテンプレートではなくドキュメントと見なします。

問題は、テンプレートを編集する必要があり、それを新しいドキュメントのテンプレートとして使用しないことです。ドキュメント処理システムの一部としてテンプレートを使用しており、ユーザーがアプリからテンプレートを編集できるようにしたいと考えています。現状では、Word を開いてそこからテンプレートを開いて編集する必要があります。アプリから行う方が簡単で安全です。

実験コード

fWordApp: WordApplication;
TempName: OleVariant;
WordDoc: WordDocument;
TemplateFile: string;
begin
  TemplateFile := Settings.Directories.RootInsert(qryTemplates.FieldByName('fldtemplate_path').AsString);
  if TemplateFile <> '' then
    begin
      if not Assigned(fWordApp) then
        begin
          fWordApp := CreateOleObject('Word.Application') as WordApplication;
          while fWordApp.Templates.Count = 0 do
            Sleep(200);                                 // Normal.dot must be loaded
        end;
      if Assigned(fWordApp) then
        fWordApp.Visible := True
      else
        raise Exception.Create('Cannot initialize Word application');
      TempName := TemplateFile;
      WordDoc := fWordApp.Documents.Add(TempName, EmptyParam, wdFormatTemplate, EmptyParam);
4

2 に答える 2

7

私が理解しているように、あなたは間違った方法を使用しています。このAddメソッドは、新しいドキュメントを作成するために使用されます。テンプレートファイル名を渡して、新しいドキュメントがそのテンプレートに基づくようにすることができます。

ただし、既存のドキュメントを開いて編集する必要があります。ドキュメントがテンプレートであるかどうかは関係ありません。あなたはまだそれを開く必要があります。そしてそのためにはメソッドが必要ですOpen。これはかなり些細な例です。

var
  WordApp, Doc: Variant;
begin
  WordApp := CreateOleObject('Word.Application');
  WordApp.Visible := True;
  Doc := WordApp.Documents.Open('path\to\my\template.dotx');
  Doc.Range.Text := 'Merry Christmas everyone';
  Doc.Save;
  WordApp.Quit;
end;

この例の方が簡単であることがわかったため、遅延バインディングを使用しました。しかし、あなたはあなたの初期の拘束力のあるアプローチに固執するべきです。openメソッドが大量のパラメーターを受け取るという事実をナビゲートする必要があります。EmptyParam最初のパラメーターを除くすべてに単純に渡すことができると思います。

于 2012-12-23T15:27:44.823 に答える