0

名前と番号を含むフォームに ListView があり、ドキュメントのテーブルにデータが入力された MSWord ドキュメントを印刷する必要があります。英語の文字ではすべて正常に動作しますが、東ヨーロッパまたはロシア語の文字を送信しようとすると、ドキュメントに「?」として表示されます。またはいくつかの「ゴミ」。また、ドキュメントからアプリケーションに戻ってこれらの文字を読み取ることはできません。

私の質問は次のとおりです。

  1. "ЉЊĐŠŽČ"文字のようなものをWord文書に送信するには?
  2. これらの文字を MSWord からアプリケーションに読み取る方法は?

要するに、コードは次のようになります。

word := CreateOleObject('Word.Application');
word.Visible := true;
doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc');

table := word.ActiveDocument.Tables.Item(1);
table.Cell(1,2).Range.Text := 'MY TEXT';

word.ActiveDocument.Close;
word.Quit;
word := UnAssigned;
doc := UnAssigned;
table := UnAssigned;

フォントとプロパティは変更できますがname、プロパティでは変更できません。sizecolorcharset

誰か?


インストールされているソフトウェア:

  • Windows XP プロフェッショナル
  • マイクロソフト ワード 2003
  • Delphi 7 エンタープライズ版
4

1 に答える 1

4

この問題は、遅延バインディングを使用して OLE オートメーション経由で Word を呼び出していることに起因しています。

そのRange.Textため、WideString(Unicode)コンテンツを期待するメソッドとしては知られていませんが、Delphi 7 ではプレーン ASCII テキストです。

最初の解決策は、Delphi 2009 以降を使用することです。新しいstringタイプは、そのような Unicode 割り当てを透過的にしました。

Delphi 7 では、WideString への型キャストの強制についてはどうでしょうか。

 table.Cell(1,2).Range.Text := WideString('MY TEXT'); 

または、次のように一時変数を使用します。

 var tmp: WideString; 

   tmp := 'ЉЊĐŠŽČ'
   table.Cell(1,2).Range.Text := tmp; 

もう 1 つの可能性は、遅延バインディングではなく、Office の OLE インターフェイスの直接宣言を使用して、IDE の [プロジェクト] メニューから [ Microsoft Word ??? オブジェクト ライブラリ] をインポートすることです。

インポートされたインターフェイスにはワイド文字列型があります。たとえば、次のようになります。

Range = interface(IDispatch)
  ['{0002095E-0000-0000-C000-000000000046}']
  function Get_Text: WideString; safecall;
  procedure Set_Text(const prop: WideString); safecall;
  (...)
  property Text: WideString read Get_Text write Set_Text;

したがって、Ansi charset で問題が発生することはもうありません。

于 2011-06-16T14:14:24.900 に答える