VisualBasic Sub einer Klasse aufrufen

Krik

Fleet Admiral Pro
Registriert
Juni 2005
Beiträge
17.025
Moin,

ich arbeite in VB 2005.


Ich habe eine Klasse namens Kunden geschrieben. In dieser befindet sich eine Sub:
Code:
Public Sub createKunde(ByVal data As String, ByVal template As String)
...
Ich möchte ein ganzes Array mit der Klasse als Maske erstellen. Daher hab ich in der .bas das hier geschrieben:
Code:
Private kunde() As Kunden

' Startpunkt des Programms.

Sub main()
  ReDim kunde(1 To 1)
  Set kunde(1) = New Kunden
  
  kunde(1).createKunde("", "")

...

Jetzt sagt mir VB, dass bei kunde(1).createKunde("", "") ein "=" fehlt.

WTF? Warum? Ich will eine Methode aufrufen und keine Zuweisung machen. Ich kann mir nicht vorstellen, dass in VB Klassen wesentlich anders funktionieren als in Java. Ich sehe meinen Fehler nicht.

Weiß jemand Rat?
Gruß, Laurin


Edit:
Fehler hat sich erledigt, als ich Call vor die fehlerhafte Zeile gesetzt habe. Warum das jetzt funktioniert, ist mir aber nicht klar. Worin liegt der Unterschied zwischen Call und nicht Call?
 
Zuletzt bearbeitet:
könnte sein, dass es noch eine Eigenheit von Visual Basic 8 ist. Ab Version 9 ist das Schlüsselwort CALL immer optional - ich nehme mal an, dass es sich um ein Relikt aus Basic 6 handelt. Dort war es mMng noch erforderlich.

Noch was: Das was du mit CreateKunde tust, ist normalerweise Aufgabe des Konstruktors. Implementiere dazu eine Public Sub mit den Namen "New" mit den gewünschten Parametern:

Code:
Public Sub New(ByVal data As String, ByVal template As String)
'...
End Sub

Die instanzierung erfolgt dann so:
Code:
Private kunde() As Kunden

' Startpunkt des Programms.

Sub main()
  ReDim kunde(1 To 1)
  Set kunde(1) = New Kunden("", "")
 '....
End Sub

edit in VB6 war so:
[...] whereas in VB6 there were different conventions for functions (parentheses required) and subs (no parentheses allowed, unless called using the keyword Call).

Quelle: http://en.wikipedia.org/wiki/Visual_Basic_.NET
 
Es gibt einen Konstruktor in VB? Die VB-eigene Hilfe war diesbezüglich nicht sehr aussagekräftig.
Vielen Dank für die Info, so was habe ich schon gesucht.


Ich habe da noch eine paar Fragen.

Zuerst etwas Pseudocode, da ich gerade nicht am Rechner mit VB sitze.
Klasse Eigenschaften:
Code:
Private Eigenschaft1 As String

Public Function getEigenschaft1 ()
'...
End Function
Frei nach dem Geheimnisprinzip sind die Instanzvariablen private und die Setter- und Getter-Methoden public.

Klasse Kunden:
Code:
Dim Eigenschaft(2) As Eigenschaften
Im weiteren Code wird das Array mit Objekten vom Typ Eigenschaften gefüllt. Dank Setter und Getter kann ich die Variablen befüllen.

Main Modul:
Code:
Private kunde() As Kunden

'...
  ReDim kunde(1 To 1)
  Set kunde(1) = New Kunden("", "")
'...
  Debug.Print kunde(1).Eigenschaft(1).getEigenschaft1
Das nach dem Debug.Print geht natürlich nicht, da das Array Eigenschaft() auf Private gesetzt ist. Als ich es auf Public setzen wollte, meckerte VB, dass man das hier nicht machen darf.
Wie komme ich also daran? Muss ich hier das mir ominöse Friend verwenden?


Noch eine zweite Frage:
Ist das "Me" vergleichbar mit dem "this" (zeigt immer auf das Objekt in dem es steht) aus Java?
 
wo hat er gemeckert, dass man nicht Pulbic setzen darf? Grundsätzlich kannst du Attribute immer Public machen, meistens ist das aber kein guter Stil.

Funktionsvariable dagegen sind natürlich immer nur innerhalb der Funktion sichtbar. Hier sind Sichtbarkeidsmodifikatoren nicht zulässig

Das hier ist erlaubt:
Code:
Public Class MeineKlasse

Private MeinAttributEins as Integer
Public MeinAttributZwei as Integer

End Class


Zum Thema Getter und Setter: Es gibt etwas parktisches, jedenfalls in VB9 das heißt Property Diese Struktur stellt getter und Setter bei deutlich kürzerer Notation bereit:

Code:
Public Property Eigenschaft
Set(ByVal value)
   MeinAttributEins = value
End Set
Get
    Return MeinAttributEins
End Get
End Property

Dies kann nun von Außen wie eien Variable verwendet Werden
Code:
MeineKlassenInstanz.Eigenschaft = 4
aber inner verhält es sich wie 2 Methoden, in der noch Werteprüfungen etc durchgeüfhrt werden können.

Für solcherlei Grundlagen empfehle ich das Galelio OpenBook. Da sind solche sachen gut erklärt. Bitte beachten: Es ist auf VisualBasic 9 bezogen:
http://openbook.galileocomputing.de/visualbasic_2008/
 
Ich habe das mit dem Konstruktor jetzt ausprobiert und VB meckert nur ("Erwarte Bezeichner", das New im Methodenkopf ist dabei markiert). Ich vermute, in dieser Version geht das so, wie du es vorgeschlagen hast, nicht. Auch die Hilfe zeigt kein Beispiel oder erwähnt es, dass man seinen eigenen Konstruktor schreiben kann.

wo hat er gemeckert, dass man nicht Pulbic setzen darf? Grundsätzlich kannst du Attribute immer Public machen, meistens ist das aber kein guter Stil.
Der Fehler kommt in der Klasse Kunden, wenn ich das Array deklariere:
Public mvarEigenschaft() As Eigenschaften
Fehlermeldung:
Konstanten, Zeichenfolgen fester Länge, Datenfelder, benutzerdefinierte Typen und Declare-Anweisungen sind als öffentliche Mitglieder von Objektmodulen nicht zugelassen.
Mit anderen Worten, ich darf ein Array in einer Klasse nicht public deklarieren. Warum ist mir nicht klar. Klar, es ist ein schlechter Programmierstil, wenn ich so was public mache, aber es ist eine unnötige Einschränkung.

Wie kann ich denn jetzt auf die Objekte A, B, C in einem Array zugreifen, dass in einem Objekt D steht? Gar nicht? Muss ich in diesem Fall mir dann immer Getter und Setter in Objekt D verwenden, die auf die Getter und Setter in den Objekten A, B, C verweisen?


Bis jetzt vielen Dank, Kagee. Du hast mir VB schon ein gutes Stück näher gebracht. :)
 
Also ich habe mal Microsoft Visual Basic 2005 Express Edition installiert und festgestellt, dass alle meine Codeausschnitte dort sehr wohl unterstützt werden.

Deine Fehlermeldung
Konstanten, Zeichenfolgen fester Länge, Datenfelder, benutzerdefinierte Typen und Declare-Anweisungen sind als öffentliche Mitglieder von Objektmodulen nicht zugelassen.
ist dagegen eine Fehlermeldung von VBA, also Visual Basic for Application. Das ist nicht dasselbe wie Visual Basic. Wenn du sagst "ich arbeite in VB 2005", was meinst du damit? Hast du ein Visual Studio installiert? Oder eine Express-Version des Studios? Oder arbeitest du im Visual-Basic-Editor des Office-Pakets?

Im letzteren Fall kann man objektorientierte Ansätze nur sehr eingeschränkt Nutzen, da es keine Klassen, sondern nur Module gibt. Die Module unterscheiden sich darüber hinaus deutlich vom Leistungsumfang von Modulen im "echten" Visual Basic".

Eine Entwicklungsumgebung für "echtes" Visual Basic gibt allerdings kostenlos von Microsoft:
http://www.microsoft.com/germany/express/download/default.aspx
Da einfach "Visual Basic 2010 Express" herunterladen und installieren, dann klappts auch mit den Klassen.
 
Ob ich VB 2010 benutzen darf, muss ich erst mit der Firma abklären.
Sie hatten mir Visual Basic 6.0 und zwei CDs mit der MSDN-Hilfe an Bord gegeben und das habe ich dann installiert.

Es wäre möglich, dass der Junge, der mir das gegeben hat, selbst nicht so wirklich eine Ahnung davon hat. Ich hab ihm heute erklärt, wie Paint funktioniert (ungelogen! bin fast vom Stuhl gefallen). Ich halte es nicht für unwahrscheinlich, dass die CD falsch beschriftet wurde.

Hab in Google geschaut, so sieht die IDE aus: http://www.theproblemsolver.nl/aspdevelopmentanddebugging/vb6.jpg
Ah Moment... VB6 ist doch nicht von 2005. Oh Mann, die haben die CD falsch beschriftet. Kein Wunder, dass ich mit den Hilfestellungen nicht zurande kam.
 
Zurück
Oben