Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Вставка рисунка в TRxRichEdit

Delphi , Компоненты и Классы , TMemo и TRichEdit

Вставка рисунка в TRxRichEdit

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

uses
   RichEdit;

 // Stream Callback function 
type
   TEditStreamCallBack = function(dwCookie: Longint; pbBuff: PByte;
     cb: Longint; var pcb: Longint): DWORD;
   stdcall;

   TEditStream = record
     dwCookie: Longint;
     dwError: Longint;
     pfnCallback: TEditStreamCallBack;
   end;

 // RichEdit Type 
type
   TMyRichEdit = TRxRichEdit;

 // EditStreamInCallback callback function 
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
   cb: Longint; var pcb: Longint): DWORD; stdcall;
   // by P. Below 
var
   theStream: TStream;
   dataAvail: LongInt;
 begin
   theStream := TStream(dwCookie);
   with theStream do
   begin
     dataAvail := Size - Position;
     Result := 0;
     if dataAvail <= cb then
     begin
       pcb := read(pbBuff^, dataAvail);
       if pcb <> dataAvail then
         Result := UINT(E_FAIL);
     end
     else
     begin
       pcb := read(pbBuff^, cb);
       if pcb <> cb then
         Result := UINT(E_FAIL);
     end;
   end;
 end;

 // Insert Stream into RichEdit 
procedure PutRTFSelection(RichEdit: TMyRichEdit; SourceStream: TStream);
   // by P. Below 
var
   EditStream: TEditStream;
 begin
   with EditStream do
   begin
     dwCookie := Longint(SourceStream);
     dwError := 0;
     pfnCallback := EditStreamInCallBack;
   end;
   RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, Longint(@EditStream));
 end;

 // Convert Bitmap to RTF Code 
function BitmapToRTF(pict: TBitmap): string;
 // by D3k 
var
   bi, bb, rtf: string;
   bis, bbs: Cardinal;
   achar: ShortString;
   hexpict: string;
   I: Integer;
 begin
   GetDIBSizes(pict.Handle, bis, bbs);
   SetLength(bi, bis);
   SetLength(bb, bbs);
   GetDIB(pict.Handle, pict.Palette, PChar(bi)^, PChar(bb)^);
   rtf := '{\rtf1 {\pict\dibitmap ';
   SetLength(hexpict, (Length(bb) + Length(bi)) * 2);
   I := 2;
   for bis := 1 to Length(bi) do
   begin
     achar := Format('%x', [Integer(bi[bis])]);
     if Length(achar) = 1 then
       achar := '0' + achar;
     hexpict[I - 1] := achar[1];
     hexpict[I] := achar[2];
     Inc(I, 2);
   end;
   for bbs := 1 to Length(bb) do
   begin
     achar := Format('%x', [Integer(bb[bbs])]);
     if Length(achar) = 1 then
       achar := '0' + achar;
     hexpict[I - 1] := achar[1];
     hexpict[I] := achar[2];
     Inc(I, 2);
   end;
   rtf := rtf + hexpict + ' }}';
   Result := rtf;
 end;


 // Example to insert image from Image1 into RxRichEdit1 
procedure TForm1.Button1Click(Sender: TObject);
 var
   SS: TStringStream;
   BMP: TBitmap;
 begin
   BMP := TBitmap.Create;
   BMP := Image1.Picture.Bitmap;
   SS  := TStringStream.Create(BitmapToRTF(BMP));
   try
     PutRTFSelection(RxRichEdit1, SS);
   finally
     SS.Free;
   end;
 end;

Код, предоставленный в этом примере, - это программный код на языке Delphi, который вставляет изображение из компонента Image в контроле TRxRichEdit с помощью кодирования RTF (Rich Text Format).

Вот подробное описание кода:

  1. Вначале определены функция обратного вызова TEditStreamCallBack и тип записи TEditStream. Эта функция используется для взаимодействия со стREAM, содержащим данные изображения.
  2. Следующая секция определяет пользовательский тип RichEdit TMyRichEdit, который наследуется от TRxRichEdit.
  3. Процедура PutRTFSelection принимает два параметра: контрол TMyRichEdit и объект TStream, содержащий данные изображения в формате RTF. Она использует функцию обратного вызова для вставки стREAM в RichEdit-control.
  4. Функция BitmapToRTF конвертирует объект TBitmap в строку RTF. Это делается следующим образом: сначала получаются размеры и данные DIB (Device-Independent Bitmap), затем кодируются данные как строка hexadecimal и обертываются в строку RTF.
  5. Наконец, есть пример процедуры, демонстрирующий, как использовать эти функции для вставки изображения из компонента Image в контрол TRxRichEdit.

Вот некоторые предложения по улучшению кода:

  1. Вы можете уменьшить дублирование кода, создав отдельную функцию для чтения данных из стREAM и вставки их в RichEdit-control.
  2. Вместо использования функции обратного вызова можно использовать тип записи TEditStream для прямого чтения и записи данных в стREAM.
  3. Функция BitmapToRTF является quite сложной и может быть разбита на более мелкие функции для более простой поддержки.
  4. Обработка ошибок может быть улучшена, если вместо использования блока try-finally ловить конкретные исключения.

В целом, этот код предоставляет хороший пример, как вставлять изображения в RichEdit-control с помощью кодирования RTF в Delphi.

В статье описывается способ вставки рисунка в компонент TRxRichEdit с помощью конвертации из формата bitmap в RTF-код.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TMemo и TRichEdit ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-07 04:38:50/0.0055239200592041/1