Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   componentes en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=21129)

Maga84 07-05-2005 21:00:08

componentes en tiempo de ejecución
 
Hola!!!:p
una pregunta...
mirad, creo en tiempo de ejecución creo unos componentes dentro de una ventana en mi aplicación. Al cerrar y volver a abrir la ventana me da error porq me dice q los componentes ya estan creados.
Como se hace para destruirlos(o algo así) cada vez que se cierre la ventana(o antes de crearlos)?
Yo los creo así:
p[i]:=Tpanel.Create(self);
...
p[i].ParentWindow:=Ppal.Handle;
...
bueno...espero haberme explicado:D
Gracias.
Un saludo:)

Delfino 07-05-2005 21:19:53

Tienes q destruir la form tb; FreeAndNil(form1)

eduarcol 07-05-2005 21:32:00

lo que sucede es que si trabajas con formularios normales, eso quiere decir que no se destruyen al cerrarse tendrias que destruirlos tu, si colocas el owner de los componentes como self eso quiere que el formulario se encarga de destruirlos antes de destruirse el, la solucion que se me ocurre es la siguiente:

Mostrar el formulario tipo modal y destruirlo despues de la ejecución:

Código Delphi [-]
if not Assigned(MiForm) then MiForm := MiForm.Create(nil);
try
   miform.Showmodal;
finally
   FreeanNil(MiForm);
end;

Destruir los componentes en el evnto onClose del formulario
Código Delphi [-]
while MiForm.ControlCount > 0 do
begin
   FreeandNil(MiForm.Controls[0]);
end;

Suerte espero te sirva

Maga84 08-05-2005 13:39:30

Gracias
 
:) probaré a ver que tal

Maga84 08-05-2005 17:17:50

no funciona
 
no se que es eso del modo modal ,pero bueno:confused:

FreeandNil(MiForm.Controls[0]);<---esto me da error
y freeAndNil(Fcentral); lo he puesto pero sigue sin funcionar

no sé...seguiré intentando
un saludo

eduarcol 08-05-2005 18:13:32

Cita:

Empezado por Maga84
no se que es eso del modo modal ,pero bueno:confused:

Se dice que un formulario es modal cuando la ejecución de tu programa se detiene por completo hasta que se ejecute una accion sobre ese formulario.

Cita:

Empezado por Maga84
FreeandNil(MiForm.Controls[0]);<---esto me da error

Y el error es???

Cita:

Empezado por Maga84
freeAndNil(Fcentral); lo he puesto pero sigue sin funcionar

Y donde lo pusistes, seguro que fue en el llamado al formulario y tu formulario lo mostrastes MODAL??

Lepe 08-05-2005 18:56:00

Pues no entiendo yo esto....

Si al crear los controles le dices que el owner es el Form, la ventana se engargaría de destruirlo no??

Creo que lo único que habría que hacer en el onClose, además de poner action := CaFree, sería poner a nil la matriz de controles p

La matriz p está situada en la misma ventana o en otra distinta¿?


Tampoco entiendo por qué usas Parentwindow, ¿no se debería usar simplemente la propiedad Parent?

Un saludo

Maga84 08-05-2005 18:59:22

jajjaja
 
la matriz esta dentro del propio formulario...
yo tampoco sé porq uso algunas cosas...:confused:
bueno, voy a ver si me aclaro y ahora os cuento
gracias:)

Maga84 08-05-2005 19:44:41

lepe
 
lo estoy intentando como tu dices
pero mi matriz es estática.No me deja ponerla a nil
ah por cierto ya me he dado cuenta de que lo de parentwindow era un tonteria
como vacio de componentes las matrices dinámicas

...
perdonadme, hoy estoy un poco...

gracias
un saludo;)

Maga84 08-05-2005 20:50:21

ya!!!
 
ya funciona bien(o eso parece)
lo que he hecho es crear los componentes en el formshow y no en el create,y en el evento onclose,he recorrido los arrays(son estáticos) y he ido haciendo
p[i].destroy;
edt[i].destroy;
...
así cuando cierro y vuelvo a abrir la ventana no pasa nada raro. No se si era la mejor solución pero al menos ya hace lo que quiero

Lepe ¿que es lo de CaFree?

oye, muchas gracias;)

Lepe 09-05-2005 10:21:30

Reholas,

Para crear los paneles:
Código Delphi [-]
procedure Tform1.button1Click(...)
begin
  p[i] := Tpanel.Create(nil)
end;
Estoy diciendo que nadie se encargue de liberar los paneles, ya que nosotros lo haremos manualmente.

Y al cerrar la ventana:
Código Delphi [-]
for i:= low(p) to high(p) do
  freeandnil(p[i])

caFree, es el valor del parámetro CloseAction del evento OnClose de la ventana.

Cuando una ventana se cierra, bien por código o bien pulsando la X de la ventana, se llama a ese evento, despues se comprueba si hay código en el evento OnCloseQuery, y por ultimo se ejecuta el código existente en el evento OnClose.

Modificando el parámetro CloseAction, puedes modificar el comportamiento de la ventana al cerrarse. Los valores posibles son:
Código:

caMinimize = al pulsar sobre la X, la ventana, se minimiza.
caHide    = se oculta
cafree    = se libera la ventana de memoria, y todos los recursos asociados
caNone    = la X no hace nada

Por supuesto, si usas caFree, para volver a ver la pantalla tendrás que usar algo como:
Código Delphi [-]
Application.CreateForm(Tform1, Form1);

Maga84 15-05-2005 12:20:51

ahora tengo otro problema
 
cuando cierro el formulario me da un error en otro evento en el que trabajo con componentes de estos que he liberado...voy a repasar todo otra vez
q desastre soy...:(

Lepe 16-05-2005 18:54:10

Si trabajas de esta forma, siempre que vayas a acceder a p[i] deberías preguntar si es distinto de nil, para que no traspases un puntero nulo.

Código Delphi [-]
if assigned(p[i]) then
 // accedo con total alegria a p[i]

Perdona por no haberlo comentado en el post anterior :o

Un saludo

Maga84 21-05-2005 19:49:06

aii
 
ya por fin!!!gracias lepe


La franja horaria es GMT +2. Ahora son las 04:40:12.

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