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:
Beispiel: Call OpenNextWindow(Form2, Me, False, True) Wirkung: Hinweis: 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: 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 Dieser Tipp wurde bereits 16.799 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats Oktober 2024 Heinz Prelle Firewall-Status unter WinXP/Vista prüfen Das Beispiel prüft, ob die Firewall unter Windows XP/Vista eingeschaltet ist oder nicht. Zudem wird eine Abfrage durchgeführt ob es sich bei dem zugrundeliegenden Betriebssystem um Windows XP/Vista handelt oder nicht. TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |