Thema Datum  Von Nutzer Rating
Antwort
Rot VBA: Attribute von neu erzeugten Objekten zeigen auf Speicher der bisherigen Objekte
03.11.2016 13:22:24 Ben
NotSolved
03.11.2016 13:39:41 BigBen
NotSolved
03.11.2016 13:53:58 BigBen
NotSolved
03.11.2016 14:13:34 Ben
NotSolved
03.11.2016 15:49:12 BigBen
NotSolved
03.11.2016 15:50:45 BigBen
NotSolved
07.11.2016 12:00:53 Ben
NotSolved

Ansicht des Beitrags:
Von:
Ben
Datum:
03.11.2016 13:22:24
Views:
1165
Rating: Antwort:
  Ja
Thema:
VBA: Attribute von neu erzeugten Objekten zeigen auf Speicher der bisherigen Objekte

Hallo VBA-Forum!

 

Ich habe das im Titel angedeutete Problem, dass ich Instanzen einer Klasse mit Parameterübergabe erzeuge und die Variablen der neu erzeugten Instanz auf den gleichen Speicher zu zeigen scheinen, wie die Variablen der zuvor erzeugten Instanzen.

Sprich: Erzeuge ich ein neues Objekt, werden allen schon erzeugten Objekten die als Parameter übergebenen Werte zugewiesen.

Ich erzeuge die Objekte in einer Sub und füge sie einer Collection in einem Objekt einer anderen Klasse hinzu. Ich habe versucht die temporäre Variable zum erzeugen des Objekts "= Nothing" zu setzen, doch das scheint keinerlei Unterschied zu machen. Wenn ich die Collection überwache, ist nach jeder neuen Instanziierung jede
Womöglich weiß ich nur nicht, wie man in meinem Fall objektspezifische Variablen irgendwie extra deklarieren muss; ich komme hier jedenfalls nicht weiter.

 

Hier der Code:

Klasse MyOneObject, bei denen die Objekte sich den Speicher zu teilen scheinen:

Option Explicit

Public varOne As MyTwoObject
Public varTwo As String
Public varThree As Integer
Public varFour As Boolean
Public varFive As Integer


Public Function GetMyOneObject(ByRef paramOne As MyTwoObject, ByVal paramTwo As String, ByVal paramThree As Integer, ByVal paramFour As Boolean) As MyOneObject

   Set GetMyOneObject = Me

   Dim varOne As MyTwoObject                

   Set varOne = paramOne
   Me.varTwo = paramTwo                     'Mit und ohne "Me." gleiches Ergebnis
   Me.varThree = paramThree
   Me.varFour = paramFour
   varFive = paramOne.varOne

End Function

 

Klasse MyTwoObject, deren Objekte eine Collection von MyOneObjects haben:

Option Explicit

Public myOneObjCollection As New Collection
Public varOne As Integer
Public varTwo As String

Public Function GetMyTwoObject(vOne As Integer, vTwo As String) As MyTwoObject

   Set GetMyTwoObject = Me

   Set myOneObjCollection = New Collection

   varOne = vOne
   varTwo = vTwo

End Function

Public Function addMyOneObj(ByVal myOneObj As MyOneObject)    'Hier führt ByRef zu keiner Veränderung

   myOneObjCollection.Add myOneObj

End Function

 

Modul3, in dem eine Variable Platz für eine Instanz von MyTwoObject hat:

Public currentMyTwoObj As MyTwoObject

 

Klasse Init. Hier wird eine Instanz vom Typ MyTwoObject erzeugt und der Variablen in Modul3 zugewiesen:

Option Explicit

Dim myTwoObjTmp As MyTwoObject

Public Sub initialize()

   Set myTwoObjTmp = MyTwoObject(5, "String")

   Set Modul3.currentMyTwoObj = myTwoObjTmp

End Sub

 

 

Klasse Runs, in welcher MyOneObjects erzeugt und der Collection von Modul3.currentMyTwoObj hinzugefügt werden:

Option Explicit

Public Sub moreOneObjects()

   Dim myOneObjTmp As MyOneObject

   Set myOneObjTmp = MyOneObject(Modul3.currentMyTwoObj, "String", 5, True)

   Modul3.currentMyTwoObj.addMyOneObj myOneObjTmp

End Sub

 

In den Kommentaren stehen Möglichkeiten die ich ausprobiert habe. Ich hoffe mal ich stelle mich einfach nur zu blöd an.

Vielen Dank schonmal im Voraus für jede Hilfe

 

Viele Grüße

Ben

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:

 
 

  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen