Domanda

Sto cercando di esportare WideString testi dal database (ADO / MS Access) per il documento di MS Word (Delphi 7), ma i caratteri stranieri non vengono trasferiti correttamente (vale a dire " e " invece di " C "):

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

Inoltre ho provato ad usare direttamente CreateOleObject(), ma nessuna differenza.

Che cosa mi manca?

Grazie!

È stato utile?

Soluzione

Credo che non è un problema con Word, ma piuttosto con il modo in cui le stringhe sono memorizzate nel database. Probabilmente sono salvati come stringhe Ansi, non come stringhe Unicode / WideString. E se questo è vero, allora essi vengono salvati in qualche codifica che è necessario sapere se si vuole loro di essere decodificati correttamente.

Ecco un'applicazione di esempio che dimostra come convertire stringa ANSI in WideString e salvarlo in 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.

Il codice precedente utilizza CodecUtilsWin32.pas unità freeware da Utility Biblioteca v.2.0.18

Quindi suggerirei usando TStringField invece di TWideStringField e convertendo le corde per WideStrings come nell'esempio qui sopra.

Altri suggerimenti

Hai provato a usare

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

In mancanza di ciò, so che Delphi 2009 ha una migliore gestione di Unicode (intero VCL ora supporta direttamente) che molto probabilmente risolvere il vostro problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top