Autor Tema: Duda sobre instancia en c#  (Leído 10305 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mil123

  • Trade Count: (1)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 19
  • -Receive: 36
  • Mensajes: 558
Duda sobre instancia en c#
« : marzo 07, 2011, 03:23:00 pm »
Como puedo limitar las instancias de un formulario, necesito que nada mas se cree un formulario y si se le da click opara intentar crear uno nuevo que se desplegue un mensaje que debe cerrar formulario actual para crear una nueva instacias

este es el codigo que tengo actualmente:

private void btnClientes_Click(object sender, EventArgs e)
        {
            frmClientes frmMantClientes = new frmClientes();
            frmMantClientes.MdiParent = this;
            frmMantClientes.Show();
        }

se les agradecera su ayuda...


Desconectado tekun

  • -^- Elite Silver -^-
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 101
  • Mensajes: 3218
  • Han convertido mi casa en cueva de mercaderes!!!!
    • www.tekun.es
Re: Duda sobre instancia en c#
« Respuesta #1 : marzo 07, 2011, 03:50:06 pm »
Como puedo limitar las instancias de un formulario, necesito que nada mas se cree un formulario y si se le da click opara intentar crear uno nuevo que se desplegue un mensaje que debe cerrar formulario actual para crear una nueva instacias

lo más fácil sería cambiarlo a modal

Código: [Seleccionar]
frmMantClientes.ShowDialog()
lo difícil lo hago rápido, con lo imposible, casi siempre me tardo un poquito

Desconectado mil123

  • Trade Count: (1)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 19
  • -Receive: 36
  • Mensajes: 558
Re: Duda sobre instancia en c#
« Respuesta #2 : marzo 07, 2011, 03:58:04 pm »
el detalle es que si lo cambio a modal no podre activar otros formularios, solo podre trabajar en clientes y no podre habilitar el uso de facturacion por decirte algo... :-/

aparte que no te lo permite por que es un mdi...
« Última Modificación: marzo 07, 2011, 04:00:26 pm por mil123 »

Desconectado mxgxw

  • Global Moderator
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 27
  • -Receive: 651
  • Mensajes: 5662
  • Starlet - 999cc
    • mxgxw
Re: Duda sobre instancia en c#
« Respuesta #3 : marzo 07, 2011, 04:04:57 pm »
el detalle es que si lo cambio a modal no podre activar otros formularios, solo podre trabajar en clientes y no podre habilitar el uso de facturacion por decirte algo... :-/

aparte que no te lo permite por que es un mdi...

Mira para que no te compliques podrías hacer algo como lo siguiente:

1- Pone una variable de tipo formulario dentro de la clase.

Código: [Seleccionar]

private frmClientes frmMantClientes;

private void btnClientes_Click(object sender, EventArgs e)
        {
           if(frmMantClientes==null) {
            frmMantClientes = new frmClientes();
            frmMantClientes.MdiParent = this;
            frmMantClientes.Show();
           } else {
               // Mostrar mensaje de error
           }
        }

Ojo que con este código deberías de asociar el evento de la ventana para que vuelva a hacer null la variable frmClientes cuando se cierre el formulario. Si no lo haces solo vas a poder abrirlo una vez.


Desconectado rdoggsv

  • Administrator
  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 299
  • -Receive: 486
  • Mensajes: 6457
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Duda sobre instancia en c#
« Respuesta #4 : marzo 07, 2011, 04:08:37 pm »
Adentro de la clase de el formulario que vas a crear pone una variable de tipo instancia, esa variable que sea un int, inicializado a 0.

Cuando crees el primer formulario, en el initialize de esa clase con la que estas creando el nuevo formulario subila en 1.

Cuando intenten crear uno nuevo, revisa si la variable de instancia en tu clase todavía vale 0, o si ya vale 1 es porque ya crearon el primero.

Es bien parecido a la solución que te dio mxgxw, solo que me parece más fácil de leer si hay 0,1,2,3, etc.

Desconectado ~

  • Trade Count: (0)
  • The Communiter-
  • *
  • Thank You
  • -Given: 0
  • -Receive: 156
  • Mensajes: 1408
    • Ciencia de Computación, OSes y Herramientas
