MS Word Ole Automation, ADO и иностранные символы - PullRequest
1 голос
/ 02 июня 2009

Я пытаюсь экспортировать тексты WideString из базы данных (ADO / MS Access) в документ MS Word (Delphi 7), но иностранные символы передаются неправильно (т. Е. « è » вместо " C "):

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

Я также пытался использовать CreateOleObject() напрямую, но без разницы.

Чего мне не хватает?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 июня 2009

Я думаю, что это не проблема с Word, а скорее с тем, как строки хранятся в базе данных. Они, вероятно, сохраняются как строки Ansi, а не как строки Unicode / WideString. И если это так, то они сохраняются в некоторой кодировке, которую вы должны знать, если хотите, чтобы они были правильно декодированы.

Вот пример приложения, демонстрирующего, как преобразовать строку Ansi в WideString и сохранить ее в 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.

Приведенный выше код использует бесплатную единицу CodecUtilsWin32.pas из Библиотека утилит v.2.0.18

Поэтому я бы предложил использовать TStringField вместо TWideStringField и преобразовать строки в WideStrings, как в примере выше.

0 голосов
/ 02 июня 2009

Вы пробовали использовать

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

Если не считать этого, я знаю, что Delphi 2009 лучше обрабатывает Unicode (теперь весь VCL поддерживает его напрямую), что, скорее всего, решит вашу проблему.

...