Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Ocultar un formulario sin descargarlo de memoria.

Estas en el tema de Ocultar un formulario sin descargarlo de memoria. en el foro de Visual Basic clásico en Foros del Web. Saludos, tengo un formulario que es un poco lento en cargar, lo que hago es preparar un CommandButton "CERRAR" que hace Me.Hide. Pero si el ...
  #1 (permalink)  
Antiguo 29/11/2006, 10:43
 
Fecha de Ingreso: marzo-2006
Mensajes: 29
Antigüedad: 18 años, 1 mes
Puntos: 0
Ocultar un formulario sin descargarlo de memoria.

Saludos, tengo un formulario que es un poco lento en cargar, lo que hago es preparar un CommandButton "CERRAR" que hace Me.Hide.

Pero si el usuario usa el boton "x" del formulario para salir, no se como controlar que no lo descarge de memoria, solo quiero ocultarlo.

Gracias,
  #2 (permalink)  
Antiguo 29/11/2006, 11:22
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
http://www.vb-mundo.com/truco_progra...mover,-etc.htm
Cita:
Formularios que no se cierran con el botón (x), no se pueden mover, etc

Si eliminamos opciones del menú de control (-) de un formulario impedimos que esas mismas acciones se puedan realizar de otras formas. Si quitamos la opción Cerrar el botón de cerrar el formulario (x) quedará dehabilitado. Si eliminamos la opción Mover el formulario no se podrá mover arratrándolo por la barra de título, etc.

Veamos un ejemplo de cómo impedir el funcionamiento del botón Cerrar de la barra de título :

Declaramos en un módulo :



Codigo:--------------------------------------------------------------------------------
Public Const MF_BYPOSITION = &H400
Public Const MF_REMOVE = &H1000
Public Declare Function DrawMenuBar Lib `user32` _
(ByVal hwnd As Long) As Long
Public Declare Function GetMenuItemCount Lib `user32` _
(ByVal hMenu As Long) As Long
Public Declare Function GetSystemMenu Lib `user32` _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long
Public Declare Function RemoveMenu Lib `user32` _
(ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long


--------------------------------------------------------------------------------


Y para deshabilitar el botón Cerrar eliminamos la opción Cerrar del menú :



Codigo:--------------------------------------------------------------------------------
Dim hMenu As Long
Dim menuItemCount As Long
`Obtenemos un handle al menú de sistema del formulario
hMenu = GetSystemMenu(Me.hwnd, 0)
If hMenu Then
`Obtenemos el número de elementos del menú
menuItemCount = GetMenuItemCount(hMenu)
`Eliminamos el elemento Cerrar, que es el último
`Los elemento empiezan a numerarse en cero por lo que el
`último es menuItemCount - 1
Call RemoveMenu(hMenu, menuItemCount - 1, _
MF_REMOVE Or MF_BYPOSITION)
`Eliminamos la barra de separación que hay justo antes de la opción Cerrar
Call RemoveMenu(hMenu, menuItemCount - 2, _
MF_REMOVE Or MF_BYPOSITION)
`Forzamos el redibujado del menú. Esto refresca la barra de título
`y deja la X deshabilitada
Call DrawMenuBar(Me.hwnd)
End If
  #3 (permalink)  
Antiguo 29/11/2006, 11:45
 
Fecha de Ingreso: marzo-2006
Mensajes: 29
Antigüedad: 18 años, 1 mes
Puntos: 0
Ya, pero es que si me interesa que el formulario se pueda cerrar mediante el boton cerrar.
  #4 (permalink)  
Antiguo 29/11/2006, 16:20
Avatar de vbx3m  
Fecha de Ingreso: febrero-2005
Ubicación: Venezuela
Mensajes: 524
Antigüedad: 19 años, 3 meses
Puntos: 1
Cita:
Iniciado por bubu54 Ver Mensaje
Saludos, tengo un formulario que es un poco lento en cargar, lo que hago es preparar un CommandButton "CERRAR" que hace Me.Hide.

Pero si el usuario usa el boton "x" del formulario para salir, no se como controlar que no lo descarge de memoria, solo quiero ocultarlo.

Gracias,
Prueba con esto:

Código:
Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
Me.Hide
End Sub
__________________
ホルヘ・ラファエル・マルティネス・レオン
  #5 (permalink)  
Antiguo 30/11/2006, 01:33
 
Fecha de Ingreso: marzo-2006
Mensajes: 29
Antigüedad: 18 años, 1 mes
Puntos: 0
Cita:
Iniciado por vbx3m Ver Mensaje
Prueba con esto:

Código:
Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
Me.Hide
End Sub
Casi, eso me hace, efectivamente lo que busco, pero como el formulario esta dentro de otro Formulario MDI, lo que ocurre es que ahora no me deja cerrar el MDI.

Edito, mira lo que he hecho:

En el formulario MDI:

Código:
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    End
End Sub
Y ya funciona.
  #6 (permalink)  
Antiguo 02/02/2007, 19:09
Avatar de nanomartin  
Fecha de Ingreso: mayo-2005
Ubicación: Moron - Bs As (ARG)
Mensajes: 50
Antigüedad: 18 años, 11 meses
Puntos: 0
Re: Ocultar un formulario sin descargarlo de memoria.

No me funciona.

Será porque uso VB.NET 2003 ?

Puntualmente me da error de código en (Me.hwnd) y el tip me dice
" 'Me.hwnd' no es un miembro de "miproyecto.miformulario" "

Ayuda por favor!

Thx in advance

PD: el ejemplo de vbx3m no hizo "ni múu".

Última edición por nanomartin; 02/02/2007 a las 19:40
  #7 (permalink)  
Antiguo 03/02/2007, 19:55
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
Puntos: 1
Re: Ocultar un formulario sin descargarlo de memoria.

Cita:
Iniciado por nanomartin Ver Mensaje
No me funciona.

Será porque uso VB.NET 2003 ?
Si especificarais la version de Visual Basic que usais cuando exponeis vuestras duda seria mas facil orientaros

En VB.NET en vez de hWnd busca Handle, y el codigo equivalente al de vbx3m seria este:
Código:
    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = True
        Me.Hide()
    End Sub
Salu2...
__________________
Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX

Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra.

  #8 (permalink)  
Antiguo 04/02/2007, 21:21
Avatar de nanomartin  
Fecha de Ingreso: mayo-2005
Ubicación: Moron - Bs As (ARG)
Mensajes: 50
Antigüedad: 18 años, 11 meses
Puntos: 0
De acuerdo Re: Ocultar un formulario sin descargarlo de memoria.

Cita:
Si especificarais la version de Visual Basic que usais cuando exponeis vuestras duda seria mas facil orientaros
Y yo qué dije?
Cita:
Será porque uso VB.NET 2003 ?
Y el código siguió dando error en el (Me.Handle).
((Un objeto de tipo 'IntPr..' no se puede convertir en '2' ))

Bueno, como sea, lo solucioné desde el panel de propiedades con la propiedad CONTROLBOX = False
(no entiendo cómo no lo encontré antes )

Gracias, saludos!!
  #9 (permalink)  
Antiguo 06/02/2007, 19:36
 
Fecha de Ingreso: febrero-2007
Ubicación: Lima, Perú
Mensajes: 11
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Ocultar un formulario sin descargarlo de memoria.

puedes poner, en el cuadro deprobpiedades del Form, a la propiedad ControlBox = False y hará que no aparezcan los botones de arriba que cierran minimizan y maximizan.
  #10 (permalink)  
Antiguo 06/02/2007, 20:40
Avatar de nanomartin  
Fecha de Ingreso: mayo-2005
Ubicación: Moron - Bs As (ARG)
Mensajes: 50
Antigüedad: 18 años, 11 meses
Puntos: 0
Re: Ocultar un formulario sin descargarlo de memoria.

Quiero aclarar que SIEMPRE y EN TODO MOMENTO agradezco a quien emita una respuesta, así como trato de hacerlo yo también, pero no se embalen y lean todo el thread!!
Yo dije:
Cita:
Bueno, como sea, lo solucioné desde el panel de propiedades con la propiedad CONTROLBOX = False
(no entiendo cómo no lo encontré antes )
Maldonado dice:
Cita:
puedes poner, en el cuadro deprobpiedades del Form, a la propiedad ControlBox = False y hará que no aparezcan los botones de arriba que cierran minimizan y maximizan.
Creo que esto corresponde más a moderadores que a mi.

Igualmente, saludos a todos y gracias. Hagamos una mejor comunidad!
  #11 (permalink)  
Antiguo 11/02/2007, 04:45
 
Fecha de Ingreso: febrero-2007
Mensajes: 12
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Ocultar un formulario sin descargarlo de memoria.

si no quieres que tu formulario se cierre simplmente tienes que controlar el evento que se produce.
FormClosing: este evento se produse cuendo el formulario se esta cerrando;
FormClosed: y este otro evento se produce dèspues que el formulario se a serrado.
como o especificas el lenguaje pondre dos ejemplos y c# y el otro vb.net tanto en 2003 como en 2005 es similar
c#
delegado
Código:
private void InitializeComponent()
{

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Closing_evento);

}
Código:
 private void Closing_evento(object sender, FormClosingEventArgs e)
    {
      //con este codigo el boton si se va a poder cerrar con el boton cerrar
       if (MessageBox.Show("esta seguro que desea salir", "", MessageBoxButtons.YesNo) == DialogResult.No)
           {
            e.Cancel = true; //canselas el evento
            this.Hide();
            }
     }
