سؤال

أحاول تصدير النصوص الازداع من قاعدة البيانات (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 بالكامل الآن مباشرة) من المرجح أن تصحح مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top