Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir a la vez el mismo form con diferentes datos (https://www.clubdelphi.com/foros/showthread.php?t=23788)

Sayuri 28-07-2005 16:46:49

Abrir a la vez el mismo form con diferentes datos
 
Tengo un form con varias etiquetas, combox y demás. Me gustaría que en tiempo de ejecución se pudieran abrir varios forms con distintos datos dentro de algunas de las etiquetas, pero que no se cerraran los anteriores.¿Cómo puedo hacerlo?

dec 28-07-2005 16:55:14

Hola,

Declarando variables del tipo del formulario "plantilla", supongo. No sé si convendría declarar algún "Array" del tipo del formulario "plantilla", pero, en todo caso, creando tantas variables del tipo de formulario "plantilla" como tengas pensado utilizar.

De todas formas no sé qué escrúpulos me deja esta respuesta que no me queda del todo contento. Es posible que se me esté escapando algo, o, sencillamente, que halla otras formas de lograrlo más eficientes.

Lepe 28-07-2005 18:25:39

Similar respuesta, pero con otra técnica:

Código Delphi [-]
 var ListaVentanas :TobjectList;

procedure FormPrincipalCreate();
begin
  ListaVentanas := TobjectList.Create(True);
end;

function CrearUnaNueva:integer;
var F:Tform2;
begin
  F := Tform2.Create(nil);
  Result := ListaVentanas.Add(F);
  // devolvemos el indice de la nueva ventana creada dentro de la 
  // lista de ventanas;
end;

Procedure  SetFocusToWindow(const indice:integer);
begin
 if Assigned(ListaVentanas) and (ListaVentanas.Count >indice) then
   TForm2(ListaVentanas.items[indice]).SetFocus;
end;

Procedure FormPrincipalClose(:::);
begin
  freeandnil(ListaVentanas);
  // liberamos la lista y todas las ventanas que haya abierto de Form2
end;

ListaVentanas es un Array pero de objetos, así no creamos variables para cada una de las ventanas, por contra, tendremos que acceder a través de su "indice".

Dependiendo de la implementación, quizás se pueda acceder a través de ListaVentanas.IndexOf

Busca por TobjectList, se ha explicado muchas veces su uso

Saludos

rastafarey 28-07-2005 23:05:12

Resp
 
Código Delphi [-]
With TForma.Create(Self{o nil}) Do Try
   //Aqui asignas lo que tengas que asignar
  Show; 
  //ShowModal;
Finally
  Free;
End;

Con la misma llamada puedes crear 50.000 formas.

Si quieres verstilidad haslo en un procedimiento teniendo por parametro los valores que quieres asignar a los controles.

jachguate 29-07-2005 16:45:12

Creo que hasta ahora se han dado respuestas complejas a un asunto que tiene una solución mas fácil (en principio):

Es perfectamente posible tener mas de una instancia de una clase formulario, donde cada una maneje sus propios datos independientemente.

Ejemplo:

Tenemos una forma (TForm1) con un Label1, ComboBox1 y Edit1.

Para no complicar mas el asunto aquí, accederé directamente a los valores de estos controles, aunque lo ideal es publicar propiedades y encapsular estos detalles.

Ahora:

Código Delphi [-]
Procedure TForm2.CrearFormas1;

Var
  Forma1, Forma2 : TForm1;

Begin
  Forma1 := TForm1.Create(Application);
  Forma1.Label1.Caption := 'soy el primer formulario!';
  Forma1.CheckBox1.ItemIndex := 3;
  Forma1.Edit1.Text := 'editame!';
  Forma1.Show;

  Forma2 := TForm1.Create(Application);
  Forma2.Label1.Caption := 'soy el segundo formulario!';
  Forma2.CheckBox1.ItemIndex := 0;
  Forma2.Edit1.Text := 'no se te ocurra editame!';
  Forma2.Show;
end;

Probá el código y me contas.

Saludos.

;)

Sayuri 08-08-2005 09:49:02

Muchas gracias amigos, me ha funcionado correctamente, ahora mi único problema es que no sé que instruccion he de usar para cerrar cada uno de ellos. muchas gracias

Lepe 08-08-2005 14:03:05

Depende de la opción que estes usando:

- Si usas la opción de jachguate, usa el evento OnClose y añade
Código Delphi [-]
Action := cafree;

Solo queda el problema de que la variable Forma1 y/o Forma2 no apunta a nil, a ver si jachguate nos dice como identificarlo. :confused:

Con la solución que propuse yo:
Código Delphi [-]
Procedure  CloseWindow(const indice:integer);
begin
 if Assigned(ListaVentanas) and (ListaVentanas.Count >indice) then
 begin
    TForm2(ListaVentanas.items[indice]).Free;
    ListaVentanas.Delete(i);
    ListaVentanas.Pack;
end;
end;

jachguate 12-08-2005 17:28:41

Buen día

Cita:

Empezado por Lepe
Solo queda el problema de que la variable Forma1 y/o Forma2 no apunta a nil, a ver si jachguate nos dice como identificarlo. :confused:

Si os fijais en cómo está implementado, las variables Form1 y Form2 que usé son locales al procedimiento CrearFormas1, y jamás se chequea si estas son nil, puesto que no hace falta, ya que en cada llamada se asume que se crearán dos nuevos formularios...

Al final, lo que yo he puesto antes como ejemplo, es solo eso, un ejemplo, que da la idea y demuestra la capacidad de independencia entre dos instancias.

Por último, aclaro que en muchos casos no hace falta mantener una lista independiente de las ventanas creadas, en algunos si... siempre depende de la situación.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 03:29:28.

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