none
zur Runtime erstellte Form vor dem öffnen schliessen. RRS feed

  • Frage

  • Ich erstelle in meinem Programm zur laufzeit ein Fenster via Button wenn ich den Button nun erneut betätige öffnet es noch ein Fenster egal ob es schon offen ist oder nicht. In von VS2010 vorgegebene Forms passiert das nicht ich finde aber nicht herraus warum das so ist entweder übersehe ich das im code oder verstehe den hintergrund nicht.

     

    Public Sub ReportForm()
      Try
       Dim LZform As New Form
       LZform.Icon = My.Resources.favicon
       Dim CRV As New CrystalDecisions.Windows.Forms.CrystalReportViewer
    
       With LZform
        .MinimumSize = New Size(600, 400)
        .Size = New Size(600, 400)
        .Show()
       End With
       LZform.Controls.Add(CRV)
    
       With CRV
        .Dock = DockStyle.Fill
        .Zoom(100)
        ' .DisplayGroupTree = False
        .ShowRefreshButton = False
        .ShowCloseButton = False
        .ShowGroupTreeButton = True
        .ShowParameterPanelButton = False
        .Visible = True
       End With
    '
    'meine code usw. hier
    '
      End Try
     End Sub
    

    Wie kann ich in diesem fall das vorher Prüfen ob das Fenster offen oder nicht ist.

     


    Montag, 15. August 2011 11:59

Antworten

  • Hallo,

    da Du jedesmal eine neue Formularinstanz erstellst, wird konsequenterweise ein neues Formular erzeugt.

    Um das zu verhindern:
    Speichere die LZForm Variable auf Klassenebene.
    Ein Formular solltest nur erstellen, wenn es noch nicht erzeugt wurde (Nothing).
    Ist das Formular bereits vorhanden, kannst Du es mit Activate in den Vordergrund holen.
    Um mitzubekommen, ob das Formular zwischenzeitlich vom Anwender geschlossen wurde,
    abbonniere das FormClosed-Ereignis. und setze LZForm auf Nothing.

    Show sollte zudem erst ausgeführt werden, wenn Du alle Steuerelemente platziert hast,
    sonst "zappelt" der Bildschirmaufbau schon mal.

    Das Ganze angedeutet:

    Private LZForm As Form
    
    Public Sub ReportForm()
      If LZForm Is Nothing Then
        ' Neues Formular erzeugen
        LZForm = New Form()
        AddHandler LZForm.FormClosed, AddressOf LZForm_FormClosed
    
        ' ... weitere Initialisierung 
    
        ' Erst ganz zum Schluss Show()
        LZForm.Show()
      Else
        ' Vorhandenes Formular aktivieren
        LZForm.Activate()
      End If
    End Sub
    
    Private Sub LZForm_FormClosed(sender As Object, e As FormClosedEventArgs)
      ' Beim nächsten Aufruf neues Formular erstellen
      RemoveHandler Me.LZForm.FormClosed, AddressOf LZForm_FormClosed
      Me.LZForm = Nothing
    End Sub
    

    Gruß Elmar

    Montag, 15. August 2011 12:22
    Beantworter

Alle Antworten

  • Hallo,

    da Du jedesmal eine neue Formularinstanz erstellst, wird konsequenterweise ein neues Formular erzeugt.

    Um das zu verhindern:
    Speichere die LZForm Variable auf Klassenebene.
    Ein Formular solltest nur erstellen, wenn es noch nicht erzeugt wurde (Nothing).
    Ist das Formular bereits vorhanden, kannst Du es mit Activate in den Vordergrund holen.
    Um mitzubekommen, ob das Formular zwischenzeitlich vom Anwender geschlossen wurde,
    abbonniere das FormClosed-Ereignis. und setze LZForm auf Nothing.

    Show sollte zudem erst ausgeführt werden, wenn Du alle Steuerelemente platziert hast,
    sonst "zappelt" der Bildschirmaufbau schon mal.

    Das Ganze angedeutet:

    Private LZForm As Form
    
    Public Sub ReportForm()
      If LZForm Is Nothing Then
        ' Neues Formular erzeugen
        LZForm = New Form()
        AddHandler LZForm.FormClosed, AddressOf LZForm_FormClosed
    
        ' ... weitere Initialisierung 
    
        ' Erst ganz zum Schluss Show()
        LZForm.Show()
      Else
        ' Vorhandenes Formular aktivieren
        LZForm.Activate()
      End If
    End Sub
    
    Private Sub LZForm_FormClosed(sender As Object, e As FormClosedEventArgs)
      ' Beim nächsten Aufruf neues Formular erstellen
      RemoveHandler Me.LZForm.FormClosed, AddressOf LZForm_FormClosed
      Me.LZForm = Nothing
    End Sub
    

    Gruß Elmar

    Montag, 15. August 2011 12:22
    Beantworter
  • Super genau das habe ich gesucht. Nun habe ich auch meinen fehler erkannt habe das NEW falsch gesetzt bei meinen versuchen.
    Dienstag, 16. August 2011 08:07