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 27-01-2006
Avatar de papulo
papulo papulo is offline
Miembro
 
Registrado: ago 2005
Ubicación: Lleida - Cataluña - España -Europa - Planeta tierra - Sistema solar - Via Lactea ...
Posts: 542
Poder: 19
papulo Va por buen camino
Llamar a una funcion almacenandola en una variable

El titulo no se si me ha salido explicativo, pero palabra que lo he intentado.

Veamos, lo que intento hacer es automatizar la llamada a una serie de funciones, todas empezando por la palabra 'SELEC' seguidas de un string diferente, que lo da el estado de ejecucion en un momento concreto.

Si tenemos los estados A, B y C, y las funciones 'SELECT_A', 'SELECT_B' y 'SELECT_C', lo que intento conseguir es que, siendo por ejemplo sStatus='A', la funcion que tengo que llamar seria 'SELECT_A', pero me gustaria ver si es posible hacer algo asi como:

Código Delphi [-]
sSelect:=('SELECT_');//El principio de todas las funciones
sSelect:=sSelect+sStatus; //Que contendria el string de la funcion SELECT_A
Lo que no se es como llamar a la funcion contenida en sSelect o si es posible.

¡Gurus de DELPHI yo os invoco! (Pero humildemente, y siempre para aprender de vuestros consejos)

Un saludo a tod@s.

Papulo.
Responder Con Cita
  #2  
Antiguo 27-01-2006
Avatar de Jonnathan
Jonnathan Jonnathan is offline
Miembro
 
Registrado: may 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 64
Poder: 19
Jonnathan Va por buen camino
Hola Papulo, puedes declarar todas las sentencias SQL en constantes y a la hora de llamarlas usas una función donde pases un parámetro para saber cual "Select" invocar. Mas o menos así:

Código Delphi [-]
const
SelectA = 'Select * From TablaA';
SelectB = 'Select * From TablaB';
SelectC = 'Select * From TablaC';

function BuscarSelect(MiSelect: Char): String;

implementation

function BuscarSelect(Status: Char): String;
begin
     case Status of
     A: BuscarSelect := SelectA;
     B: BuscarSelect := SelectB;
     C: BuscarSelect := SelectC;
     end;
end;
...
//LA USARIAS ASI:
BuscarSelect('A');

Si lo que deseas es usar un "Select" para la misma tabla que solo cambie el filtro, hace puedes hacer esto:

Código Delphi [-]
const
sSelect = 'Select * From MiTabla where Status=%s';
...
//PARA USAR EL SELECT O ASIGNARLO A ALGUN QUERY HACES ESTO
MiQuery.SQL.Text := Format(sSelect, [Status]);
La función Format() reemplazará el "%s" por el caracter de Status que quieras usar. Espero haberte ayudado, saludos.
__________________
"En el siglo de la estupidez todas las casas comienzan por la fachada" (Fuckowsky)
Planeta Insólito, La Pluma Inspirada
Responder Con Cita
  #3  
Antiguo 27-01-2006
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
Pues no, realmente esto no se puede. ¿Por qué? Porque Delphi es un lenguaje compilado y no interpretado. ¿Qué quiere decir esto? Pues quien sabe pero el caso es que una vez compilado, en el ejecutable ya no quedan referencias a los nombres de funciones, variables, etc. que hayas usado en el código fuente- sólo instrucciones en ensamblador.

Siempre hay alternativas pero dependen mucho del contexto general. Por ejemplo, suponiendo que SelectA, SelectB y SelectC son parte de un X proceso podrías tener algo como

Código Delphi [-]
type
  TProcesoX = class
  public
    function Select; virtual; abstract;
  end;

  TProcesoA = class(TProcesoX)
  public
    function Select; override;
  end;

  TProcesoB = class(TProcesoX)
  public
    function Select; override;
  end;

  TProcesoC = class(TProcesoX)
  public
    function Select; override;
  end;

Según el proceso específico que estés haciendo, instanciarás una u otra clase en una variable de la clase base TProcesoX, de manera que al llamar a Proceso.Select, el polimorfismo se encargará de escoger el correcto.

Pero esto requiere claro, que hayas estructurado tu aplicación en clases.

De no ser así o no ser factible, puedes optar por dos cosas (entre otras que se le ocurran a alguien más).

La primera es: si sólo hay un punto del programa donde debes decidir cuál función llamar, pues olvídate de complicaciones y haz el case:

Código Delphi [-]
case Status of
  0: SelectA();
  1: SelectB();
  2: SelectC();
end;

Si es algo que llamas desde distintas partes de la aplicación, podrías crearte una clase "selectora":

