Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear o duplicar form en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=62508)

odrack 30-12-2008 00:55:36

Crear o duplicar form en tiempo de ejecucion
 
Un saludo a todo el foro.

Les deseo un prospero año nuevo y que esten felices disfrutando sus dias festivos.

Tengo una aplicación que realiza ordenes de compra, esto es que agrega los articulos segun el proveedor al que este añadido, donde calculo la cantidad de articulos por su costo, descuentos, etc... Cuando yo creo una orden de compra nueva cierro ciertos campos por seguridad y asi evitar duplicidades de numeros de ID o consecutivos, me han pedido que el comportamiento del form sea parecido a lo que hace excel con sus libros, explicando mejor, me piden que se cree una nueva ventana secundaria de la orden de compra exactamente igual para agregar una orden de compra nueva sin perder la anterior, y es aqui donde tengo el problema, ¿Como puedo crear o duplicar ese formulario en tiempo de ejecucion, asi como lo hace excel con sus libros?

Gracias!!

Neftali [Germán.Estévez] 30-12-2008 10:42:22

De lo que explicas, lo que no me queda claro es qué hacer con los datos que no se pueden duplicar, justo esos que "cierras" para que no se dupliquen.

De todas formas, digamos que para duplicar tu formulario (que está conectado a unos datos) necesitas "duplicar" esas dos cosas; El formulario(1) y los datos(2) y cuando los crees tendrás un duplicado del original.

Para duplicar el formulario, basa con que crees uno nuevo de la misma clase(1).
Si en tu Aaplicación se crea así:
Código Delphi [-]
  Application.CreateForm(TForm1, Form1);

bastará con crear uno nuevo:
Código Delphi [-]
  Form1 := TForm1.Create(Application);

Si creas varios debes tener en cuenta a la hora de destruirlos que no pierdas memoria, así que creo que lo más correcto es que en el OnClose utilices:
Código Delphi [-]
  Action := caFree;

Con esto tendrás un segundo formulario de la misma clase que el primero, ¿Pero y los datos que muestra?
Pues lo lógico es que crees un nuevo registro en tu tabla de ordenes de compra(2) con los mismos datos del primero (menos los que no puedes duplicar) y hagas que el nuevo formulario apunte a ese nuevo registro; Con eso habrás conseguido dos formulario iguales apuntando a dos registros diferentes (duplicados) con los mismos datos.

No se si me he explicado bien y si es eso lo que quieres exactamente.

Un saludo.

Lepe 30-12-2008 15:45:50

Código Delphi [-]
Form1 := TForm1.Create(Application);
Copia := TForm1.Create(Application);
Creo que así se ve más claro el ejemplo de Neftali

Saludos

Neftali [Germán.Estévez] 30-12-2008 15:57:43

Cita:

Empezado por Lepe (Mensaje 332617)
Creo que así se ve más claro el ejemplo de Neftali

Efectívamente se ve más claro así.
Gracias Lepe.

Aunque si desde fuera no se necesita acceder al formulario, puede ir utilizando la misma variable siempre, teniendo en cuenta que esta apuntará al último formulario creado.

odrack 30-12-2008 19:30:48

Gracias por responder tan rapido.

Solo una duda, al crear un nuevo formulario tambien se crean los objetos tal y como se creal el primero, solo que si yo hago una nueva orden los campos que tenia anteriormente en mi otra orden tambien se modifican, ¿Como puedo hacer que sean independientes del primero?

Saludos!!!

Neftali [Germán.Estévez] 30-12-2008 23:20:04

Eso es porque estás usando en ambos la misma fuente de datos. ¿Es una tabla? ¿Está la tabla en un datamodule?

En ese caso lo que debes hacer es colocar la fuente de datos en el formulario. El TTable, por ejemplo. Al crear los dos formularios se crearán dos TTable distintos (aunque apunten a la misma tabla, ya no apuntarán al mismo datos), de esa forma serán independientes.

odrack 31-12-2008 00:15:08

Saludos

Utilizo Tquery, un adoquery, Datasourse, el detalle que tengo es que utilzo dos form mas, uno para seleccionar el proveedor y otro para hacer modificaciones por medio del adoquery.

tendria que crear o duplicar los form a los que llama la forma principal??

Neftali [Germán.Estévez] 31-12-2008 09:56:02

Simplemente el TQuery que utilizas en el formulario, en lugar de tenerlo en el DataModule lo colocas dentro del formulario, de esa forma al crear el nuevo formulario también se creará un nuevo query.

No se si me explico.

odrack 31-12-2008 19:35:19

Saludos.

Una disculpa, el que no se explico fui yo, y creo entender cual es mi problema, cuando creo la copia del form se crea nuevamente todo, solo que yo tengo un error, cuando creo la forma esta esta direccionada a un form (Ej. Tform22(proveedor)), el cual obtengo la clave y la uno a un dbtext, cuando creo la nueva forma cambian los datos por que estoy haciendo una busqueda al mismo form (proveedor), ahi es donde tengo mi problema y tendre que modificarlo para al insertar mis datos no cambie el proveedor.

Gracias por toda su ayuda, ahora depende de mi responder lo que falta, jeje.

Saludos nuevamente compañeros del foro!!:D


La franja horaria es GMT +2. Ahora son las 16:54:55.

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