PDA

Ver la Versión Completa : delphi interprete


lledesma
02-04-2006, 15:56:34
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:

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


try
myform.showmodal;
except
myform.free;
end;


en lugar de except deberías usar finally:


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
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).


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
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