Visual Basic 6

Auflistungsklassen richtig clonen

Der kleine Unterschied bei Klasseninstanzen

Visual Basic bietet mit dem Klassenmodell eine hervorragende Möglichkeit Daten während der Laufzeit zu speichern. Wo Arrays und normale Collections an ihre Grenzen stoßen fangen Klassenauflistungen an Ihre Stärken auszuspielen. Eine Auflistung in VB ist nichts anderes als ein Container für eine normale Klasse mit Eigenschaften, in dem die einzelnen Elemente in einer Collection verwaltet werden, also eine Klassen-Collection mit Verwaltungsfunktionen.

Der VB-Klassengenerator leistet einen guten Beitrag bei der Erstellung von Auflistungen, auch wenn der Code danach etwas verbesserungswürdig ist. Man erreicht ihn in der VB-IDE über das Menü "Add-Ins", wenn er als Add-In bereits eingebunden ist. Über das Menü "Datei\Neu\Auflistung" im Klassengenerator öffnet sich der Auflistungsgeneratordialog. Am einfachsten lässt man diesen die Auflistungsklasse und die Eigenschaftsklasse zusammen generieren.

Hier ein Beispiel für eine einfache Kontakt-Klasse mit Auflistung:

Im Anschluss kann man im Klassengenerator die Eigenschaften der Contact-Klasse festlegen.

Über "Datei\Projekt aktualisieren" werden schließlich die beiden neuen Klassen in der IDE generiert.

In der Auflistungsklasse sind nun, neben den Class_Initialize- und Class-Terminate-Methoden, 2 weitere Methoden und 3 Eigenschaften enthalten:

  • Add (Methode)
  • Remove (Methode)
  • Count (Eigenschaft)
  • Item (Eigenschaft)
  • NewEnum (Eigenschaft)

Wie bereits erwähnt ist der dabei entstehende Code nicht optimal, insbesondere wenn wir später die Klon-Funktionalität in die Auflistungsklasse einbauen möchten. So kann man beim Hinzufügen neuer Elemente zur Auflistung zwar einen Schlüssel (Key) angeben und später über diesen auf die Elemente zugreifen, aber man kann ihn nicht auslesen. Da hilft, wenn man aus dem Key eine eigene Eigenschaft (Property Get und Property Let) macht und die Add-Methode der Auflistungsklasse entsprechend anpasst:

Public Function Add( _
   FirstName As String, _
   LastName As String, _
   EMail As String, _
   Optional Key As String) As Contact

'neues Objekt erstellen
Dim objNewMember As Contact
Set objNewMember = New Contact

'die Eigenschaften festlegen, die der Methode übergeben werden
objNewMember.FirstName = FirstName
objNewMember.LastName = LastName
objNewMember.EMail = EMail

If Len(sKey) = 0 Then
   mCol.Add objNewMember
Else
   objNewMember.Key = Key
   mCol.Add objNewMember, Key
End If

'das erstellte Objekt zurückgeben
Set Add = objNewMember
Set objNewMember = Nothing

End Function

Mit einer solchen Auflistung kann man nun wunderbar Daten während der Laufzeit zwischenspeichern und mit ihnen arbeiten. So ist es z.B. möglich Datenbanktabellen mit mehreren Untertabellen beim Start einer Anwendung komplett in eine entsprechend angelegte Auflistungsstruktur zu laden, um die Datenbankzugriffe zu minimieren.

Das Klonen

In manchen Situationen macht es nun Sinn eine zuvor gefüllte Auflistung zu kopieren, um dann mit der Kopie weiterzuarbeiten, ohne die Ursprungsauflistung anzutasten. Dies ist aber nicht so ohne weiteres möglich, denn das reine Instanzieren einer neuen Auflistung und das Übertragen der Daten mit der SET-Methode bringt es mit sich, dass Änderungen an der Kopie immer auch an das Original weitergereicht werden.

Was wir brauchen ist eine komplett abgekoppelte Klasseninstanz. Dies wird erreicht, in dem wir eine neue Methode in die Auflistungsklasse einbauen, die nichts anderes tut, als jedes Element der eigenen Klassen-Collection in eine neue Instanz von sich selbst zu kopieren und diese Instanz an die aufrufende Funktion zurückzugeben:

Public Function Clone() As Contacts

Dim objClass As New Contacts
Dim obj As Contact

Set objClass = New Contacts

For Each obj In mCol
   objClass.Add _
     obj.FirstName, _
     obj.LastName, _
     obj.EMail, _
     obj.Key
Next

Set Clone = objClass

End Function

Nun kommt auch die Veränderung an der Add-Methode zum Tragen, denn ohne die Key-Eigenschaft wäre es nicht möglich eine exakte Kopie der Auflistung zu erhalten.

Downloads

ClassClone.zip
kick it on dotnet-kicks.de AddThis 4 wikio-Stimme(n) Trackback-Url...

Schlagworte

1 Kommentar bislang...

  • Funktioniert super!
    Ich arbeite gerade an ein Porjekt in dem ich eine Objekthirarchie erstellen muss in dem eine Eigenschaft eines Objkets eine Objektauflistung sein kann. Mit diesem Artikel habe ich es endlich geschafft kopien der Objektauflistungen zu erstellen und dort die Werte anzupassen. Dabei muss man aber darauf achten, dass nur die unterste Auflistung geklont wird um wirklich mit einer Kopie zu arbeiten.

    Danke
    1
    chris : Samstag, 3. September 2005 11:19

Dein Kommentar hierzu...


Kommentar-Feed für diesen Beitrag
Gravatare werden unterstützt .:. eMail-Adressen werden nicht veröffentlicht
 

RSS-Feed

Die URL des Standard-Newsfeed von zerbit.de lautet:

http://www.zerbit.de/rssfeed.aspx

Login


 

 

Statistik



kürzlich kommentiert

  • Roland : 06.09.2010 13:15 @ OutlookSignature
    in der Facebook-Gruppe gibt es zumindest...
  • Roland : 06.09.2010 11:48 @ OutlookSignature
    Hallo, wir verwalten unsere Signaturen a...
  • Helmut : 05.09.2010 15:08 @ OutlookSignature
    Mir wird bei Outlook 2010 auch die Stand...
  • S. Doberstein : 31.08.2010 22:59 @ Der Ordner "MSOCache"
    Fortsetzung meines gestrigen Kommentares...
  • Steffen Doberstein : 30.08.2010 20:50 @ Der Ordner "MSOCache"
    Hallo! Ich fand die Idee mit dem Partiti...

Artikel 4

  • Datum: 06.02.2005
    Kategorie: Visual Basic 6
    Zugriffe: 1.185
    Kommentare: 1
    Trackbacks: 0

Letzte Beiträge

Kategorien

Buttons & More

Blog-Roll

Banner Piraten-Partei