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

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

Desconectado mil123

  • Sv Full Member
  • *
  • 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 -^-
  • The Communiter-
  • *
  • Mensajes: 3221
  • 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

  • Sv Full Member
  • *
  • 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
  • The Communiter-
  • *
  • Mensajes: 5665
  • 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
  • The Communiter-
  • *
  • Mensajes: 6530
  • "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 mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Duda sobre instancia en c#
« Respuesta #5 : 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
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Duda sobre instancia en c#
« Respuesta #6 : 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

  • The Communiter-
  • *
  • Mensajes: 13252
  • some text
Re: Duda sobre instancia en c#
« Respuesta #7 : 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

  • Sv Full Member
  • *
  • Mensajes: 558
Re: Duda sobre instancia en c#
« Respuesta #8 : 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
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Duda sobre instancia en c#
« Respuesta #9 : 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

  • Sv Full Member
  • *
  • Mensajes: 558
Re: Duda sobre instancia en c#
« Respuesta #10 : 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

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Duda sobre instancia en c#
« Respuesta #11 : 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