Question

I'm trying to export WideString texts from the database (ADO / MS Access) to the MS Word document (Delphi 7), but foreign characters are not correctly transferred (i.e. "è" instead of "č"):

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

I've also tried to use CreateOleObject() directly, but no difference.

What am I missing?

Thanks!

Was it helpful?

Solution

I think it's not a problem with Word but rather with the way the strings are stored in the database. They are probably saved as Ansi strings, not as Unicode/WideString strings. And if that is true, then they are saved in some encoding which you must know if you want them to be decoded correctly.

Here is a sample application demonstrating how to convert Ansi string into WideString and save it 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.

The code above uses freeware unit CodecUtilsWin32.pas from Utility Library v.2.0.18

So I'd suggest using TStringField instead of TWideStringField and converting the strings to WideStrings as in the above example.

OTHER TIPS

Have you tried using

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

Short of that, I know that Delphi 2009 has better handling of Unicode (entire VCL now supports it directly) that would most likely correct your problem.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top