Ver Mensaje Individual
  #24  
Antiguo 26-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 31
Lepe Va por buen camino
Estas usando ese mismo evento para destruir varios frames, y debe tenerse en cuenta.

Por ejemplo:
- has creado 2 frames (para simplificar los nombres) uno es "Cam" y el otro "Cli".
- Ahora cierras un frame.
- Se ejecuta el evento TForm2.RecibeEventoOnSalir que liberará de memoria los dos frames ¿eso no importa?

Lo pregunto porque yo no sé la lógica de tu programa, pero al menos no lo veo del todo correcto.

Una posible solución sería esta:
Código Delphi [-]
procedure TForm2.RecibeEventoOnSalir(Sender: TObject);
begin
  if (FrameCamAlt <> nil) and (Sender is TFrameCamAlt) then FreeAndNil(FrameCamAlt);
  if (FrameCliAlt <> nil) and (Sender is TFrameCliAlt)then FreeAndNil(FrameCliAlt);
end;

El truco viene de la definición del frame, en la línea que se lanza el evento:
Código Delphi [-]
FOnSalir(Self);
como ves, se le pasa el parámetro "Self", que será un TFrameCamAlt o un TFrameCliAlt, según quien lance el evento. De esta forma solo liberamos el Frame donde se pulse el boton salir.

No lo he dicho, pero en el OnClose del TForm2 también tendrías que mirar si hay algún frame creado para liberarlo.

El "Abstract error" viene a decir que estamos ejecutando un método que está marcado como abstracto (abstract es una palabra reservada de delphi) que precisamente se pone para eso, para evitar un problema mayor del que estas teniendo. Imagina que el programa se cierra sin indicar ningún mensaje de error... ¿por donde empiezas a buscar?.

Ahora te muestra el mensajito de error y ya sabes que el problema está en la creación y destrucción de objetos, y es más que probable que hayas creado un método así:
Código Delphi [-]
constructor Create;
procedure  Close;
cuando debería decir:
Código Delphi [-]
constructor Create;override; 
procedure  Close;override;
Para indicar que ese método que estas creando no es uno nuevo, sino que sustituye a uno existente en la clase de la que estas heredando (esa clase puede ser un Frame, un Form, etc).

Saludos y buena caza.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita