Alle offenen Fenster schliessen

DrMueller

Erfahrenes Mitglied
Hallo mal wieder,
folgendes Problem: Ich programmiere ein Modul zu einem Hauptprogramm. Jetzt hätte ich gern, dass, falls das Hauptprogramm sich schliesst, alle meine Nebenfenster auch schliessen.
Den Event, bevor das Hauptprogramm schliesst, habe ich, aber wie kann ich testen, welche Fenster offen sind und diese ggf. schliessen?
Ist das überhaupt möglich?
 
Du könntest über die Forms-Auflistung alle Forms abfragen und die, die geladen sind mittels Unload schließen. Das ganze kommt am besten in das Form_Unload-Event deines Hauptforms und wird damit beim Schließen derselben ausgeführt.

Links dazu:
Forms-Auflistung
Form-Objekt


Der Doc!
 
Welche Forms sind denn in diesem Forms-Objekt? Egal, wieviele ich offen habe, ich bekomme bei Count immer 0, auch wenn ich jedes einzeln abfragen will, bekomme ich kein Form zurück, obwohl viele offen sind.
 
Das machst Du so:

Code:
Private Sub Form_Unload(Cancel As Integer)
   Dim frm As Form
   For Each frm In Forms
      Unload frm.Name
   Next
   
End Sub

Viele Grüsse
ronaldh
 
es gäbe auch die ganz heftige Methode mit shell ("taskkill /IM der-name-deines-programms.exe")...
wird allerding nicht wirklich so gern gesehen. Außerdem funktioniert es nicht auf allen Betriebsystemen...


m.f.G.: flyandshot
 
Forms wäre schon gut, aber wenn ich z.B. vor dem Loginwechsel ein Forms.count mache, zeigts mir 0 an, obwohl ich das offene Fenster ja selber sehe. Darum wollte ich wissen, wann genau ein Fenster als offen zählt.
 
Mit folgender Prozedur werden alle geladenen Formen angezeigt:

Code:
Public Sub Test()
   Dim frm As Form
   For Each frm In Forms
      Debug.Print frm.Name
   Next
   Debug.Print Forms.Count
End Sub

Es werden alle Formen angezeigt, die im Speicher geladen sind, ob sichtbar oder nicht.

Das heißt, wenn Du z.B. in Deinem Code irgendwo drinstehen hast:
Code:
     form2.Caption = "Hallo"
dann ist Form2 geladen, ob sie nun sichtbar ist, oder nicht. Oder wenn Du eine Form mt der Hide-Funktion (anstatt Unload) verlässt, ist sie zwar nicht mehr zu sehen, aber trotzdem im Speicher geladen.

Grüsse
ronaldh
 
Die Sache scheint kompelxer zu sein als ich dachte, da in Forms nur die Fenster des aktiven Dlls sind. Das Prob ist natürlich, das so meine Fenster nicht angezeigt werden, da die beiden Events vom Hauptprogramm, worauf ich keinen Zugriff habe, ausgeführt werden. Darum gibts auch immer 0 offene Forms zurück. Kann man das übergreifend machen?
 
Hallo,

Du kannst den Titel eines Fensters abfragen mit einer API-Funktion:

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

Public Function IsProgramActive(PrgFinm As String) As Boolean
    Dim WinWnd As Long
    WinWnd = FindWindow(vbNullString, PrgFinm)
    If WinWnd = 0 Then
      IsProgramActive = False
   Else
      IsProgramActive = True
   End If

End Function

Wenn Du diesen Code in ein Modul packst, und dann die Funktion mit der Überschrift aufrufst, bekommst Du True oder False zurück. Dazu muss jedoch die ganze Titelleiste des abzufragenden Programms abgefragt werden, z.B.

IsProgramActive("tutorials.de - Antworten - Windows Internet Explorer")

Hilft das weiter?

Grüsse
ronaldh
 

Neue Beiträge

Zurück