PDA

Ver la Versión Completa : Abrir a la vez el mismo form con diferentes datos


Sayuri
28-07-2005, 16:46:49
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:


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


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

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:

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

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.

;)