PDA

Ver la Versión Completa : agregar un link ligado a un procedimiento a un RichText


robertosc
29-09-2008, 19:14:51
hola a todos!

mi duda es como puedo agregar ya sea un link o una imagen dentro de un richtext y al momento de dar click ya sea en el link o en la imagen llamar un procedimiento en delphi, como un tipo boton...:)

ya se como agregar el link o la imagen al richtext, pero no más... :p

el richtext va tener la propiedad de readonly=true, digamos que nomas lo uso como consulta o lectura, pero necesito usarlo por que el texto tiene formato...

gracias de antemano!

lKinGl
30-09-2008, 00:13:36
podrias ser mas explicito?

egostar
30-09-2008, 00:50:55
Hola

http://delphi.about.com/od/vclwriteenhance/l/aa051804a.htm

Salud OS

robertosc
30-09-2008, 14:56:05
hola lKinGl (http://www.clubdelphi.com/foros/member.php?u=21090) gracias por responder, mira tengo un richtext asi:

http://robman.site40.net/richtext.jpg

y quiero programar que cuando le den clic a la imagen sea como un tipo boton donde yo pueda programar por medio de codigo delphi una acción. :rolleyes: llamar un procedimiento donde yo pueda abrir otra forma por ejemplo.

robertosc
01-10-2008, 15:51:40
o algun otro componente que pueda utilizar para lograr mi proposito :confused: :(

cHackAll
01-10-2008, 23:59:49
//...

uses ActiveX, ComObj, RichEdit;

//...

type
IRichEditOle = interface(IUnknown)
['{00020d00-0000-0000-c000-000000000046}']
function GetClientSite(out clientSite: IOleClientSite): HRESULT; stdcall;
function GetObjectCount: HRESULT; stdcall;
function GetLinkCount: HRESULT; stdcall;
function GetObject(iob: Integer; out ReObject; dwFlags: Cardinal): HRESULT; stdcall;
end; // changed !!!

procedure TForm1.JvRichEdit1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var
RichEdit: TCustomMemo;
Point: TPoint;
Value, Index: Integer;
RichEditOle: IRichEditOle;
ReObject: record
cbStruct, cp: Cardinal;
clsid: TCLSID;
poleobj: IOleObject;
pstg: IStorage;
polesite: IOleClientSite;
sizel: TSize;
dvAspect: Integer;
dwFlags, dwUser: Cardinal;
end;

begin
if (Button = mbLeft) and (Sender is TCustomMemo) then
begin
RichEdit := Sender as TCustomMemo;
if RichEdit.SelLength = 1 then
begin
Windows.GetCaretPos(Point);
Value := RichEdit.Perform(EM_CHARFROMPOS, 0, Integer(@Point)) - 1;
if Value >= 0 then
begin
SendMessage(RichEdit.Handle, EM_GETOLEINTERFACE, 0, Integer(@RichEditOle));
ReObject.cbStruct := SizeOf(ReObject);
for Index := 0 to RichEditOle.GetObjectCount - 1 do
begin
RichEditOle.GetObject(Index, ReObject, 0{REO_GETOBJ_NO_INTERFACES});
if Integer(ReObject.cp) = Value then // 0j0: funciona con cualquier objeto!
begin
ShowMessage('Object ID: ' + IntToStr(Index)); // aquí haces lo que debes hacer...
RichEdit.SelLength := 0;
Break;
end;
end;
end;
end;
end;
end;

Nota; considerar que en las pruebas se utilizó un componente JEDI (http://ufpr.dl.sourceforge.net/sourceforge/jvcl/JVCL334CompleteJCL1102-Build3072.zip), sin embargo debiese funcionar con cualquier componente que utilice interfaces OLE estándares :cool:.

Saludos

robertosc
02-10-2008, 15:19:58
hola [cHackAll] (http://www.clubdelphi.com/foros/member.php?u=13492), muchas gracias :D

ya prove tu código y funciono perfecto, justo lo que necesitaba!!!! :D