Zeiger-Liste

02/11/2009 - 12:06 von Ersin Yilmiz | Report spam
Hallo,
ich möchte in VB6 ein Array mit Zeigern machen, die auf Objekte (hier:
Klassen) zeigen.
Ich habe es bisher immer nur geschafft, die Klassen selbst in die Liste
aufzunehmen, aber das ist nicht das, was ich möchte.
Wenn ich nàmlich Objekte aus meinem Array entfernen möchte, entferne ich
gleichzeitig die Objekte.
Was ich bràuchte, wàre sowas wie in C++...
typedef std::list< const c_MeineKlasse * > t_MeineKlassenList;
Kriegt man das mit VB6 auch hin?
Ciao
Ersin
 

Lesen sie die antworten

#1 Peter Götz
02/11/2009 - 13:37 | Warnen spam
Hallo Ersin,

ich möchte in VB6 ein Array mit Zeigern machen, die auf Objekte (hier:
Klassen) zeigen.



Dim MyArray(1) as Object
Set MyArray(0) = Obj1
Set MyArray(1) = Obj2


Ich habe es bisher immer nur geschafft, die Klassen selbst in die Liste
aufzunehmen,



Wohl eher nicht.
Du kannst einer Variablen oder einem Member eines
Arrays einen Verweis auf eine Klasseninstanz zuweisen,
aber nicht die Instanz selbst.

aber das ist nicht das, was ich möchte.
Wenn ich nàmlich Objekte aus meinem Array entfernen möchte, entferne ich
gleichzeitig die Objekte.



Wie (Code) entfernst Du denn ein solches Objekt?

Was ich bràuchte, wàre sowas wie in C++...
typedef std::list< const c_MeineKlasse * > t_MeineKlassenList;
Kriegt man das mit VB6 auch hin?



Mit

Dim MyObjVariable1 as Object
dim MyObjVariable2 as Object

Set MyObjVariable1 = New MyObj
Set MyObjVariable2 = MyObjVariable1

weist Du erst mal MyObjVariable1 einen Verweis (Zeiger)
auf die mit New MyObj erstellte Objektinstanz zu.
Und anschliessend erhàlt auch noch MyObjVariable2
einen Verweis auf die selbe Objektinstanz.

Beide Variablen zeigen also auf die selbe Objektinstanz.

Hier mal ein prakt. Beispiel.
Erstelle hierzu ein Projekt mit einem Formmodul (Form1)
sowie zwei Klassenmodulen (Class1 und Class2).


' /// Code in Form1
Option Explicit
Private mC1 As Class1
Private mC2 As Class2
Private mMyClasses() As Object
Private mLoading As Boolean


Private Sub Form_Load()
mLoading = True
Set mC1 = New Class1
Set mC2 = New Class2

ReDim mMyClasses(1)
Set mMyClasses(0) = mC1
Set mMyClasses(1) = mC2

End Sub


Private Sub Form_Activate()
Dim i As Integer
Dim MsgBuffer As String

If mLoading Then
mLoading = False

ShowObjs

Set mMyClasses(1) = Nothing
ShowObjs

Set mMyClasses(0) = Nothing
ShowObjs
End If
End Sub

Private Sub ShowObjs()
Dim i As Integer
Dim MsgBuffer As String

MsgBuffer = _
"mC1: " & mC1.Name & _
vbCrLf & _
"mC2: " & mC2.Name & _
vbCrLf & vbCrLf

Dim Obj As Object
For i = 0 To UBound(mMyClasses)
MsgBuffer = MsgBuffer & vbCrLf

MsgBuffer = _
MsgBuffer & _
"mMyClasses(" & CStr(i) & ") : "

If mMyClasses(i) Is Nothing Then
MsgBuffer = _
MsgBuffer & "Nothing"
Else
MsgBuffer = _
MsgBuffer & mMyClasses(i).Name
End If
Next

MsgBox MsgBuffer, vbInformation
End Sub
' \\\ ___________________________


' /// Code in Klassenmodul Class1
Option Explicit

Public Property Get Name() As String
Name = "Class1"
End Property
' \\\ ___________________________


' /// Code in Klassenmodul Class2
Option Explicit

Public Property Get Name() As String
Name = "Class2"
End Property
' \\\ ___________________________

Nach dem Programmstart wird in Form_Load() erst mal eine
Instanz der Klasse Class1

Set mC1 = New Class1

sowie eine Instanz der Klasse Class2 erzeugt

Set mC2 = New Class2

Die Variablen mC1 und mC2 zeigen nun jeweils auf eine dieser
beiden Klasseninstanzen.
Anschliessend wird mMyClasses(0) und mMyClasses(1) ebenfalls
ein Verweis auf je eine dieser beiden Klasseninstanzen zugewiesen:

Set mMyClasses(0) = mC1
Set mMyClasses(1) = mC2

mMyClasses(0) zeigt nun auf die Instanz der Klasse Class1 und
mMyClasses(1) zeigt auf die Instanz der Klasse Class2.

In Form_Activate werden dann erst mal die Klassen entsprechend
via MsgBox angezeigt.
Anschliessend wird mMyClass(1) auf Nothing gesetzt, womit mMyClass(1)
nun nicht mehr auf die Instanz der Klasse Class2 zeigt, sondern eben
auf nichts (Nothing).
In der nachfolgenden MsgBox wird dieser Zustand sichtbar.

Danach wird mMyClass(0) ebenfalls auf Nothing gesetzt und die
MsgBox zeigt wieder den Zustand der einzelnen Variable bzw.
Array-Member.

Solange noch irgendeine Variable einen Verweis auf eine
solche Klasseninstanz hàlt, wird diese Klasseninstanz am
Leben erhalten. Wird der letzte Verweis auf eine solche
Instanz gelöscht

Set LetzteObjVariable = Nothing

dann wird damit auch gleich die noch im Speicher befindliche
Klasseninstanz freigegeben und zerstört.

Alles klar?

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen