1

データベース(ADO / MS Access)からMS Wordドキュメント(Delphi 7)にWideStringテキストをエクスポートしようとしていますが、外国文字が正しく転送されません(つまり、「 č 」ではなく「 è」)。

while not ADOQuery1.Eof do
begin
  WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
  WordApplication1.Selection.TypeParagraph;
  ADOQuery1.Next;
end;

私もCreateOleObject()直接使ってみましたが、違いはありません。

私は何が欠けていますか?

ありがとう!

4

2 に答える 2

3

Wordの問題ではなく、文字列のデータベースへの保存方法に問題があると思います。それらはおそらくUnicode/WideString文字列としてではなく、Ansi文字列として保存されます。そしてそれが本当なら、それらは正しくデコードされたいかどうかを知る必要があるいくつかのエンコーディングで保存されます。

これは、Ansi文字列をWideStringに変換してWordに保存する方法を示すサンプルアプリケーションです。

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  ComObj,
  ActiveX,
  CodecUtilsWin32;

procedure Test();
var
  wordApp, wordDoc: Variant;
  ansiStr: string;
  codec: TUnicodeCodec;

  function str2WideStr(const s: string): WideString;
  var
    i: Integer;
  begin
    codec.DecodeStr(@s[1], Length(s), Result);
  end;

begin
  codec := TEncodingRepository.CreateCodecByAlias('ISO-8859-2');

  ansiStr := #$BF#$F3#$B3#$E6; //"zólc"

  wordApp := CreateOleObject('Word.Application'); 
  wordDoc := wordApp.Documents.Add;
  wordApp.Selection.TypeText(str2WideStr(ansiStr));
  wordDoc.SaveAs('C:\sample.doc');
  wordDoc.Close();
  wordApp.Quit(False);
end;

begin
  CoInitialize(nil);
  Test();
end.

上記のコードは、ユーティリティライブラリv.2.0.18のフリーウェアユニットCodecUtilsWin32.pasを使用しています。

したがって、上記の例のように、TWideStringFieldの代わりにTStringFieldを使用し、文字列をWideStringsに変換することをお勧めします。

于 2009-06-05T21:51:49.420 に答える
0

使ってみましたか

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

それを除けば、Delphi 2009の方がUnicodeの処理が優れており(VCL全体が直接サポートするようになりました)、問題が修正される可能性が高いことを私は知っています。

于 2009-06-02T16:23:49.197 に答える