Delphi 2005 nebo Delphi7 vlozeni smajliku do memo1 richedit1
Ahoj vsem mam dotaz , potreboval bych vedet zda jde do Richedit nebo memo1 komponenty vlozit
obrazek do textu v Richedit lze udelat obarveni textu to neni problem ale jak tam dostat obrazek napadlo mne ze by to mohlo jit pomoci canvas .
Pokud existuje naky web kde by bylo mozno neco si precist beru taky , uz jsem prosel kde co ale vsude je jen ukazka jak to vlozit na pozadi to nepotrebuji.
Vim listbox , treeview, listview maji moznost vlozeni obrazku ale jen na zacatek to taky nechci , potrebuji to nak nacpat do memo1 nebo richedit1.
Vlastni komponentu jsem uvazoval ze bych vytvoril ale nechce se mi ji delat kdyz je mozna moznost to vytvorit v stavajici ale nevim jak to tam nacpat.
Diky moc.
Klasicky RichEdit, ktery se pouziva v Delphi vyuziva knihovnu RichEdt.DLL v.1
Ta neumoznuje vkladat obrazky.
K tomu potrebujes minimalne verzi 2. Ta je implementovana napr. v komponente rxRichEdit
U Memo je to jeste horsi, tam bys musel pouzit uzivatelske vykreslovani a to u Memo je dost tezke...
Ale pokud si vsimnes jakychkoliv programu typu ICQ, Miranda, ..., tak pro zobrazovani textu se nepouzivaji "editacni" komponenty, jako RichEdit nebo Memo, ale ListBox s uzivatelskym vykreslovanim.
Dalsi moznost je generovat HTML kod a zobrazovat pomoci komponenty TWebBrowser, ale bude to pomalejsi
Opravdu jsem prosel ledasco ale vzdycky jsem skoncil u nedobreho reseni, jinak komponenta TWebbrowser taky neni k zahozeni jdu zkusis hledat na google dekuji mockrat.
Ja som našiel jeden tip pre rxRichEdit, neskúšal som:
[pas]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;[/pas]
[mod]Upravil (Jan Fiala)[/mod]
=pokračovanie=
[pas]// 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;[/pas]
[mod]upravil (Jan Fiala)[/mod]
Do .... ako sa sem vkladá zdroják v pascale/delphi ?
len pre doplnenie, mozes pouzit tag code a je tam aj specialne pre pascal.
takto:
[pas]function BitmapToRTF(pict: TBitmap): string;
// by D3k
var
bi, bb, rtf: string;
bis, bbs: Cardinal;
achar: ShortString;
hexpict: string;
...[/pas]
No však som to skúsil cez tag "PAS" ale v náhľade nič...
Prosím vysvetliť polopate
mozno je problem v tom, ze bol prispevok dlhy a uz sa nezmestil uzatvaraci tag code.
[pas]uses Pokus;
function Oprava: boolean;
var
I: integer;
begin
showmessage('IgorK je super');
end;
[/pas]
Áno chýbal uzatvárací tag ....
Jeste jsem koukal zde ze to jde i pres streams to se mne hodne libi to bude mozna lepsi reseni , na netu jeste zatim hledam, pokud nic nenajdu zkusim to pres streamsi.
Mozno teraz tresnem blbost, neviem, nerobil som s tym ale mal som to v plane. Hral som sa s tym, ale uz neviem ako to dopadlo. Neda sa do RichEdit vlozit OLE objekt? Alebo to umoznuje len ta verzia 2?