Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problemas de memoria al cerrar FORM (https://www.clubdelphi.com/foros/showthread.php?t=77966)

mRoman 09-03-2012 04:08:34

Problemas de memoria al cerrar FORM
 
Hola amigos Foreros....


Nuevamente solicitando su ayuda. Antes que nada les comento q estoy trabajando con Delphi6, FB 1.5. El problema es el siguiente:

Tengo un Form (frmMenu) del tipo fsMDIForm y desde este form mando llamar a otro form (frmVentas) del tipo fsMDIChild y desde aqui mando llamar a otro form (frmCodigoBarra) del tipo fsStayOnTop.

en frmMenu, este es el codigo q utilizo para llamar a frmVentas:
Código Delphi [-]
procedure TfrmMenu.Capturar1Click(Sender: TObject);
begin
     if FindComponent('frmVentas') = nil then
           frmVentas:=TfrmVentas.Create(self);
     frmVentas.Show;
end;

y estando en frmVentas, dentro de la estructura de un CASE, llamo a frmCodigoBarra usando F9 de la siguiente manera:
Código Delphi [-]
....
        VK_F9:Begin
                sBtnF9.Enabled:=False;
                if FindComponent('frmCodigoBarra') = nil then
                       frmCodigoBarra:=TfrmCodigoBarra.Create(self);
                frmCodigoBarra.Show;
....

Estando en frmCodigoBarra, si puslo la tecla F9 el form se cierra. El evento de OnKeyDown de frmCodigoBarra tengo este codigo:
Código Delphi [-]
procedure TfrmCodigoBarra.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     case key of
      VK_F1: begin
//                HtmlHelp(GetDesktopWindow, Pchar(frmMenu.PathAyuda+'SisDLLManual.chm::/menu_ventas_diarias.htm'), HH_DISPLAY_TOPIC, 0);
             end;

      VK_F9 : begin
                frmVentas.sBtnF9.Enabled:=True;
                Close;
              end;
      end;
end;

Y en el evento OnClose de frmCodigoBarra, tengo esto:
Código Delphi [-]
procedure TfrmCodigoBarra.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    Action:=caFree;
end;

Cuando se cierra frmCodigoBarra, el control pasa a frmVentas. En este formulario tengo un panel donde el usuario captura los datos de llave primaria para llamar el registro y consultarlo o modificarlo, etc. En el evento OnEnter de este panel, tengo lo siguiente:

Código Delphi [-]
        
        if frmCodigoBarra=nil then
        begin
        end else
        begin
             frmCodigoBarra.mskCodigo.SetFocus;
        end;

En cada iteración que hace el usuario para consultar algun registro, entra al evento OnEnter del panel de frmVentas, para "inicializar" algunas variables, cerrar algunos componentes IBQuery e iniciar una nueva transacción, etc, etc. hasta llegar a la validacion del form de frmCodigoBarra=nil....

ESCENARIO:

Supongamos que estando en frmVentas(fsMDIChild) activo el form frmCodigoBarra (fsStayOnTop) usando F9, pero me arrepiento y mejor la cierro, recordando q en estos momento el control esta en frmCodigoBarra, asi pues al pulsar F9 se ejecutan los siguientes codigos:

Código Delphi [-]
procedure TfrmCodigoBarra.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
     case key of
      VK_F1: begin
//                HtmlHelp(GetDesktopWindow, Pchar(frmMenu.PathAyuda+'SisDLLManual.chm::/menu_ventas_diarias.htm'), HH_DISPLAY_TOPIC, 0);
             end;

      VK_F9 : begin
                frmVentas.sBtnF9.Enabled:=True;
                Close;
              end;
      end;
end;

Y en el evento OnClose de frmCodigoBarra, tengo esto:
Código Delphi [-]
procedure TfrmCodigoBarra.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    Action:=caFree;
end;

Y si el usuario decide no trabajar con frmCodigoBarra, empiza a marcar errores de este tipo:

'Access violation at address 0061FC11 in module 'miaplicacion.exe'. Read of address 00000000'. Process stopped....etc, etc.'

Que me hace falta definir para evitar este error !?....alguien me pudiera ayudar. En realidad no sé si fui explícito en el planteamiento del problema, en caso de que haber sido asi, les agradeceré mucho me lo informaran.

Gracias amigos ! por ayuda y sobre todo POR SU TIEMPO !!!.....GRACIAS !!

mRoman 09-03-2012 04:20:06

BUENO.....me respondo solo !!! jejejeje....

En cuanto publique el hilo me fije en los links de abajo....Y OH SORPRESA !!!....AHI ESTABA LA RESPUESTA.

En uno de ellos menciona q en el Evento OnDestroy, agregar la siguiente linea de codigo Form4:=nil......asi q se lo agregue a mi aplicacion y funciono....vaya....eso pasa por haber consultado previamente en el foro de Delphi.....LO LAMENTO MUCHACHOS !!!....MEA CULPA !....

PROBLEMA SOLUCIONADO !!!


La franja horaria es GMT +2. Ahora son las 09:44:07.

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