2012-10-31 23 views
6

私はこの問題に関する複数の投稿を読んでおり、まったく私の質問にまともな結論は出ていないようです。 (おそらく、最近何かが現れたかどうかを確認しようとしています)COMオートメーションを使用せずにWord文書を使用するにはどうすればよいですか?

私は約束を処理する小さなチャリティアプリを持っています。そうするには、文書を扱い、印刷する必要があります。

Wordがバックグラウンドで開いていると、アプリケーションスレッドがハングしてWordの終了に応答せず、手動でロールバックして単語を閉じる必要があります。もちろん、すべて正常に動作しますが、ユーザーマニュアルに指示を入れても、エンドユーザーがWordを閉じることは保証できません。

私はスピードについてあまり心配していませんが、それが強化できれば、ちょっとしたボーナスになると思います。

ドキュメントのオープン、編集、印刷、保存を可能にするライブラリがDelphi用にリリースされましたか?そうでない場合は、開いたときにWordの別の開いているハンドルと競合しないようにWord Automationを使用する方法がありますか?

+0

Aspose on .netを試すことができます。 Delphiの包括的な機能はありません。おそらく、Word文書以外のものを使用するのが最善の方法でしょう。何かテキストファイルに基づいています。 –

+0

Asposeでも可能であれば、私はラッパーや物を書くことに非常に熱心ではありません。とにかくそれは単に.Netなので、私は本当にそれを見ていない。正直言って、Wordは私に、特にエンドユーザーのために、ドキュメントに最も柔軟に対応します。だから、Wordを使わないのは本当にオプションではありません。しかし、ありがとう。 :) –

+0

*アプリのスレッドがハングする*、どのコールが正確に? –

答えて

5

GetActiveOleObjectを使用すると、Wordの実行インスタンスが取得されます。 CreateOleObjectを使用すると、新しいインスタンスが作成され、実行中の他のインスタンスによって問題が発生することはありません。

TWordApplicationラッパーを使用する場合は、ConnectKindckNewInstanceに設定してください。デフォルトでは、TWordApplicationは実行中のインスタンスに接続しようとします。

+0

TWordApplicationを使用せずにConnectKind(または類似のもの)を設定する方法はありますか?私が意味することを知っているなら、生のOle関数を使うほうが好きです。私はCreateOleObjectを使用します。 –

+5

なぜ後でCOMにバインドするのが好きですか?確かに初期のバウンドが良いです。 –

+0

私はできますが、それはひどい考えではありませんが、ConnectKindを変更できるのはそれが唯一の方法ですか?早期拘束力の他にもいくつかの利点があると確信していますが、必要があるかどうかはわかりません。 –

0

Word文書の編集と印刷を開いて、RTF形式を使用していても構わない場合は、TRichViewを調べてください。

MS Wordでサポートされている形式の1つであるRTF形式の豊富なドキュメントを生成します。私はそれが直接.DOCファイルを読むとは思わないが、ほとんどの単純なファイルでは.DOCと.DOCXをRTFに変換できますが、特定の高度なフォーマット機能は変換で失われます。

文書処理を行うマシンにMS Wordをインストールする必要はありません。レシートやその他の簡単な書類を作成するには、これは最も信頼できる方法です。 Wordを直接使用しないでください。

+1

RTFファイル形式の問題は、私が知る限り、ヘッダーとフッターがサポートされていないことです。顧客の能力を制限することは賢明ではありません。 OpenOfficeをこの目的のために(サポートされている間に)完全に移行しないのと同じ理由です。 –

1
procedure PrintViaWord (const filename: string); 
const 
wdUserTemplatesPath = 2; 

var 
    wrdApp, wrdDoc, wrdSel: variant; 

begin 
wrdApp:= CreateOleObject ('Word.Application'); // create new instance 
sleep (5000); // this fixes a bug in Word 2010 to do with opening templates 
wrdDoc:= wrdApp.documents.add (
      wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '\mytemplate.dot'); 

wrdDoc.Select; 
wrdSel:= wrdApp.selection; 
wrdApp.Options.CheckSpellingAsYouType:= 0; 
wrdSel.paragraphformat.alignment:= 1; 
wrdSel.typetext ('This is a program demonstrating how to open Word in the background' 
        + ' and add some text, print it, save it and exit Word'); 
wrdDoc.SaveAs (filename + '.doc'); 
wrdApp.ActivePrinter:= 'Konica Minolta 211'; 
wrdApp.PrintOut; 
WrdDoc.SaveAs (filename + '.doc'); 
wrdApp.quit; 

wrdSel:= unassigned; 
wrdDoc:= unassigned; 
wrdApp:= unassigned 
end; 
関連する問題