تحميل نص RTF من قاعدة البيانات إلى trichedit
-
28-09-2019 - |
سؤال
أنا حاليًا بصدد ترحيل حل البرمجيات الخاص بنا من Delphi 7 إلى 2010. كانت التغييرات في الغالب بسيطة ولم يكن هناك سوى كمية صغيرة من العقبات المتبقية.
في نموذج ، نستخدم trichedit يعرض نص RTF الذي تم أمسك به من حقل Blob في MSSQL DB. هذه هي الطريقة التي عملت بها في دلفي 7:
//Get RTF text from Blob field using TADOQuery
rtfStream := sql.CreateBlobStream(sql.FieldByName('rtftext'), BmRead) as TMemoryStream;
//Load into TRichEdit
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(rtfStream);
هذا من شأنه أن يعرض RTF كما هو متوقع في مكون Trichedit ، ولكن نفس الرمز في Delphi 2010 يعرض RTF كنص عادي مع علامات تبويب بين كل حرف. أفترض أن هذا له علاقة كبيرة بالتغيير من Ansi إلى Unicode ، لكنني لم أحصل على أي حظ في تصحيح المشكلة.
أي مساعدة في الحصول على هذا العمل سيكون موضع تقدير كبير. شكرًا
المحلول
حسنًا ، لقد اكتشفت ذلك.
لتحميل نص RTF:
//Get the data from the database as AnsiString
rtfString := sql.FieldByName('rtftext').AsAnsiString;
//Write the string into a stream
stream := TMemoryStream.Create;
stream.Clear;
stream.Write(PAnsiChar(rtfString)^, Length(rtfString));
stream.Position := 0;
//Load the stream into the RichEdit
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(stream);
stream.Free;
لحفظ نص RTF:
//Save to stream
stream := TMemoryStream.Create;
stream.Clear;
RichEdit.Lines.SaveToStream(stream);
stream.Position := 0;
//Read from the stream into an AnsiString (rtfString)
if (stream.Size > 0) then begin
SetLength(rtfString, stream.Size);
if (stream.Read(rtfString[1], stream.Size) <= 0) then
raise EStreamError.CreateFmt('End of stream reached with %d bytes left to read.', [stream.Size]);
end;
stream.Free;
//Save to database
sql.FieldByName('rtftext').AsAnsiString := rtfString;
استغرق هذا الأمر وقتًا طويلاً جدًا لأكتشفه :) أعتقد أنني تعلمت شيئًا واحدًا ... إذا حدث خطأ ما في Delphi 2010 ، فهو يرتبط عادةً بـ Unicode ؛)
نصائح أخرى
عندما يكون النص العادي خطأ ، يحاول loadfromstream () أولاً تحميل رمز RTF ، وإذا فشل ذلك ، فإن LoadfromStream () يحاول تحميل الدفق مرة أخرى كنص عادي. كان هذا هو الحال دائمًا في جميع إصدارات دلفي. مع إدخال Unicode ، أفترض أن شيئًا ما قد يكون قد كسر في loadfromstream () EM_STREAMIN
معالج رد الاتصال. أقترح عليك أن تدخل إلى رمز المصدر الفعلي لـ LoadFromStream () مع مصحح الأخطاء ومعرفة ما يحدث بالفعل.