Ver Mensaje Individual
  #10  
Antiguo 06-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Código Delphi [-]
procedure TDBexplorer.Execute;
begin
   CloseAction:= caFree;
   Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
   if Modal and (Owner<>nil) then
      Explorador.OnDestroy:= OnDie;
.
   FOldOnClose:= Explorador.OnClose;
   FOldOnActivate := Explorador.OnActivate;
   Explorador.OnActivate:= Activate;
   Explorador.OnShow:= OnShow;
   Explorador.OnEndDock:= OnEndDock;
   Explorador.OnClose:= OnClose;
   if FModal then
     try
        Explorador.ShowModal;
     finally
     begin
        //llamada a los eventos OnClose y FOldOnclose para sobrescribir
        Cerrar(CloseAction);
        Explorador.Free;
     end;
     end
   else
   begin
     try
       Explorador.Show;
     except
       Explorador.Free;
       //OJO: sigue viva
     end;
   end;
end;

Execute es publico, por tanto el usuario puede llamarlo varias veces ok¿?, vale, lo llamo una vez, se crea el Explorador. Lo llamo una segunda vez, se vuelve a crear otro Explorador ¿y que pasa con el anterior? pues simplemente se queda perdido en memoria ram, ocupando memoria y sin que nadie lo pueda liberar, ya que Explorador apunta ya al nuevo creado.

solución:
Código Delphi [-]
procedure TDBexplorer.Execute;
begin
   CloseAction:= caFree;
   if not assigned(Explorador) then 
     Explorador:= TfmExControlsTabla.CreateTabla(Owner, FTable);
   if Modal and (Owner<>nil) then
      Explorador.OnDestroy:= OnDie;
...


saludos
Responder Con Cita