Anordnung des Benutzers beibehalten
Lassen Sie jeden Benutzer ein Formular so vorfinden, wie er es verlassen hat – oder bewahren Sie die Anordnung an einem eigenen Ort auf, etwa in einer Einstellungstabelle auf dem Server, oder bieten Sie eine Schaltfläche an, die den Entwurf wiederherstellt.
Voraussetzungen: WKL Forms Object Library 1.28 oder höher.
Lösungsüberblick
Ohne Code merken sich beide Layout-Steuerelemente die Anordnung je Windows-Benutzer (AutoSaveLayout, standardmäßig
eingeschaltet) unter einem Schlüssel (LayoutKey, Standardwert „Formularname.Steuerelementname“). Layout gibt die
Anordnung als Text zurück und übernimmt sie, für Code, der sie anderswo speichert; Reset stellt den Entwurf wieder her
und entfernt die gemerkte Anordnung.
WklGrid und WklTreeList tun dasselbe für ihre Spalten: Breiten, Reihenfolge, ausgeblendete Spalten, Bänder,
Sortierung, Gruppierung, die Spaltenfilter eines Rasters und die Höhe seiner Detailansichten – mit denselben
Eigenschaften, derselben Tabelle und denselben Regeln.
Umsetzung
Für den Standardfall ist nichts zu tun: Jede Änderung durch den Benutzer oder durch Code wird sofort gespeichert und ist beim nächsten Öffnen des Formulars wieder da. Eine Schaltfläche für den Entwurf:
Private Sub cmdDefaultLayout_Click()
Me!Layout1.Object.Reset ' also removes the user's row in USysWklLayout
End Sub
Dasselbe für die Spalten eines Rasters:
Private Sub cmdDefaultColumns_Click()
Me!Grid1.Object.Reset
End Sub
Zwei Formulare, die sich eine Anordnung teilen, oder derselbe Formularname in zwei Dokumenten mit UserForms erhalten einen eigenen Schlüssel (Designerseite Verhalten, Feld Schlüssel, oder per Code, bevor das Formular angezeigt wird):
Private Sub Form_Open(Cancel As Integer)
Me!Layout1.Object.LayoutKey = "Verwaltung.Hauptlayout"
End Sub
Eigene Speicherung statt der eingebauten – schalten Sie AutoSaveLayout aus, und bewahren Sie den Text auf:
Private Sub Form_Open(Cancel As Integer)
With Me!Layout1.Object
.AutoSaveLayout = False
.Layout = Nz(DLookup("Layouttext", "tblBenutzereinstellungen", "Benutzer = '" & Environ("USERNAME") & "' AND Formular = 'frmVerwaltung'"), "")
End With
End Sub
Private Sub Layout1_AfterLayoutChange(ByVal Pane As String)
SaveUserSetting "frmVerwaltung", Me!Layout1.Object.Layout ' your own procedure
End Sub
Hinweise
- In Access kommt die Anordnung in die lokale Tabelle
USysWklLayoutder Datenbank, die das Formular enthält, eine Zeile je Windows-Benutzer (DOMÄNE\Name) und Schlüssel; das PräfixUSysmacht sie zu einer ausgeblendeten Systemtabelle. Ein Frontend, das auf jeden Arbeitsplatz kopiert wird, hält die Anordnungen lokal; ein auf einem Terminalserver gemeinsam genutztes hält die Benutzer auseinander. Bei UserForms von Excel und Word kommt sie nachHKEY_CURRENT_USER\Software\The White Knight Labs\Access Framework\Layouts. - Eine Anordnung, die dem Entwurf entspricht, wird nicht gespeichert:
ResetundRefreshhinterlassen nichts. - Ein per Code gesetztes
Layout, bevor das Formular angezeigt wird, hat Vorrang vor der gemerkten Anordnung; Code, der Anordnungen anderswo aufbewahrt, wird nie überschrieben. - Der Text ist JSON (
{"format":"WklDockLayout",...}oder{"format":"WklSplitter",...}); ein Text des jeweils anderen Steuerelements oder ein unlesbarer Text löstwkeInvalidValueaus. Bereiche, die in einem älteren Text fehlen, behalten ihren Entwurf; ein gespeicherter Text übersteht also Änderungen am Formular. - Ein schreibgeschütztes Frontend oder ein abgelehnter Schreibvorgang beeinträchtigt das Formular nicht; die Anordnung wird dann einfach nicht gemerkt.
- Raster und Strukturlisten speichern nur Abweichungen. Eine Spalte, die der Benutzer nie angefasst hat, folgt einer späteren Änderung des Entwurfs; aus dem Entwurf entfernte Spalten werden ignoriert, und neue erscheinen wie entworfen. Ihr Entwurf ist das, was das Steuerelement bei der ersten Anzeige zeigt – mit den Änderungen, die
Form_Loadper Code vorgenommen hat. Auswahl, Suchtext und aufgeklappte Datensätze werden nicht gemerkt. - Detailansichten eines Rasters haben keine eigene Anordnung; ihre Höhe gehört zur Anordnung des Rasters.
Verwandte Themen
- API-Referenz (Englisch): WklDockLayout.Layout, WklSplitter.Layout, WklGrid, WklTreeList:
AutoSaveLayout,LayoutKey,Reset