Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-06-2016
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Usando RTTI para devolver lista de eventos

Intentando usar RTTI, no puedo encontrar una forma que me devuelva una lista con todos los eventos que pueda tener una clase.

He mirado las units del propio entorno de Delphi (XE8) y no hay nada que se de forma directa. Lo que he encontrado que dentro de la unit System.RTTI existe la clase TRttiType que contiene los métodos GetMethods, GetFields, GetProperties, GetIndexedProperties entre otros.

Mi pregunta ahora es la siguiente. ¿Puede ser que GetMethods devuelva todos los métodos de una clase, incluidos los que se usan para los evntos. Si es asi, como identifico cuales son los de los eventos, cuales son procedimientos, funciones, constructor, etc.?

Como dije antes, en la unit correspondiente no he visto nada que me de una idea de como hacer lo que quiero. ¿Acaso tendre que identificar cada uno de ellos por lo que diga delante (procedure, function, constructor, etc)?

Si alguien sabe como hacerlo y tiene algún ejemplo que me pueda orientar se los agradecería mucho. Ya saben cualquier cosa que algo no se entienda pueden preguntar y sera aclarado.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #2  
Antiguo 02-06-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Al parecer, los eventos en Delphi son identificados mediante TTypeKind.tkMethod

Entonces, podes hacer esto:

Código Delphi [-]
uses
  Rtti;

procedure TForm1.Button1Click(Sender: TObject);
var
  c: TRttiContext;
  &Type: TRttiType;
  Prop: TRttiProperty;
begin
  Memo1.Clear;
  &Type := c.GetType(TButton);
  for Prop in &Type.GetProperties do
  begin
    if Prop.PropertyType.TypeKind = TTypeKind.tkMethod then
      Memo1.Lines.Add(Prop.ToString);
  end;
end;

Salida:

Código Delphi [-]
property OnClick: TNotifyEvent
property OnContextPopup: TContextPopupEvent
property OnDragDrop: TDragDropEvent
property OnDragOver: TDragOverEvent
property OnDropDownClick: TNotifyEvent
property OnEndDock: TEndDragEvent
property OnEndDrag: TEndDragEvent
property OnEnter: TNotifyEvent
property OnExit: TNotifyEvent
property OnKeyDown: TKeyEvent
property OnKeyPress: TKeyPressEvent
property OnKeyUp: TKeyEvent
property OnMouseActivate: TMouseActivateEvent
property OnMouseDown: TMouseEvent
property OnMouseEnter: TNotifyEvent
property OnMouseLeave: TNotifyEvent
property OnMouseMove: TMouseMoveEvent
property OnMouseUp: TMouseEvent
property OnStartDock: TStartDockEvent
property OnStartDrag: TStartDragEvent
property OnDropDownClick: TNotifyEvent
property WindowProc: TWndMethod
property OnGesture: TGestureEvent
Responder Con Cita
  #3  
Antiguo 02-06-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Otra opción que les servirá también a los que disponen de versiones mas viejitas:
Código Delphi [-]
uses TypInfo;

procedure GetMethodNames(AComponent: TComponentClass; TS: TStrings);
var
  i   : Integer;
  pInf: PPropList;
begin
  for i := 0 to GetPropList(AComponent.ClassInfo, pInf)-1 do
    if pInf[i].PropType^.Kind = tkMethod then
      TS.Add(Format('%s: %s',[pInf[i].Name, pInf[i].PropType^.Name]));
end;

// Ej. de uso
...
begin
   GetMethodNames(TListBox, ListBox1.Items); 
   ...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 02-06-2016
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Primero que nada, gracias por las respuestas. En cuanto pueda vere las dos opciones que me dan, ya que esto me servirá para hacer que el Framework pueda hacer lo mismo en versiones nuevas y mas viejas.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #5  
Antiguo 02-06-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola Daniel, acabo de probar tu ejemplo en Delphi 2010 y funciona bien

Simplemente no entiendo porque limitas la clase a inspeccionar a que sea heredero de TComponent

Segun las pruebas que he hecho, funciona bien si heredamos de TObject:


Código Delphi [-]
  TCustomEvent = procedure of object;

  TMyClass = class
  private
    FEvento: TNotifyEvent;
    FEventoCustom: TCustomEvent;
    procedure SetEvento(const Value: TNotifyEvent);
    procedure SetEventoCustom(const Value: TCustomEvent);
  published
    property Evento: TNotifyEvent read FEvento write SetEvento;
    property EventoCustom: TCustomEvent read FEventoCustom write SetEventoCustom;
  end;

implementation

uses
  TypInfo;

procedure GetMethodNames(AClass: TClass; TS: TStrings);
var
  I: Integer;
  pInf: PPropList;
begin
  for I := 0 to GetPropList(AClass.ClassInfo, pInf) - 1 do
    if pInf[i].PropType^.Kind = tkMethod then
      TS.Add(Format('%s: %s', [pInf[i].Name, pInf[i].PropType^.Name]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  TS: TStrings;
begin
  TS := TStringList.Create;
  try
    GetMethodNames(TMyClass, TS);
    ShowMessage(TS.Text);
  finally  
    TS.Free;
  end;
end;

En este caso imprime tanto el TNotifyEvent como el TCustomEvent. Eso si, fue necesario declarar las propiedades como publicadas
Responder Con Cita
  #6  
Antiguo 02-06-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por AgustinOrtu Ver Mensaje
Simplemente no entiendo porque limitas la clase a inspeccionar a que sea heredero de TComponent
De hecho podría limitarlo a TPersistent, pero no más arriba, al menos en Delphi 7. O, mejor dicho, habría que verificar que AClass.ClassInfo no sea nil, y no lo será siempre que la directiva {$M+} esté presente, cosa que sucede con TPersistent.

Tú ejemplo, da un Access Violation en D7 hasta que se activa la directiva. No sé si en D 2010 se active siempre.

LnieComment Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funcion postgres para devolver nombre del mes banthas PostgreSQL 4 28-12-2015 22:14:28
Llenar una lista desplegable usando ibase MAXIUM PHP 2 12-03-2013 16:44:54
Monitor de eventos usando una clase dario61081 Trucos 5 08-02-2013 16:49:41
función date para devolver Nº dia de la semana lucasarts_18 PHP 2 27-03-2007 14:27:03
problema para devolver 2 valores en una funcion tiagor64 OOP 4 06-05-2005 15:38:59


La franja horaria es GMT +2. Ahora son las 09:41:32.


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
Copyright 1996-2007 Club Delphi