2009-06-02 4 views
1

Ich versuche, WiteString Texte aus der Datenbank (ADO/MS Access) in das MS Word Dokument (Delphi 7) zu exportieren, aber fremde Zeichen werden nicht korrekt übertragen (zB "è "statt" è „):MS Word Ole Automatisierung, ADO und fremde Zeichen

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

habe ich versucht, auch CreateOleObject() direkt zu verwenden, aber keinen Unterschied.

Was fehlt mir?

Danke!

Antwort

3

Ich denke, es ist kein Problem mit Word, sondern mit der Art, wie die Strings in der Datenbank gespeichert sind. Sie werden wahrscheinlich als Ansi-Zeichenfolgen gespeichert, nicht als Unicode-/WideString-Zeichenfolgen. Und wenn das stimmt, dann werden sie in einer Kodierung gespeichert, die Sie wissen müssen, wenn Sie sie richtig dekodieren wollen.

Hier ist eine Beispielanwendung zeigt, wie Ansi-String in Wide konvertieren und in Word speichern:

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. 

Der obige Code verwendet Freeware-Einheit CodecUtilsWin32.pas von Utility Library v.2.0.18

So würde ich vorschlagen Verwenden Sie TStringField anstelle von TWideStringField und konvertieren Sie die Strings wie im obigen Beispiel in WideStrings.

+0

Obwohl Felder in der Datenbank als Unicode markiert sind, funktioniert diese Lösung. Vielen Dank und gut gemacht! :) – vrad

0

Haben Sie

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

Kurz davon versucht mit, ich weiß, dass Delphi 2009 ein besseres Handling von Unicode (gesamte VCL unterstützt nun direkt), die Ihr Problem würde höchstwahrscheinlich korrigieren hat.

+0

Nein, in Delphi 7 gibt es keine AsWideString-Methode. In anderen Fällen funktioniert AsVariant in Ordnung. – vrad

+0

Und leider, Delphi 7 ist Client-Anforderung (es ist die einzige Version, die sie haben). – vrad