Delphi 7を使用して、Msword 2003から地元のキャラクターを読み書きする方法は?
-
28-10-2019 - |
質問
名前と数字を含むフォームにlistViewがあり、ドキュメントのテーブルに記入されたデータを備えた印刷MSWORDドキュメントを提供する必要があります。すべてが英語のキャラクターでうまく機能しますが、東ヨーロッパやロシアのキャラクターを送信しようとすると、文書に「?」として表示されます。またはいくつかの「ゴミ」。また、ドキュメントからアプリケーションまでこれらの文字を読むことはできません。
私の質問は次のとおりです。
- のようなキャラクターを送信する方法
"ЉЊĐŠŽČ"
文書を言葉にするには? - 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
, size
と color
プロパティですが、それはできません 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に問題はもうありません。