Home All Groups Group Topic Archive Search About

how to prevent multiple instances of 2nd form?

Author
16 Jan 2006 6:51 AM
Rich
Hello,

my app opens a 2nd form (form2) by clicking a button on the first form
(form1).  I do not want to open form2 in modal form, but I only want one
instance of form2 open.  So if someone re-clicks the button on form1 there
will not be multiple instances of form2.  I created a module level boolean
var in form1 and a property in form1 to control the loading of form2, but I
am having a problem resetting the value of this boolean var.  Here is what I
have:

'--in form1 I have this property

Public Property frmLoaded() As Boolean
     Get
         Return bFrmLoaded
     End Get
     Set(ByVal Value As Boolean)
         bFrmLoaded = Value
     End Set
End Property

Sub...
If bFrmLoaded.Equals(False) Then
   form2.Show
   bFrmLoaded = True
End If
....
End Sub

In form2 in the closing event I want to reset the value of bFrmLoaded to
False.  But when I set a form var to form1 - it is a new instance of the form
Dim frm As New form1
frm.frmLoaded = False

The original form1 does not receive this.  I can't remember how I dealt with
this in the past.  I have done this before.  Just can't remember what I did. 
Or is there a better approach to dealing with keeping only one instance of a
form (which is not in modal form or mdi, etc)? 

Any suggestions appreciated  on how to reset the form1  bFrmLoaded boolean
var from form2. 

Thanks,
Rich

Author
16 Jan 2006 7:26 AM
Cyril Gupta
Hmm...

Well your strategy is not going to work, because very act of accessing the
variable will create a new instance of the form.

This is what you should do, and it's damn easy :)

Dim frm as New Form1

If frm Is Nothing Then
    Frm.show
End If

Regards
Cyril Gupta
Author
16 Jan 2006 7:40 AM
Cor Ligthert [MVP]
Rich,

It is a very well hidden property.

You can use the Isdisposed from the form2.

http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.isdisposed.aspx

If this answer is not enough, than reply, however I assume it is enough,

Cor
Author
16 Jan 2006 8:11 AM
Rich
OK.  I found this code snippet that seems to work for my purposes:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
        '  If the instance still exists... (ie. it's Not Nothing)
        If Not IsNothing(F2) Then
            '  and if it hasn't been disposed yet
            If Not F2.IsDisposed Then
                '  then it must already be instantiated - maybe it's
                '  minimized or hidden behind other forms ?
                F2.WindowState = FormWindowState.Normal  ' Optional
                F2.BringToFront()  '  Optional
            Else
                '  else it has already been disposed, so you can
                '  instantiate a new form and show it
                F2 = New Form2
                F2.Show()
            End If
        Else
            '  else the form = nothing, so you can safely
            '  instantiate a new form and show it
            F2 = New Form2
            F2.Show()
        End If

    End Sub

But if anyone has any other or additional suggestions - please share.

Thanks


Show quoteHide quote
"Rich" wrote:

> Hello,
>
> my app opens a 2nd form (form2) by clicking a button on the first form
> (form1).  I do not want to open form2 in modal form, but I only want one
> instance of form2 open.  So if someone re-clicks the button on form1 there
> will not be multiple instances of form2.  I created a module level boolean
> var in form1 and a property in form1 to control the loading of form2, but I
> am having a problem resetting the value of this boolean var.  Here is what I
> have:
>
> '--in form1 I have this property
>
> Public Property frmLoaded() As Boolean
>      Get
>          Return bFrmLoaded
>      End Get
>      Set(ByVal Value As Boolean)
>          bFrmLoaded = Value
>      End Set
> End Property
>
> Sub...
> If bFrmLoaded.Equals(False) Then
>    form2.Show
>    bFrmLoaded = True
> End If
> ...
> End Sub
>
> In form2 in the closing event I want to reset the value of bFrmLoaded to
> False.  But when I set a form var to form1 - it is a new instance of the form
> Dim frm As New form1
> frm.frmLoaded = False
>
> The original form1 does not receive this.  I can't remember how I dealt with
> this in the past.  I have done this before.  Just can't remember what I did. 
> Or is there a better approach to dealing with keeping only one instance of a
> form (which is not in modal form or mdi, etc)? 
>
> Any suggestions appreciated  on how to reset the form1  bFrmLoaded boolean
> var from form2. 
>
> Thanks,
> Rich
Author
16 Jan 2006 8:29 AM
Cyril Gupta
Hello Rich,

I think it is a perfectly valid solution.

Note that it combines what Cor and I suggested :)

If you check for IsDisposed without checking for Is Nothing first, you will
get an error, or will create an instance of the form.

Regards
Cyril Gupta