Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Llamar evento sabiendo el nombre (https://www.clubdelphi.com/foros/showthread.php?t=79252)

cbrrr 19-06-2012 12:16:17

Llamar evento sabiendo el nombre
 
Hola

Estoy creando unos componentes y me surge la necesidad (por eso de querer hacer funciones generales) de hacer una llamada a un método (evento) sabiendo sólo el nombre (en una cadena).

Gracias a este mensaje (http://stackoverflow.com/questions/4...ed-in-a-string) se cómo llamar a un método teniendo el nombre de éste en la cadena. Lo que pasa es que al ser un evento necesito saber si éste está asignado antes de invocarlo (para evitar esos AV molestos).

¿Alguna idea de cómo poder controlar si el evento está asignado?

Gracias

ecfisa 19-06-2012 13:38:58

Cita:

Empezado por cbrrr (Mensaje 435498)
¿Alguna idea de cómo poder controlar si el evento está asignado?

Hola cbrr.

Una forma es:
Código Delphi [-]
uses  TypInfo;

function MethodAssigned(const aObject: TObject; const MethodName: string): Boolean;
var
  Method: TMethod;
begin
  Method:= GetMethodProp(aObject, MethodName);
  Result:= Method.Code <> nil;
end;

Uso:
Código Delphi [-]
...
begin
  MethodName:= 'OnClick';
  if MethodAssigned(Edit1, MethodName) then
   ...

Saludos.

cbrrr 19-06-2012 15:23:45

Y mira que conocía la función GetMethodProp de la TypInfo, pero no caí en él. Y ya que tiro de la RTTI, puedo usarlo para lanzar directamente el evento

Gracias

Casimiro Notevi 19-06-2012 15:38:47

[offtopic]

Vaya, vaya... joe bar team y cbrrr

[/offtopic]

LoPiTaL 19-06-2012 15:49:14

Hola,
Si estás usando Delphi 2010 o superior, tal vez te interese revisar la RTTI extendida, que permite hacer muchas más cosas que TypInfo y de forma más sencilla (más orientada a objetos). Simplemente incluye en el uses "RTTI", y añádete una variable de TRTTIContext, y verás cómo es más o menos sencillo:

Código Delphi [-]
//Ejemplo tomado de http://stackoverflow.com/questions/2...event-properly
function MethodAssigned(const aObject: TObject; const MethodName: string): Boolean;
var
  LContext: TRttiContext;
  LValue: TValue;
  LEvent: TNotifyEvent;
begin
  LValue:=LContext.GetType(aObject.ClassType).GetProperty(MethodName).GetValue(aObject);
  LEvent:=LValue.AsType();  //Los () son necesarios, para que el compilador distinga entre 
                                                           //llamar a AsType y lanzar el evento.
  if assigned(LEvent) then
    LEvent(Self);
end;

Un saludo,
LoPiTaL

cbrrr 20-06-2012 10:58:46

Buenas LoPiTaL,

Efectivamente, ese enlace lo encontré buscando información por la web, pero como quiero que los componentes funcionen en versiones "viejas" de Delphi, esa solución no me sirvió (aunque está bien ponerla como documentación)

Gracias de nuevo


La franja horaria es GMT +2. Ahora son las 08:18:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi