Formularios MDI

He encontrado un problema en visual basic 6.0 y que no he podido descifrar, es con los formularios MDI al cerrar el MDI Principal el procesos queda en cola en memoria, esto sucede solamente cuando dan clic en la POR del formulario y no cuando dan el procedimiento de Archivo-Salir.

1 respuesta

Respuesta
1
En el evento Closing de la forma coloca el mismo código de l menu.
Hola,
El procedimiento que mencionas es en el Form_Unload y es correcto mientras no exista abierto un formulario o mientras no haya abierto uno.
Cuando abro un formulario realizo la siguiente validación:
Case ID_C_CLIENTES:
    If SGH_Check_Entrance("frmCtlgClientes") = True Then
       PassSecurityForm = True
       Set frmActive = New frmCtlgClientes
    Else
        MsgBox "NO TIENE LOS PERMISOS NECESARIOS PARA ACCESAR A ESTE MODULO",        vbCritical, "CONSULTE AL ADMINISTRADOR"
        PassSecurityForm = False
End If
Si PassSecurityForm es True entonces frmactive.show
de lo contrario le asigno Nothing para limpiar memoria, pero nada, siempre queda en cola el proceso.
No se si hay que hacer un ciclo de limpieza por cada formulario que este o haya sido abierto.
Gracias.
App.Exit 
Eso termina la aplicación
Hola,
La función App. Exit no es propia de Visual Basic 6.0,me parece que esa es del .net o 9.0.
Gracias
END
Eso cierra la aplicación
Si yo se, ese es el código que tiene en:
mnuSalir_click
MDIForm_Unload
Pero por alguna razón siempre queda cargado el proceso en memoria. Utilizo varios paquetes de controles adicionales para FTP, Skins, Frames y otros, no se si existe un código que los descargue de memoria.
Gracias
Supongo que estas usando threads y no los estas cerrando, y como hasta ahora mencionas que usas otros controles, tienes que revisar que un control de esos es el que se mantiene en la memoria.
Pues threads no estoy ocupando, lo que si ocupo son muchas variables de Tipo Objeto y toda mi conexión a base de datos se basa en Módulos de Clases, por lo cual heredo en los objectos las elementos de las clases.
Pero siempre las inicializo, por ejemplo
Set NewClass=nothing
set NewClass = new clsClase
NewClass.Function
Set NewClass=nothing
Y realizo lo mismo en el Form Unload de cada formulario, y los Initialize y Terminate de las clase hago lo mismo.
Asi que no se que es.
Gracias
¿Cuál es la forma principal, o en otras palabras desde donde inicias el programa en un modulo con un sub main? Es posible que estas haciendo el .end en una forma que has llamado desde otra y por eso te queda en memoria el programa.
No se si el componente FTP que usas lo estas abriendo y eso es lo que queda abierto...
Tengo un Modulo llamado mdlResource donde existe un Sub Main que carga el main Form:
Sub Main()
   Load splashSGH
   splashSGH.Show 1
End Sub
Este hace un proceso de carga, verifica usuario de login del Servidor y si es válido se conecta así:
If ConectSGH.Inicializar(TxtUser, txtPass) = "UserLoginFailed" Then
    MsgBox "EL usuario y/o contraseña son incorrectos", vbCritical, "CORRIJA !!!"
Else
   NameActUsr = UCase(TxtUser)
   set connpublic=nothing
   set connpublic=new adodb.connection
   With ConnPublic
      .ConnectionString = ConectSGH.Inicializar(TxtUser, txtPass)
      .Open
    End With
    Set ActUsr= Nothing
    Set ActUst= New mclSystemUsers
    ActUsr.GetCodeUser
    Set ActUsr= Nothing
    Unload Me
    Load MDIPrincipal
    MDIPrincipal.Show
End If
El componente FTP simplemente se utiliza para Upload la base de datos a un servidor remoto vía Web. Más que todo visualiza la conexión por que el proceso se hace vía JAVA. Este control solo se ocupa una ves a la semana por lo que no creo que sea el causante de este problema.
Gracias de antemano.
¿Cómo cierras la aplicación? ¿A través de un menu salir? ¿O a través de la POR de la ventana?
¿En cada uno de los casos cual es el código que tiene en esos eventos?
Existe un menu que se llama MnuSalir. Al darle click ejecuto el siguiente código
private sub MnuSalir_Click()
   ConectDS.DisConect_Server
   Set ConectDS = Nothing
   Set ConnPublic = Nothing
   End
end sub
Y en el MDIForm_Unload hago exactamente lo mismo.
private sub MDIForm_Unload_Click()
    ConectDS.DisConect_Server
    Set ConectDS = Nothing
    Set ConnPublic = Nothing
    End
end sub
Saludes.
¿Y cuál es el formulario que queda activo? ¿MDIForm?
Pues yo supongo que es ese el que queda pendiente por que al revisar el Administrador de Tareas me aparece como si todavía se estuviera ejecutando. Y ocupa entre 20 y 30 MB del archivo de paginación.
Slds.
Si ejecutas el programa, ¿y le das salir sucede lo que describes? Porque un programa VB6 no ocupa 20 MB de la memoria a menos que este cargando en memoria un conjunto de registros de la base de datos muy grande.
Tienes que revisar que cosas estas haciendo al momento de inciar la aplicación para poder descubrir que es lo que pasa.
El espacio que ocupa es de la memoria de paginación.
Por otro lado me he fijado que al abrir un formulario mediante una variable objeto, este espacio en memoria incrementa un 10 por cierto por decirlo, pero al cerrarlo este no disminuye ese mismo porcentaje.
Por ejemplo al Iniciar mi MDIPrincipal ocupe 21,458 KB de archivo de paginación, al abrir un formulario(este form no accesa a ninguna tabla, es solo el frmabout) este aumente a 23,500 KB. Pero al cerrar este formulario disminuye a 22,100. SIempre queda aumentado un porcentaje de memoria. Cada ves que abro un formulario lo hago mediante una variable de la siguiente manera:
DIm x as Form
set x = new frmAbout
x.show
Gracias de antemano por tu paciencia.
Si siempre haces variable = null para las memorias de los formularios
Null no seria, seria nothing por lo que es una variable de objeto, entonces quedaria algo asi:
x.show
Seguiria el siguiente codigo:
set x = nothing
Gracias de antemano.
eso es .NET o VB6? Me confundes colocas instrucciones de uno y de otro...
VB 6, en VBNet las declaracion son diferentes, lo que pasa es que mi proyecto lo manejo con modulos de clases, y VBNet esta basado todo en clases, talves por eso te confundes, pero bueno, asi seria las sentencias finales entonces?
Gracias de antemano.
Si así son las instrucciiones

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas