2009-06-02 9 views
1

J'essaie d'exporter des textes WideString de la base de données (ADO/MS Access) vers le document MS Word (Delphi 7), mais les caractères étrangers ne sont pas correctement transférés (par exemple "è "au lieu de" č «):MS Word Ole Automatisation, ADO et caractères étrangers

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

J'ai aussi essayé d'utiliser directement CreateOleObject(), mais aucune différence.

Qu'est-ce qui me manque?

Merci!

Répondre

3

Je pense que ce n'est pas un problème avec Word, mais plutôt avec la façon dont les chaînes sont stockées dans la base de données. Ils sont probablement enregistrés en tant que chaînes Ansi, et non en tant que chaînes Unicode/WideString. Et si cela est vrai, ils sont sauvegardés dans un encodage que vous devez savoir si vous voulez qu'ils soient décodés correctement.

Voici un exemple d'application montrant comment convertir la chaîne en Ansi WideString et enregistrez dans 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. 

Le code ci-dessus utilise l'unité freeware CodecUtilsWin32.pas de Utility Library v.2.0.18

Je propose donc en utilisant TStringField au lieu de TWideStringField et en convertissant les chaînes en WideStrings comme dans l'exemple ci-dessus.

+0

Bien que les champs de la base de données soient marqués comme Unicode, cette solution fonctionne. Merci beaucoup et bien fait! :) – vrad

0

Avez-vous essayé d'utiliser

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

court de cela, je sais que Delphi 2009 a une meilleure gestion de l'Unicode (ensemble VCL supporte désormais directement) qui serait très probablement corriger votre problème.

+0

Non, il n'y a pas de méthode AsWideString dans Delphi 7. Dans d'autres cas, AsVariant fonctionne bien. – vrad

+0

Et malheureusement, Delphi 7 est l'exigence du client (c'est la seule version qu'ils ont). – vrad

Questions connexes