{"id":55000119,"date":"2018-02-01T00:00:00","date_gmt":"2020-03-27T19:30:24","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=119"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Visual_Basic_Mit_Klassen_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Visual_Basic_Mit_Klassen_programmieren\/","title":{"rendered":"Visual Basic: Mit Klassen programmieren"},"content":{"rendered":"<p><b>Wer bisher mit VBA oder C# gearbeitet hat und zu VB wechseln m&ouml;chte, sieht sich bei der Entwicklung von WPF-Anwendungen einigen &Auml;nderungen gegen&uuml;ber. Dieser Artikel liefert die Grundlagen zum Umgang mit Namespaces und zur Programmierung von Klassen. Zum Experimentieren mit den Beispielen nutzen wir das Tool LINQPad 5. <\/b><\/p>\n<h2>Klassen<\/h2>\n<p>Im Gegensatz zu C# werden Klassen unter Visual Basic nicht durch eine geschweifte Klammer eingeleitet und beendet, sondern wir arbeiten mit dem f&uuml;r Visual Basis typischen Start- und Endzeilen:<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> Beispiel\r\n     ---\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b>Class<\/b>-Elemente k&ouml;nnen dabei mit folgenden Modifizierern ausgestattet werden:<\/p>\n<ul>\n<li><b>Public<\/b>: Die Klasse ist innerhalb der Assembly und auch von anderen Assemblies aus sichtbar.<\/li>\n<li><b>Friend<\/b>: Die Klasse ist nur innerhalb der Assembly sichtbar, zu der sie geh&ouml;rt. Dies ist der Standard-Modifizierer, wenn Sie dem Schl&uuml;sselwort <b>Class <\/b>weder <b>Public <\/b>noch <b>Friend <\/b>oder einen anderen Modifizierer voranstellen!<\/li>\n<\/ul>\n<h2>Klasse erstellen<\/h2>\n<p>Eine Klasse wird typischerweise in einer eigenen Code-Datei angelegt. Wenn Sie ein neues WPF-Fenster anlegen, f&uuml;gt Visual Studio beispielsweise eine eigene Datei mit der Dateiendung <b>.xaml.vb <\/b>hinzu, welche als Code behind-Modul f&uuml;r das WPF-Fenster dient. Wenn Sie eine neue Klasse ben&ouml;tigen, die nicht als Code behind-Modul f&uuml;r ein WPF-Element dient, erledigen Sie dies normalerweise &uuml;ber den Dialog <b>Neues Element hinzuf&uuml;gen&#8230;<\/b>, den Sie am einfachsten durch Markieren des Projekts im Projektmappen-Explorer und anschlie&szlig;endes Bet&auml;tigen der Tastenkombination <b>Strg + Umschalt + A <\/b>aufrufen.<\/p>\n<p>Hier w&auml;hlen Sie dann den Eintrag <b>Klasse <\/b>aus und geben den gew&uuml;nschten Namen an, in diesem Fall <b>Beispiel<\/b> (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_01\/pic_119_001.png\" alt=\"Einf&uuml;gen einer neuen Klassendatei\" width=\"499,6607\" height=\"371,4981\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Einf&uuml;gen einer neuen Klassendatei<\/span><\/b><\/p>\n<p>Die neue Klasse wird dann mit dem <b>Public<\/b>-Schl&uuml;sselwort ausgezeichnet. Wenn Sie nicht wollen, dass die Klasse in anderen Assemblies genutzt werden kann, &auml;ndern Sie <b>Public <\/b>also in <b>Friend<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Beispiel\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Objekte auf Basis von Klassen initialisieren<\/h2>\n<p>Es gibt verschiedene Arten, eine Klasse zu initialisieren. Wenn Sie den Zeitpunkt der Deklaration und der Initialisierung trennen m&ouml;chten, nutzen Sie zwei Anweisungen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>Beispielklasse<span style=\"color:blue;\"> As <\/span>Beispiel\r\nBeispielklasse = <span style=\"color:blue;\">New<\/span> Beispiel<\/pre>\n<p>Anderenfalls haben Sie die Wahl zwischen den folgenden beiden Schreibweisen. Die erste kennen Sie von VBA:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>Beispielklasse<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Beispiel<\/pre>\n<p>Die zweite ist eine Kombination aus dem Zweizeiler:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>Beispielklasse<span style=\"color:blue;\"> As <\/span>Beispiel = <span style=\"color:blue;\">New<\/span> Beispiel<\/pre>\n<h2>Weitere Klassen anlegen<\/h2>\n<p>Wenn Sie weitere Klassen anlegen wollen, haben Sie die Wahl: Sie k&ouml;nnen jeweils eine neue Datei mit jeder Klasse erstellen, was wie oben beschrieben funktioniert. Theoretisch k&ouml;nnen Sie aber auch mehrere Klassen in einer Datei speichern. Sie k&ouml;nnen neue Klassen auch innerhalb bestehender Klassen anlegen. Das sieht dann etwa wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Beispiel\r\n     <span style=\"color:blue;\">Public <\/span>Class UntergeordneteKlasse\r\n     End Class\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Mit Klassen experimentieren<\/h2>\n<p>Die sch&ouml;nste Benutzeroberfl&auml;che auch zum Experimentieren mit Klassen ist das Tool <b>LINQPad<\/b>. Damit k&ouml;nnen Sie, was f&uuml;r die Beispiele dieses Artikels sinnvoll ist, unter Language den Eintrag <b>VB Program <\/b>ausw&auml;hlen. Es wird dann automatisch eine <b>Sub Main <\/b>eingerichtet, unterhalb derer Sie die Klassen dieses Artikels definieren k&ouml;nnen. In <b>Sub Main <\/b>greifen Sie dann ganz einfach auf die Klassen zu (siehe Bild 2). Wenn Sie auf die <b>Start<\/b>-Schaltfl&auml;che klicken, wird <b>Sub Main <\/b>ausgef&uuml;hrt. Wir f&uuml;gen der untergeordneten Klasse einfach eine &ouml;ffentliche Eigenschaft hinzu:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_01\/pic_119_002.png\" alt=\"Experimentieren mit Klassen in LINQPad\" width=\"649,559\" height=\"514,6575\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Experimentieren mit Klassen in LINQPad<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> Beispiel\r\n     <span style=\"color:blue;\">Public <\/span>Class UntergeordneteKlasse\r\n         <span style=\"color:blue;\">Public <\/span>Property Test<span style=\"color:blue;\"> As String<\/span> = \"bla\"\r\n     End Class\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Die untergeordnete Klasse k&ouml;nnen Sie etwa wie folgt deklarieren und initialisieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>UntergeordneteKlasse<span style=\"color:blue;\"> As <\/span>Beispiel.UntergeordneteKlasse\r\nUntergeordneteKlasse = <span style=\"color:blue;\">New<\/span> Beispiel.UntergeordneteKlasse\r\nDebug.WriteLine (UntergeordneteKlasse.Test)<\/pre>\n<p>F&uuml;r solche untergeordneten Klassen gibt es neben den Modifizierern <b>Public <\/b>und <b>Friend <\/b>noch drei weitere m&ouml;gliche Modifizierer. Diese Modifizierer gelten nat&uuml;rlich auch f&uuml;r die anderen Elemente einer Klasse, also beispielsweise Methoden, Eigenschaften oder Ereignisse:<\/p>\n<ul>\n<li><b>Private<\/b>: Die Klassen, Methoden, Ereignisse und Eigenschaften k&ouml;nnen nur innerhalb des Objekts genutzt werden, in der diese auch definiert wurde. Au&szlig;erhalb der &uuml;bergeordneten Klasse ist sie nicht sichtbar. Wenn Sie die Klasse <b>UntergeordneteKlasse <\/b>von oben als <b>Private <\/b>deklarieren w&uuml;rden, k&ouml;nnten Sie nicht von der Methode <b>Public Main <\/b>darauf zugreifen.<\/li>\n<li><b>Protected<\/b>: Die Klasse, Methoden, Ereignisse und Eigenschaften k&ouml;nnen nur innerhalb des Objekts genutzt werden, indem diese definiert wurden, und in Objekten auf Basis von Klassen, die von der urspr&uuml;nglichen Klasse abgeleitet sind. Ableitungen von Klassen stellen wir sp&auml;ter noch vor.<\/li>\n<li><b>Protected Friend<\/b>: Die Klasse, Methoden, Ereignisse und Eigenschaften k&ouml;nnen nur innerhalb des Objekts  und der Assembly genutzt werden, indem diese definiert wurden, und in Objekten auf Basis von Klassen, die von der urspr&uuml;nglichen Klasse abgeleitet sind.<\/li>\n<\/ul>\n<h2>Felder von Klassen<\/h2>\n<p>Sie k&ouml;nnen einer Klasse sogenannte Felder hinzuf&uuml;gen, indem Sie direkt unterhalb der <b>Class<\/b>-Ebene Variablen deklarieren. Dies k&ouml;nnen Variablen mit dem Modifizierer <b>Public<\/b>, <b>Private <\/b>oder einem der anderen Modifizierer sein. <b>Public<\/b>-Felder k&ouml;nnen Sie auch von au&szlig;erhalb lesen und schreiben. Die Klasse im folgenden Beispiel hat eine &ouml;ffentliche und eine private Variable. Die &ouml;ffentliche ist von au&szlig;en per IntelliSense verf&uuml;gbar und kann sowohl geschrieben als auch abgefragt werden:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     <span style=\"color:blue;\">Dim <\/span>KlasseMitFeld<span style=\"color:blue;\"> As <\/span>KlasseMitFeld\r\n     KlasseMitFeld = <span style=\"color:blue;\">New<\/span> KlasseMitFeld\r\n     KlasseMitFeld.Zeichenkette = \"Test\"\r\n     Debug.WriteLine(KlasseMitFeld.Zeichenkette)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Class<\/span> KlasseMitFeld\r\n     <span style=\"color:blue;\">Public <\/span>Zeichenkette<span style=\"color:blue;\"> As String<\/span> \r\n     <span style=\"color:blue;\">Private <\/span>Zahl<span style=\"color:blue;\"> As Integer<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<h2>Felder als nur lesbar markieren<\/h2>\n<p>Wenn ein Feld nur lesenden, aber keinen schreibenden Zugriff erm&ouml;glichen soll, deklarieren Sie es mit dem Schl&uuml;sselwort <b>ReadOnly<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>ReadOnly ZeichenketteNurLesbar<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Diese liefert dann beim Zugriff von au&szlig;en den Wert <b>null<\/b> zur&uuml;ck. Schreibend k&ouml;nnen Sie von au&szlig;en nicht auf dieses Feld zugreifen, und von innerhalb der Klasse, in der es definiert ist, auch nur sehr eingeschr&auml;nkt. Sie k&ouml;nnen es in der Deklarationszeile mit dem gew&uuml;nschten Wert initialisieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>ReadOnly ZeichenketteNurLesbar<span style=\"color:blue;\"> As String<\/span> = \"Nur lesbar\"<\/pre>\n<h2>Die Konstruktor-Methode<\/h2>\n<p>Die einzige weitere Alternative bei schreibgesch&uuml;tzten Feldern ist die Verwendung der Konstruktor-Methode. Also schauen wir uns diese gleich hier an. Die Konstruktor-Methode ist wie unter C# die Methode, die beim Initialisieren eines Objekts auf Basis der Klasse automatisch ausgef&uuml;hrt wird.<\/p>\n<p>Unter C# hei&szlig;t diese wie die Klasse selbst, unter Visual Basic ist dies ganz anders: Hier lautet der Name der Konstruktor-Methode schlicht <b>New<\/b>. Die Konstruktor-Methode der folgenden Klasse <b>KlasseMitFeld <\/b>weist dem Feld <b>ZeichenketteNurLesbar <\/b>eine Zeichenkette zu. Die Methode <b>Sub Main <\/b>initialisiert die Klasse und gibt dann als Beweis die zugewiesene Zeichenkette aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     <span style=\"color:blue;\">Dim <\/span>KlasseMitFeld<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> KlasseMitFeld\r\n     Debug.WriteLine(KlasseMitFeld.ZeichenketteNurLesbar)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Public Class<\/span> KlasseMitFeld\r\n     <span style=\"color:blue;\">Public <\/span>ReadOnly ZeichenketteNurLesbar<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Sub <span style=\"color:blue;\">New<\/span>\r\n         ZeichenketteNurLesbar = \"Wert von der Konstruktor-Methode zugewiesen\"\r\n     End Sub\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Die Konstruktor-Methode ist ein von vielen VBA-Entwicklern schmerzlich vermisstes Feature: Damit k&ouml;nnen Sie einer Klasse direkt beim Initialisieren wichtige Informationen &uuml;bermitteln, die dann auch direkt verarbeitet werden k&ouml;nnen &#8211; beispielsweise, um einer <b>Kunde<\/b>-Klasse direkt den Namen und die Adresse des Kunden zu &uuml;bermitteln.<\/p>\n<h2>Eigenschaften<\/h2>\n<p>Felder k&ouml;nnen fast wie Eigenschaften genutzt werden &#8211; es gibt schreib- und lesbar Felder oder auch nur lesbare Felder (<b>Read-Only<\/b>). Eigenschaften erlauben aber eine genauere Steuerung der Berechtigungen und erlauben auch noch das Ausf&uuml;hren weiterer Aktionen, wenn der Eigenschaftswert geschrieben oder gelesen wird. Eine Eigenschaft enth&auml;lt in der Regel eine lokale Variable, die den Eigenschaftswert speichert (die sogenannte Member-Variable), sowie ein &ouml;ffentliches <b>Property<\/b>-Konstrukt, welches jeweils einen sogenannten Getter und einen Setter enth&auml;lt. Das sieht dann insgesamt wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> KlasseMitEigenschaften\r\n     <span style=\"color:blue;\">Private <\/span>_eigenschaft<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Eigenschaft<span style=\"color:blue;\"> As String<\/span>\r\n         Get\r\n             Return _eigenschaft\r\n         End Get\r\n         Set(ByVal value<span style=\"color:blue;\"> As String<\/span>)\r\n            _eigenschaft = value\r\n         End <span style=\"color:blue;\">Set<\/span>\r\n     End Property\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\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\/55000119\/\">\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\/55000119?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\/55000119\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9f18b59416\"\/>\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>Wer bisher mit VBA oder C# gearbeitet hat und zu VB wechseln m&ouml;chte, sieht sich bei der Entwicklung von WPF-Anwendungen einigen &Auml;nderungen gegen&uuml;ber. Dieser Artikel liefert die Grundlagen zum Umgang mit Namespaces und zur Programmierung von Klassen. Zum Experimentieren mit den Beispielen nutzen wir das Tool LINQPad 5. <\/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":[66012018,662018,44000027,44000016],"tags":[],"yst_prominent_words":[],"class_list":["post-55000119","post","type-post","status-publish","format-standard","hentry","category-66012018","category-662018","category-Excel_programmieren","category-VBGrundlagen"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000119","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=55000119"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000119\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000119"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}