ten en cuenta que el enlace del delegado con el evento va en el componente de inicialisacion

vb
Código:
 Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles MyBase.FormClosing
        If MessageBox.Show("esta seguro que desea salir", "", MessageBoxButtons.YesNo) = DialogResult.No Then
            e.Cancel = True
            Me.Hide()
        End If
    End Sub
en vb es mucho mas sencillo, puedes usas el evento sin nesesidad del delegado
Cita:
o tambien puedes usar ControlBox=false, pero el valor de la propiedad vas a perder de vista al boton max , min y no vas a poder cerrar el formulario
saludos a todo y si tienes alguna duda y esta denttro de mis pocibilidades ayudarte no dudes en comunicarate con migo [email protected]
  #12 (permalink)  
Antiguo 11/02/2007, 18:29
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
Puntos: 1
Re: Ocultar un formulario sin descargarlo de memoria.

Cita:
Iniciado por nanomartin Ver Mensaje
Y yo qué dije?
Perdon, te confundi con el autor inicial del thread, bubu54, el no indico version del lenguaje.

Cita:
Iniciado por nanomartin Ver Mensaje
Y el código siguió dando error en el (Me.Handle).
((Un objeto de tipo 'IntPr..' no se puede convertir en '2' ))
El fallo esta en el codigo al ser para VB 6.0 declara los enteros de 4 bytes como Long cuando en .NET son Integer. Cambiando eso te funciona, y por cierto, no habia que dar tanta vuelta para anular visualmente el boton, con menos codigo se consigue igual:
Código:
Public Class Form1
    Private Const MF_BYPOSITION = &H400
    Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
    Private Declare Function RemoveMenu Lib "user32.dll" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RemoveMenu(GetSystemMenu(Me.Handle, 0), 6, MF_BYPOSITION)
    End Sub
End Class 
Cita:
Iniciado por nanomartin Ver Mensaje
Bueno, como sea, lo solucioné desde el panel de propiedades con la propiedad CONTROLBOX = False
(no entiendo cómo no lo encontré antes )
Yo cuando leo alguien que pide que se deshabilite el boton de cerrar de la ventana yo entiendo esto: y no esto , sobre todo por que mucha gente busca hacer lo primero por... "estetica" llamemoslo. En otras palabras, que al sonar tan ovio el tema y que no utilizabas la propiedad ControlBox hemos tirado por el metodo "rebuscado"

Cita:
Iniciado por willy6666
ten en cuenta que el enlace del delegado con el evento va en el componente de inicialisacion
(...)
en vb es mucho mas sencillo, puedes usas el evento sin nesesidad del delegado
No hace falta ponerse a programar el delegado para el evento ni en C# ni en VB.NET. Desde el panel de propiedades del entorno de desarrollo seleccionas la vista de eventos del formulario (el icono del rayo) y buscas y haces doble click sobre FormClosing en este caso, eso ya te genera el delegado y la declaracion del evento para que añadas codigo.

Salu2...
__________________
Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX

Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra.

  #13 (permalink)  
Antiguo 11/02/2007, 19:35
Avatar de nanomartin  
Fecha de Ingreso: mayo-2005
Ubicación: Moron - Bs As (ARG)
Mensajes: 50
Antigüedad: 18 años, 11 meses
Puntos: 0
De acuerdo Re: Ocultar un formulario sin descargarlo de memoria.

Excelente cátedra EX3 ! (aplausos)
Muy buena la explicación para ambos mensajes, el mio y el de Willy.

Ésta es la gente que enriquece el foro.

Buena la actitud de dar el mail de Willy... te tendré en cuenta.
Verdaderamente que no seré un gran aporte, pero por si al alguien le interesa el mio es [email protected]

Saludos a todos!
  #14 (permalink)  
Antiguo 13/02/2007, 01:11
 
Fecha de Ingreso: febrero-2007
Mensajes: 12
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Ocultar un formulario sin descargarlo de memoria.

gracias [EX3] por dar una forma mas sencilla de usar eventos y delegados pero es es una forma mucho mas sencilla
saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:00.