vb.net Form öffnen ohne das die Instanz verloren geht?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Verwende besser ein NotifyIcon, anstelle einer zweiten Form. Das ist dann eine Sprechblase (oder heißt das Ding seit Windows Vist / 7 anders?), die auch geklickt werden kann. Außerdem lässt sich die Anzeigedauer einstellen und man kann zur Not in der Taskleiste auf ein Minisymbol des Programms klicken, was das Gleiche bewirkt.

Hier findest du alles zum OnClick Event des NotifyIcon.

Und hier die eigentliche NotifyIcon-Klasse.

Bei beiden kannst du den Beispielcode von C# auf VB.Net ändern.

Woher ich das weiß:Hobby
gabrixl 
Fragesteller
 14.12.2018, 15:53

Kenne NotfiyIcons, leider funktionieren die BalloonToolTips auf den Rechner meines Geschäftes nicht (Irgend eine Domäne Einstellung...). Da die Benachrichtigung über eine Form viel professioneller aussieht und ich es somit für mein Programm optimieren kann, möchte ich es so oder so machen. Hast du nicht zufällig eine Idee wie man das lösen könnte?

0
RBM1992  15.12.2018, 12:19
@gabrixl

Wenn sich die Form mit den Benachrichtigungen (ich nenne sie einfach Form2), wenn ich das richtig verstehe, beim Klick schließen soll, wäre es am besten so:

Private Sub Form2_Click(sender As Object, e As EventArgs)
  ' neues Objekt von Form3 erzeugen und anzeigen
  Dim frm As New Form3()
  frm.Show()
  ' das Me kann hier auch ausgelassen werden
  Me.Close()
End Sub

Im OnClose-Event der Form3 solltest du Form2 wieder anzeigen:

Private Sub Form3_Closing(sender As Object, e As EventArgs)
  ' neues Objekt von Form2 erzeugen und anzeigen
  Dim frm As New Form2()
  frm.Show()
  ' das Me kann hier auch ausgelassen werden
  Me.Close()
End Sub
1
gabrixl 
Fragesteller
 17.12.2018, 08:22
@RBM1992

Sehr gute Idee, klappt aber leider nicht... Vielleicht gehe ich die Sache auch komplett falsch an, hier die Ausgangslage:

Das Programm hat die Funktion ein Kopierverlauf zu erstellen, welcher dann bei klick vom Mausrad in Form eines ContextMenu auftaucht. (Also kein richtiges GUI) Nun hat das Programm aber die Unterfunktion das man Reminder hinzufügen kann. Dazu habe ich noch ein GUI (fAddReminder). Nun will ich über eine dritte Form (fMsg) dem Benutzer Benachrichtigungen zeigen (wie erwähnt funktionieren BalloonToolTips nicht, deshalb die Form). Damit das "Kopierverlaufs-ContextMenu" immer reagiert, habe ich einen FileSystemWatcher in der Benachrichtigungsform, damit ich einfach eine Datei erstellen kann, der FileSystemWatcher wird dann in der fMsg darauf reagieren, der MSG_SHOW sub wird aufgerufen, bleibt dann in dem DoEvents Loop* und somit kann Benachrichtigung und Kopierverlauf unabhängig von einander dargestellt werden.

DoEvents Loop*

    Do Until closeMe
      Application.DoEvents()
    Loop

Nun zum Problem:

Der Benutzer soll die Benachrichtigung anklicken können und die fAddReminder Form soll mit allen Einstellungen des Reminders geöffnet werden. Somit muss ich ja theoretisch aus dem DoEvents Loop* die fAddReminder Form öffnen. Habe das ganze mit folgenden Ansätzen probiert:

  • VisibleChanged Event, bei welchem auf eine Variable "openReminder" geprüft wird, falls dieser True ist, wird wieder eine Datei erstellt, auf welche der FIleSystemWatcher (in Benachrichtigungsform) reagiert und dann den Sub() fAddReminder.ShowMe() aufgerufen wird. - Fazit: Form erscheint tot (Auch mit Invoke etc.)
  • Genau dasselbe wie oben: Nachdem der DoEvents Loop* verlassen wurde, wird eine Datei erstellt - selbes Resultat
  • Evenfalls nach dem DoEvents Loop* wird der Sub() aufgerufen - selbes Resultat

Wie schaffe ich es, dass das Programm (der Mainthread) die Methode aufruft? Bin komplett überfordert, es muss doch eine Lösung geben?

Kann schlecht dem ganzen Code poste, sind rund 1'500 Zeilen..

Vielen Dank für deine Bemühungen!

0