vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: Oberfläche · Fenster   |   VB-Versionen: VB4, VB5, VB626.08.03
Fensterpositionen synchronisieren

Synchronisieren der jeweiligen Positionen von mehreren Fenstern einer Applikation.

Autor:   Guido EisenbeisBewertung:     [ Jetzt bewerten ]Views:  12.817 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 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

Dieser Tipp wurde bereits 12.817 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel