Brauche Hilfe bei Delphi Code
-
Also folgendendes,
auf der Suche nach einer möglichkeit ein Bitmap oder Icon in einem Riched darzustellen bin ich in den Google Groups auf diesen Delphi Code gestoßen. Benutz wird ein Richedit aus der RXLibary (Die habe ich auch)procedure AddbBitmapToRichEdit(bmp : Tbitmap; RichEdit : TRxRichEdit); 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\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; var s : TstringStream; begin S := TStringStream.Create(BitmapToRTF(bmp)); RichEdit.PlainText := False; RichEdit.StreamMode := [smSelection]; RichEdit.Lines.LoadFromStream(S); S.Free; end;
Nun versuche ich gerade diesen Code im CBuilder zu übersetzen und habe bisher folgendes erreicht
#include <vcl.h> #include "BitmapInRE.h" AnsiString __fastcall BitmapToRTF(Graphics::TBitmap *Pic) { AnsiString bi, bb, rtf, achar; //char *bi, *bb; unsigned int bis,bbs; AnsiString hexpict; int I, bilen, bblen, hexlen; GetDIBSizes(Pic->Handle, bis, bbs); bi = bi.SetLength(bis); //bi = new char [bis]; bb = bb.SetLength(bbs); //bb = new char [bbs]; GetDIB(Pic->Handle,Pic->Palette,bi.c_str(),bb.c_str()); rtf = "{\rtf1 {\pict\dibitmap "; bilen = bi.Length();//StrLen(bi); bblen = bb.Length();//StrLen(bb); hexpict = hexpict.SetLength((bblen + bilen) * 2); hexlen = hexpict.Length(); I = 2; for (bis = 1; bis<bilen;bis++) { achar = Format("%x",ARRAYOFCONST(((int)bi[bis]))); if (achar.Length () == 1) achar = "0" + achar; hexpict[I-1] = achar[1]; hexpict[I] = achar[2]; I=I+2; } for(bbs=1;bbs<bblen;bbs++) { achar = Format("%x",ARRAYOFCONST(((int)bb[bbs]))); if (achar.Length() == 1) achar = "0" + achar; hexpict[I-1] = achar[1]; hexpict[I] = achar[2]; I=I+2; } rtf = rtf + hexpict + " }}"; return rtf; } void __fastcall AddBitmapToRichEdit(Graphics::TBitmap *bmp, TRxRichEdit *RichEdit) { TStringStream *S; S = new TStringStream(BitmapToRTF(bmp)); RichEdit->PlainText = False; RichEdit->StreamMode << smSelection; RichEdit->Lines->LoadFromStream(S); S->Free(); }
[ Dieser Beitrag wurde am 18.02.2003 um 09:32 Uhr von Fox-Alpha editiert. ]
Code aktualisiert
[ Dieser Beitrag wurde am 18.02.2003 um 10:16 Uhr von Fox-Alpha editiert. ]
-
Also ich bin jetzt soweit das es einigermassen läuft, naja das das Ergebniss ist nicht ganz das was es sein soll aber immerhin kann ich den Code :
#include <vcl.h> #include "BitmapInRE.h" TStringStream *S; AnsiString __fastcall BitmapToRTF(Graphics::TBitmap *Pic) { AnsiString bi, bb, rtf="",End = "", achar, Data=""; unsigned int bis,bbs; AnsiString hexpict; unsigned int I, bilen, bblen, hexlen, Datalen=0; int datapos; GetDIBSizes(Pic->Handle, bis, bbs); bi = bi.SetLength(bis); //bi = new char [bis]; bb = bb.SetLength(bbs); //bb = new char [bbs]; GetDIB(Pic->Handle,Pic->Palette,bi.c_str(),bb.c_str()); rtf = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031\\uc1 {\\pict \\dibitmap \r\n"; bilen = bi.Length(); bblen = bb.Length(); hexpict = hexpict.SetLength(4096/*(bblen + bilen) * 3*/); hexlen = hexpict.Length(); I = 2; for (bis = 1; bis<bilen;bis++) { achar = Format("%x",ARRAYOFCONST(((int)bi[bis]))); if (achar.Length () == 1) achar = "0" + achar; hexpict[I-1] = achar[1]; hexpict[I] = achar[2]; I=I+2; } for(bbs=1;bbs<bblen;bbs++) { achar = Format("%x",ARRAYOFCONST(((int)bb[bbs]))); if (achar.Length() == 1) achar = "0" + achar; hexpict[I-1] = achar[1]; hexpict[I] = achar[2]; I=I+2; } End = "\r\n}}"; hexlen = rtf.Length() + hexpict.Length() + End.Length(); S = new TStringStream(rtf + hexpict + End); return ""; } void __fastcall AddBitmapToRichEdit(Graphics::TBitmap *bmp, TRxRichEdit *RichEdit) { BitmapToRTF(bmp); RichEdit->PlainText = False; RichEdit->StreamMode << smSelection; RichEdit->Lines->LoadFromStream(S); S->Free(); }
ohne Probleme Kompilieren.
Das was jetzt noch fehlt ist das das Image auch noch angezeigt wird.
Momentan erhalte ich immer die RTF Headerzeile und den Boitmap Hexcode, aber der fuss fehlt und es wird nicht angezeigt. Bzw. Das ganze wird irgendwie abgeschnitten, der Wert aus der variable End wird nicht angefügt.Nichtmal wenn ich die Variable hexpict auf 4 kb setzte geht es also an der grösse kann es nicht liegen.
Wenn ich das ganze in eine Datei reineditiere und dann über einen TFileStream in das RichEdit lade geht es aber aus dem Stream.
Ich hoffe das mir jemand helfen kann und mir zeigt was ich falsch gemacht habe.
-
Sorry, keine Ahnung wo das eigentliche Problem liegt. Aber Free() solltest du nicht verwenden (siehe Hilfe) , da gehört ein delete hin!
Nur damit du nicht denkst, dass dein Code ungelesen bliebe.