Announcement

Collapse
No announcement yet.

Formulare in Hashtable speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Formulare in Hashtable speichern

    Hallo zusammen,
    ich habe verschiedenste Popup-Formulare, die immer wieder aufgerufen werden und aus XML-Dateien generiert werden. Um jetzt nicht jedesmal die XMLs neu zu lesen, bin ich hingegangen und habe die Formulare in einer Hashtable gespeichert, wo mein Programm sie sich herausfischt, wenn sie schon vorhanden sind, anderfalls wird das XML gelesen.

    Nun öffne ich Formular1, das XML wird gelesen, Formular wird in Hashtable gespeichert, alles funktioniert.
    Jetzt öffne ich Formular2, das XML wird gelesen, Formular wird in Hashtable gespeichert, alles funktioniert.
    Nun öffne ich wieder Formular1, das Formular wird aus Hashtable gelesen. Hier funktioniert nun keiner der Buttons mehr.

    Die Eventhandler werden fehlerfrei generiert, das konnte ich schon nachvollziehen. Dennoch sind die Buttons tot.

    Wenn ich den Teil mit der Hashtable weglasse und die Formulare jedes mal neu aus dem XML lese, funktioniert alles ohne Probleme.

    Hat jemand eine Idee, woran das liegen kann?

    [highlight=vb.net]
    Public Shared Function Create(ByVal PFName As String, ByVal Parent As Object, ByVal typ As Type, Optional ByVal objektArt As String = Nothing) As FrmMyProjectBearbeiten
    Dim fBearbeiten As FrmMyProjectBearbeiten = Nothing
    Dim popName As String = PFName

    If Not objektArt Is Nothing Then
    Dim popBearbeiten As FrmMyProjectBearbeiten = typ.InvokeMember(typ.FullName, BindingFlags.CreateInstance, Nothing, New Object, Nothing)
    popName = popBearbeiten.CreatePopName(objektArt, PFName)
    'popBearbeiten = Nothing '## Speicherbeich der Instanz wieder freigeben, da diese hier nicht mehr benötigt wird.
    End If

    '' gibt es schon ein Hashtable? Wenn "Nein" wird eines erzeugt
    If htblGeoeffneteDialoge Is Nothing Then
    htblGeoeffneteDialoge = New Hashtable()
    End If
    fBearbeiten = htblGeoeffneteDialoge.Item(popName)

    ' wenn das Popup noch nicht im Hashtable existiert, wird es neu angelegt
    If fBearbeiten Is Nothing Then
    fBearbeiten = typ.InvokeMember(typ.FullName, BindingFlags.CreateInstance, Nothing, New Object, Nothing)
    F_ReadMSKDatei(popName, fBearbeiten) '## Formularstruktur aus XML lesen
    fBearbeiten.Width = fBearbeiten.AllgProps.DefWidth
    fBearbeiten.Height = fBearbeiten.AllgProps.DefHeight
    fBearbeiten.Text = F_GetDialogName(popName)
    htblGeoeffneteDialoge.Add(popName, fBearbeiten)
    End If
    If Not Parent Is Nothing Then fBearbeiten.Herkunft = Parent
    Return fBearbeiten
    End Function
    [/highlight]

  • #2
    Hallo,

    wie wird das Formular "geschlossen" ?
    Ich meine, irgendwie sollte nur 'visible = false' gesetzt werden, sonst verschwindet vielleicht die WindowProc des Formulars ?
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Die Formulare werden über Close() geschlossen.
      Wenn ich immer das selbe Formular aufrufe, funktioniert es mit dem Hashtable. Erst wenn es mehrere sind tritt das Problem auf.

      Comment


      • #4
        Aber nimmt Close() das Formular nicht komplett aus dem Speicher ? Und der erneute Aufruf findet nur zufällig alles wieder an der originalen Stelle ..

        Hmm, dann müßte es aber irgenwie Schutzverletzungen hageln.

        Trotzdem, subjektiv "gefühlt" sind die Zeiger in der Hashtabelle nach Close() nicht mehr so richtig gültig ?
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          hmm...das ist ein Argument. Danke für die Denkanstöße, werd mir das ganze mal durch den Kopf gehen lassen.

          Comment


          • #6
            Wenn ich die Formulare über Visible=False oder Me.Hide vor dem Benutzer verberge, tritt das selbe Problem auf

            Comment

            Working...
            X