Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   delphi interprete (https://www.clubdelphi.com/foros/showthread.php?t=30272)

lledesma 02-04-2006 15:56:34

delphi interprete
 
Hola:
Quizas sea muy rebuscada mi pregunta pero ahi va:
Necesito hacer que delphi interprete una variable, esto es:
por ejempo

var x: string;

begin
x:='Tmyform';
myform:= x.create(self);
try
myform.showmodal;
except
myform.free;
end;
end;

se puede?. Espero que se entienda mi pregunta. Gracias

jmariano 02-04-2006 16:25:28

Se puede, pero has de utilizar la función FindClass para buscar la clase a inicializar a través de su nombre y registrar dicha clase antes de localizarla utilizando el método RegisterClass. Ej:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  x: string;
begin
  x := 'TForm1';

  with TFormClass(FindClass(x)).Create(Self) do
  begin
    ShowModal;
    Free;
  end;
end;

initialization
  RegisterClass(TForm1);

roman 02-04-2006 16:44:52

lledesma, una observación: en tu código

Código Delphi [-]
try
  myform.showmodal;
except
  myform.free;
end;

en lugar de except deberías usar finally:

Código Delphi [-]
try
  myform.showmodal;
finally
  myform.free;
end;

// Saludos

lledesma 02-04-2006 19:03:10

Mariano:

Gracias, funciona. Estoy empezando con delphi y al desconocer algunos aspectos de este lenguaje mi requerimiento no es muy claro. Te pregunto cual es en realidad mi duda. Tengo una tabla con distintas opciones (junto a los forms asociados a esa opcion) de un menu y me gustaria poder armar un menu en tiempo de ejecucion de modo que sea dinamico, esto es, cada usuario tiene un perfil y cuando se validad se le arma el menu para ese usuario y cada vez que seleccione una opcion pueda llamar al Form asociado. De ahi la necesidad de mi pedido. En el codigo que me enviaste quedarian dos dudas a resolver



Uses x ? // x contendria la unidad uForm

procedure TForm1.Button1Click(Sender: TObject);
var
x: string;
begin
x := 'TForm1';

with TFormClass(FindClass(x)).Create(Self) do
begin
ShowModal;
Free;
end;
end;

initialization
RegisterClass(x); // x en lugar de Tform1.

Desde ya muchas gracias!!

jmariano 03-04-2006 16:35:39

Cita:

Empezado por lledesma
Uses x ? // x contendria la unidad uForm

No, no necesitas añadir el formulario a cargar a la cláusula uses porque lo estás localizando a través de su nombre con la función FindClass. Otra cosa distinta es que tuvieras que invocar métodos o propiedades específicas de dicho formulario, ya que, entonces, necesitarás hacer un moldeado de tipo y para ello si tendrás que añadir la unidad del formulario a dicha cláusula (pero si sólo se trata de cargarlo y mostrarlo, entonces, no hace falta). (Otra opción es añadir dichas propiedades a la parte published del formulario y hacer uso de la información de tipos en tiempo de ejecución, revisa la ayuda sobre la unidad TypInfo).

Cita:

Empezado por lledesma
initialization
RegisterClass(x); // x en lugar de Tform1.

Si te refieres a pasar una cadena como parámetro, nop, no puedes, ya que RegisterClass espera como parámetro una clase. Lo que te aconsejaría es añadir dicha parte initialization en todas las unidades pertenecientes a los formularios a cagar dinámicamente.

Saludos!

roman 03-04-2006 18:29:29

Cita:

Empezado por jmariano
no necesitas añadir el formulario a cargar a la cláusula uses porque lo estás localizando a través de su nombre con la función FindClass.

Quizá valga la pena aclarar que en algún lugar debe incluirse la unidad del formulario. Si son muchos podría crear una unidad formularios.pas que incluya todos los demás e incluir ésta en el dpr.

// Saludos


La franja horaria es GMT +2. Ahora son las 08:32:44.

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