質問

名前と数字を含むフォームにlistViewがあり、ドキュメントのテーブルに記入されたデータを備えた印刷MSWORDドキュメントを提供する必要があります。すべてが英語のキャラクターでうまく機能しますが、東ヨーロッパやロシアのキャラクターを送信しようとすると、文書に「?」として表示されます。またはいくつかの「ゴミ」。また、ドキュメントからアプリケーションまでこれらの文字を読むことはできません。

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

  1. のようなキャラクターを送信する方法 "ЉЊĐŠŽČ" 文書を言葉にするには?
  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, sizecolor プロパティですが、それはできません charset 財産。

誰かがいますか?


ソフトウェアインストール:

  • Windows XPプロフェッショナル
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition
役に立ちましたか?

解決

この問題は、Late Bindingを使用してOLEオートメーションを介して単語を呼んでいるという事実に起因しています。

そう Range.Text 幅が広い(Unicode)コンテンツを期待する方法としては知られていませんが、Delphi 7の下ではプレーンASCIIテキストです。

最初の解決策は、Delphi 2009以降を使用することです。新しい string このようなユニコード割り当てを透明にしました。

Delphi 7の下で、タイプのキャストを広大なものに強制するのはどうですか:

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

または、このような一時的な変数を使用してください。

 var tmp: WideString; 

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

別の可能性は、拘束遅延ではなく、オフィスのOLEインターフェースの直接宣言を使用することです。マイクロソフトワード ???オブジェクトライブラリ「IDEの「プロジェクト」メニューから。

インポートされたインターフェイスに幅が広いタイプがあります。

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に問題はもうありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top