Ver Mensaje Individual
  #9  
Antiguo 09-08-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Reputación: 23
maeyanes Va por buen camino
Hola...

Por lo poco que puedo ver de tu código, y sin saber que haces fuera de lo que nos enseñado, te puedo decir que tu aplicación corre peligro de consumir mucha memoria y luego de un buen tiempo de uso puede fallar con errores del tipo Out of Memory. Aparte, si no te consumes toda la memoria, al finalizar la aplicación esta no va a liberar toda la memoria que consumió. Ahora, el por que de esto que te comento:

Veo que creas varios TBitBtn, todos sin un owner (TBitBtn.Create(nil)), y estos los asignas a variables declaradas dentro del método donde se crean, esto es, esas variables dejarán de existir una vez salgas de ese método, haciendo que no haya forma que puedas referenciar esos TBitBtn más adelante y como estos no tienen dueño, al finalizar la aplicación tampoco se destruirán. Aunado a esto, cada que presionas un botón ya creado, creas una serie de botones usando la misma técnica y en ningún momento veo que elimines los botones creados anteriormente.

Una forma de resolver esto es asignándole un dueño a cada TBitBtn que se cree, es por eso que te comenté el uso de Self, que en el ámbito donde lo vas a usar, sería el formulario donde estás creando esos botones. Al ser el formulario el dueño de esos botones, al destruirse este, primero destruye todos los componentes que le pertenecen.

La recomendación que yo te doy, es usar algún tipo de lista para guardar las referencias a los botones que vayas creando y así los puedas eliminar apenas los dejes de usar. Aquí algo de código para aclarar la idea:

Código Delphi [-]
TMyForm = class(TForm)
  // Declaraciones de componentes en tiempo de diseño
private
  FBtnPadre: TComponentList;
  FBtnCategoria: TComponentList;
  FBtnSubCategoria: TComponentList;
  FBtnProducto: TComponentList;
public
  // ...
end;

implementation

// Evento OnCreate y OnDestroy del formulario:
procedure TMyForm.FormCreate(Sender: TObject);
begin
  FBtnPadre := TComponentList.Create;
  FBtnCategoria := TComponentList.Create;
  FBtnSubCategoria := TComponentList.Create;
  FBtnProducto := TComponentList.Create;
  // Algún otro código de inicialización
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
  // Algún otro código de finalización
  FBtnPadre.Free;
  FBtnCategoria.Free;
  FBtnSubCategoria.Free;
  FBtnProducto.Free
end;

// Método donde creas los botones padre:
  // ...
  Btn := TBitBtn.Create(nil); // no se usa owner ya que la lista se encargará de esto
  // Asignamos propiedades
  FBtnPadre.Add(Btn);
// ...

// Método OnClick de los botones padre:
  // Primero verificamos si ya existen botones de categorías y eliminamos los que ya existen
  if FBtnCategoria.Count > 0 then
    FBtnCategoria.Clear;
  // Query que lee categorías...
  Btn := TBitBtn.Create(nil);
  // Asignamos propiedades
  FBtnCategoria.Add(Btn);
// ...

// Método OnClick de los botones de categorías:
  // Primero verificamos si ya existen botones de subcategorías
  if FBtnSubCategoria.Count > 0 then
    FBtnSubCategoria.Clear;
  // Query que lee subcategorias
  Btn := TBitBtn.Create(nil);
  // Asignamos propiedades
  FBtnSubCategoria.Add(Btn);
// ...

Ya con este código te debes de dar una idea de como hacer mejor las cosas...


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter

Última edición por maeyanes fecha: 09-08-2011 a las 18:13:04.
Responder Con Cita