Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2004
JoseQ JoseQ is offline
Miembro
 
Registrado: jul 2004
Posts: 167
Poder: 20
JoseQ Va por buen camino
Paneles Child

Buenas, quiero crear un panel dentro del cual se generen, en runtime, paneles mas pequeños(formularios), consigo crear un form child en runtime, pero nose como hacer para que me genere varios, estaba probando a cambiarle el nombre al form nada mas crearlo i luego repetir toda el proceso, pero no funciona,al menos como io lo tengo , alguna sugerencia, este es el codigo que uso ahora para crear el child

Código Delphi [-]
procedure TMainForm.btnChildClick(Sender: TObject);
var x:integer;
begin
for x:=1 to 3 do
begin
if not Assigned(FNewChildForm) then
begin
FNewChildForm := TNewChildForm.Create(Application, pnlParent);
FNewChildform.Show;
fnewchildform.Height := pnlParent.Height div 2;
fnewchildform.Name:= 'child' + inttostr(x);
fnewchildform.Free;
end;
end;
end;

Última edición por JoseQ fecha: 20-07-2004 a las 16:55:09.
Responder Con Cita
  #2  
Antiguo 21-07-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por JoseQ
Buenas, quiero crear un panel dentro del cual se generen, en runtime, paneles mas pequeños(formularios), consigo crear un form child en runtime, pero nose como hacer para que me genere varios, estaba probando a cambiarle el nombre al form nada mas crearlo i luego repetir toda el proceso, pero no funciona,al menos como io lo tengo , alguna sugerencia, este es el codigo que uso ahora para crear el child

Código Delphi [-]
procedure TMainForm.btnChildClick(Sender: TObject);
var x:integer;
begin
for x:=1 to 3 do
begin
if not Assigned(FNewChildForm) then
begin
FNewChildForm := TNewChildForm.Create(Application, pnlParent);
FNewChildform.Show;
fnewchildform.Height := pnlParent.Height div 2;
fnewchildform.Name:= 'child' + inttostr(x);
fnewchildform.Free; // por qué lo destruyes ¿?¿?¿?¿?¿?¿?¿?
end;
end;
end;
Por otra parte if not Assigned(FNewChildForm) then está evitando que se vuelva a crear el 2º y tercer panel, yo más bien haría esto:

Código Delphi [-]
procedure TMainForm.btnChildClick(Sender: TObject);
var top, x:integer;
      FNewChildForm : TnewChildForm;

begin
top:= 0;
for x:=1 to 3 do
begin
  FNewChildForm := TNewChildForm.Create(Application, pnlParent);

  fnewchildform.parent := pnlparent;

  // cambiamos el tamaño antes de mostrarlo para evitar parpadeos
  fnewchildform.Height := pnlParent.Height div 3;
  fnewchildform.top :=  top;
  inc(top, fnewchildform.Height +1);
  FNewChildform.Show;
//fnewchildform.Name:= 'child' + inttostr(x); // el nombre ya lo controla 
//delphi, pero si quieres tener el control para acceder por código, deja esta //linea sin comentar.

end;
end;

Detalles:

Primero: el Padre no es lo mismo que el Propietario, así que tambien asignamos el Parent para que se situe dentro del pnlParent.

Segundo: Fnewchildform es una variable local, pero estamos creando un objeto dinámicamente, con lo cual se crearán 3 objetos, eso si, perdemos la referencia al terminar el bucle, no podremos acceder a ellos (salvo que controlemos el nombre, o usemos otra técnica).

Tercero: Al asignar el Propietario (Aowner) al pnlParent, estamos diciendo que cuando se destruya pnlParent, se deberá destruir automaticamente los hijos (todos los fnewchildform que contiene dentro) así que no tenemos que hacer nada más


Cuarto: Si queremos recorrer los FnewChildForm, podemos usar TFnewChildForm(pnlParent.controls[i]) para acceder a ellos en tiempo de ejecución, controlando que no nos salgamos de pnlParent.controls.count-1
(si hemos puesto nombre a los ChildForm, podremos acceder a ellos por su nombre, como es lógico)

Además he añadido la variable top, para situarlos y que se vean los 3

Recién me acabo de dar cuenta que a TnewChildForm.create, le pasas 2 parámetros, realmente no sé como construyes esa clase.

Lo normal es que reciba un parámetro, el Aowner, en ese caso ,yo pondría pnlParent, así, cuando destruyes la ventana, se destruyen los FnewChildForm.

Aquí no se vé la cosa muy clara, ya que la ventana que crea los FnewChild es el MainForm de la aplicación, por tanto, al cerrar la MainForm, se termina la aplicación y por tanto tambien se liberan los hijos creados.

Si los FnewChildForm se crearan desde una ventana secundaria, y esta ventana no estuviese en AutocreateForms de Projects--> Options-->forms, se vería más clara mi explicación.

Saludos


¿es lo que desesas hacer?

Última edición por Lepe fecha: 21-07-2004 a las 11:22:30.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:02:10.


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
Copyright 1996-2007 Club Delphi