Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Tile Horizontally/Vertically
zurück: Konstanten und Enums-kleine Helfer für übersichtlichen Code weiter: Bedingte Compilierung Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
26. Okt 2010, 18:12
Rufname:

Tile Horizontally/Vertically - Tile Horizontally/Vertically

Nach oben
       Version: Office 2007

Hallo zusammen,

in Access gibt es ja auch die Möglichkeit, alle geöffneten Fenster mit "Tile Vertically" bzw. "Tile Horizontally" in der einen oder anderen Richtung auf dem Bildschirm zu verteilen.

Man kann diese Funktionen auch von VBA aus aufrufen, mit
Code:
    DoCmd.RunCommand acCmdTileVertically
    DoCmd.RunCommand acCmdTileHorizontally
Leider haben diese Funktionen ein paar entscheidende Nachteile:
  • wenn man mehr als drei Fenster offen hat, entscheiden sich die Funktionen selbst, wie sie die Fenster aneinanderkleben - vorbei ist's mit dem "Horizontal" oder "Vertikal" (es muß bei Access-Funktionen anscheinend immer einen Pferdefuß geben...)
  • wenn die Rahmen-Einstellung des Formulars nicht mehr "Sizeable" ist, funktionieren beide nicht mehr richtig oder versagen im Fall von "None" gleich ganz.
  • es darf auch kein Popup-Formular sein, diese werden überhaupt nicht berücksichtigt.
Darum hier mal eine Funktion, die je nach Wunsch die Fenster horizontal oder vertikal verteilt, ohne wenn und aber - ENTWEDER vertikal ODER horizontal.

Der Einfachheit halber wird ein und dasselbe Formular fünfmal als Objekt geöffnet und in die Collection "colForms" geschoben. Wenn man das in einer eigenen Access-Datenbank testen möchte, muß man nur die Konstante cFormName mit dem Wert "frmDatasheetTest" auf ein eigenes Formular biegen und ebenso in "OpenForms" die Zeile:
Code:
    Set objForm = New Form_frmDatasheetTest
entsprechend anpassen.

Voraussetzung für das Formular ist, daß es Code enthält (also mindestens die Eigenschaft "HasModule" eingestellt hat), sonst kann es nicht auf diese Weise instantiiert werden und es darf lediglich nicht modal sein, da solche Fenster die weitere Codeausführung sperren würden.

Das praktische hierbei ist, daß nur die Fenster in der Collection verteilt werden, man kann also auch eine Sammlung unterschiedlicher Formularfenster in die Collection schieben statt wie hier im Beispiel nur von einem Formular. Alle anderen vielleicht auch noch geöffneten Formulare bleiben unberücksichtigt.

Ist nur ein Formular in der Collection, dann kann man die Funktion auch als Maximize-Funktion einsetzen, die eben auch mit Popups funktioniert.

Die Bildschirmgrößenberechnung habe ich aus der InnerWidth und InnerHeight des "Messfensters" genommen, hierbei wird immer das erste Fenster in der Collection kurz zum Messen herangezogen, in dem es maximiert wird. Das Ergebnis ist je nach Rahmenbreite daher nicht immer ganz der komplette Bildschirm, so aber auf jeden Fall immer komplett sichtbar. "WindowWidth/-Height" ist dagegen wieder zu groß, daher lieber diese Methode.

Den folgenden Text einfach in ein neues Standardmodul kopieren, das Formular wie oben angegeben auswechseln und dann mit "OpenForms" im VBA-Direktfenster die Formulare öffnen. Danach kann man mit:
Code:
    TileCollection colForms,enmTileMode_Vertically
' bzw.
    TileCollection colForms,enmTileMode_Horizontally
die Formulare senkrecht oder waagerecht anordnen (im Fall von als Popup definierten Formularen sogar über den Applikationsrand hinaus).

Die Ribbons und die Navigationsleiste werden automatisch ausgeblendet und mit "CloseForms" werden beide wieder eingeblendet und alle Formulare geschlossen.

Die besten Ergebnisse erzielt man, wenn die Formulare in der Collection auf "randlos" eingestellt sind.
Code:
Option Compare Database
Option Explicit

Public Const cFormName = "frmDatasheetTest"

Public colForms As Collection
Public Enum EnmTileMode
    enmTileMode_Vertically
    enmTileMode_Horizontally
End Enum


