MS Word Ole Automation, ADO e caracteres estrangeiros
-
06-09-2019 - |
Pergunta
Eu estou tentando exportar WideString textos do banco de dados (ADO / MS Access) para o documento MS Word (Delphi 7), mas caracteres estrangeiros não são transferidos corretamente (ou seja, " e " em vez de " C "):
while not ADOQuery1.Eof do
begin
WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
WordApplication1.Selection.TypeParagraph;
ADOQuery1.Next;
end;
Eu também tentei usar CreateOleObject()
diretamente, mas nenhuma diferença.
O que eu estou ausente?
Obrigado!
Solução
Eu acho que não é um problema com a Palavra, mas sim com a forma como as cordas são armazenados no banco de dados. Eles provavelmente são salvos como strings ANSI, não como strings Unicode / WideString. E se isso for verdade, então eles são salvos em alguns codificação que você deve saber se você quer que eles sejam decodificados corretamente.
Aqui está um exemplo de aplicativo que demonstra como converter seqüência ANSI em WideString e guardá-lo no 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.
O código acima usa o freeware CodecUtilsWin32.pas unidade de Utility Biblioteca v.2.0.18
Então, eu sugiro usar TStringField vez de TWideStringField e convertendo as cordas para widestrings como no exemplo acima.
Outras dicas
Você tentou usando
WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString);
curta do que, eu sei que o Delphi 2009 tem uma melhor manipulação de Unicode (inteira VCL agora suporta-lo diretamente) que provavelmente corrigir seu problema.