Objekte erstellen und durchsuchen

Hi,

ich probiere grade mit Klassen in VB6 herum und brauche etwas Hilfe:

Ich habe eine Klasse mit einer Eigenschaft.
Nun habe ich 2 Fragen:
Ich würde erstens gerne zur Laufzeit beliebig viele Instanzen der Klasse erstellen (möglichst mit aufsteigendem Namen Objekt1, Objekt2 usw).
Zweites wüsste ich gerne, wie ich diese Objekte später wieder ansprechen kann, um nach dieser Eigenschaft zu suchen.

Hier der Quellcode der Klasse:

_Option Explicit

Private m_inteigenschaft As Integer

Public Property Get Eigenschaft() As Integer
Eigenschaft = m_inteigenschaft
End Property

Public Property Let Eigenschaft(ByVal NewValue As Integer)
m_inteigenschaft = NewValue
End Property

Private Sub Class_Initialize(Eigenschaft As Integer)
m_inteigenschaft = Eigenschaft
End Sub_

MfG

Hallo,

Private Sub Class_Initialize(Eigenschaft As Integer)
m_inteigenschaft = Eigenschaft
End Sub

das geht so nicht, es kann ja keine Prozedur einen Wert für ‚Eigenschaft‘ übergeben. Die Klammer muss also leer bleiben.
Die Klasse mit Korrektur:

Option Explicit

Private m\_inteigenschaft As Integer

Public Property Get Eigenschaft() As Integer
 Eigenschaft = m\_inteigenschaft
End Property

Public Property Let Eigenschaft(ByVal NewValue As Integer)
 m\_inteigenschaft = NewValue
End Property

Private Sub Class\_Initialize()
 m\_inteigenschaft = 0
End Sub

In der Form kannst Du dann natürlich mehrere Instanzen davon aufrufen.

Option Explicit

Dim CL1 As Class1
Dim CL2 As Class1

Private Sub Form\_Load()
 Set CL1 = New Class1
 Set CL2 = New Class1
 CL1.Eigenschaft = 1
 CL2.Eigenschaft = 4
 List1.AddItem CL1.Eigenschaft
 List1.AddItem CL2.Eigenschaft
End Sub

Gruß, Rainer

oh, mir fällt grad auf, dass ich was wesentliches vergessen hab.
Die Objekte sollen während der Laufzeit erstellt werden.

Ich brauche also X Objekte.
Die müssten dann in einer Schleife erstellt werden,
aber auch später ansprechbar sein.

Und danke für die Info mit dem Konstruktor.
Meine Frage wäre dann allerdings, wie ich bei der Initialisierung Werte übergebe?

Oder geht das bei VB nicht?

Dim XYZ as Objekt 4,5

Jetzt würde Eigenschaft 1 den Wert 4 haben und Eigenschaft 2 den Wert 5. Ist sowas möglich oder nicht? Würd mich wundern, wenn nicht :o

Hallo,

Die Objekte sollen während der Laufzeit erstellt werden.

ja, werden sie doch.

Ich brauche also X Objekte.
Die müssten dann in einer Schleife erstellt werden,
aber auch später ansprechbar sein.

Dann bietet sich ein Array an.

Option Explicit

Dim CL() As Class1

Private Sub Form\_Load()
 ReDim CL(1 To 2)
 Set CL(1) = New Class1
 Set CL(2) = New Class1
 CL(1).Eigenschaft = 1
 CL(2).Eigenschaft = 4
 List1.AddItem CL(1).Eigenschaft
 List1.AddItem CL(2).Eigenschaft
End Sub

gerade getestet, geht. :smile:

Und danke für die Info mit dem Konstruktor.
Meine Frage wäre dann allerdings, wie ich bei der
Initialisierung Werte übergebe?

Oder geht das bei VB nicht?

Dim XYZ as Objekt 4,5

Jetzt würde Eigenschaft 1 den Wert 4 haben und Eigenschaft 2
den Wert 5. Ist sowas möglich oder nicht? Würd mich wundern,
wenn nicht :o

Das weiß ich nicht.

Eine Frage noch, da kommen aber auch noch Prozeduren dazu, oder? Im Moment kann ich nämlich den Sinn noch nicht ganz erkennen, die Klasse macht ja nicht mehr, als eine Variable auch tun würde.

Oder willst Du einfach nur verschiedene Werte gemeinsam verwalten?
Wie gefällt Dir das:

Option Explicit

Private Type Daten
 I As Integer
 B As Byte
 S As String
End Type

Dim DT() As Daten

Private Sub Form\_Load()
 Dim I As Integer
 ReDim DT(2)
 DT(0).I = 2354
 DT(0).B = 12
 DT(0).S = "Test"
 DT(1).I = 5678
 DT(1).B = 34
 DT(1).S = "Ende"

 For I = LBound(DT) To UBound(DT)
 List1.AddItem DT(I).I
 List1.AddItem DT(I).B
 List1.AddItem DT(I).S
 Next
End Sub

Ohne Klasse, ohne Objekt. :smile:

Gruß, Rainer

Die Klasse ist schon aufwändiger.
Ich habe das nur auf eine Eigenschaft heruntergebrochen,
um das Problem zu verdeutlichen.

Weitere Frage:

