{"id":55000324,"date":"2017-02-01T00:00:00","date_gmt":"2020-01-24T15:59:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=324"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Flying_Controls","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Flying_Controls.html","title":{"rendered":"Flying Controls"},"content":{"rendered":"<p class='introduction'>Fliegende Steuerelemente &uuml;blicherweise positionieren Sie Textboxen, Labels und Kombinationsfelder fest im Entwurf eines Formulars und &auml;ndern an der ergonomischen Gestalt zur Laufzeit nichts mehr. Doch manchmal gibt es gute Gr&uuml;nde f&uuml;r ein dynamisches Layout, bei dem Steuerelemente ihren angestammten Platz verlassen. Einige Anregungen dazu liefert dieser Beitrag.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels finden Sie in der Datenbank <b>1607_FlyingCtls.accdb<\/b>.<\/p>\n<h2>Steuerelemente verschieben<\/h2>\n<p>F&uuml;r die Position jedes Steuerelements sind dessen Eigenschaften <b>Links<\/b> und <b>Oben<\/b> im Formular- oder Berichtsentwurf verantwortlich, die Sie entweder durch Ziehen der Elemente mit der Maus &auml;ndern, oder durch einen direkten Eintrag im Eigenschaftenblatt. Gleiches gilt f&uuml;r die <b>Breite<\/b> und <b>H&ouml;he<\/b> eines <b>Controls<\/b>. <\/p>\n<p>Unter VBA greifen Sie auf diese Eigenschaften &uuml;ber die Properties <b>Left<\/b> und <b>Top<\/b> zu, sowie &uuml;ber <b>Width<\/b> und <b>Height<\/b>. Diese Methoden sind nicht schreibgesch&uuml;tzt, so dass Sie &uuml;ber entsprechende Wertzuweisungen die Positionen zur Laufzeit &auml;ndern k&ouml;nnen. Ein Textfeld <b>txtName<\/b> bringen Sie etwa so in eine andere Position und auf neue Abmessungen:<\/p>\n<pre>txtName.<span style=\"color:blue;\">Left<\/span> = 300\r\ntxtName.Top = 120\r\ntxtName.Width = 2100\r\ntxtName.Height = 270<\/pre>\n<p>Das Ganze k&ouml;nnen Sie auch &uuml;ber einen <b>With-Block<\/b> auf das <b>Control<\/b> umsetzen und setzen besser noch den Container <b>Me<\/b> des Steuerelements voran:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> Me!txtName\r\n   .<span style=\"color:blue;\">Left<\/span> = 300\r\n   .Top = 120\r\n   .Width = 2100\r\n   .Height = 270\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Die Einheit dieser Werte ist unter Access immer <b>Twips<\/b>. 15 <b>Twips<\/b> entsprechen in der Regel 15 Pixeln und ein Zentimeter entspricht etwa 567 <b>Twips<\/b>. Die Positionsangaben beziehen sich grunds&auml;tzlich auf die linke obere Ecke des Steuerelements als seinen Ursprung und sind, entgegen der Aussage in der Access-Hilfe,  relativ zum jeweiligen Container. Das kann der Detailbereich sein, aber auch der Kopf- oder Fu&szlig;bereich. Bei Berichten kommen noch weitere Containerfl&auml;chen hinzu.<\/p>\n<p>Eine Alternative zum direkten Zuweisen der Werte an <b>Left<\/b> und <b>Top<\/b> stellt die <b>Move<\/b>-Methode dar, die allen Steuerelementen zueigen ist. Mit ihr k&ouml;nnen Sie die vier Eigenschaften auf einen Schlag einstellen:<\/p>\n<pre>Me!txtName.Move 300, 120, 2100, 270<\/pre>\n<p>Alle vier Angaben sind optional. Sie k&ouml;nnen also mit dieser Methode etwa nur Position oder nur die Abmessungen &auml;ndern, indem Sie die anderen Parameter weglassen:<\/p>\n<pre>Me!txtName.Move 300,120\r\nMe!txtName.Move , , 2100, 270<\/pre>\n<p>Schlie&szlig;lich gibt es mit der <b>DoCmd<\/b>-Anweisung <b>MoveSize<\/b> noch eine weitere Methode, die in ihren Parametern der <b>Move<\/b>-Methode der Controls entspricht. Sie wirkt allerdings nicht nur auf Steuerelemente, sondern genauso auf Formularfenster. Das macht zur Bedingung, dass das zu positionierende Element zum Zeitpunkt ihres Aufrufs den Fokus besitzt:<\/p>\n<pre>Me!txtName.SetFocus\r\nDoCmd.MoveSize 300, 120, 2100, 270<\/pre>\n<p>Auch hier sind alle Parameter optional. Die Methode entkoppelt die Anweisung vom Steuerelement und eignet sich daher nur f&uuml;r F&auml;lle, in denen das <b>Control<\/b>-Objekt ungewiss ist.<\/p>\n<h2>Fliegende Steuerelemente<\/h2>\n<p>Das weitgehend sinnfreie Formular <b>frmFlying<\/b> der Beispieldatenbank demonstriert die Verschiebeeffekte zur Laufzeit (Bild 1). In einer VBA-Schleife werden &uuml;ber den Timer des auf Adressdatens&auml;tzen basierenden Formulars s&auml;mtliche Steuerelemente fortlaufend verschoben. Damit sie nicht &uuml;ber den Rand hinaus geraten, was Access ohnehin mit einer Fehlermeldung quittieren w&uuml;rde, reflektieren sie quasi billardm&auml;&szlig;ig von den Seiten. Den Code, der beim Starten des Formulars zun&auml;chst ausgef&uuml;hrt wird, finden Sie in Listing 1. Er ist auf den ersten Blick nicht selbsterkl&auml;rend.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/frmFlying.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/frmFlying.png\" alt=\"Das Formular frmFlying zeigt in der Gegend herumfliegende Steuerelemente\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Das Formular frmFlying zeigt in der Gegend herumfliegende Steuerelemente<\/p>\n<p>Modulweit gelten die Variablen <b>colCtl<\/b>  (<b>Collection<\/b>-Objekt) und das Array <b>arrXY<\/b>. Die <b>Collection<\/b> versammelt indiziert die Namen aller Controls des Formulars, <b>arrXY<\/b> ist zweidimensional und speichert deren Positionen. Die <b>For-Each-<\/b>Schleife durchl&auml;uft alle Steuerelemente &uuml;ber die Iteratorvariable <b>ctl<\/b>. Das k&ouml;nnen Textboxen, Comboboxen oder Labels sein. In <b>colCtl<\/b> werden per <b>Add<\/b>-Methode die Indizes (<b>i<\/b>) der Controls aufgenommen, wobei als Schl&uuml;ssel jeweils der Steuerelementname herh&auml;lt. Das Array <b>arrXY<\/b> wird &uuml;ber <b>ReDim<\/b> in der zweiten Dimension auf die Zahl der Steuerelemente dimensioniert (<b>Controls.Count<\/b>) und andererseits auf <b>1<\/b> in der ersten Dimension, was bedeutet, dass zu jedem Array-Element zwei Werte abgespeichert werden k&ouml;nnen: ein <b>X<\/b>&#8211; und ein <b>Y<\/b>-Wert f&uuml;r die Positionsverschiebungen. Die <b>Collection<\/b> dient dazu, um sp&auml;ter aus einem Steuerelementnamen seinen Index f&uuml;r <b>arrXY<\/b> bestimmen zu k&ouml;nnen. Au&szlig;erdem wird das Array mit <b>X<\/b>&#8211; und <b>Y<\/b>-Verschiebefaktoren vorgef&uuml;llt, die sich aus Zufallszahlen (<b>Rnd<\/b>) ergeben.  Der Ausdruck<\/p>\n<pre>1 + 5 * (Rnd - 0.5)<\/pre>\n<p>bewirkt, dass die Klammer positiv oder negativ wird, wenn <b>Rnd<\/b> gr&ouml;&szlig;er oder kleiner ist, als <b>0.5<\/b>. Der Bereich des Klammerausdrucks betr&auml;gt damit <b>-2.5 <\/b>bis <b>+2.5<\/b>. <\/p>\n<p>Abschlie&szlig;end wird der <b>Timer<\/b> des Formulars aktiviert und auf 20 Millisekunden eingestellt, was zu 50 Wiederholungen pro Sekunde f&uuml;hren sollte. Die Prozedur des <b>Timer-Events<\/b> in Listing 2 nimmt nun die eigentlichen Steuerelementverschiebungen vor und wertet aus, ob sie am Rand des Formulars reflektiert werden sollen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Timer()\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.Control\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     For Each ctl In Me.Controls\r\n         i = colCtl(ctl.Name)\r\n         ctl.<span style=\"color:blue;\">Left<\/span> = ctl.<span style=\"color:blue;\">Left<\/span> + 30 * arrXY(0, i)\r\n         ctl.Top = ctl.Top + 30 * arrXY(1, i)\r\n         \r\n         <span style=\"color:blue;\">If <\/span>(ctl.<span style=\"color:blue;\">Left<\/span> < 91)<span style=\"color:blue;\"> Then<\/span>\r\n             arrXY(0, i) = -arrXY(0, i)\r\n             ctl.<span style=\"color:blue;\">Left<\/span> = 90\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>((ctl.<span style=\"color:blue;\">Left<\/span> - 91) > (Me.InsideWidth - ctl.Width))<span style=\"color:blue;\"> Then<\/span>\r\n             arrXY(0, i) = -arrXY(0, i)\r\n             ctl.<span style=\"color:blue;\">Left<\/span> = Me.InsideWidth - ctl.Width - 90\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>(ctl.Top < 91)<span style=\"color:blue;\"> Then<\/span>\r\n             arrXY(1, i) = -arrXY(1, i)\r\n             ctl.Top = 90\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span>((ctl.Top + 91) > (Me.InsideHeight - ctl.Height))<span style=\"color:blue;\"> Then<\/span>\r\n             arrXY(1, i) = -arrXY(1, i)\r\n             ctl.Top = Me.InsideHeight - ctl.Height - 90\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     DoEvents\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p class='imagetext'>Listing 2: Timer-Prozedur des Formulars zum Bewegen der Steuerelemente<\/p>\n<p>Auch hier wird eine Schleife auf alle Controls des Formulars gesetzt. Aus <b>colCtl<\/b> wird jeweils erst &uuml;ber den Namen der <b>Control<\/b>-Variable <b>ctl<\/b> dessen Index f&uuml;r das Array <b>arrXY<\/b> errechnet und in der Variablen <b>i<\/b> abgespeichert. Dann wird zu <b>Left<\/b> und <b>Top<\/b> des Controls der mit 30 multiplizierte Verschiebewert aus dem Array hinzuaddiert. Je h&ouml;her dieser Multiplikator, desto schneller bewegt sich das Steuerelement zur Laufzeit &uuml;ber das Formular.<\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Access &#091;basics&#093;<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/282\/access-basics?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 400 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000324\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/index.php\/data\/wp\/v2\/posts\/55000324?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/access-basics.de\/data\/wp\/v2\/posts\/55000324\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8d63f6cbe9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fliegende Steuerelemente &uuml;blicherweise positionieren Sie Textboxen, Labels und Kombinationsfelder fest im Entwurf eines Formulars und &auml;ndern an der ergonomischen Gestalt zur Laufzeit nichts mehr. Doch manchmal gibt es gute Gr&uuml;nde f&uuml;r ein dynamisches Layout, bei dem Steuerelemente ihren angestammten Platz verlassen. Einige Anregungen dazu liefert 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":[662016,66072016,44000010],"tags":[],"class_list":["post-55000324","post","type-post","status-publish","format-standard","hentry","category-662016","category-66072016","category-Formulare_mit_VBA_programmieren"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Flying Controls - Access [basics]<\/title>\n<meta name=\"description\" content=\"Fliegende Steuerelemente? \u00dcblicherweise positionieren Sie Textboxen, Labels und Kombinationsfelder fest im Entwurf eines Formulars und \u00e4ndern an der ergonomischen Gestalt zur Laufzeit nichts mehr. Doch manchmal gibt es gute Gr\u00fcnde f\u00fcr ein dynamisches Layout, bei dem Steuerelemente ihren angestammten Platz verlassen. Einige Anregungen dazu liefert dieser Beitrag.\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flying Controls - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"Fliegende Steuerelemente? \u00dcblicherweise positionieren Sie Textboxen, Labels und Kombinationsfelder fest im Entwurf eines Formulars und \u00e4ndern an der ergonomischen Gestalt zur Laufzeit nichts mehr. Doch manchmal gibt es gute Gr\u00fcnde f\u00fcr ein dynamisches Layout, bei dem Steuerelemente ihren angestammten Platz verlassen. Einige Anregungen dazu liefert dieser Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-24T15:59:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/frmFlying.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"14\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/frmFlying.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\",\"name\":\"Flying Controls - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html#primaryimage\"},\"datePublished\":\"2020-01-24T15:59:38+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"description\":\"Fliegende Steuerelemente? \\u00dcblicherweise positionieren Sie Textboxen, Labels und Kombinationsfelder fest im Entwurf eines Formulars und \\u00e4ndern an der ergonomischen Gestalt zur Laufzeit nichts mehr. Doch manchmal gibt es gute Gr\\u00fcnde f\\u00fcr ein dynamisches Layout, bei dem Steuerelemente ihren angestammten Platz verlassen. Einige Anregungen dazu liefert dieser Beitrag.\",\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Flying_Controls.html\",\"name\":\"Flying Controls\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000324"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000324\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}