{"id":55000389,"date":"2023-10-01T00:00:00","date_gmt":"2023-10-19T13:10:37","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=389"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"twinBASIC_Fenster_oeffnen_schliessen_und_mehr","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/twinBASIC_Fenster_oeffnen_schliessen_und_mehr\/","title":{"rendered":"twinBASIC: Fenster &ouml;ffnen, schlie&szlig;en und mehr"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/73d9eb0c479146a2a3673d39950c9fbc\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Form-Objekte waren in VB6 und sind in twinBASIC das Element der Wahl, wenn es um die Abbildung von Benutzeroberfl&auml;chen geht. In diesem Artikel zeigen wir die grundlegenden Techniken rund um die Verwendung und Programmierung von Forms. Dabei zeigen wir, wie Du ein Form-Element &ouml;ffnest, es wieder schlie&szlig;t und welche &Ouml;ffnungsmodi es gibt. Dabei beschreiben wir auch, wie Du die Position eines Formulars nach dem &Ouml;ffnen festlegen kannst. Au&szlig;erdem schauen wir uns schon einige der grundlegenden Ereigniseigenschaften von Forms an und zeigen, wie wir diese in Form von Ereignisprozeduren implementieren k&ouml;nnen.<\/b><\/p>\n<h2>Fenster oder Form?<\/h2>\n<p>In den folgenden Abschnitten werden wir synonym von Fenstern und Forms sprechen. Allgemein ist zwar nicht jedes Fenster ein <b>Form<\/b>-Objekt, aber im Kontext des vorliegenden Artikels schon. <\/p>\n<h2>Forms &ouml;ffnen<\/h2>\n<p>Wenn wir mit einer neuen twinBASIC-Anwendung starten, haben wir zwei M&ouml;glichkeiten, das erste Fenster zu &ouml;ffnen:<\/p>\n<ul>\n<li>Durch Angabe des Fensters f&uuml;r die Eigenschaft <b>Project: Startup Object<\/b> oder<\/li>\n<li>durch Aufrufen der Prozedur <b>Main<\/b>, der wir den Code zum &Ouml;ffnen eines Fensters zuweisen.<\/li>\n<\/ul>\n<h2>Form als Startfenster &ouml;ffnen<\/h2>\n<p>Wir schauen uns zuerst die erste M&ouml;glichkeit an, wo wir ein Fenster als Startfenster festlegen. Damit wir in unserem neuen Projekt namens <b>Forms_OpenCloseAndCo <\/b>nicht die ganze Zeit mit einem Startform namens <b>Form1 <\/b>arbeiten m&uuml;ssen, l&ouml;schen wir dieses und f&uuml;gen &uuml;ber den Kontextmen&uuml;-Eintrag <b>Add|Add Form <\/b>ein neues <b>Form<\/b>-Element hinzu, das wir gleich nach dem Anlegen <b>frmMain <\/b>nennen.<\/p>\n<p>Achtung: Nur wenn wir dies erledigen, solange der Bearbeitungsmodus des neuen <b>Form<\/b>-Elements im Projektexplorer aktiviert ist, werden alle Elemente des Form-Objekts umbenannt &#8211; also auch die Eigenschaft <b>Name <\/b>des <b>Form<\/b>-Elements, der Name der Code behind-Klassendatei und auch der Name der Klasse selbst. Hast Du diesen Zeitpunkt verpasst, kein Problem &#8211; l&ouml;sche das Element einfach wieder und lege es erneut an.<\/p>\n<p>Haben wir dies erledigt, brauchen wir nur noch die Optionen des Projekts aufzurufen und hier den Eintrag <b>frmMain <\/b>auszuw&auml;hlen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_001.png\" alt=\"Einstellen der Startform frmMain\" width=\"424,6267\" height=\"195,0209\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einstellen der Startform frmMain<\/span><\/b><\/p>\n<p>Starten wir das Projekt nun, wird die Form <b>frmMain <\/b>angezeigt.<\/p>\n<h2>Startform &uuml;ber die Prozedur Main &ouml;ffnen<\/h2>\n<p>Die zweite M&ouml;glichkeit ist das &Ouml;ffnen des Fensters per Code. Wenn wir das Startformular <b>frmMain<\/b> per Code &ouml;ffnen wollen, statt &uuml;ber die Eigenschaft, entfernen wir es zun&auml;chst aus der Eigenschaft <b>Project: Startup Object<\/b> und w&auml;hlen dort den Wert <b>Sub Main <\/b>aus (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_010.png\" alt=\"Einstellen der Startprozedur Main\" width=\"424,6267\" height=\"180,0261\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Einstellen der Startprozedur Main<\/span><\/b><\/p>\n<p>Diese Prozedur m&uuml;ssen wir nun auch noch anlegen. Dazu f&uuml;gen wir dem Projekt mit dem Kontextmen&uuml;befehl <b>Add|Add Module .TWIN supporting Unicode <\/b>ein neues Modul hinzu (siehe Bild 2). Das neue Modul benennen wir in <b>mdlMain <\/b>um.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_011.png\" alt=\"Hinzuf&uuml;gen eines Moduls zum Projekt\" width=\"524,6265\" height=\"369,1124\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen eines Moduls zum Projekt<\/span><\/b><\/p>\n<p>Dieses &ouml;ffnen wir nun und f&uuml;gen die folgende Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main()\r\n     frmMain.Show\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die einzige Anweisung der Prozedur besteht aus dem Objekt <b>frmMain <\/b>und der Methode <b>Show<\/b>. Jede Code behind-Klasse eines <b>Form<\/b>-Elements stellt die Eigenschaften und Methoden der <b>Form<\/b>-Klasse zur Verf&uuml;gung, so zum Beispiel <b>Show<\/b>.<\/p>\n<p>Um die Eigenschaften und Methoden dieser Klasse zu nutzen, m&uuml;ssen wir den Klassennamen angeben, der im Klassenmodul hinter dem Schl&uuml;sselwort <b>Class <\/b>angegeben ist. Sollte bei Dir die Klasse also einmal anders benannt sein als die Klassendatei (diese beiden sind nicht zu verwechseln), verwende den Klassennamen.<\/p>\n<p>Das Codefenster sieht nun wie in Bild 4 aus. Starten wir die Anwendung nun erneut, erscheint das Fenster <b>frmMain <\/b>genauso, als wenn wir es als Startobjekt festgelegt h&auml;tten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_012.png\" alt=\"Anlegen der Startprozedur Main\" width=\"524,6265\" height=\"344,9601\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anlegen der Startprozedur Main<\/span><\/b><\/p>\n<p>Damit wir sehen, dass tats&auml;chlich die Prozedur das Fenster ge&ouml;ffnet hat, f&uuml;gen wir dieser noch eine Meldung hinzu:<\/p>\n<pre><span style=\"color:blue;\">MsgBox<\/span> \"Vor dem &Ouml;ffnen\"\r\nfrmMain.Show\r\n<span style=\"color:blue;\">MsgBox<\/span> \"Nach dem &Ouml;ffnen\"<\/pre>\n<p>Die erste Meldung wird vor dem Anzeigen des Fensters eingeblendet, die zweite unmittelbar danach.<\/p>\n<h2>Forms schlie&szlig;en<\/h2>\n<p>Bisher sehen wir nur die X-Schaltfl&auml;che oben rechts als M&ouml;glichkeit, das Fenster zu schlie&szlig;en. Au&szlig;erdem k&ouml;nnen wir durch einen linken Mausklick auf das Anwendungs-Icon das Systemmen&uuml; aus Bild 5 anzeigen. Dieses erscheint auch, wenn wir mit der rechten Maustaste auf eine beliebige Stelle der Titelleiste klicken.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_013.png\" alt=\"Systemmen&uuml;\" width=\"399,6267\" height=\"384,5684\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Systemmen&uuml;<\/span><\/b><\/p>\n<p>Gegebenenfalls m&ouml;chten wir aber eine eigene Schaltfl&auml;che zum Schlie&szlig;en des Fensters nutzen. Das erledigen wir, indem wir zun&auml;chst eine Schaltfl&auml;che zum Fenster hinzuf&uuml;gen.<\/p>\n<h2>Schaltfl&auml;che anlegen<\/h2>\n<p>Dazu aktivieren wir die Anzeige des Entwurfs des Fensters und klicken in der Toolbox einfach auf das Icon f&uuml;r die Schaltfl&auml;che. Dann ziehen wir im Entwurf einen Rahmen von der gew&uuml;nschten Gr&ouml;&szlig;e der anzulegenden Schaltfl&auml;che auf. Anschlie&szlig;end stellen wir im Eigenschaftsfenster den Namen auf <b>cmdUnload <\/b>und die Beschriftung auf <b>Unload <\/b>ein (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_014.png\" alt=\"Anlegen einer Schaltfl&auml;che\" width=\"649,627\" height=\"320,9921\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen einer Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Danach hinterlegen wir eine Ereignisprozedur f&uuml;r das Ereignis <b>Click<\/b> der Schaltfl&auml;che. Das gelingt ganz einfach, indem wir doppelt auf den Entwurf der Schaltfl&auml;che klicken. twinBASIC &ouml;ffnet nun den Code-Editor mit der automatisch angelegten Prozedur. Dieser f&uuml;gen wir gleich die Anweisung zum Schlie&szlig;en des aktuellen Fensters hinzu. Dabei gibt es allerdings verschiedene Varianten.<\/p>\n<h2>Fenster schlie&szlig;en beziehungsweise entladen<\/h2>\n<p>Um ein Fenster per Code zu schlie&szlig;en, gibt es mindestens die folgenden M&ouml;glichkeiten:<\/p>\n<ul>\n<li><b>Unload Me<\/b>: Schlie&szlig;t das Formular und entfernt das Formular aus dem Speicher.<\/li>\n<li><b>Me.Close<\/b>: Schlie&szlig;t das Formular, dieses bleibt jedoch im Speicher erhalten.<\/li>\n<li><b>SendMessage<\/b>: Ein API-Befehl, der das mit dem Handle referenzierte Fenster und alle enthaltenen Elemente zuverl&auml;ssig terminiert.<\/li>\n<\/ul>\n<p>Im Formular <b>frmMain <\/b>haben wir noch zwei weitere Schaltfl&auml;chen untergebracht, um alle drei Methoden ausprobieren zu k&ouml;nnen. Die &uuml;brigen Schaltfl&auml;chen hei&szlig;en <b>cmdClose<\/b> und <b>cmdSendMessage <\/b>(siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_05\/pic_389_015.png\" alt=\"Schaltfl&auml;chen mit verschiedenen Methoden zum Schlie&szlig;en des aktuellen Fensters\" width=\"424,6267\" height=\"322,8157\"\/><\/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\/55000389\/\">\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\/55000389?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\/55000389\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"e5d0bba7c3\"\/>\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>Form-Objekte waren in VB6 und sind in twinBASIC das Element der Wahl, wenn es um die Abbildung von Benutzeroberfl&auml;chen geht. In diesem Artikel zeigen wir die grundlegenden Techniken rund um die Verwendung und Programmierung von Forms. Dabei zeigen wir, wie Du ein Form-Element &ouml;ffnest, es wieder schlie&szlig;t und welche &Ouml;ffnungsmodi es gibt. Dabei beschreiben wir auch, wie Du die Position eines Formulars nach dem &Ouml;ffnen festlegen kannst. Au&szlig;erdem schauen wir uns schon einige der grundlegenden Ereigniseigenschaften von Forms an und zeigen, wie wir diese in Form von Ereignisprozeduren implementieren k&ouml;nnen.<\/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],"tags":[],"yst_prominent_words":[],"class_list":["post-55000389","post","type-post","status-publish","format-standard","hentry","category-662023","category-66052023","category-twinBASICProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000389","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=55000389"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000389\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000389"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}