{"id":55000398,"date":"2023-10-01T00:00:00","date_gmt":"2023-10-19T13:10:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=398"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"twinBASIC_Ereigniseigenschaften_von_Fenstern","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/twinBASIC_Ereigniseigenschaften_von_Fenstern\/","title":{"rendered":"twinBASIC: Ereigniseigenschaften von Fenstern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/bf83cebb747e46d6ad78815bb9460b3c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Artikel twinBASIC: Forms &ouml;ffnen, schlie&szlig;en und mehr (www.vbentwickler.de\/389) haben wir bereits gezeigt, wie wir Fenster beziehungsweise Form-Elemente mit twinBASIC-Befehlen &ouml;ffnen und schlie&szlig;en k&ouml;nnen und welche Varianten es dabei gibt. &Uuml;ber ein wichtiges Feature von Form-Elementen haben wir dabei noch nicht gesprochen: Die sogenannten Ereigniseigenschaften. F&uuml;r diese k&ouml;nnen wir Prozeduren hinterlegen, die beim Ausl&ouml;sen bestimmter Ereignisse des Fensters ausgel&ouml;st werden &#8211; beispielsweise beim &Ouml;ffnen, Schlie&szlig;en, Aktivieren, Deaktivieren oder auch beim &Auml;ndern der Gr&ouml;&szlig;e oder der Position eines Fensters. Und auch wenn der Benutzer das Fenster an einer Stelle anklickt, die keine Steuerelemente enth&auml;lt, wird ein Ereignis ausgel&ouml;st, auf das wir reagieren k&ouml;nnen. Wie wir solche Ereigniseigenschaften nutzen k&ouml;nnen und wir Du diese anlegst, zeigen wir in diesem Artikel.<\/b><\/p>\n<h2>Ereignisprozeduren anlegen<\/h2>\n<p>Im Artikel <b>twinBASIC: Forms &ouml;ffnen, schlie&szlig;en und mehr <\/b>(<b>www.vbentwickler.de\/389<\/b>) haben wir gelernt, wie wir <b>Form<\/b>-Elemente &ouml;ffnen und schlie&szlig;en k&ouml;nnen, aber eine weitere, m&auml;chtige M&ouml;glichkeit haben wir uns noch nicht angesehen. Dabei handelt es sich um die Ereigniseigenschaften der <b>Form<\/b>-Klasse.<\/p>\n<p>Was aber sind Ereignisse, Ereigniseigenschaften und Ereignisprozeduren &uuml;berhaupt?<\/p>\n<p>Ereignisse existieren erst einmal unabh&auml;ngig von Dingen wie Ereigniseigenschaften oder Ereignisprozeduren. Ereignisse geschehen bei der Benutzung &#8211; ein Form-Element wird ge&ouml;ffnet, eine Schaltfl&auml;che wird angeklickt, ein Form-Element verliert den Fokus, weil ein anderes Form-Element diesen erh&auml;lt, der Benutzer klickt mit rechten Maustaste auf einen Bereich, um ein Kontextmen&uuml; anzuzeigen und so weiter.<\/p>\n<p>Hier setzen wir mit Ereigniseigenschaften und Ereignisprozeduren an, um uns diese Ereignisse zu Nutze zu machen. Dabei legen wir im Prinzip fest, dass beim Auftreten eines Ereignisses eine bestimmte Prozedur ausgel&ouml;st werden soll. Das geschieht durch das Erstellen einer Ereignisprozedur und durch das Einstellen einer Ereigniseigenschaft auf den Namen dieser Prozedur (zumindest in twinBASIC &#8211; in anderen Entwicklungsumgebungen gibt es andere Vorgehensweisen).<\/p>\n<p>Dann geschieht Folgendes:<\/p>\n<ul>\n<li>Der Benutzer f&uuml;hrt eine Aktion durch, f&uuml;r die es eine Ereigniseigenschaft gibt, beispielsweise das Anklicken des <b>Form<\/b>-Elements.<\/li>\n<li>Die Anwendung schaut, ob f&uuml;r die entsprechende Ereigniseigenschaft eine Ereignisprozedur hinterlegt ist.<\/li>\n<li>Falls ja, wird diese Ereignisprozedur aufgerufen.<\/li>\n<\/ul>\n<p>Da sich dies sehr theoretisch anh&ouml;rt, schauen wir uns nun in der Praxis an, wie es funktioniert.<\/p>\n<h2>Beispiel f&uuml;r eine Ereignisprozedur<\/h2>\n<p>Wir schauen uns eines der ersten Ereignisse an, das beim &Ouml;ffnen eines Formulars ausgel&ouml;st wird, und das durch die <b>Load<\/b>-Ereigniseigenschaft repr&auml;sentiert wird.<\/p>\n<p>Um eine Ereignisprozedur anzulegen, die durch dieses Ereignis ausgel&ouml;st wird, wechseln wir in der Entwurfsansicht des <b>Form<\/b>-Elements, hier das Fenster <b>frmMain <\/b>des Beispielprojekts, zur zweiten Registerseite des Eigenschaftbereichs. Hier finden wir weiter unten den Eintrag <b>Load<\/b> (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_001.png\" alt=\"Ereignisprozedur anlegen\" width=\"649,627\" height=\"357,6497\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ereignisprozedur anlegen<\/span><\/b><\/p>\n<p>Wir brauchen nur in das Textfeld der Eigenschaft zu klicken, damit twinBASIC automatisch den Code-Editor f&uuml;r das Klassenmodul des <b>Form<\/b>-Elements &ouml;ffnet und dort eine leere Ereignisprozedur f&uuml;r dieses Ereignis hinterlegt. Dieses sieht anschlie&szlig;end wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_002.png\" alt=\"Die neue Ereignisprozedur\" width=\"649,627\" height=\"348,3664\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die neue Ereignisprozedur<\/span><\/b><\/p>\n<h2>Benennung von Ereignisprozeduren<\/h2>\n<p>Der Name der Ereignisprozedur setzt sich standardm&auml;&szlig;ig aus dem Namen des Elements, f&uuml;r welches das Ereignis ausgel&ouml;st wird, einem Unterstrich und dem Namen des Ereignisses zusammen. Im Falle des Form-Elements frmMain ist das jedoch anders &#8211; hier verwendet twinBASIC standardm&auml;&szlig;ig nicht beispielsweise <b>frmMain_Load<\/b>, sondern <b>Form_Load<\/b>. Das ist eine Vereinfachung, weil wir so in allen Klassenformularen von Form-Elementen die gleiche Benennung f&uuml;r solche Ereignisprozeduren haben. Auf diese Weise k&ouml;nnen wir die Ereignisprozeduren auch leicht kopieren und in anderen Form-Klassenmodulen verwenden. Bei anderen Elementen wie zum Beispiel Schaltfl&auml;chen ist dies anders. Wollen wir eine Ereignisprozedur anlegen, die beim Anklicken beispielsweise einer Schaltfl&auml;che namens <b>cmdOK <\/b>ausgel&ouml;st wird, erh&auml;lt diese tats&auml;chlich den Namen <b>cmdOK_Click<\/b>. Warum verwendet twinBASIC hier nicht einfach <b>CommandButton_Click<\/b>? Ganz einfach: Beim <b>Form<\/b>-Element ist es meist so, dass wir nur das <b>Form<\/b>-Element im Code referenzieren, zu dem das Klassenmodul auch geh&ouml;rt. <b>Form<\/b>-Elemente enthalten aber meist mehr als ein Element des Typs <b>CommandButton<\/b>, <b>TextBox <\/b>et cetera. Daher vergibt twinBASIC direkt eine Bezeichnung f&uuml;r die Ereignisprozedur, die den Namen des Steuerelements enth&auml;lt.<\/p>\n<p>Nach dem Anlagen der Ereignisprozedur tr&auml;gt twinBASIC ihren Namen f&uuml;r die jeweilige Ereigniseigenschaft ein (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_003.png\" alt=\"Ereignisprozedur im Eigenschaftsbereich\" width=\"424,6267\" height=\"470,4498\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ereignisprozedur im Eigenschaftsbereich<\/span><\/b><\/p>\n<p>Wenn wir die Ereignisprozedur vom <b>Form<\/b>-Entwurf aus bearbeiten wollen, k&ouml;nnen wir direkt auf die bereits gef&uuml;llte Eigenschaft klicken.<\/p>\n<p>twinBASIC zeigt die entsprechende Ereignisprozedur dann im Codefenster an.<\/p>\n<h2>Wichtige Ereigniseigenschaften des Form-Elements<\/h2>\n<p>Schlie&szlig;lich wollen wir uns noch die grundlegenden Ereigniseigenschaften des <b>Form<\/b>-Elements ansehen und betrachten, wozu wir diese nutzen k&ouml;nnen. Hier ist die &Uuml;bersicht der vorgestellten Ereignisse:<\/p>\n<ul>\n<li><b>Form_Load<\/b><\/li>\n<li><b>Form_Unload<\/b><\/li>\n<li><b>Form_Resize<\/b><\/li>\n<li><b>Form_Click<\/b><\/li>\n<li><b>Form_KeyPress<\/b><\/li>\n<li><b>Form_Activate<\/b><\/li>\n<li><b>Form_Deactivate<\/b><\/li>\n<li><b>Form_GotFocus<\/b><\/li>\n<li><b>Form_LostFocus<\/b><\/li>\n<li><b>Form_QueryUnload<\/b><\/li>\n<\/ul>\n<h2>Reihenfolge der Ereignisse beim &Ouml;ffnen eines Form-Elements<\/h2>\n<p>Wenn man die Ereignisse eines <b>Form<\/b>-Elements programmieren m&ouml;chte, ist es wichtig, die Reihenfolge zu kennen, in der die Ereignisse ausgel&ouml;st werden.<\/p>\n<p>Wie aber k&ouml;nnen wir die Reihenfolge herausfinden? Das ist zum Beispiel auf die folgenden beiden Arten m&ouml;glich. Beide erfordern, dass wir f&uuml;r alle Ereigniseigenschaften jeweils eine Ereignisprozedur anlegen. Dann gibt es folgende M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir f&uuml;gen jeder Ereignisprozedur einen Haltepunkt f&uuml;r die erste Zeile hinzu. <\/li>\n<li>Wir f&uuml;gen jeder Ereignisprozedur eine Debug.Print-Anweisung hinzu, die den Namen der Ereignisprozedur im Bereich DEBUG CONSOLE ausgibt.<\/li>\n<\/ul>\n<p>In Bild 4 haben wir beides gleichzeitig implementiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_004.png\" alt=\"Test der Abfolge des Aufrufs der einzelnen Ereignisprozeduren f&uuml;r verschiedene Aktionen\" width=\"649,627\" height=\"584,2395\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Test der Abfolge des Aufrufs der einzelnen Ereignisprozeduren f&uuml;r verschiedene Aktionen<\/span><\/b><\/p>\n<p>Wenn wir nun die Anwendung starten und das <b>Form<\/b>-Element <b>frmMain <\/b>wird direkt beim Start geladen, sehen wir beispielsweise das Ergebnis aus Bild 5 in der <b>DEBUG CONSOLE<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_005.png\" alt=\"Ausgel&ouml;ste Ereignisse beim &Ouml;ffnen eines Form-Elements\" width=\"549,6265\" height=\"263,2312\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ausgel&ouml;ste Ereignisse beim &Ouml;ffnen eines Form-Elements<\/span><\/b><\/p>\n<p>Schlie&szlig;en wir das Formular wieder, erhalten wir das Ergebnis aus Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_398_006.png\" alt=\"Ausgel&ouml;ste Ereignisse beim Schlie&szlig;en eines Form-Elements\" width=\"549,6265\" height=\"151,3313\"\/><\/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>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 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:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000398\/\">\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=\"\/data\/wp\/v2\/posts\/55000398?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<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000398\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9fac6dd15a\"\/>\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>Im Artikel twinBASIC: Forms &ouml;ffnen, schlie&szlig;en und mehr (www.vbentwickler.de\/389) haben wir bereits gezeigt, wie wir Fenster beziehungsweise Form-Elemente mit twinBASIC-Befehlen &ouml;ffnen und schlie&szlig;en k&ouml;nnen und welche Varianten es dabei gibt. &Uuml;ber ein wichtiges Feature von Form-Elementen haben wir dabei noch nicht gesprochen: Die sogenannten Ereigniseigenschaften. F&uuml;r diese k&ouml;nnen wir Prozeduren hinterlegen, die beim Ausl&ouml;sen bestimmter Ereignisse des Fensters ausgel&ouml;st werden &#8211; beispielsweise beim &Ouml;ffnen, Schlie&szlig;en, Aktivieren, Deaktivieren oder auch beim &Auml;ndern der Gr&ouml;&szlig;e oder der Position eines Fensters. Und auch wenn der Benutzer das Fenster an einer Stelle anklickt, die keine Steuerelemente enth&auml;lt, wird ein Ereignis ausgel&ouml;st, auf das wir reagieren k&ouml;nnen. Wie wir solche Ereigniseigenschaften nutzen k&ouml;nnen und wir Du diese anlegst, zeigen wir in diesem Artikel.<\/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":[662023,66052023,44000031,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000398","post","type-post","status-publish","format-standard","hentry","category-662023","category-66052023","category-twinBASICProgrammierung","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000398"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000398\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000398"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}