Rubrik: Oberfläche · Fenster | VB-Versionen: VB4, VB5, VB6 | 26.08.03 |
Fensterpositionen synchronisieren Synchronisieren der jeweiligen Positionen von mehreren Fenstern einer Applikation. | ||
Autor: Guido Eisenbeis | Bewertung: | Views: 16.620 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wenn man eine Applikation mit mehreren Fenstern hat und möchte, dass alle möglichst "ordentlich" an der gleichen Position geöffnet werden, gibt es mehrere Möglichkeiten: z.B. bei allen die gleiche StarUp-Position festlegen, dann öffnet aber das nächste Fenster immer an dieser Stelle (z.B. Bildschirmmitte) auch wenn das vorherige verschoben wurde. Oder man speichert die letzte Fensterposition mit "Left" und "Top" ab. Das funktioniert ganz gut, es sei denn, die Fenster sind unterschiedlich gross und/oder eines ist Rahmenlos ... . Und dann?
Dann nehmen wir zur Bestimmung der Fensterposition halt nicht "Left" und "Top", sondern die jeweilige Fenstermitte und übergeben diese. Ich habe die Punkte "MiddleLeft" und "MittelTop" genannt (sinnvoll wäre auch "Middle_X" und "Middle_Y"), und das Ganze in eine schöne, einfach zu handhabende Prozedur gepackt, so wie wir das alle lieben. Am Schluss wird die Mittel-Position noch in die Registry abgespeichert, so dass sie uns beim nächsten Start wieder zur Verfügung stehen.
Der Aufruf erfolgt mit folgender Syntax:
Call OpenNextWindow(OpenUpWindow As Form, _ CloseDownWindow As Form, _ Optional Hide_CloseDownWindow As Boolean, _ Optional Unload_CloseDownWindow As Boolean, _ Optional bShowModal As Boolean = False)
Die Argumente bedeuten:
- OpenUpWindow: das zu öffnende Fenster
- CloseDownWindow: das zu schliessende Fenster
- Hide_CloseDownWindow: zu schliessendes Fenster verstecken (Optional)
- Unload_CloseDownWindow: zu schliessendes Fenster entladen (Optional)
- bShowModal: Neues Fenster modal anzeigen
Beispiel:
Call OpenNextWindow(Form2, Me, False, True)
Wirkung:
Das nächste Fenster (Form2) wird geöffnet, das derzeitige Fenster wird entladen.
Hinweis:
Die Fenster können bei dieser Lösung auch zur Laufzeit verändert (kleiner oder gösser gezogen) werden, es funktioniert immer.
Nachfolgenden Code bitte in ein Modul einfügen (basFensterPositionen.bas):
Option Explicit ' Mittlere horizontale Position eines Fensters Public MiddleLeft ' Mittlere vertikale Position eines Fensters Public MiddleTop
' Prozedur zum Synchronisieren ' der Fensterpositionen ' (Wenn ein Fenster geschlossen wird, wird ' das nächste mittig an dieser Position geöffnet) ' ' Aufruf-Beispiel: ' Call OpenNextWindow(Form2, frmMain, True) ' ' Argumente: ' OpenUpWindow: das zu öffnende Fenster ' CloseDownWindow: das zu schliessende Fenster ' Hide_CloseDownWindow: zu schliessendes Fenster ' verstecken (Optional) ' Unload_CloseDownWindow: zu schliessendes Fenster ' entladen (Optional) ' bShowModal: Neues Fenster modal anzeigen Public Sub OpenNextWindow(OpenUpWindow As Form, _ CloseDownWindow As Form, _ Optional Hide_CloseDownWindow As Boolean, _ Optional Unload_CloseDownWindow As Boolean, _ Optional bShowModal As Boolean = False) ' Fenstermitte des zu schliessenden Fensters ' übergeben With CloseDownWindow MiddleLeft = .Left + (.Width / 2) MiddleTop = .Top + (.Height / 2) End With With OpenUpWindow ' zu öffnendes Fenster positionieren .Left = MiddleLeft - (.Width / 2) .Top = MiddleTop - (.Height / 2) ' absichern, dass das zu öffnende Fenster nicht zu weit ' über den Desktoprand gerät. If .Left + .Width - 2000 < 0 Then .Left = -.Width + 2000 If .Top < 0 Then .Top = 0 If .Left + 2000 > Screen.Width Then .Left = Screen.Width - 2000 If .Top + 2000 > Screen.Height Then .Top = Screen.Height - 2000 ' zu öffnendes Fenster öffnen/zeigen If bShowModal Then .Show vbModal Else .Show ' zu schliessendes Fenster verstecken oder entladen If Hide_CloseDownWindow = True Then CloseDownWindow.Hide If Unload_CloseDownWindow = True Then Unload CloseDownWindow End If End With End Sub
' Prüfen, ob eine bestimmte Form geladen und ' sichtbar ist Public Function FormIsVisible(sName As String) As Boolean Dim oForm As Form For Each oForm In Forms If oForm.Name = sName Then FormIsVisible = (oForm.Visible = True) Exit For End If Next End Function
Beispiel:
Benötigt werden 3 Formen (frmMain, Form2, Form3) mit jeweils einen CommandButton (Command1).
Code in Form 1 (frmMain):
Private Sub Form_Load() ' Position des Hauptfensters aus der Registry einlesen MiddleLeft = GetSetting("FensterPosBeispiel", "Position", _ "MiddleLeft", Screen.Width / 2) MiddleTop = GetSetting("FensterPosBeispiel", "Position", _ "MiddleTop", Screen.Height / 2) ' Position zuweisen frmMain.Left = MiddleLeft - (frmMain.Width / 2) frmMain.Top = MiddleTop - (frmMain.Height / 2) End Sub
Private Sub Command1_Click() ' Nächstes Fenster über Button aufrufen Call OpenNextWindow(Form2, frmMain, True) End Sub
Private Sub Form_Unload(Cancel As Integer) ' Position ermitteln MiddleLeft = frmMain.Left + (frmMain.Width / 2) MiddleTop = frmMain.Top + (frmMain.Height / 2) ' Position des Hauptfensters in die Registry schreiben SaveSetting "FensterPosBeispiel", "Position", "MiddleLeft", MiddleLeft SaveSetting "FensterPosBeispiel", "Position", "MiddleTop", MiddleTop End Sub
Code in Form 2:
' Form 3 über Button aufrufen Private Sub Command1_Click() Call OpenNextWindow(Form3, Form2, , True) End Sub
' Form 3 beim Entladen von Form2 aufrufen Private Sub Form_Unload(Cancel As Integer) If FormIsVisible("Form3") = False Then Call OpenNextWindow(Form3, Form2) End If End Sub
Code in Form 3:
' Form 2 über Button aufrufen Private Sub Command1_Click() Call OpenNextWindow(Form2, Form3, , True) End Sub
' Hauptfenster beim Entladen von Form 3 aufrufen Private Sub Form_Unload(Cancel As Integer) If FormIsVisible("Form2") = False Then Call OpenNextWindow(frmMain, Form3, , True) End If End Sub