Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamar funciones dinamicamente.. desde strings? (https://www.clubdelphi.com/foros/showthread.php?t=89639)

Reasen 03-01-2016 06:30:45

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.

Casimiro Noteví 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:

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;

Reasen 03-01-2016 17:42:57

Gracias! Me sirve!

Casimiro Noteví 03-01-2016 18:12:39

Cita:

Empezado por AgustinOrtu (Mensaje 500976)
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

Cita:

Empezado por Lepe (Mensaje 500995)
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

Cita:

Empezado por Reasen (Mensaje 500968)
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

Cita:

Empezado por mamcx (Mensaje 501006)
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...


La franja horaria es GMT +2. Ahora son las 07:24:36.

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