Public Sub OpenForms()
    Dim objForm As Access.Form
    Dim i As Long
   
    HideNavigation
    On Error Resume Next
    DoCmd.Close acForm, cFormName
    'DoCmd.RunCommand acCmdAppMaximize
    Set colForms = New Collection
    For i = 1 To 5
        Set objForm = New Form_frmDatasheetTest
        objForm.Visible = True
        colForms.Add objForm, "k" & i
    Next i
    DoCmd.ShowToolbar "Ribbon", acToolbarNo
End Sub

Public Sub CloseForms()
    Dim objForm As Access.Form
    Dim i As Long
   
    Set colForms = New Collection
    For Each objForm In colForms
        objForm.Visible = False
        Set objForm = Nothing
    Next objForm
    For Each objForm In colForms
        colForms.Remove 1
    Next objForm
    DoCmd.ShowToolbar "Ribbon", acToolbarYes
    ShowNavigation
End Sub

Public Sub HideNavigation()
    On Error Resume Next
    DoCmd.SelectObject acTable, , True
    DoCmd.RunCommand acCmdWindowHide
    DoCmd.SelectObject acQuery, , True
    DoCmd.RunCommand acCmdWindowHide
    DoCmd.SelectObject acForm, , True
    DoCmd.RunCommand acCmdWindowHide
    DoCmd.SelectObject acReport, , True
    DoCmd.RunCommand acCmdWindowHide
    DoCmd.SelectObject acMacro, , True
    DoCmd.RunCommand acCmdWindowHide
    DoCmd.SelectObject acModule, , True
    DoCmd.RunCommand acCmdWindowHide
End Sub

Public Sub ShowNavigation()
    DoCmd.SelectObject acTable, , True
End Sub

Public Sub TileCollection(ByRef col As Collection, _
                          Optional ByVal intTileMode As EnmTileMode = enmTileMode_Vertically)
On Error GoTo TileCollection_Error
    Dim objForm As Form_frmDatasheetTest
    Dim lngScreenWidth As Long
    Dim lngScreenHeight As Long
    Dim lngFormWidth As Long
    Dim lngFormHeight As Long
    Dim lngLeft As Long
    Dim lngTop As Long
   
    Application.Echo False
    If Not col Is Nothing Then
        If col.Count > 0 Then
            ' Alle Formulare unsichtbar schalten
            For Each objForm In col
                objForm.Visible = False
            Next objForm
            Set objForm = col(1)
            ' Die erste Form in der Collection sichtbar machen
            With objForm
                .Visible = True
                .SetFocus
                ' ...maximieren...
                DoCmd.Maximize
                ' ...und ausmessen...
                lngScreenWidth = .InsideWidth
                lngScreenHeight = .InsideHeight
                ' ...und wiederherstellen...
                DoCmd.Restore
            End With
            ' Je nach Tile Mode
            If intTileMode = enmTileMode_Vertically Then
                ' Formularbreite durch Anzahl Formulare teilen
                lngFormWidth = lngScreenWidth / col.Count
                lngLeft = 0
              Else
                ' oder Formularhöhe durch Anzahl Formulare teilen
                lngFormHeight = lngScreenHeight / col.Count
                lngTop = 0
            End If
            ' Und dann allen Formularen in der Collection zuweisen.
            For Each objForm In col
                With objForm
                    .Visible = True
                    .SetFocus
                    If intTileMode = enmTileMode_Vertically Then
                        DoCmd.MoveSize lngLeft, 0, lngFormWidth, lngScreenHeight
                        lngLeft = lngLeft + lngFormWidth
                      Else
                        DoCmd.MoveSize 0, lngTop, lngScreenWidth, lngFormHeight
                        lngTop = lngTop + lngFormHeight
                    End If
                End With
            Next objForm
        End If
    End If
TileCollection_Exit:
    Application.Echo True
    Exit Sub
TileCollection_Error:
    Application.Echo True
    Select Case Err
      Case Else
        MsgBox Err.Number & " - " & Err.Description
        Resume TileCollection_Exit
    End Select
End Sub
Getestet mit Access 2007, sollte aber in anderen Versionen genauso funktionieren.

Viel Spaß beim Fensterverteilen...Smile

Christian
Willi Wipp
Moderator


Verfasst am:
09. Apr 2011, 07:24
Rufname:
Wohnort: Raum Wiesbaden


AW: Tile Horizontally/Vertically - AW: Tile Horizontally/Vertically

Nach oben
       Version: Office 2007

{Dieser Beitrag nimmt das Thema aus den unbeantworteten Themen heraus}
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Expression Web Forum