Wenn ich in UserForm_Initialize nur das hier stehen habe:

Private Sub Form_initialize()
Dim Objekt As New Class1
End Sub

Müsste doch der Konstruktor gestartet werden von der Klasse?

Hat sich erledigt.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Die Klasse ist schon aufwändiger.
Ich habe das nur auf eine Eigenschaft heruntergebrochen,
um das Problem zu verdeutlichen.

das hatte ich vermutet, aber ich habe gelernt sicherheitshalber mal nachzufragen. :smile:

Gruß, Rainer

Hallo,

Hallo Rainer,

Die Objekte sollen während der Laufzeit erstellt werden.

ja, werden sie doch.

Ich brauche also X Objekte.
Die müssten dann in einer Schleife erstellt werden,
aber auch später ansprechbar sein.

Dann bietet sich ein Array an.

was spricht gegen eine Collection?
Somit ist man Arg flexibel :smile:

Option Explicit

Dim CL() As Class1

Private Sub Form_Load()
ReDim CL(1 To 2)
Set CL(1) = New Class1
Set CL(2) = New Class1
CL(1).Eigenschaft = 1
CL(2).Eigenschaft = 4
List1.AddItem CL(1).Eigenschaft
List1.AddItem CL(2).Eigenschaft
End Sub

gerade getestet, geht. :smile:

Und danke für die Info mit dem Konstruktor.
Meine Frage wäre dann allerdings, wie ich bei der
Initialisierung Werte übergebe?

Bei einer Collection ist das möglich :smile:

Oder geht das bei VB nicht?

Dim XYZ as Objekt 4,5

Jetzt würde Eigenschaft 1 den Wert 4 haben und Eigenschaft 2
den Wert 5. Ist sowas möglich oder nicht? Würd mich wundern,
wenn nicht :o

Das weiß ich nicht.

Eine Frage noch, da kommen aber auch noch Prozeduren dazu,
oder? Im Moment kann ich nämlich den Sinn noch nicht ganz
erkennen, die Klasse macht ja nicht mehr, als eine Variable
auch tun würde.

Oder willst Du einfach nur verschiedene Werte gemeinsam
verwalten?
Wie gefällt Dir das:

Option Explicit

Private Type Daten
I As Integer
B As Byte
S As String
End Type

Dim DT() As Daten

Private Sub Form_Load()
Dim I As Integer
ReDim DT(2)
DT(0).I = 2354
DT(0).B = 12
DT(0).S = „Test“
DT(1).I = 5678
DT(1).B = 34
DT(1).S = „Ende“

For I = LBound(DT) To UBound(DT)
List1.AddItem DT(I).I
List1.AddItem DT(I).B
List1.AddItem DT(I).S
Next
End Sub

Ohne Klasse, ohne Objekt. :smile:

Gruß, Rainer

MfG Alex

Hallo Alex,

was spricht gegen eine Collection?
Somit ist man Arg flexibel :smile:

das ist auch etwas, das mir nie einfällt, weil ich es noch nie verwendet habe. Ich weiß, was eine Collection ist, würde es wohl auch schaffen, damit zu arbeiten, aber probiert habe ich es noch nicht.

Meist verwende ich Arrays ja im Zusammenhang mit Schleifen und Collections sind langsam. In dem Beispiel/Zusammenhang hier, spielt das wohl eher keine Rolle, aber in zeitkritischen Anwendungen sind Collections wohl keine gute Idee. Deshalb habe ich mir die noch nie genauer angesehen.

Gruß, Rainer

Hallo Rainer,

es kommt halt immer auf dem Fall darauf an.
Ich selbst bin ein echter Freund, von Collection’s, somal man sie auch vererben kann :wink:

Zum Bsp. mein derzeitiges Project. Es ist eine Datenbank. Dort werden unter anderem auch MP3’s eingelesen, mit all ihren Eigenschaften, welche schon mal 50 Stueck oder mehr sein koennen!

All diese Info’s per Hand einzugeben, wäre Wahnsinn. Also habe ich eine Routine geschrieben, die die Daten automatisch einliesst. Du gibst ein Verzeichnis an, dort werden alle MP3’s gesucht und je nach Auswahl werden dann alle eingelesen! Der Anwender bekommt dann alle Daten zu sehen und kann sie noch von Hand ändern.

Nehmen wir mal an, du hast eine DVD mit MP3’s. Wieviele MP3’s da rauf passen, weisst du sicherlich.

Aber nungut. Wie würdest du die Daten speichern?
In dem Falle erstelle ich eine Klasse , die die Daten der Mp3’s enthaelt und dann noch eine Collection. In dieser werden nun die ganzen Daten eingetragen und bei Bedarf angezeigt oder später dann in die DB geschrieben :smile:

All diese Info’s in ein File auszulagen, naja ich denke mal das da eine Collection schneller ist und ich mir keine GEdanken machen muss, ob noch soviel Speicherplatz vorhanden ist etc.

Die ganzen Daten in ein Array zu packen. Hmm, wäre eine Variante, aber ich weiss net ob es da eine Grenze gibt?
Und selbst wenn. Ein Array mit x tausend Eintraegen, via Hilfsfunktion umzudimensionieren, wäre Wahnsinn oder?

MfG Alex