vb-Zentrum
Fenstertricks
http://www.vb-zentrum.de/tip_fenster.html

© 2023 vb-Zentrum

0001 Always on top

Mit der folgenden Funktion läßt sich eine Form dauerhaft im Vodergrund halten. Diese Eigenschaft kann für die entsprechende Form mit dem Parameter True / False ein- bzw. ausgeschaltet werden. Um die Funktion zu nutzen muß die API-Deklaration "SetWindowPos" im Quellcode eingebunden sein:

' Deklaration:
Private Declare Function SetWindowPos Lib "user32" ( _
        ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
        ByVal X As Long, ByVal Y As Long, 
        ByVal W As Long, ByVal H As Long, _
        ByVal wFlags As Long) As Long
Const conHwndTopmost = -1
Const conHwndNoTopmost = -2
 
' Setzt eine Form permanent in den Vordergrung (prop=True)
' prop=False schaltet diese Eigenschaft wieder aus
Public Sub always_on_top(ByVal hwnd As Long, ByVal prop As Boolean)
  Dim mode As Long
  
  mode = IIf(prop, conHwndTopmost , conHwndNoTopmost ) ' Effekt ein- / ausschalten
  SetWindowPos hwnd, mode, 0, 0, 0, 0, &H13
End Sub
 
' Aufruf:
always_on_top (Me.hwnd, True)

Autor: ralf schlegel
Stand: 10/2004

Nach oben

0002 Windows Sidebar (transparente Formen)

Windows Vista Sidebar im Eigenbau
ist ein Beispielprojekt, dass demonstriert wie mit einfachen Mitteln, eine Sidebar ähnlich der Windows Vista Sidebar entwickelt werden kann. Das Formular wird am rechten Bildschirmrand ausgerichtet. Mit Hilfe einer API-Funktion wird die Höhe der Startleiste ermittelt und das Formular bis zur Startleiste verlängert. Das gesamte Formular ist dynamisch aufgebaut, so dass sich die Sidebar der Höhe der Startleiste automatisch anpasst sobald diese verändert wird.

Ausserdem unterstützt das Beispiel den Transparenzeffekt für Formen! Das Handling in ist einem eigenständigen Modul abgelegt und kann und darf so direkt für eigene Anwendungen genutzt werden...

   0002_VB_Sidebar.zip

Autor: gino dola
Stand: 10/2009

Nach oben

0003 Ein Form (Fenster) richtig öffnen - die Falle des Form_Initialize!

Drei Ereignisse werden durchlaufen, wenn ein Form das erste Mal durch "Form1.Show" geöffnet wird, und zwar in der Reihenfolge:

1.) Private Sub Form_Initialize()
2.) Private Sub Form_Load()
3.) Private Sub Form_Activate()

Vielen Programmierern ist das genaue Verhalten dieser Ereignisse nur bedingt klar, deshalb hier ein Versuch zur Klärung:

1.) Das Ereignis Form_Initialize dient, wie der Name schon sagt, ausschließlich zum Initialisieren. Verwenden Sie diesen Abschnitt z.B. zum Laden von DLLs, Öffnen von Log-Files, oder Datenbanken, Initialisieren von Variablen oder Klassen.
Hier darf kein Code stehen, der das Form selbst anspricht, oder gar darin enthaltene Controls manipuliert!
Vermeiden Sie unbedingt Code, wie ListView1.Width = Me.ScaleWidth in Form_Initialize, sonst passiert folgendes:

  • das Initialisierungsereignis wird aufgerufen und Zeile für Zeile abgearbeitet
  • trifft das Programm auf die Zeile "ListView1.Width = Me.ScaleWidth", so wird unmittelbar das Form_Load Ereignis ausgelöst, um die Werte zu holen, die bei der Initialisierung noch gar nicht bekannt sind! Erst wenn die Form_Load Prozedur komplett durchlaufen ist, kehrt das Programm zu Form_Initialize zurück und arbeitet dort die weiteren Programmzeilen ab.
    Das war sicher nicht in Ihrem Sinn, oder?
  • Wird ein Form durch die Anweisung Unload Me geschlossen und später wieder geöffnet, so wird das Ereignis Form_Initialize nicht durchlaufen, es sei denn Sie zerstören das Form nach dem Schließen durch "Set FormName = Nothing" im Form_Unload Ereignis, oder im Quellcode außerhalb des Forms! Sie können hier also bewußt Einfluss nehmen, ob das Form beim erneuten Öffnen auch neu initialisiert wird, oder nicht.

2.) Das Form_Load Ereignis wird jedesmal beim Öffnen durchlaufen und sollte deshalb hauptsächlich Code zur Gestaltung der Oberfläche und zum Positionieren des Form enthalten. Es wird nicht durchlaufen, wenn ein Form durch Form1.Hide nur ausgeblendet wurde und später durch Form1.Show wieder sichtbar wird.

3.) Das Form_Activate Ereignis wird jedesmal ausgelöst, wenn ein Form erneut den Focus erhält. D.h.: wenn der Benutzer von einem Form zum nächsten wechselt, indem er es mit der Maus anklickt. Dazu muß das Form also nicht geschlossen gewesen sein.

Autor: ralf schlegel
Stand: 12/2012

Nach oben

0004 Alle Forms (Fenster) einer Anwendung richtig schließen

Um alle Fenster einer Anwendung zu schließen, in der Regel wird dies zum Beenden der Anwendung benötigt, bedient man sich der Forms.Count Eigenschaft. Diese enthält die Anzahl aller geöffneten Forms (auch die eventuell unsichtbaren) als 0-basierter Zähler; d.h.: die Anzahl der tatsächlichen geladenen Forms entspricht Forms.Count - 1

Wichtig zu wissen: die Forms Colletion selbst ist eine flache Struktur: das Hauptform ihrer Anwendung muß nicht zwingend Forms(0) sein! Im QueryUnload Ereignis Ihres Hauptfensters schließen Sie also alle Forms in einer Schleife mit Ausnahme der eigenen, denn diese wird am Ende des Ereignisses ohnehin geschlossen. Sollten Sie dennoch das eigene Fenster innerhalb des Ereignisses durch Unload Forms(i) schließen, so kann es zum Programmabsturz kommen, wenn Sie in Ihrem Programm Benutzersteuerelemente oder SubClassing verwenden. Da hilft dann auch kein On Error Resume Next weiter, denn das QueryUnload Ereignis wird u. U. recursiv aufgerufen!

Stellen Sie also sicher, dass Sie sich nicht selbst den Boden unter den Füßen wegziehen:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Dim i As Long
  
  ' weitere Anweisungen
  ' .
  ' .
  ' .
  
  For i = Forms.Count - 1 To 0 Step -1
    If Forms(i).hWnd <> Me.hWnd Then Unload Forms(i)
  Next i
End Sub

Ergänzung:
Beim Beenden einer Form werden drei Ereignisse durchlaufen.
Hier noch einmal die Reihenfolge der Ereignisse (als Pendant zum Tipp Nr. 0003):

1.) Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
2.) Private Sub Form_Unload(Cancel As Integer)
3.) Private Sub Form_Terminate()

Rufen Sie in Form_Unload und Form_Terminate keine Eigenschaften der implementierten Controls oder des Form selbst auf, da das Form sonst wieder geladen wird; hier darf nur noch reiner Basiccode stehen, z.B. das Schließen einer Dateinbank oder das Löschen von temporären Dateien. In der Regel können Sie dies aber alles im Ereignis Form_QueryUnload erledigen.

Autor: ralf schlegel
Stand: 12/2012

Nach oben