Re: Duda sobre instancia en c#
« Respuesta #5 : marzo 07, 2011, 04:14:03 pm »
Lo único que hay que hacer es tener una variable booleana o entera (0 para falso y 1 para verdadero).

Esta variable se podría llamar formulario_presente.

Cuando el programa comienza, y el formulario esté cerrado, esta variable tiene que ser 0 o false, opcionalmente con el menú correspondiente activado.

Cuando se le dé clic al menú o botón que abre este formulario, esta variable tiene que ponerse a 1 o true.

Después, tiene que haber un IF que evalúe esta variable. Si la variable formulario_presente es 1 o true, tiene que avisar que este formulario ya está abierto (otra opción sería desactivar el menú o botón correspondiente para que no se pueda usar dos veces). Si la variable  formulario_presente es 0 o false, entonces tiene que:

- Poner la variable a 1 o true.
- Crear el diálogo.
- Opcionalmente desactivar el menú o botón correspondiente.

Cuando se cierre el formulario, el formulario se tiene que encargar de poner esta variable a 0 o false (y opcionalmente reactivar el menú correspondiente).

Son muchas explicaciones pero es algo así:
_________________

formulario_presente es una variable booleana global, que tiene el valor false cuando el programa arranca y el formulario correspondiente no se ve.

Cuando abrimos el formulario:

if(formulario_presente==true)
{
 Mensaje("El formulario ya está abierto");
}
 else if(formulario_presente==false)
 {
  formulario_presente=true;
  mostramos el formulario;
  desactivamos el menú correspondiente;
 }



Cuando cerramos el formulario:

formulario_presente=false;
activamos el menú correspondiente.
« Última Modificación: marzo 07, 2011, 04:17:28 pm por ~ »
Mi sitio web:
---- IP para archivo hosts (todos mis subdominios):
190.150.9.244 archefire.org

Desconectado mxgxw

  • Global Moderator
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 27
  • -Receive: 651
  • Mensajes: 5662
  • Starlet - 999cc
    • mxgxw
Re: Duda sobre instancia en c#
« Respuesta #6 : marzo 07, 2011, 04:14:24 pm »
Adentro de la clase de el formulario que vas a crear pone una variable de tipo instancia, esa variable que sea un int, inicializado a 0.

Cuando crees el primer formulario, en el initialize de esa clase con la que estas creando el nuevo formulario subila en 1.

Cuando intenten crear uno nuevo, revisa si la variable de instancia en tu clase todavía vale 0, o si ya vale 1 es porque ya crearon el primero.

Es bien parecido a la solución que te dio mxgxw, solo que me parece más fácil de leer si hay 0,1,2,3, etc.

Modifico mi codigo nuevamente:

Este seria en tu ventana principal:
Código: [Seleccionar]
public frmClientes frmMantClientes; // public para poder accederlo desde mdIParent

private void btnClientes_Click(object sender, EventArgs e)
        {
           if(frmMantClientes==null) {
            frmMantClientes = new frmClientes();
            frmMantClientes.MdiParent = this;
            frmMantClientes.Show();
           } else {
               // Mostrar mensaje de error
           }
        }

Este sería dentro del codigo del formulario:

Código: [Seleccionar]
        public static void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
           (<Nombredeclaselocal>)this.MdiParent.frmMantClientes=null;
        }

Nota: Es importante que en <NombredeClaseLocal> pongas el nombre de clase que te genera el editor de formularios de VisualStudio, sino te va a dar error que encuentra el miembro de la clase...

ahhh el polimorfismo  :wub: las cosas que uno aprende con Java....  :cry: extraño java.


Desconectado rdoggsv

  • Administrator
  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 299
  • -Receive: 486
  • Mensajes: 6457
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Duda sobre instancia en c#
« Respuesta #7 : marzo 07, 2011, 04:15:27 pm »
Hey se me olvidaba mencionar que en el destroy de tu clase con la que creas los formularios tenes que decrementar en 1 la variable de instancia que controla cuantos formularios hay.

Desconectado Jaru

  • Trade Count: (21)
  • The Communiter-
  • *
  • Thank You
  • -Given: 782
  • -Receive: 1555
  • Mensajes: 13248
  • -text
