none
instancia formulario creada RRS feed

  • Pregunta

  • buenas!
    estoy haciendo un programa en visual net y quiero saber antes de que se cree una nueva instancia de un formulario (new) si ya existe alguna para cerrrarlo
    la idea es que si desde un formulario se llama a otro varias veces solo se abra una vez con los ultimos datos llamados

    saludos
    Aran
    miércoles, 3 de febrero de 2010 17:16

Respuestas

  • hola

    no creo que el como lo llamas sea el problema
    lo que puedes hacer es verificar en que estado esta el formulario y cambiarlo


    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

        EstableceRegistro()

        If form IsNot Nothing Then
            Me.FormInstance.Close()
        End If
       
        Dim frm As frmPartidasMnto = Me.FormInstance
        frm.Show()

        If frm.WindowState = FormWindowState.Minimized Then
            frm.WindowState = FormWindowState.Normal
        End If


    End Sub


    Form.WindowState (Propiedad)

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta aticnet lunes, 22 de febrero de 2010 10:25
    jueves, 4 de febrero de 2010 15:29
  • bueno ya esta he puesto owner = mdiprincipal y asi parece que va bien

    muchisimas gracias Leandro
    Aran
    • Marcado como respuesta aticnet lunes, 22 de febrero de 2010 10:25
    lunes, 22 de febrero de 2010 10:25

Todas las respuestas

  • hola

    podrias ahcer algo como esto

    public partial class Form1 : Form
    {

        private Form2 form = null;

        private Form2 FormInstance
        {
            get
            {
                if (form == null)
                {
                    form = new Form2();
                    form.Disposed += new EventHandler(form_Disposed);
                }

                return form;
            }
        }

        void form_Disposed(object sender, EventArgs e)
        {
            form = null;
        }

        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = this.FormInstance;
            frm.Show();
        }
    }


    como veras la propeidad es la que abstrae la creacion del formulario y si esta creada la instancia puedes cerrarla
    eso si esto funciona si lo ahces desde el form que abrio al form hijo, pero no desde otro lado

    si necesitas hacerlo desde cualqueir parte debes usar

    Application. OpenForms (Propiedad)


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 3 de febrero de 2010 17:24
  • lo unico que he conseguido es que no me lo vuelva a abrir pero yo quiero que me lo abra con los nuevos datos, entiendo que primero tendra que cerrar, no se
    no entiendo muy bien el codigo que me has puesto, la logica que tiene yo Lo estoy haciendo en visual he puesto:

    'PRUEBA ABRIR SOLO 1

     

    Private form As frmPartidasMnto = Nothing

     

     

    Private ReadOnly Property FormInstance() As frmPartidasMnto

     

    Get

     

    If form Is Nothing Then

    form =

    New frmPartidasMnto(registro, mCalidad)

     

    AddHandler form.Disposed, AddressOf form_Disposed

     

    End If

     

    Return form

     

    End Get

     

    End Property

     

     

    Sub form_Disposed(ByVal sender As Object, ByVal e As EventArgs)

    form =

    Nothing

     

    End Sub

     

    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    EstableceRegistro()

     

    Dim frm As frmPartidasMnto = Me.FormInstance

    frm.Show()

     

    End Sub 'button1_Click

     

    'FIN PRUEBA


    Aran
    miércoles, 3 de febrero de 2010 17:56
  • hola

    esta muy bien como has convertido el codigo



    Private form As frmPartidasMnto = Nothing

    Private ReadOnly Property FormInstance() As frmPartidasMnto
        Get
            If form Is Nothing Then

                form = New frmPartidasMnto(registro, mCalidad)
                AddHandler form.Disposed, AddressOf form_Disposed

            End If

            Return form
        End Get
    End Property


    Sub form_Disposed(ByVal sender As Object, ByVal e As EventArgs)

        form = Nothing

    End Sub


    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

        EstableceRegistro()

        If form IsNot Nothing Then
            Me.FormInstance.Close()
        End If

       
        Dim frm As frmPartidasMnto = Me.FormInstance
        frm.Show()

    End Sub



    como veras detectas que ya hay una instancia y la cierras
    acto seguido recuperas una nueva


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 3 de febrero de 2010 18:06
  • gracias Leandro
    perfecto! solo un detalle, al pasar de un form al otro desde el que le he llamado se minimiza ¿como puedo dejarlo en el tamaño que esta?
    miércoles, 3 de febrero de 2010 18:54
  • por favor alguien me puede decir como hago para que al pasar el foco (pinchar con el raton) de un formulario a otro, el primero no se quede minimizado?
    supondo que será la forma de llamarlo no se como hacerlo para que se mantengan los dos en su posicion  y tamaño
    gracias
    Aran
    jueves, 4 de febrero de 2010 14:24
  • hola

    no creo que el como lo llamas sea el problema
    lo que puedes hacer es verificar en que estado esta el formulario y cambiarlo


    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

        EstableceRegistro()

        If form IsNot Nothing Then
            Me.FormInstance.Close()
        End If
       
        Dim frm As frmPartidasMnto = Me.FormInstance
        frm.Show()

        If frm.WindowState = FormWindowState.Minimized Then
            frm.WindowState = FormWindowState.Normal
        End If


    End Sub


    Form.WindowState (Propiedad)

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta aticnet lunes, 22 de febrero de 2010 10:25
    jueves, 4 de febrero de 2010 15:29
  • que hace que al pasar el foco de un formulario a otro unos se minimicen y sin embargo otros no?
    no quiero que se minimicen nunca excepto a petición del usuario
    creo que el problema viene de que en principio hice la aplicación con un mdi y ahora me piden ver muchos formulario a la vez
    ¿sería mejor sustituir el mdi por form normal con el menu principal de la aplicación?
    Aran
    viernes, 5 de febrero de 2010 9:17
  • hola

    no hace falta cambiar lo que has realziado en MDI, deberia funcionar sin problemas, la verdad es raro esto que comentas de minimizar los forms

    puedes hacer unas pruebas para ver sino es problema del desarrollo en particualar

    create un proyecto parte en una nuva solucion y arma un ejemplo simple de MDO con esta tencica para abrir formulario a ver si sucede lo mismo
    sino sucede quiere decir que algun parte de tu codigo esta haciando que se minimize

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 5 de febrero de 2010 12:32
  • no encuentro solucion al problema yo llamo al formulario tal y como me has indicado pero al picar sobre el otro, este queda minimizado
    que evento tengo que programar cuando pierde el foco el formulario para que no se minimice?
    he puesto este codigo pero no se ejecuta, pongo un punto de ruptura y ni siquiera pasa por aqui cuando pico en otro form

     

    Private Sub frmPartidasMnto_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus

     

    If Me.WindowState = FormWindowState.Minimized Then

     

    Me.WindowState = FormWindowState.Normal

     

    End If

     

     

    End Sub


    si le pongo owner=me
    entonces lo que ocurre es que si se quedan los dos maximizados pero no pasa a primer plano y yo quiero que el form en primer plano sea el que tiene el foco en cada momento
    gracias

    Aran
    lunes, 22 de febrero de 2010 10:06
  • bueno ya esta he puesto owner = mdiprincipal y asi parece que va bien

    muchisimas gracias Leandro
    Aran
    • Marcado como respuesta aticnet lunes, 22 de febrero de 2010 10:25
    lunes, 22 de febrero de 2010 10:25