Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Asignar memoria dinámica a TFrame? (https://www.clubdelphi.com/foros/showthread.php?t=71033)

Ledian_Fdez 25-11-2010 20:05:48

¿Asignar memoria dinámica a TFrame?
 
Hola amigos !!!

Mi pregunta es ¿Se podrá asignarle memoria dinámica a un TFrame?

Es que me funciona muy bien con los TForm y es maravilloso. Este es el código que uso para los TForm:

Código Delphi [-]
Try
  Application.CreateForm(TForm1, Form1);
  ...
  OficodasForm.ShowModal;
Finally
  ...
  Form1.Free;
  Form1:= nil;
End

Muchas grasias de antemano,
y en espera de sus repuesta,
Un Delfiano.

LoPiTaL 26-11-2010 00:09:06

Sí que puedes. De hecho debes hacer exactamente lo mismo que un componente normal: crearlo (con o sin owner), asignarle un parent para que se vea en algún sitio, posicionarlo (top, left, width, height), visible y tal y tal... y ya debería ir correctamente...


Un saludo,
LoPiTaL

Ledian_Fdez 26-11-2010 14:18:50

Código para asignar memoria dinámica a un TFrame
 
Grasias LoPiTaL, pero ... :confused: ¿Cuál seria el código?

Cita:

Tengo en un formulario varios Frames en dependencia de la opción a realizar lo muestro o no. Mi idea es hacer lo mismo que con los Form. Asignarle memoria dinamica y luego liberarlo.
¿Me podrias ayudar con el código?

Grasias de antemano y que tengan un buen dia !!!

LoPiTaL 26-11-2010 16:06:38

Claro, es como si creas cualquier otra cosa:

En donde quieras crearlo, supongo que en create del formulario, o en alguna
función de inicialización:
Código Delphi [-]
  miFrame:=TMiClaseFrame.Create(nil);
  miFrame.Parent:=FormularioDondeLoMuestro;  miFrame.align:=alClient;//P. ej. Si no usas el align, pues usa las propiedades Top, Bottom, etc...

y ya donde quieras eliminarlo, p. ej. en el destructor del formulario:

Código Delphi [-]
  miFrame.Free;

Como te digo, debes manejarlo como si fuese cualquier otro objeto, lo creas cuando lo necesites, lo destruyes cuando ya no lo quieras, etc...
Los componentes internos del frame no necesitas crearlos/destruirlos. Si quieres puedes moverlos, cambiarles visibilidad, etc.. pero no te recomiendo ni que los creas/los destruyas ni que le cambies de parent.

Un saludo,
LoPiTaL

Ledian_Fdez 30-11-2010 21:11:39

Mensaje de error 'Abstract Error'
 
Grasias LoPiTaL, de veras que eres un genio !!!. El código me quedo de esta forma como mas abajo le muestro.

Código Delphi [-]
public
    { Public declarations }
    miFrame : TFrame;

...

// según lo que quiero mostrar
procedure TPrincipalForm.JvXPBar5ItemClick(Sender: TObject;
  Item: TJvXPBarItem);
begin
 miFrame.Free;
 Case Item.Index of
   0:begin    // Oficodas
      miFrame:=TOficodasFrame.Create(nil);
     end;
   1:begin    // Bodegas
      miFrame:=TBodegaFrame.Create(nil);
     end;
   2:begin    // Nucleos
      miFrame:=TNucleosFrame.Create(nil);
     end;
   3:begin    // Consumidores
      miFrame:=TConsumidoresFrame.Create(nil);
     end;
 End;
 miFrame.Parent:=Panel1;
 miFrame.align:=alClient;
end;

Ahora tengo 2 nuevas preguntas: :confused:

1- Cómo podré solucionar este error que en ocaciones me da: 'Abstract Error'

2-No me libera realmente la memoria, lo he verificado en el administrador de tareas de windows. Cuando creo el frame me aumenta el uso de memoria, pero cuando lo libero (miFrame.Free) se queda igual. realmente ha liberado la memoria, acaso el administrador de tareas de windows no registra bien los valores de memoria?

Eternamente agradecido,
En espera de sus respuesta.

Ledian.

Ledian_Fdez 30-11-2010 22:26:10

Corrigiendo código

Código Delphi [-]
public
    { Public declarations }
    miFrame : TFrame;

...

// según lo que quiero mostrar
procedure TPrincipalForm.JvXPBar5ItemClick(Sender: TObject;
  Item: TJvXPBarItem);
begin
 if assigned(miFrame) then
   begin
    miFrame.Free;
    miFrame:= nil;
   end;
 Case Item.Index of
   0:begin    // Oficodas
      miFrame:=TOficodasFrame.Create(nil);
     end;
   1:begin    // Bodegas
      miFrame:=TBodegaFrame.Create(nil);
     end;
   2:begin    // Nucleos
      miFrame:=TNucleosFrame.Create(nil);
     end;
   3:begin    // Consumidores
      miFrame:=TConsumidoresFrame.Create(nil);
     end;
 End;
 miFrame.Parent:=Panel1;
 miFrame.align:=alClient;
end;

Cita:

Recuerden:

1- Cómo podré solucionar este error que en ocaciones me da: 'Abstract Error'

2-No me libera realmente la memoria, lo he verificado en el administrador de tareas de windows. Cuando creo el frame me aumenta el uso de memoria, pero cuando lo libero (miFrame.Free) se queda igual. realmente ha liberado la memoria, acaso el administrador de tareas de windows no registra bien los valores de memoria?


La franja horaria es GMT +2. Ahora son las 18:19:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi