سؤال

أنا حاليًا بصدد ترحيل حل البرمجيات الخاص بنا من 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 () مع مصحح الأخطاء ومعرفة ما يحدث بالفعل.

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