|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Конвертирование BMP в RTF
Нашел такой код
Код:
function BitmapToRTF(pict: TBitmap): string; 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\dibitmap0 '; SetLength(hexpict, (Length(bb) + Length(bi)) * 2); I := 2; for bis := 1 to Length(bi) do begin achar := IntToHex(Integer(bi[bis]), 2); hexpict[I - 1] := achar[1]; hexpict[i] := achar[2]; Inc(I, 2); end; for bbs := 1 to Length(bb) do begin achar := IntToHex(Integer(bb[bbs]), 2); hexpict[I - 1] := achar[1]; hexpict[i] := achar[2]; Inc(I, 2); end; rtf := rtf + hexpict + ' }}'; Result := rtf; end; |
#2
|
|||
|
|||
Функция работает нормально. Протестировано.
Может быть объект-параметр не создается перед передачей его в функцию. |
#3
|
|||
|
|||
Ты прав
У значит проблема в следующем у меня bmp изображения подключены через ресурсы как мне теперь вставить их в эту функцию?! |
#4
|
|||
|
|||
Теперь здесь застривает
Код:
GetDIBSizes(pict.Handle, bis, bbs); |
#5
|
||||
|
||||
Содранная вами с DelphiWorld процедура несколько не полна.
Вот полный её код: Код:
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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
это для вставки картинок в RichEdit я понял? по секрету скажу: в IRichEditOle есть метод InsertObject.
Пишу программы за еду. __________________ |
#7
|
||||
|
||||
Я, несколько другой код, использовал для создания именно rtf файлов. Те файлы, что нынче создают редакторы, просто ужасны, переполнены кучей ненужной "шелухи". Таким или подобным способом удобно создавать компактные файлы для, к примеру, документирования, справки.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |