PDA

Ver la Versión Completa : Llamar funciones dinamicamente.. desde strings?


Reasen
03-01-2016, 06:30:45
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:



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.

Casimiro Notevi
03-01-2016, 12:02:33
Creo que no se entiende qué quieres hacer ni qué problema tienes.

AgustinOrtu
03-01-2016, 17:00:58
Es posible usando Rtti, pero requiere Delphi 2010 o superior:


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;

Reasen
03-01-2016, 17:42:57
Gracias! Me sirve!

Casimiro Notevi
03-01-2016, 18:12:39
Es posible usando Rtti, pero requiere Delphi 2010 o superior:Ya decía yo que algo no entendía, me quedé en D2007 :)

Lepe
04-01-2016, 10:32:33
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.

Reasen
04-01-2016, 21:45:15
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.

mamcx
05-01-2016, 01:05:40
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" ???

Reasen
05-01-2016, 04:31:30
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.

mamcx
05-01-2016, 16:34:34
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...