Ir al contenido


Foto

¿Cómo ejecutar un método (Procedure/Funciones) por su nombre?


  • Por favor identifícate para responder
12 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 12 mayo 2009 - 05:11



delphi
  1. type
  2.   TForm1 = class(TForm)
  3.     Button1: TButton;
  4.     procedure Button1Click(Sender: TObject) ;
  5.     procedure LlamarPorNombre(Sender: TObject) ;
  6.   private
  7.     procedure ExecMethod(OnObject: TObject; MethodName: string) ;
  8.   end;
  9.  
  10. var
  11.   Form1: TForm1;
  12.  
  13. type
  14.   TExec = procedure of object;
  15.  
  16. procedure TForm1.ExecMethod(OnObject: TObject; MethodName: string) ;
  17. var
  18.   Routine: TMethod;
  19.   Exec: TExec;
  20. begin
  21.   Routine.Data := Pointer(OnObject) ;
  22.   Routine.Code := OnObject.MethodAddress(MethodName) ;
  23.   if NOT Assigned(Routine.Code) then Exit;
  24.   Exec := TExec(Routine) ;
  25.   Exec;
  26. end;
  27.  
  28. procedure TForm1.LlamarPorNombre(Sender: TObject) ;
  29. begin
  30.   ShowMessage('Hola Delphi!') ;
  31. end;
  32.  
  33. procedure TForm1.Button1Click(Sender: TObject) ;
  34. begin
  35.   ExecMethod(Form1, 'LlamarPorNombre') ;
  36. end;



Fuente

Saludos.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.963 mensajes
  • LocationMadrid - España

Escrito 12 mayo 2009 - 05:29

Interesante aporte enecumene. Otra forma de ver las cosas. :)

Saludos.

  • 0

#3 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 12 mayo 2009 - 06:56

Hola
Perdón la ignorancia, para que sirve el código, no entiendo?.
Saludos
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 12 mayo 2009 - 07:07

Hola
Perdón la ignorancia, para que sirve el código, no entiendo?.
Saludos


Es otra forma de llamar tus procedimientos y funciones, sólo que esta vez la llamas por su nombre, ejemplo:

En un botón:



delphi
  1. procedure TForm1.Button1Click(sender: TObject);
  2. begin
  3.     if Carlos <> Puto then
  4.         ShowMessage('Pues es Cuero'); //Si no es puto es Cuero
  5.     end else begin
  6.         ShowMessage('Pues sí­ es puto'); //No no, me equivoqué, es puto :p
  7.     end;
  8. end;



En otro botón:



delphi
  1. procedure TForm1.Button2Click(sender: TObject);
  2. begin
  3.     ExecMethod(Form1, 'Button1Click');
  4. end;



Saludos :D :D

  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 12 mayo 2009 - 07:15

Hola
Ahora entiendo, se puede llamar a un evento cualquiera.
Mi duda estaba en relación a llamar a un evento, como en este caso:


delphi
  1. type
  2.   TForm1 = class(TForm)
  3.     Button1: TButton;
  4.     procedure Button1Click(Sender: TObject);
  5.     procedure Mensaje;
  6.   private
  7.     { Private declarations }
  8.   public
  9.     { Public declarations }
  10.   end;
  11.  
  12. var
  13.   Form1: TForm1;
  14.  
  15. implementation
  16.  
  17. {$R *.dfm}
  18.  
  19. procedure TForm1.Mensaje;
  20. begin
  21.   showmessage('hola');
  22. end;
  23.  
  24. procedure TForm1.Button1Click(Sender: TObject);
  25. begin
  26.   Mensaje;
  27. end;


Muy interesante amigo, gracias por la explicación.
Saludos
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 12 mayo 2009 - 07:21

Pues sí­ amigo es mejor que:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   ShowMessage('DelphiAccess');
  4. end;
  5.  
  6. procedure TForm1.Button2Click(Sender: TObject);
  7. begin
  8.   Button1Click(sender);
  9. end;



Ya que aquí­ nos obliga agregar "(Sender)", con ese código sólo podemos llamarlo con su nombre sin necesidad de usar esa última parte.

Saludos.
  • 0

#7 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 12 mayo 2009 - 07:29

Hola
No es quejido, es que jodo  :D :D :D
Cual sender amigo??. :


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   showmessage('hola');
  4. end;
  5.  
  6. procedure TForm1.Button2Click(Sender: TObject);
  7. begin
  8.   Form1.Button1.Click;
  9. end;


Saludos
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 12 mayo 2009 - 07:29

Hola



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   ShowMessage('DelphiAccess');
  4. end;
  5.  
  6. procedure TForm1.Button2Click(Sender: TObject);
  7. begin
  8.   Button1.Click;
  9. end;



Salud OS
  • 0

#9 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 12 mayo 2009 - 07:33

Hola
Que interesante:
Muchas maneras de cortar CoJ.......... :D :D :D
Saludos
PD: Como siempre Egostar cortando codigo, que vago..... :D :D :D
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 12 mayo 2009 - 07:37

Hola
Que interesante:
Muchas maneras de cortar CoJ.......... :D :D :D
Saludos
PD: Como siempre Egostar cortando codigo, que vago..... :D :D :D


Bueno, bueno, no seas tan duro con enecumene, lo que hace es ilustrarte como ejecutar el método de un objeto por su nombre y no por el nombre de su evento :p

Salud OS
  • 0

#11 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 12 mayo 2009 - 07:43

Hola
Ya en serio:
Mas bien soy duro conmigo mismo, me costo entender el concepto del codigo de enecumene, por eso pregunte. :$
Para mi es un excelente sistema para llamar a un procedimiento, lo implementare de seguro.
Y reitero Gracias por el aporte y la explicación amigo enecumene.
Saludos
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 12 mayo 2009 - 08:04

Hola
Ya en serio:
Mas bien soy duro conmigo mismo, me costo entender el concepto del codigo de enecumene, por eso pregunte. :$
Para mi es un excelente sistema para llamar a un procedimiento, lo implementare de seguro.
Y reitero Gracias por el aporte y la explicación amigo enecumene.
Saludos


:D :D (y) (b)
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 mayo 2009 - 08:26

Hola Fernando, lindo truco... no quiero aguar la fiesta pero... creo que sólo vale para los métodos publicados. Y eso se debe a que MethodAccess se vale de RTTI para obtener la dirección de memoria de dichos métodos.

Si se mueve el método LlamarPorNombre a privado no funcionará. ;)

Saludos,



  • 0