MS Word Automation، ADO والأحرف الأجنبية
-
06-09-2019 - |
سؤال
أحاول تصدير النصوص الازداع من قاعدة البيانات (ADO / MS Access) إلى مستند MS Word (Delphi 7)، ولكن الحروف الأجنبية غير مريحة بشكل صحيح (أي "è" بدلا من "č"):
while not ADOQuery1.Eof do
begin
WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
WordApplication1.Selection.TypeParagraph;
ADOQuery1.Next;
end;
لقد حاولت أيضا استخدام CreateOleObject()
مباشرة، ولكن لا يوجد فرق.
ماذا ينقصني؟
شكرا!
المحلول
أعتقد أنها ليست مشكلة مع كلمة ولكن مع الطريقة التي يتم فيها تخزين السلاسل في قاعدة البيانات. ربما يتم إنقاذهم كسلاسل 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 بدلا من TwidStringfield وتحويل السلاسل إلى Widestrings كما هو الحال في المثال أعلاه.
نصائح أخرى
هل حاولت استخدام
WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString);
باختصار ذلك، أعرف أن دلفي 2009 لديه معالجة أفضل من Unicode (يدعم VCL بالكامل الآن مباشرة) من المرجح أن تصحح مشكلتك.