Foros Club Delphi

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

titomigue 03-06-2010 01:45:27

clonar forms
 
Hola, mi problema es que tengo un form principal, y otro preparado que es el que clono.

Desde el principal llamo a esta funcion:

procedure FormClone(form : TForm) ;
var
ms : TMemoryStream;
clone : TForm;
begin
ms := TMemoryStream.Create;
try
ms.WriteComponent(form) ;
ms.Position := 0;
clone := TFormClass(form.ClassType).CreateNew(Application) ;
ms.ReadComponent(clone) ;
clone.caption:=Datos.TablaListado.Fields.FieldByName('Nombre').AsString;
clone.Left := form.Left;
clone.Top := form.Top;

clone.Visible:=false;
Form3.Edit1.Text:=IntToStr(indice+1);//esto es una variable que luego uso
clone.Show;
finally
ms.Free;
end;
end;

Asta aqui todo bien, me clona la ventana, unas veces 3, otras 4 veces... lo que necesite el programa, y la ventana clonada comienza a trabajar.

Como puede verse en la funcion, la ventana está oculta. El problema es que hay algunas ocasiones en el que tengo que introducir algun dato de forma manual, y detecto cuando es, pero no consigo poner la ventana visible.

Es decir tengo 4 ventanas generadas a partir de esa funcion trabajando y quiero en un momento dado, que la ventana 2 (por ejemplo) se ponga visible, no se como puedo referirme a esa ventana en concreto para ponerla visible, he probado a poner form3.visible:=true; (form3 es la ventana que clono) y lo que hace es abrirme una nueva...

Alguna idea? gracias.

duranguenze 03-06-2010 02:59:28

Asi como esta el codigo creas formularios a lo alli se va, y dejas que anden volando por alli, ya que creas una variable tipo TForm en un sub procedimiento, al crearlo y terminar, esa variable se queda en el limbo esperando a que terminen con su vida, cuando mandas a llamar otra funcion lo que pasa es que como el espacio asignado a la variable anterior clone, ya esta ocupado, delphi asigna otro nuevo espacio, y se puede crear otro formulario:
Cita:

clone := TFormClass(form.ClassType).CreateNew(Application) ;
de cierta manera esta bien, pero te falta ver como encontrar todos los formularios, una idea es crear un arreglo de referencias a objetos del tipo "TObject" y meter la referencia en el para luego saber cual abrir y asi controlarlo con "TForm(arreglo[2]).visible:=true" o el caso que sea.

Neftali [Germán.Estévez] 03-06-2010 09:55:18

Cita:

Empezado por titomigue (Mensaje 366051)
Es decir tengo 4 ventanas generadas a partir de esa funcion trabajando y quiero en un momento dado, que la ventana 2 (por ejemplo) se ponga visible, no se como puedo referirme a esa ventana en concreto para ponerla visible, he probado a poner form3.visible:=true; (form3 es la ventana que clono) y lo que hace es abrirme una nueva...

Lo lógico sería que guardaras referencia de los formularios que vas creando para luego poder acceder a ellos sin problemas.

Por ejemplo con un TStringList (nombre + referencia) o con un TList.

titomigue 03-06-2010 11:58:26

duranguenze: y ¿como se hace un arreglo de referencias a objetos del tipo "TObject"?

Neftali: ¿me podrias poner un pequeño ejemplo?

Neftali [Germán.Estévez] 03-06-2010 13:17:57

1 Archivos Adjunto(s)
La idea es convertir ese procedimiento y devolver el formulario creado.
Luego por otro lado creas una Lista de Objetos (TStringList) y vas añadiendo los formularios creados y el nombre.

Ahí te envío un ejemplo de cómo añadirlo a la lista y luego accederlos:


titomigue 03-06-2010 15:40:50

me he descargado el ejemplo y le e estado mirando, aun no le he llevado a mi aplicacion pero creo que me va a ser de gran ayuda, muchas gracias.


La franja horaria es GMT +2. Ahora son las 23:11:11.

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