PDA

Ver la Versión Completa : Consulta Formularios


leoram72
05-04-2007, 02:47:05
Hola,

Tengo la necesidad de crear en tiempo de ejecución los formularios de mi aplicación los nombres de cada formulario estan almacenado en campos texto, y necesito que cuando el usuario elija que formulario ejecutar, tome el nombre del formulario, lo cree y lo presente, he tenido problemas con los tipos de datos.

Agradezco de antemano la ayuda.

dec
05-04-2007, 03:24:24
Hola,

Por el momento se me ocurre algo como lo siguiente:


with Application do begin
if Assigned(FindComponent('Form2')) then
(FindComponent('Form2') as TForm).ShowModal();
end;


Con el posible inconveniente de que el formulario "Form2" ha de crearse al comenzar el proyecto, es decir, ha de estar disponible (lo que no quiere decir visible) para poder utilizar el método "FindComponent" de la clase "Application".

leoram72
05-04-2007, 04:02:19
Mil gracias, esta opcion me sirve, ya despues mirare como optimizarla para no tener que crear toas las formas desde el principio

Gracias.

roman
05-04-2007, 04:16:39
Aquí va otra idea:

Para crear el formulario con nombre dado puedes definir el siguiente método en el formulario principal:


procedure TForm1.CreateForm(FormName: String);
var
FormClass: TPersistentClass;

begin
FormClass := GetClass(FormName);
if Assigned(FormClass) and (FormClass.InheritsFrom(TForm)) then
with TFormClass(FormClass).Create(Application) do
Show;
end;


Para que esto funcione, el formulario principal debe incluir en el uses, las unidades de los otros formularios, y cada uno de esos otros formularios debe incluir una sección initialization donde registre la clase del formulario:


unit Unit2;

interface

type
TForm2 = class(TForm)
...
end;

implementation

...

initialization
RegisterClass(TForm2);
end.


Es un poco más de trabajo, pero permite iniciar sin tener creados los formularios.

// Saludos

leoram72
05-04-2007, 04:39:34
Bien,

Ya probe esta funcionalidad y es perfecta, mil gracias por la ayuda y la verdad no es muy extensa.

Nuevamente Gracias

juliobuitrago
20-04-2007, 08:18:26
Algo hago mal.
Tengo aqui tres forms.
Uno es el principal, los otros dos de prueba.
En el principal tengo un ComboBox con los nombres de los forms para poder cargarlos.
Todo creo que está como este ejemplo, pero me recoge Nil en el GetClass y por eso no se ejecuta.

Algo mal hago, observar que registro, en cada uno de los form las clases, pero algo pasa, por favor, ayuda y muchas gracias.

Fernando

roman
20-04-2007, 08:48:14
Tú estás mezclando los dos métodos que se hablaron aquí:


var
FormClass: TPersistentClass;
begin
FormClass := GetClass(i);
if Assigned(FormClass) then
if (FormClass.InheritsFrom(TForm)) then

(* !! AQUÍ !! *)

with Application do
if Assigned(FindComponent(i)) then
(FindComponent(i) as TForm).ShowModal()
Else
ShowMessage('No Encontrado');
End;


Si haces una traza del programa, notarás que la ejecución logra llegar donde marqué; lo cual quiere decir que sí encontró la clase (GetClass) y sí se trata de un formulario (InheritsFrom).

Pero luego es cuando mezclas el otro método, y el condicional falla (FindComponent), y falla por lo que comentó dec: para que funcione, tendrían que crearse los formularios desde el inicio de la aplicación, en el autocreate.

Entonces, para que funcione, tendrías que quitar esa parte y dejar el código tal como lo puse yo, o bien olvidarte de mi método y usar el de dec, pero lo esencial es que no mezcles una cosa con la otra.

// Saludos

juliobuitrago
20-04-2007, 16:40:32
Con este procedure me funcionó y aunque todas las respuestas son válidas, espero que este fuera el ejemplo, me funcionó.

procedure Lanza(i:String);
var
FormClass: TPersistentClass;
begin
FormClass := GetClass(i);
if Assigned(FormClass) and (FormClass.InheritsFrom(TForm)) then
with TFormClass(FormClass).Create(Application) do Begin
ShowModal;
End;
End;


Pero mi pregunta es: Y el Free o el freeAndNil....?
Si el objeto se crea, donde lo libero?
Trabajo con QReport y a vece da muchos problemas en este sentido con su Preview, por eso pregunto.
El lo crea y lo visualiza, sin problemas, y donde lo destruye?. o es que se autodestruye?
Llevo tanto tiempo con Delphi y nunca habia tenido necesidad de trabajar con Clases, perdonen.
y Gracias.
Saludos
Fernando

roman
20-04-2007, 18:31:56
En Delphi, las componentes (clase TComponent y descendientes) manejan el concepto de owner o dueño. El owner de una componente es otra componente, que será la encargada de destruirla cuando ella misma se destruya. En otras palabras, cuando una componente se destruye, se lleva consigo a todas las componentes que posea.

La asignación del dueño, se hace al momento de crear una componente, mediante el parámetro Owner del constructor.

En este caso en particular, las ventanas la estás creando con


TFormClass(FormClass).Create(Application)


de manera que estás indicando que el objeto Application será el dueño del formulario. Entonces- según lo dicho arriba -cuando el objeto Application se destruya, él se encargará de destruir a los formularios que posea. El código de la VCL se encarga de destruir el objeto Application al terminar la ejecución, así que por ahí no hay problema.

Ahora, esta técnica pudiera tener el inconveniente de que todos los formularios que crees durante la ejecución de tu aplicación, estarán ocupando memoria, aun cuando ya no los uses. Si quieres liberarlos antes de que termine la aplicación, entonces basta que en el evento OnClose del formulario pongas


Action := caFree;


Esto indica al formulario que se "autodestruya" luego de cerrarse.

// Saludos

juliobuitrago
04-05-2007, 20:59:11
Lo quiero hacer con Reportes del QReport, pero de los que se sacan directamente, no de la forma en que estan casi todos los ejemplos de que uno pone un form y luego el componente, sino desde Files/New/Report.

Estos, no me dicen del tipo que es y se me traba, alguna sugerencia?

Saludos nuevamente y muchas gracias.