Avatar billede ncp Nybegynder
23. marts 2005 - 23:58 Der er 10 kommentarer og
1 løsning

Finde form - hvordan?

Hi, har et projekt med 2 forme - FormA of FormB, hvor FormA er startformen. På FormA har jeg en knap, som åbner FormB via følgende kode:

        Dim FormB As New FormB
        FormB.Show()

Og det virker også fint, men klikkes flere gange på knappen åbnes flere forme - det er der ikke helt brug for, den skal bare vise en af dem som er lavet (fra FormB kan laves flere FormB'ere)

Nogen forslag ?
Avatar billede jakobdo Ekspert
24. marts 2005 - 00:10 #1
Kan du ikke "bare" bruge FormB.ShowModal()
Avatar billede ncp Nybegynder
24. marts 2005 - 00:35 #2
Hvis det er ShowDialog() du tænker på, kan jeg jo ikke benytte FormA imens FormB bliver vist, og i form af, at FormA er min "menu"-form er det et must...
Avatar billede jakobdo Ekspert
24. marts 2005 - 00:38 #3
Så kan jeg ikke hjælpe! :o(
Avatar billede plx Nybegynder
24. marts 2005 - 02:18 #4
En dirty måde at gøre det på kunne være

Dim synlig as Boolean

If synlig = False Then
  synlig = True
  Dim FormB As New FormB
  FormB.Show()
End If
Avatar billede jakobdo Ekspert
24. marts 2005 - 08:43 #5
Den løsning tænkte jeg selv, men hvis nu formB lukkes, hvordan sættes synlig så til false igen?

Det man næsten må gøre er noget i stil med følgende:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim WinWnd As Long

WinWnd = FindWindow(vbNullString, "Adobe Reader")

if WinWnd = NULL then
  Dim FormB As New FormB
  FormB.Show()
End If
Avatar billede jakobdo Ekspert
24. marts 2005 - 08:44 #6
Hov, det var fra noget kode jeg lige fandt på nettet.
"Adobe Reader" skal være hvad som står i caption/titlen på FormB
Avatar billede burningice Nybegynder
24. marts 2005 - 10:42 #7
ingen grund til at lege med Win32 API'er

Hvad med at lave en HelperClass med en Shared HashTable hvori, du hver gang åbner en form, gemmer en Type af den form i den. Til at fjerne typen igen når formen lukkes kan du bruge Form.Closed-eventen, og før du åbner en form tjekker du om den pågældende type findes i hashtable'n eller ej.
Avatar billede ncp Nybegynder
24. marts 2005 - 17:10 #8
-> cyberfessor : Kan du komme med et eksempel hvordan jeg laver såden en GelperClass ?
Avatar billede burningice Nybegynder
24. marts 2005 - 18:30 #9
:) here it goes (så fik jeg vist også genopfrisket min rustne vb.net-syntaks ;))

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Button1 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Label1 = New System.Windows.Forms.Label
        Me.Button1 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'Label1
        '
        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label1.Location = New System.Drawing.Point(56, 32)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(176, 48)
        Me.Label1.TabIndex = 0
        Me.Label1.Text = "Hej, jeg er form 1"
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(184, 104)
        Me.Button1.Name = "Button1"
        Me.Button1.TabIndex = 1
        Me.Button1.Text = "Åbn Form2"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(296, 149)
        Me.Controls.Add(Me.Button1)
        Me.Controls.Add(Me.Label1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim _f As Form2 = New Form2

        If FormManager.Exists(_f) Then
            MessageBox.Show("Form2 already open")

            _f = FormManager.GetFormInstance(_f)

            _f.TopMost = True
            _f.Visible = True
            _f.WindowState = FormWindowState.Normal

            Return
        End If

        FormManager.Add(_f)

        _f.Show()
    End Sub
End Class


Public Class Form2
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    Friend WithEvents Label1 As System.Windows.Forms.Label
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Label1 = New System.Windows.Forms.Label
        Me.SuspendLayout()
        '
        'Label1
        '
        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label1.Location = New System.Drawing.Point(56, 56)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(208, 48)
        Me.Label1.TabIndex = 0
        Me.Label1.Text = "Hej, jeg er form 2"
        '
        'Form2
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Controls.Add(Me.Label1)
        Me.Name = "Form2"
        Me.Text = "Form2"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub Form2_Closed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        FormManager.Remove(Me)
    End Sub
End Class


Public Class FormManager

    Private Shared _table As Hashtable = New Hashtable

    Public Shared Sub Add(ByRef _form As Form)
        If FormManager.Exists(_form) Then
            Throw New Exception("Form already open")
        End If

        FormManager._table.Add(_form.GetType(), _form)
    End Sub

    Public Shared Sub Remove(ByRef _form As Form)
        FormManager._table.Remove(_form.GetType())
    End Sub

    Public Shared Function Exists(ByRef _form As Form) As Boolean
        Return FormManager._table.Contains(_form.GetType())
    End Function

    Public Shared Function GetFormInstance(ByRef _form As Form) As Form
        If Not FormManager.Exists(_form) Then
            Return Nothing
        End If

        Return FormManager._table.Item(_form.GetType())
    End Function

End Class
Avatar billede ncp Nybegynder
25. marts 2005 - 19:05 #10
Ganske perfekt! :D
- smider du ikke et svar ?
Avatar billede burningice Nybegynder
25. marts 2005 - 19:27 #11
:) svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester