Ver Mensaje Individual
  #2  
Antiguo 21-07-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
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