Programación General > Visual Basic para principiantes
Manejo de formularios en un MDI
(1/1)
mikelm3:
Hola a toda la comunidad.
Mi problema es el siguiente:
Tengo una aplicación que inicia con un procedimiento Main que inicializa varias variables globales para el proyecto y tambien manda a llamar otro formulario para el control de acceso de los usuarios y este al validar el usuario muestra un formulario MDI, hasta alli todo bien, el problema que tengo es que deseo que al entrar en un menu que dice cerrar sesión, se cierre la conexión del usuario actual y reinicialize las variables y pueda entrar otro usuario.
Yo meti codigo en el evento unload del formulario MDI y mande a llamar el procedimiento Main, pero al validar al nuevo usuario me manda un error que dice que el formulario MDI solo se puede cargar una vez.
Que necesito hacer para descargar el MDI y poder darle acceso a un nuevo usuario sin necesidad de finalizar completamente la aplicación.
O que se hace en este caso para darle acceso a un nuevo usuario sin necesidad de estar cerrando la aplicación, ya que a veces se queda colgado el ejecutable en la memoria y se tiene que estar cerrando del administrador de tareas de windows.
La situación aqui es que son varias las personas que entran duarante el día a la aplicación, o ustedes me pueden decir que tengo que revisar para que no se quede colgado el ejecutable en memoria, me he dado cuenta que siempre que cierran la aplicacón por la x de la ventana del MDI pasa esto,pero a veces tambien sucede cuando le dan clic en el botón de salir.
En el evento click del boton salir esta codificado un END.
cabe aclarar que al entrar el nuevo usuario se guarda en una variable su login para posterior uso en el proyecto y ademas se habilitan menus de acuerdo a su nivel de seguridad que es leido de la base de datos.
Por su ayuda gracias
Nebire:
bueno después de elaborar todo el mensaje al ir a añadir el código de ejemplo, se ha ido todo ahacer puñetas, la ventana se ha colgado, no sé porqué....
Como no me patece repetir el mensaje... te pongo el código y 4 breves indicaciones, si tienes dudas luego haces las preguntas que consideres...
Este código va en un módulo....
--- Código: Visual Basic --- Public Enum MisUsuarios Admin = 0 Ramon = 1 Juan = 2 Maria = 3 Andres = 4 Violeta = 5End Enum Public MivariableGlobalDeEjemplo As Integer ' estas variables no deben ser accesibles al usuarioPublic salir As Boolean ' sale un usuario, no se cierra la aplicación.Public Cerrar As BooleanPublic usuario As MisUsuarios Public Sub main() Dim mdi As MDIForm Form1.Caption = "Panel del administrador..." ' allí hay un botón tal que su código es cerrar=true Form1.Show 1 ' formulario del administrador.... el administrador arranca la aplicación, cuando ciere su ' ventana puede entrar otro usuario ... Siguiente: Call ResetVariables 'aquí llamamos a un procedimiento que restablece las variables al valor deseado como inical... usuario = (usuario Mod 5) + 1 ' garantiza que rota entre usuarios pero no regresa al admin ' en vez de usarse un usuario tras ootro aquí debería mostrarse una ventana de login... Set mdi = Nothing Set mdi = New mFrm1 mdi.Show Do DoEvents Loop While salir = False salir = False If Cerrar = False Then GoTo Siguiente ' al llegar aquí se cierra la aplicación, definitivamente, para ello sólo el admin debería acceder a cambiar el valor de salir ' entrando en su panel de administrador 'end ' sólo cuando no haya tareas pendientes... en este caso no las hay pero al salir de main termina la aplicación, no necesitamos end.End Sub Public Function getNombreUsuario(ByVal numero As MisUsuarios) As String Select Case numero Case 0 getNombreUsuario = "Administrador " Case 1 getNombreUsuario = "Ramón " Case 2 getNombreUsuario = "Juan " Case 3 getNombreUsuario = "María " Case 4 getNombreUsuario = "Andrés " Case 5 getNombreUsuario = "Violeta " End SelectEnd Function Public Function ResetVariables() MivariableGlobalDeEjemplo = 25 ' ....End Function
Este otro código va en el formulario MDI
--- Código: Visual Basic --- Public VariableDeEjemploReseteadaTrasCerrarMDI As String Private Sub MDIForm_Load() Me.Show ' centrado a lo ancho, arriba, 2/3 del ancho de pantalla y 2/3 del alto de pantalla Me.Move (Screen.Width - Me.Width) / 2, 0, (Screen.Width / 3) * 2, (Screen.Height / 3) * 2 Me.Move (Screen.Width - Me.Width) / 2, 0 Me.Caption = "El usuario: " & getNombreUsuario(usuario) & "tiene su ventana de aplicación lista..."End Sub Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer) Unload Me salir = TrueEnd Sub Private Sub mnuMDI_Click(Index As Integer) MsgBox "valor actual de la variable interna del form MDI: " & VariableDeEjemploReseteadaTrasCerrarMDI VariableDeEjemploReseteadaTrasCerrarMDI = InputBox("Modifica el texto y luego cierra la aplicación, volverá a resurgir como el ave Fénix, con los valores de este form reseteados y con los valores globales restablecidos desde la función al efecto...", "Cambiamos el valor de la variable ahora...", VariableDeEjemploReseteadaTrasCerrarMDI)End Sub Private Sub mnuVariables_Click(Index As Integer) MsgBox "el valor actual de la variable 'MivariableGlobalDeEjemplo', es: " & MivariableGlobalDeEjemplo Select Case Index Case 0 MivariableGlobalDeEjemplo = 20 Case 1 MivariableGlobalDeEjemplo = 30 Case 2 MivariableGlobalDeEjemplo = 99 End Select MsgBox "El valor de 'MivariableGlobalDeEjemplo', que se resetea tras cada reinicio del MDI ha cambiado al valor: " & MivariableGlobalDeEjemploEnd Sub
Para recrear correctamente el proyecto, crea un nuevo proyecto, añade un módulo y un formulario MDI, luego cambia en las porpiedades del proyecto para que arranque desde main. el formulario MDI renómbralo a mFrm1
Éste lleva 2 menús, el 1º tiene 3 submenús, el 2º sólo tiene un submenú....
El bucle principal realiza en este orden:
a ) restablecer las variables globales.... llamando a una rutina
b ) loguear al usuario... en el ejemplo el loguin es simulado, (no forma parte del problema)
c ) resetear el estado del formulario MDI (o mantener el estado actual)...
Si necesitas detalles o explicaciones adicionales, realiza las preguntas oportunas...
Incluyo un archivo comprimido que puedes descargar si no quieres teclear...
Navegación
Ir a la versión completa