{"id":55000675,"date":"2009-08-01T00:00:00","date_gmt":"2020-05-22T22:16:36","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=675"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Formularposition_speichern_und_wiederherstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/","title":{"rendered":"Formularposition speichern und wiederherstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wer seinen Anwendern eine Freude machen m&ouml;chte, liefert ihnen eine ergonomische Anwendung. Ein Faktor, der dazu beitragen kann, ist das Speichern der Position und Gr&ouml;&szlig;e von Elementen der Benutzeroberfl&auml;che und das Wiederherstellen beim erneuten &Ouml;ffnen. Wie das f&uuml;r Formulare funktioniert, zeigt dieser Beitrag.<\/b><\/p>\n<p>Die Position eines Formulars speichern und wiederherstellen Das kann Access doch wohl allein, oder Nein, kann es nicht: Bestenfalls erscheint das Anwendungsfenster von Access an der gleichen Stelle, wenn Sie es erneut &ouml;ffnen, aber bei der Anzeige von Formularen m&uuml;ssen Sie schon nachhelfen.<\/p>\n<p>Zun&auml;chst einmal gibt es verschiedene M&ouml;glichkeiten, die Position eines Formulars grunds&auml;tzlich zu beeinflussen.<\/p>\n<p>Die einfachste Variante ist das Einstellen der Eigenschaft <b>Automatisch zentrieren <\/b>auf den Wert <b>Ja<\/b>, was dazu f&uuml;hrt, dass Access ein Formular nach dem &Ouml;ffnen in der Mitte des Access-Fensters anzeigt (siehe Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/FormularpositionSpeichern-web-images\/pic001_opt.jpeg\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Einstellen der Eigenschaft Automatisch zentrieren<\/span><\/b><\/p>\n<p>Eine weitere M&ouml;glichkeit ist das Maximieren des Formulars gleich nach dem &Ouml;ffnen. Dazu legen Sie eine Prozedur f&uuml;r das Ereignis <b>Beim &Ouml;ffnen <\/b>des Formulars an, die wie folgt aussieht:<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    DoCmd.Maximize\r\n    End Sub<\/pre>\n<p>Das ist nicht immer praktisch, weil die Maximierung sich auch auf alle anderen, nicht als modaler Dialog ge&ouml;ffneten Elemente wie Formulare und Berichte auswirkt.<\/p>\n<p>Auch die Position und die Gr&ouml;&szlig;e l&auml;sst sich mit einer einzigen Anweisung festlegen, und zwar mit der <b>DoCmd<\/b>-Methode <b>MoveSize<\/b>. Die folgende Anweisung etwa schiebt das Formular nach ganz links oben und macht es 5.000 x 5.000 Twips gro&szlig;:<\/p>\n<pre>DoCmd.MoveSize 0,0,5000,5000<\/pre>\n<p>Wenn Sie einen oder mehrere Werte nicht angeben, beh&auml;lt das Formular die bestehende Position in x- oder y-Richtung beziehungsweise die Breite oder H&ouml;he bei. F&uuml;r viele F&auml;lle mag es schon ausreichen, wenn ein neues Fenster nicht irgendwo am Rand erscheint, sondern zentriert oder an einer fest definierten Position angezeigt wird. Das gilt insbesondere f&uuml;r modale Dialoge, deren besondere Eigenschaft es ja ist, keinen Zugriff auf die &uuml;brigen Elemente der Benutzeroberfl&auml;che zuzulassen, bis das Formular wieder geschlossen wurde.<\/p>\n<p>Ganz anders sieht es aus, wenn Sie ein Formular mit erg&auml;nzenden Informationen zum aktuell angezeigten Formular &ouml;ffnen oder wenn ein weiteres Formular Funktionen liefert, die sich auf bereits ge&ouml;ffnete Elemente der Benutzeroberfl&auml;che auswirken.<\/p>\n<p>Ein Beispiel ist ein Dialog, der von einem Formular in der Datenblattansicht aus ge&ouml;ffnet wird und einige Suchfelder f&uuml;r dieses Formular anbietet. Dieses m&ouml;chte der Benutzer vermutlich so anordnen, dass es die f&uuml;r ihn interessanten Spalten oder Zeilen des Suchergebnisses nicht verdeckt.<\/p>\n<p>Wenn der Benutzer diese Suche oft verwendet, m&ouml;chte er das Formular sicher nicht jedes Mal wieder verschieben, sodass Sie ihm diese Arbeit abnehmen und die Position beim Schlie&szlig;en speichern und sie beim n&auml;chsten &Ouml;ffnen wiederherstellen.<\/p>\n<p>Der Einfachheit halber verwenden wir zu Beispielzwecken einfache Formulare ohne Anzeige von Daten und ohne Suchfunktion. Das erste Formular namens <b>frmBasis <\/b>ruft dabei das zweite Formular <b>frmOnTop <\/b>auf und stellt dieses so ein, dass es immer &uuml;ber dem ersten Formular angezeigt wird, auch wenn es den Fokus verliert. Alle Grundlagen dazu finden Sie im Beitrag <b>Formulare im Blickpunkt <\/b>(Shortlink 654).<\/p>\n<p><b>Ganz oben<\/b><\/p>\n<p>Damit das Formular <b>frmOnTop <\/b>immer &uuml;ber dem aufrufenden Formular <b>frmBasis <\/b>angezeigt wird, der Benutzer aber immer noch auf die Steuerelemente von <b>frmBasis <\/b>zugreifen kann, sind die folgenden Schritte n&ouml;tig:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Stellen Sie die Eigenschaft <b>Popup <\/b>des Formulars <b>frmOnTop <\/b>auf <b>Ja <\/b>ein.<\/li>\n<li class=\"aufz-hlung\">Stellen Sie sicher, dass das Modul <b>mdlOnTop <\/b>sich in der Anwendung befindet.<\/li>\n<li class=\"aufz-hlung\">F&uuml;gen Sie <b>frmBasis <\/b>eine Schaltfl&auml;che hinzu, die das Formular <b>frmOnTop <\/b>mit einer ganz normalen <b>DoCmd.OpenForm<\/b>-Anweisung &ouml;ffnet.<\/li>\n<li class=\"aufz-hlung\">F&uuml;gen Sie <b>frmOnTop <\/b>eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim &Ouml;ffnen <\/b>hinzu und erg&auml;nzen Sie diese wie folgt:<\/li>\n<\/ul>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    SetWindowOnTop Me.hwnd\r\n    End Sub<\/pre>\n<p>Der erste Schritt w&auml;re damit geschafft. Die folgenden Schritte k&ouml;nnten wir zwar auch mit einem ganz normal ge&ouml;ffneten Formular durchf&uuml;hren, aber mit der vorliegenden Konstellation haben Sie gleich die Grundlage f&uuml;r praktische Einsatzzwecke.<\/p>\n<p><b>Position speichern<\/b><\/p>\n<p>Nun soll beim Schlie&szlig;en des Formulars seine Position gespeichert werden. Nur, wohin speichern wir diese Die Antwort ist nicht ganz trivial und h&auml;ngt von den Gegebenheiten ab. Falls es sich um eine Desktop-Anwendung f&uuml;r einzelne Arbeitspl&auml;tze handelt, schreiben wir die Daten einfach in eine lokale Tabelle.<\/p>\n<p>Wenn es sich um eine Frontend-Backend-L&ouml;sung handelt, bei der jeder Benutzer sein eigenes Frontend verwendet, speichern wir die Formularposition in einer Tabelle im Frontend. Eventuell greifen aber auch mehrere Benutzer auf das gleiche Frontend zu und wollen alle individuellen Positionen speichern &#8211; hier werden die Daten am besten in einer Tabelle im Backend abgelegt, die gleichzeitig einen Verweis auf den Benutzer speichert.<\/p>\n<p>Wir halten das Beispiel einfach und gehen von der Einzelplatz-Anwendung und der Speicherung der Positionen in einer einfachen Tabelle aus. Diese hei&szlig;t <b>tblPositionen <\/b>und besitzt die in Bild 2 abgebildeten sechs Felder. Legen Sie au&szlig;erdem einen eindeutigen Index f&uuml;r das Feld <b>Formularname <\/b>fest, um zu verhindern, dass f&uuml;r ein Formular gleich mehrere Positionen gespeichert werden k&ouml;nnen (siehe Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/FormularpositionSpeichern-web-images\/pic002_opt.jpeg\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Diese Tabelle speichert die Formularpositionen<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/FormularpositionSpeichern-web-images\/pic003_opt.jpeg\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Der eindeutige Schl&uuml;ssel verhindert, dass mehr als eine Position je Formular gespeichert wird.<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Die Position soll beim Schlie&szlig;en des Formulars gespeichert werden, also kommt zum Beispiel das Ereignis <b>Beim Schlie&szlig;en <\/b>infrage. F&uuml;gen wir dort also eine Anweisung ein, welche die aktuelle Position des Formulars in einem Datensatz der Tabelle <b>tblFormularpositionen <\/b>speichert.<\/p>\n<p>Uups &#8211; woher bekommt man denn eigentlich die H&ouml;he, Breite, linke und obere Position des Formulars und brauchen wir eigentlich die absoluten Koordinaten oder soll die Formularposition in Abh&auml;ngigkeit von der Position des Access-Fensters gespeichert werden Wir gehen in diesem Fall davon aus, dass wir die Position in Abh&auml;ngigkeit vom Access-Fenster speichern.<\/p>\n<p>Zum besseren Verst&auml;ndnis der nachfolgenden Erl&auml;uterung dient Abb. 4. <b>xA <\/b>und <b>yA <\/b>definieren den Abstand vom linken und oberen Bildschirmrand zum linken und oberen Rand des Access-Fensters. <b>xF <\/b>und <b>yF <\/b>entsprechen der Entfernung des Formulars vom linken und oberen Bildschirmrand. Aus der Differenz von <b>xF <\/b>und <b>xA <\/b>erhalten Sie die Position des Formulars innerhalb des Access-Fensters. <b>dx <\/b>und <b>dy <\/b>geben die H&ouml;he und Breite des Formulars an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/FormularpositionSpeichern-web-images\/pic004_opt.jpeg\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Wichtige Ma&szlig;e beim Speichern und Wiederherstellen von Formularpositionen<\/span><\/b><\/p>\n<p>Um diese Informationen mit geeigneten API-Funktionen zu erhalten, brauchen wir einen speziellen Datentyp, der &uuml;ber die API-Funktionen gef&uuml;llt wird. Diese enth&auml;lt den Abstand des linken Fensterrands zum linken Bildschirmrand, den Abstand des oberen Fensterrands zum oberen Bildschirmrand, den Abstand des rechten Bildschirmrands zum linken Fensterrand und den Abstand des unteren Fensterrands zum oberen Bildschirmrand:<\/p>\n<pre>Private Type Rect\r\nLeft As Long\r\nTop As Long\r\nRight As Long\r\nBottom As Long\r\nEnd Type<\/pre>\n<p>Die API-Funktion <b>GetWindowRect <\/b>erwartet ein Handle auf das Fenster, dessen Koordinaten Sie in diese Struktur einlesen m&ouml;chten. Ein Handle ist schlicht und einfach ein <b>Long<\/b>-Wert von Windows, der das Fenster identifiziert.<\/p>\n<pre>Private Declare Function GetWindowRect\r\nLib \"USER32\" (ByVal hWnd As Long, lpRect As Rect) As Long<\/pre>\n<p>Das Handle f&uuml;r ein Formular erhalten Sie &uuml;ber seine Eigenschaft <b>hWnd<\/b>, das Handle f&uuml;r das Access-Fenster &uuml;ber den Ausdruck <b>Application.hWndAccessApp<\/b>.<\/p>\n<p>Die API-Funktion <b>GetWindowRect <\/b>und den Datentyp <b>Rect <\/b>deklarieren Sie am besten in einem Standardmodul (in der Beispieldatenbank <b>mdlFormularposition<\/b>).<\/p>\n<p>Wenn Sie die API-Funktion aufrufen m&ouml;chten, m&uuml;ssen Sie zuvor eine Variable deklarieren, die den Typ des oben festgelegten Datentyps <b>Rect <\/b>aufweist, und diese nebst dem Fensterhandle der API-Funktion als Parameter &uuml;bergeben. Diese f&uuml;llt dann die Variable des Typs <b>Rect<\/b>, sodass Sie anschlie&szlig;end &uuml;ber die Eigenschaften <b>Left<\/b>, <b>Right<\/b>, <b>Top <\/b>und <b>Bottom <\/b>auf die Koordinaten zugreifen k&ouml;nnen.<\/p>\n<p>Die Funktion aus Listing 1 erwartet einen Verweis auf ein Formular (<b>frm<\/b>) und vier weitere Parameter zum Zur&uuml;ckgeben der Position (<b>sngLeft<\/b>, <b>sngTop<\/b>) und der Gr&ouml;&szlig;e (<b>sngWidth<\/b>, <b>sngHeight<\/b>) des Formulars.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: Diese Funktion holt die Koordinaten des angegebenen Formulars.<\/p>\n<pre>Public Function GetFormPosition(frm As Form, sngLeft As Single, _\r\n    sngTop As Single, sngWidth As Single, sngHeight As Single)\r\n    Dim rectForm As Rect\r\n    Dim rectParent As Rect\r\n    GetWindowRect frm.hWnd, rectForm\r\n    GetWindowRect Application.hWndAccessApp, rectParent\r\n    sngLeft = rectForm.Left - rectParent.Left\r\n    sngTop = rectForm.Top - rectParent.Top\r\n    sngWidth = rectForm.Right - rectParent.Left - rectForm.Left\r\n    sngHeight = rectForm.Bottom - rectParent.Top - rectForm.Top\r\nEnd Function<\/pre>\n<p>Sie deklariert zwei <b>Rect<\/b>-Variablen zum Speichern der Koordinaten des &uuml;bergebenen Formulars sowie des Accessfensters. Diese werden durch zwei Aufrufe der API-Funktion <b>GetWindowRect <\/b>gef&uuml;llt. Die letzten vier Zeilen berechnen aus den so gewonnenen Werten die Informationen in der gew&uuml;nschten Form, n&auml;mlich als linken und oberen Abstand des Formulars vom Access-Rand und als H&ouml;he und Breite des Formulars.<\/p>\n<p>Die Funktion <b>GetFormPosition <\/b>soll beim Schlie&szlig;en des Formulars in der Ereignisprozedur <b>Form_Close <\/b>aufgerufen und ausgewertet werden. Die entsprechende Prozedur finden Sie in Listing 2. Die Routine deklariert die vier f&uuml;r den Aufruf der Funktion <b>GetFormPosition <\/b>notwendigen Variablen <b>sngLeft<\/b>, <b>sngTop<\/b>, <b>sngWidth <\/b>und <b>sngHeight <\/b>und l&auml;sst diese dann f&uuml;llen.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Beim &Ouml;ffnen eines Formulars soll dessen gespeicherte Position und Gr&ouml;&szlig;e wiederhergestellt werden.<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim sngLeft As Single\r\n    Dim sngTop As Single\r\n    Dim sngWidth As Single\r\n    Dim sngHeight As Single\r\n    SetWindowOnTop Me.hwnd\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(\"SELECT * FROM tblFormularpositionen WHERE Formularname = &euro;&euro; _\r\n    &amp; Me.Name &amp; \"&euro;&#153;&euro;, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n        sngLeft = rst!PositionLinks\r\n        sngTop = rst!PositionOben\r\n        sngWidth = rst!PositionBreite\r\n        sngHeight = rst!PositionHoehe\r\n        mdlFormularposition.SetFormPosition Me, sngLeft, sngTop, sngWidth, sngHeight\r\n        rst.MoveNext\r\n    Loop\r\n    End Sub<\/pre>\n<p>Der Rest ist kein Hexenwerk mehr: Die erste SQL-Execute-Anweisung versucht, einen neuen Datensatz in der Tabelle <b>tblFormularpositionen <\/b>anzulegen. Gelingt dies nicht, weil bereits ein Datensatz mit dem gleichen Formularnamen vorhanden ist, l&ouml;st dies Fehler <b>3022 <\/b>aus &#8211; und der wird gleich im Anschluss abgefangen, indem die Routine die Daten des vorhandenen Datensatzes f&uuml;r das Formular &uuml;berschreibt.<\/p>\n<p>Der Inhalt der Tabelle <b>tblFormularpositionen<\/b> sieht nun beispielsweise wie in Bild 5 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_04\/FormularpositionSpeichern-web-images\/pic005_opt.jpeg\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Die Tabelle tblFormularpositionen mit den Daten eines Formulars<\/span><\/b><\/p>\n<p><b>Position wiederherstellen<\/b><\/p>\n<p>Beim Wiederherstellen der Position auf Basis der in der Tabelle gespeicherten Daten kommt die Ereignisprozedur <b>Beim &Ouml;ffnen <\/b>des Formulars zum Einsatz. Diese sieht wie in Listing 3 aus und &ouml;ffnet zun&auml;chst eine Datensatzgruppe auf Basis der Tabelle <b>tblFormularpositionen<\/b>. Die <b>WHERE<\/b>-Bedingung sorgt daf&uuml;r, dass die Datensatzgruppe als einzigen Datensatz den f&uuml;r den angegebenen Formularnamen gespeicherten liefert. Gegebenenfalls bleibt die Datensatzgruppe auch leer &#8211; in diesem Fall sind Position und Gr&ouml;&szlig;e zuvor noch nicht gespeichert worden.<\/p>\n<p>Falls die Routine einen passenden Datensatz findet, schreibt sie die Koordinaten und die Breite in die Variablen <b>sngTop<\/b>, <b>sngLeft<\/b>, <b>sngWidth <\/b>und <b>sngHeight <\/b>und &uuml;bergibt diese nebst einem Objektverweis auf sich selbst (also das aufrufende Formular) an die Funktion <b>SetFormPosition<\/b>. Diese deklariert wiederum eine <b>Rect<\/b>-Variable f&uuml;r die Koordinaten des Access-Fensters und f&uuml;llt diese &uuml;ber deren Handle. Der Grund f&uuml;r die Notwendigkeit dieser Koordinaten liegt in der API-Funktion <b>MoveWindow<\/b>, die wir f&uuml;r das Positionieren und Anpassen des Formulars verwenden. Diese Funktion erwartet die absoluten Werte, also jeweils vom oberen und linken Bildschirmrand aus gemessen. Die Funktion wird so deklariert (in einer Zeile):<\/p>\n<pre>Private Declare Function MoveWindow\r\nLib \"USER32\" (ByVal hWnd As Long,\r\nByVal X As Long, ByVal Y As Long,\r\nByVal nWidth As Long,\r\nByVal nHeight As Long,\r\nByVal bRepaint As Long) As Long<\/pre>\n<p>Nach dem Ermitteln der Koordinaten des Access-Fensters modifiziert die Routine <b>SetFormPosition <\/b>zun&auml;chst die aus der Tabelle <b>tblFormularpositionen <\/b>eingelesenen und von der Ereignisprozedur <b>Form_Load <\/b>&uuml;bergebenen Variablen <b>sngLeft<\/b>, <b>sngTop<\/b>, <b>sngWidth <\/b>und <b>sngHeight<\/b>, sodass aus diesen relativen Werten, die sich auf die Position innerhalb des Access-Fensters beziehen, absolute Angaben in Bezug auf den Bildschirm werden. Erst dann kann die Funktion <b>SetFormPosition <\/b>die API-Routine <b>MoveWindow <\/b>mit den ben&ouml;tigten Informationen f&uuml;ttern und so die alte Position und Gr&ouml;&szlig;e des Formulars wiederherstellen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Das Speichern der Position von Formularen mag auf den ersten Blick unn&ouml;tiger Aufwand sein, aber wenn Sie die n&ouml;tigen Routinen einmal in die Anwendung eingearbeitet haben, lohnt es sich: Der Benutzer wird es Ihnen danken, wenn er entsprechende Formulare nicht jedes Mal neu hin- und herschieben oder deren Gr&ouml;&szlig;e anpassen muss.<\/p>\n<p>In bestimmten F&auml;llen kann es sinnvoll sein, die absolute Position des Formulars zu speichern. Diese Anforderung k&ouml;nnen Sie durch kleine &auml;nderungen an der vorliegenden L&ouml;sung leicht umsetzen. In der Beispieldatenbank finden Sie diese Umsetzung bereits: Sie k&ouml;nnen dort &uuml;ber die Variable <b>bolAbsolut<\/b> in der Ereignisprozedur <b>Beim Schlie&szlig;en <\/b>festlegen, ob die absoluten oder relativen Werte gespeichert werden sollen.<\/p>\n<table>\n<tbody>\n<tr>\n<td>\n<p class=\"kastentabelleheader\">Listing 2: Ermitteln und speichern der Koordinaten beim Schlie&szlig;en des Formulars<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre>Private Sub Form_Close()\r\n    Dim db As DAO.Database\r\n    Dim sngLeft As Single\r\n    Dim sngTop As Single\r\n    Dim sngWidth As Single\r\n    Dim sngHeight As Single\r\n    mdlFormularposition.GetFormPosition Me, sngLeft, sngTop, sngWidth, sngHeight\r\n    Set db = CurrentDb\r\n    On Error Resume Next\r\n    db.Execute \"INSERT INTO tblFormularpositionen(Formularname, PositionLinks, PositionOben,\r\n    PositionBreite, PositionHoehe) VALUES(&euro;&euro; &amp; Me.Name &amp; \"&euro;&#153;, \" &amp; sngLeft &amp; \", \" &amp; sngTop\r\n    &amp; \", \" &amp; sngWidth &amp; \", \" &amp; sngHeight &amp; \")&euro;, dbFailOnError\r\n    If Err.Number = 3022 Then\r\n        db.Execute \"UPDATE tblFormularpositionen SET PositionLinks = \" &amp; sngLeft &amp; \", PositionOben\r\n        = \" &amp; sngTop &amp; \", PositionBreite = \" &amp; sngWidth &amp; \", PositionHoehe = \" &amp; sngHeight\r\n        &amp; \" WHERE Formularname = &euro;&euro; &amp; Me.Name &amp; \"&euro;&#153;&euro;, dbFailOnError\r\n    End If\r\n    End Sub<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<tbody>\n<tr>\n<td>\n<p class=\"kastentabelleheader\">Listing 4: F&uuml;r das Einstellen von Position und Gr&ouml;&szlig;e ist diese Routine verantwortlich.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<pre>Public Function SetFormPosition(frm As Form, sngLeft As Single, sngTop As Single, _\r\n    sngWidth As Single, sngHeight As Single)\r\n    Dim rectParent As Rect\r\n    GetWindowRect Application.hWndAccessApp, rectParent\r\n    sngLeft = sngLeft + rectParent.Left\r\n    sngTop = sngTop + rectParent.Top\r\n    sngWidth = sngWidth + rectParent.Left\r\n    sngHeight = sngHeight + rectParent.Top\r\n    MoveWindow frm.hWnd, sngLeft, sngTop, sngWidth, sngHeight, True\r\nEnd Function<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormularpositionSpeichern.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{046E7E8F-87B9-4A15-929D-C158705C52E1}\/aiu_675.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wer seinen Anwendern eine Freude machen m&ouml;chte, liefert ihnen eine ergonomische Anwendung. Ein Faktor, der zu einer solchen beitragen kann, ist das Speichern der Position und Gr&ouml;&szlig;e von Elementen der Benutzeroberfl&auml;che und das Wiederherstellen beim erneuten &Ouml;ffnen. Wie das f&uuml;r ein Formular funktioniert, zeigt dieser Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662009,66042009,44000028,44000023],"tags":[],"class_list":["post-55000675","post","type-post","status-publish","format-standard","hentry","category-662009","category-66042009","category-Ergonomie_und_Benutzeroberflaeche","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Formularposition speichern und wiederherstellen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formularposition speichern und wiederherstellen\" \/>\n<meta property=\"og:description\" content=\"Wer seinen Anwendern eine Freude machen m&ouml;chte, liefert ihnen eine ergonomische Anwendung. Ein Faktor, der zu einer solchen beitragen kann, ist das Speichern der Position und Gr&ouml;&szlig;e von Elementen der Benutzeroberfl&auml;che und das Wiederherstellen beim erneuten &Ouml;ffnen. Wie das f&uuml;r ein Formular funktioniert, zeigt dieser Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:16:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Formularposition speichern und wiederherstellen\",\"datePublished\":\"2020-05-22T22:16:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/\"},\"wordCount\":2003,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2042c2b1f7b648418fa0f254b53ffb6e\",\"articleSection\":[\"2009\",\"4\\\/2009\",\"Ergonomie und Benutzeroberfl\u00e4che\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/\",\"name\":\"Formularposition speichern und wiederherstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2042c2b1f7b648418fa0f254b53ffb6e\",\"datePublished\":\"2020-05-22T22:16:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2042c2b1f7b648418fa0f254b53ffb6e\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2042c2b1f7b648418fa0f254b53ffb6e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularposition_speichern_und_wiederherstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formularposition speichern und wiederherstellen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Formularposition speichern und wiederherstellen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Formularposition speichern und wiederherstellen","og_description":"Wer seinen Anwendern eine Freude machen m&ouml;chte, liefert ihnen eine ergonomische Anwendung. Ein Faktor, der zu einer solchen beitragen kann, ist das Speichern der Position und Gr&ouml;&szlig;e von Elementen der Benutzeroberfl&auml;che und das Wiederherstellen beim erneuten &Ouml;ffnen. Wie das f&uuml;r ein Formular funktioniert, zeigt dieser Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:16:36+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Formularposition speichern und wiederherstellen","datePublished":"2020-05-22T22:16:36+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/"},"wordCount":2003,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e","articleSection":["2009","4\/2009","Ergonomie und Benutzeroberfl\u00e4che","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/","url":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/","name":"Formularposition speichern und wiederherstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e","datePublished":"2020-05-22T22:16:36+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2042c2b1f7b648418fa0f254b53ffb6e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Formularposition_speichern_und_wiederherstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Formularposition speichern und wiederherstellen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000675","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000675"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000675\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}