2009-06-02 14 views
1

WideStringテキストをデータベース(ADO/MS Access)からMS Word文書(Delphi 7)にエクスポートしようとしましたが、外字が正しく転送されません(つまり、 "è "の代わりに"「C):MS Word Ole Automation、ADOおよび外国語

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

私はまた、直接CreateOleObject()を使用しようとしましたが、ない違いました。

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

ありがとうございます!

答えて

3

私はそれがWordの問題ではなく、むしろ文字列がデータベースに格納される方法と思う。おそらく、Unicode/WideString文字列としてではなく、Ansi文字列として保存されます。それが本当であれば、エンコードされて保存されます。エンコーディングは、正しくデコードされたければ知っておく必要があります。ここで

はWideStringににANSI文字列を変換し、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. 

上記のコードは、だから私はお勧めしたいUtility Library v.2.0.18

からフリーウェアユニットCodecUtilsWin32.pasを使用していますTWideStringFieldの代わりにTStringFieldを使用し、上の例のように文字列をWideStringに変換します。

+0

データベースのフィールドはUnicodeとしてマークされていますが、このソリューションが機能します。どうもありがとうございました! :) – vrad

0

は、あなたがそれの

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

ショートを使用してみました、私が最も可能性の高いあなたの問題を解決するだろうとのDelphi 2009(全体VCLは今それを直接サポートしている)は、Unicodeのより良いハンドリングを持っていることを知っています。

+0

いいえ、Delphi 7ではAsWideStringメソッドがありません。それ以外の場合、AsVariantは問題なく動作します。 – vrad

+0

残念ながら、Delphi 7はクライアントの要件です(これは唯一のバージョンです)。 – vrad

関連する問題