Re: Duda sobre instancia en c#
« Respuesta #8 : marzo 07, 2011, 04:32:44 pm »
Hey se me olvidaba mencionar que en el destroy de tu clase con la que creas los formularios tenes que decrementar en 1 la variable de instancia que controla cuantos formularios hay.
ahi pondrias ya sea en "FALSE" o "0" la variable segun el método que sugiere (~)
N/A

Desconectado mil123

  • Trade Count: (1)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 19
  • -Receive: 36
  • Mensajes: 558
Re: Duda sobre instancia en c#
« Respuesta #9 : marzo 07, 2011, 04:36:46 pm »

Código: [Seleccionar]
        public static void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
           (<Nombredeclaselocal>)this.MdiParent.frmMantClientes=null;
        }


esta parte no entiendo muy bien, la otra parte funciona ya que crea una unica instancia... pero al cerrar como lo devueldo a null

Desconectado mxgxw

  • Global Moderator
  • Trade Count: (1)
  • The Communiter-
  • *
  • Thank You
  • -Given: 27
  • -Receive: 651
  • Mensajes: 5662
  • Starlet - 999cc
    • mxgxw
Re: Duda sobre instancia en c#
« Respuesta #10 : marzo 07, 2011, 05:49:32 pm »
esta parte no entiendo muy bien, la otra parte funciona ya que crea una unica instancia... pero al cerrar como lo devueldo a null

Ahh ok mira lo que pasa es esto.

Vos tenes tu programa que es tu "contenedor" por decirlo así. Que crea una "variable hijo" que es tu formulario.

Si te fijas en la inicializacion del formulario hijo especificas quien va a ser el contenedor por medio de la variable MDIParent.

En tu formulario "hijo" en la funcion FormClosed tenes que acceder a la variable del contenedor y ponerla a null. Esto lo haces llamando a la variable mdiparent, y aquí es donde entra el polimorfismo.

Para tu formulario hijo tu ventana es un Form. La clase Form no tiene una variable que se llame frmMantClientes, así que tenes que convertirla primero a la clase que te crea visualBAsic, por ejemplo MiFormulario. Esta conversion tiene que especificarse ya que el compilador no es tan inteligente para adivitar que la varialbe frmMantClientes está definida en la clase heredada y no en la clase original.


Desconectado mil123

  • Trade Count: (1)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 19
  • -Receive: 36
  • Mensajes: 558
Re: Duda sobre instancia en c#
« Respuesta #11 : marzo 08, 2011, 01:27:26 pm »
Encontre la solucion !!!!!!!!!!  :drinks: ohyea:
Código: [Seleccionar]
private frmClientes form = null;
        private frmClientes FormInstance {
            get
            {
                if (form == null)
                {
                    form = new frmClientes();
                    form.Disposed += new EventHandler(form_Disposed);
                }
                return form;
            }
        }
        void form_Disposed(object sender, EventArgs e)
        {
            form = null;
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            Close();

        }
esto lo coloque en el formulario principal y exactamente me controla que se abra una unica instancia del form que necesito.

Gracias a todos los que me echaron una mano...

Desconectado Non Servium

  • Trade Count: (0)
  • Sv Member
  • ***
  • Thank You
  • -Given: 6
  • -Receive: 39
  • Mensajes: 426
  • Ilix Punx :)
Re: Duda sobre instancia en c#
« Respuesta #12 : abril 11, 2011, 02:34:24 pm »
también podrias dehabilitar el boton con que se abre el form  :D

Y agregar una propiedad al MDI...
Código: [Seleccionar]
public Boolean Habilitar
{
    set { btn_Clientes.Enabled = value; }
}

Para deshabilitar el boton, se puede en el mismo evento btn_Accion_Click
Código: [Seleccionar]
((Button)sender).Enabled = false;

O bien en el evento load del nuevo form hijo
Código: [Seleccionar]
Parent.Habilitar = false;

Y en el evento OnForm closing poner
Código: [Seleccionar]
Parent.Habilitar = true;

 :bananajump: :bananajump: espero te sirva! Suerte!
« Última Modificación: abril 11, 2011, 02:42:08 pm por bereco190xP »
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch