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 03-01-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Llamar funciones dinamicamente.. desde strings?

Hola!
Actualmente necesito una manera de poder llamar las funciones desde string para ahorrar mucho codigo,
la verdad nose si esto es posible ya que al compilar desapecen los nombres de las funciones, etc.,
alguna manera parecida también serviría como por ejemplo saber el address de la función y llamarlo desde ahí,
espero que alguien pueda ayudarme en este complicado tema.


Este código actualmente funciona para poner un ejemplo:


Código Delphi [-]
program Project2;

{$APPTYPE CONSOLE}
  uses windows,SysUtils;

type
  TNodeFunction = function(AInput: String): String;



function Func1(AInput: String): String;
begin
   result := AInput;
end;

function Func2(AInput: String): String;
begin
   result := 'Hola!';
end;

function Func3(AInput: String): String;
begin
   result := UpperCase(AInput);
end;


var
  SomeFunc: TNodeFunction;
begin

     SomeFunc := Func2;

    MessageBox(0,PChar(SomeFunc('Nada')),'',0) ;   // devuelve 'Hola!'

end.
Responder Con Cita
  #2  
Antiguo 03-01-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.068
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que no se entiende qué quieres hacer ni qué problema tienes.
Responder Con Cita
  #3  
Antiguo 03-01-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
Es posible usando Rtti, pero requiere Delphi 2010 o superior:

Código Delphi [-]
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  public
    procedure YellHello;
  end;

  TAlgunaClase = class
  public
    procedure Yell(const AText: string);
  end;

var
  Form1: TForm1;

implementation

uses
  Rtti;

procedure TForm1.Button1Click(Sender: TObject);
var
  c: TRttiContext;
  t: TRttiType;
  m: TRttiMethod;
  NombreMetodo: string;
begin
  t := c.GetType(ClassType);
  if t = NIL then
    Exit;

  NombreMetodo := 'YellHello';
  m := t.GetMethod(NombreMetodo);
  if m = NIL then
    Exit;

  m.Invoke(Self, []);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  c: TRttiContext;
  t: TRttiType;
  m: TRttiMethod;
  NombreMetodo: string;
  AlgunObjeto: TAlgunaClase;
begin
  t := c.GetType(TAlgunaClase);
  if t = NIL then
    Exit;

  NombreMetodo := 'Yell';

  m := t.GetMethod(NombreMetodo);
  if m = NIL then
    Exit;

  AlgunObjeto := TAlgunaClase.Create;
  try
    m.Invoke(AlgunObjeto, ['Hi!']);
  finally
    AlgunObjeto.Free;
  end;
end;

procedure TForm1.YellHello;
begin
  ShowMessage('TForm1: Hello world!');
end;

{ TAlgunaClase }

procedure TAlgunaClase.Yell(const AText: string);
begin
  ShowMessage('TAlgunaClase: ' + AText);
end;
Responder Con Cita
  #4  
Antiguo 03-01-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Gracias! Me sirve!
Responder Con Cita
  #5  
Antiguo 03-01-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.068
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por AgustinOrtu Ver Mensaje
Es posible usando Rtti, pero requiere Delphi 2010 o superior:
Ya decía yo que algo no entendía, me quedé en D2007
Responder Con Cita
  #6  
Antiguo 04-01-2016
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
El RTTI lo he usado en D6 y en D7 creo está algo más currado, de todas formas Neftali tiene en blog una unidad RTTI.pas, creo aquí en el club también hay algo en trucos.

Lo cierto es que quizás Delphi no sea el mejor lenguaje para eso, (aunque lo tiene y es usable), deberías plantearte incluir un lenguaje de scripts, tipo python (busca python4Delphi) en tu aplicación.

Creas una API (unas funciones en Delphi que exportan a python las cosas que requieras, Crear un Tquery, conectar a tu BBDD, algunas funciones de tu aplicación...) y ya después puedes crear scripts en python que hacen todo:
- bajar ficheros de internet
- enviar correos
- conectar a la base de datos y hacer tareas
- abrir ficheros de disco y guardarlos, analizar el contenido, etc...

Tu programa solo carga el motor python4Delphi y el script lo puedes guardar tanto en disco como en la BBDD (un blob), lo puedes usar como si fueran plugins llamando a uno u otro si está en la BBDD.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 04-01-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
El RTTI lo he usado en D6 y en D7 creo está algo más currado, de todas formas Neftali tiene en blog una
Tu programa solo carga el motor python4Delphi y el script lo puedes guardar tanto en disco como en la BBDD (un blob), lo puedes usar como si fueran plugins llamando a uno u otro si está en la BBDD.
Entonces sería posible combinar Python con Delphi 7 / XE en un mismo ejecutable? Nunca he oído sobre Python para Delphi.
Responder Con Cita
  #8  
Antiguo 05-01-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.917
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Reasen Ver Mensaje
para ahorrar mucho codigo,
la verdad nose si esto es posible ya que al compilar desapecen los nombres de las funciones,
Aunque ya te contestaron, me entra la duda de porque te parece que "ahorras codigo" y que problema hay con que " desapecen los nombres de las funciones" ???
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 05-01-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Aunque ya te contestaron, me entra la duda de porque te parece que "ahorras codigo" y que problema hay con que " desapecen los nombres de las funciones" ???
Nose bien que responderte, pues simplemente me ahorra tener que poner miles de condiciones con el proyecto que estoy haciendo.
Responder Con Cita
  #10  
Antiguo 05-01-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.917
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Bueno, entonces puedes poner un ejemplo de ese codigo, y cual es la razon de ser del mismo. Tambien ayuda que version de Delphi tienes.

Te lo digo porque aunque hacer asi tiene sus gracias, no es la forma idiomatica en Delphi, y dependiendo de que es lo que buscas, se pueden hacer cosas que seran casi iguales pero mucho mas eficientes...
__________________
El malabarista.
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
Llamar a funciones de dll compilada con g++ desde código Delphi noob OOP 0 27-06-2013 16:03:51
Como llamar a las funciones de la Api de Windows? antonio302050 C++ Builder 2 17-11-2010 00:35:39
Llamar procedimiento y funciones almacenadas en Oracle? gueritox Conexión con bases de datos 1 18-12-2009 16:02:19
LLamar funciones dentro de una misma pagina php Coco_jac PHP 3 04-10-2005 17:18:48
llamar funciones PHP karocs PHP 3 29-01-2005 01:33:02


La franja horaria es GMT +2. Ahora son las 02:10:31.


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