MS Word Ole Automation, ADO y extranjeros caracteres
-
06-09-2019 - |
Pregunta
Estoy tratando de exportar WideString textos de la base de datos (ADO / MS Access) al documento de MS Word (Delphi 7), pero los caracteres extranjeros no se transfieren correctamente (es decir, " e " en vez de " c "):
while not ADOQuery1.Eof do
begin
WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
WordApplication1.Selection.TypeParagraph;
ADOQuery1.Next;
end;
También he intentado usar CreateOleObject()
directamente, pero no hay diferencia.
¿Qué me falta?
Gracias!
Solución
Creo que no es un problema con la palabra sino con la forma en que las cadenas se almacenan en la base de datos. Probablemente se guardan como cadenas ANSI, no como cadenas Unicode / WideString. Y si eso es cierto, entonces ellos se guardan en alguna codificación que debe saber si usted quiere que sean decodificados correctamente.
Esta es una aplicación de ejemplo que muestra cómo convertir cadena ANSI en WideString y guardarlo en 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.
El código anterior utiliza CodecUtilsWin32.pas unidad de software gratuito de biblioteca de utilidades v.2.0.18
Así que me gustaría sugerir el uso de TStringField en lugar de TWideStringField y la conversión de las cadenas de WideStrings como en el ejemplo anterior.
Otros consejos
¿Ha intentado utilizar
WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString);
A falta de eso, sé que Delphi 2009 tiene un mejor manejo de Unicode (VCL todo ahora soporta directamente) que lo más probable corregir su problema.