Código Delphi [-]
type
  TSelector = class
  private
    class function SelectA: Integer;
    class function SelectB: Integer;
    class function SelectC: Integer;
  public
    class function Select(Status: Integer): Integer;
  end;

implementation

function TSelector.Select(Estatus: Integer): Integer;
begin
  case Status of
    0: Result := Self.SelectA();
    1: Result := Self.SelectB();
    2: Result := Self.SelectC();
  end;
end;

La clase sólo tiene métodos estáticos (directiva class) de manera que no hay que crear ninguna instancia, simplemente la usas así:

Código Delphi [-]
TSelector.Select(Status);

Los métodos TSelector.SelectA, TSelector.SelectB y TSelector.SelectC también son estáticos y reemplazarían a los que tenías antes.

O bien los dejas fuera de la clase y dejas a TSelector únicamente con el método Select:

Código Delphi [-]
function TSelector.Select(Estatus: Integer): Integer;
begin
  case Status of
    0: Result := SelectA();
    1: Result := SelectB();
    2: Result := SelectC();
  end;
end;

Pero la primera opción te da un cierto orden al englobar en un sólo ente las tres funciones relacionadas.

// Saludos

Última edición por roman fecha: 27-01-2006 a las 19:25:52.
Responder Con Cita
  #4  
Antiguo 27-01-2006
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
¿Estamos hablando de SQL?

De ser así, quédate con la opción de Jonnathan.

// Saludos
Responder Con Cita
  #5  
Antiguo 27-01-2006
Avatar de OSKR
OSKR OSKR is offline
Miembro
 
Registrado: nov 2004
Ubicación: San Cristóbal/Táchira/Venezuela
Posts: 389
Poder: 20
OSKR Va por buen camino
No siendo SQL y reafirmando el mismo método de Román yo recomendaría el uso de punteros a funciones, esto aligeraría el código, dependiendo del problema puede q no sea necesario crear otras clases, casi imprescindible el uso del case (en mi caso Switch), e incluso se podría variar los parametros y reducir desiciones por descarte y/o usando funciones polimorfas, lo digo porq ya me he topado con problemas de este tipo
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad."
Simón Bolívar
(Carta al Coronel Inglés Patricio Cambell 05/08/1829).
Responder Con Cita
  #6  
Antiguo 27-01-2006
Avatar de Jonnathan
Jonnathan Jonnathan is offline
Miembro
 
Registrado: may 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 64
Poder: 19
Jonnathan Va por buen camino
Tienes razon roman jejeje , no se que estaba fumando que de repente vi todo como que era SQL, debe ser que he visto muchas consultas hoy en el trabajo, ahora que vuelvo a leer entiendo lo de automatizar la función. Y tambien recuerdo hace mucho vi por ahi una manera de llamar funciones pasandolas como una cadena de texto a una función del compilador que las ejecutaba ¿o tal vez era Visual Basic? . Bueno, el caso es que si quieres armar una sentencia con varias cadenas de texto y despues intentar ejecutarla te recomendaria algun componente interprete de scripts como FastScript.

Nota Mental: No responder preguntas del foro en estados de presión laboral.
__________________
"En el siglo de la estupidez todas las casas comienzan por la fachada" (Fuckowsky)
Planeta Insólito, La Pluma Inspirada
Responder Con Cita
  #7  
Antiguo 28-01-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo me quedaría con el uso de punteros, como dice OSKR
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tseleccion = function (a,b:Integer):Integer;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function An(a,b:integer):integer ;
begin
  Result := a;
end;

function the(a,b:integer):integer ;
begin
  Result := b;
end;


procedure TForm1.Button1Click(Sender: TObject);
  var sel:Tseleccion;
begin
   sel := the;
// aqui podemos elegir tanto la funcion "the" como la funcion "An" ya que 
// ambas tienen el mismo tipo de declaración.

// incluso podemos comparar para saber que funcion tienen:
if @sel = @the then
   ShowMessage('estamos usando la funcion the ');  

// ahora la ejecutamos:
   ShowMessage(IntToStr(sel(3,5)));
end;

end.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
Llamada a una funcion que incluye en el nombre una variable papulo PHP 11 28-12-2005 16:38:19
Sobre cierto resultado de la función SHGetSpecialFolderPath dec API de Windows 3 01-06-2005 06:59:01
Error En Variable Double Red_Delphi Varios 3 03-09-2004 00:13:42
problema al llamar una función sgarrido Varios 3 27-07-2004 01:14:33
mostrar SOLO cliente de los que tengo un sólo registro Giniromero SQL 15 11-06-2004 12:33:19


La franja horaria es GMT +2. Ahora son las 17:01:29.


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