• Viernes 3 de Mayo de 2024, 12:26

Autor Tema:  Manejo de formularios en un MDI  (Leído 2301 veces)

mikelm3

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Manejo de formularios en un MDI
« en: Jueves 23 de Abril de 2009, 01:59 »
0
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

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Manejo de formularios en un MDI
« Respuesta #1 en: Jueves 23 de Abril de 2009, 05:28 »
0
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
  1.  
  2.  
  3. Public Enum MisUsuarios
  4.     Admin = 0
  5.     Ramon = 1
  6.     Juan = 2
  7.     Maria = 3
  8.     Andres = 4
  9.     Violeta = 5
  10. End Enum
  11.  
  12. Public MivariableGlobalDeEjemplo As Integer
  13.  
  14. ' estas variables no deben ser accesibles al usuario
  15. Public salir As Boolean         ' sale un usuario, no se cierra la aplicación.
  16. Public Cerrar As Boolean
  17. Public usuario As MisUsuarios
  18.  
  19. Public Sub main()
  20.     Dim mdi As MDIForm
  21.     Form1.Caption = "Panel del administrador..."  ' allí hay un botón tal que su código es cerrar=true
  22.     Form1.Show 1  ' formulario del administrador.... el administrador arranca la aplicación, cuando ciere su
  23.     ' ventana puede entrar otro usuario ...
  24.    
  25. Siguiente:
  26.     Call ResetVariables 'aquí llamamos a un procedimiento que restablece las variables al valor deseado como inical...
  27.     usuario = (usuario Mod 5) + 1  ' garantiza que rota entre usuarios pero no regresa al admin
  28.     ' en vez de usarse un usuario tras ootro aquí debería mostrarse una ventana de login...
  29.    
  30.     Set mdi = Nothing
  31.     Set mdi = New mFrm1
  32.     mdi.Show
  33.    
  34.    
  35.     Do
  36.         DoEvents
  37.     Loop While salir = False
  38.     salir = False
  39.     If Cerrar = False Then GoTo Siguiente
  40.    
  41.     ' al llegar aquí se cierra la aplicación, definitivamente, para ello sólo el admin debería acceder a cambiar el valor de salir
  42.     '   entrando en su panel de administrador
  43.     '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.
  44. End Sub
  45.  
  46.  
  47. Public Function getNombreUsuario(ByVal numero As MisUsuarios) As String
  48.     Select Case numero
  49.         Case 0
  50.             getNombreUsuario = "Administrador "
  51.         Case 1
  52.             getNombreUsuario = "Ramón "
  53.         Case 2
  54.             getNombreUsuario = "Juan "
  55.         Case 3
  56.             getNombreUsuario = "María "
  57.         Case 4
  58.             getNombreUsuario = "Andrés "
  59.         Case 5
  60.             getNombreUsuario = "Violeta "
  61.     End Select
  62. End Function
  63.  
  64.  
  65. Public Function ResetVariables()
  66.     MivariableGlobalDeEjemplo = 25
  67.     ' ....
  68. End Function
  69.  
  70.  
  71.  


Este otro código va en el formulario MDI
Código: Visual Basic
  1.  
  2.  
  3. Public VariableDeEjemploReseteadaTrasCerrarMDI As String
  4.  
  5.  
  6. Private Sub MDIForm_Load()
  7.     Me.Show
  8.    
  9.     ' centrado a lo ancho,  arriba, 2/3 del ancho de pantalla y 2/3 del alto de pantalla
  10.     Me.Move (Screen.Width - Me.Width) / 2, 0, (Screen.Width / 3) * 2, (Screen.Height / 3) * 2
  11.     Me.Move (Screen.Width - Me.Width) / 2, 0
  12.    
  13.     Me.Caption = "El usuario: " & getNombreUsuario(usuario) & "tiene su ventana de aplicación lista..."
  14. End Sub
  15.  
  16.  
  17.  
  18. Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  19.     Unload Me
  20.     salir = True
  21. End Sub
  22.  
  23. Private Sub mnuMDI_Click(Index As Integer)
  24.     MsgBox "valor actual de la variable interna del form MDI: " & VariableDeEjemploReseteadaTrasCerrarMDI
  25.    
  26.     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)
  27. End Sub
  28.  
  29. Private Sub mnuVariables_Click(Index As Integer)
  30.     MsgBox "el valor actual de la variable 'MivariableGlobalDeEjemplo', es: " & MivariableGlobalDeEjemplo
  31.     Select Case Index
  32.         Case 0
  33.             MivariableGlobalDeEjemplo = 20
  34.         Case 1
  35.             MivariableGlobalDeEjemplo = 30
  36.         Case 2
  37.             MivariableGlobalDeEjemplo = 99
  38.     End Select
  39.     MsgBox "El valor de 'MivariableGlobalDeEjemplo', que se resetea tras cada reinicio del MDI ha cambiado al valor: " & MivariableGlobalDeEjemplo
  40. End Sub
  41.  
  42.  

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...
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
«Ma non troppo»
----> ModoVacaciones = False<----