Anzeige
Archiv - Navigation
1892to1896
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Daten verändern in kaskadierten Klassen

Daten verändern in kaskadierten Klassen
17.08.2022 18:37:07
Horn
Hallo,
ich bin neu in Forum da ich Unterstützung benötige. Ich habe Erfahrung mit VBA, bin aber neu bei Klassenmodulen.
Ich habe (mit Hilfe eurer Beiträge) eine kaskadiertes Klassengebilde erstellt. Diese besteht aus 3 Klasssenmodulen
In der Klasse(1) "cls1Feld" sind die eigentlichen Daten hinterlegt (hier: "PosA" und "PosZ")
Die Klasse(2) "cls2Zeile" bildet eine Auflistung von einigen Klasse(1) Instanzen (hier: 3)
Die Klasse(3) "cls3Bild" bildet ein Auflistung von einigen Klasse(2) Instanzen (hier: 3).
Wichtig ist dass ich alle Instanzen aller Klassen in Schleifen ansprechen kann (mit Schleifenindex)
Ich kann alle Instanzen erzeugen, mit Daten befüllen und auch die Daten der untersten Klasse einzeln wieder auslesen.
Aber ich muss einige Daten der untersten Klasse "cls1Feld" nachträglich ändern.
Dazu müssen in der Klasse "cls2Zeile" und "cls3Bild" noch mindesten ein zusätzlicher Eintrag hinzukommen.
Dazu habe ich aber nicht finden können. Was und wo muss ich noch etwas eintragen, damit ich nachträglich Daten der untersten Ebene ändern kann.
Nachfolgend die 3 Klassen und der Modul-Code.
' ------ Klassenmodul "cls1Feld" --------
Option Explicit
Private myPosA As String
Private myPosZ As String
Public Property Get PosA() As String
PosA = myPosA
End Property
Public Property Let PosA(ByVal pPosA As String)
myPosA = pPosA
End Property
Public Property Get PosZ() As String
PosZ = myPosZ
End Property
Public Property Let PosZ(ByVal pPosZ As String)
myPosZ = pPosZ
End Property
' ------ Klassenmodul "cls2Zeile" --------
Option Explicit
Private colFelder As Collection

Private Sub Class_Initialize()
Set colFelder = New Collection
End Sub

Private Sub Class_Terminate()
Set colFelder = Nothing
End Sub
Function Add(pFeld As cls1Feld, pName As String)
colFelder.Add pFeld, pName
End Function Function GetEigenschaft(strKey As String) As cls1Feld
Set GetEigenschaft = colFelder(strKey)
End Function ' ------ Klassenmodul "cls3Bild" --------
Option Explicit
Private colZeilen As Collection

Private Sub Class_Initialize()
Set colZeilen = New Collection
End Sub

Private Sub Class_Terminate()
Set colZeilen = Nothing
End Sub
Function Add(pZeile As cls2Zeile, pNameZeile As String)
colZeilen.Add pZeile, pNameZeile
End Function Function GetEigenschaft(pName As String) As cls2Zeile
Set GetEigenschaft = colZeilen(pName)
End Function ' ------ Modul --------
Sub Erstellen_und_Testen()
Dim objFeld() As cls1Feld
Dim objZeile() As cls2Zeile
Dim objBild As cls3Bild
Dim iK1%, iK2%
Set objBild = New cls3Bild
ReDim objZeile(3)
For iK2 = 1 To 3
Set objZeile(iK2) = New cls2Zeile
ReDim objFeld(3)
For iK1 = 1 To 3
Set objFeld(iK1) = New cls1Feld
objFeld(iK1).PosA = "PosA_" & iK2 & iK1
objFeld(iK1).PosZ = "PosZ_" & iK2 & iK1
objZeile(iK2).Add objFeld(iK1), "Feld" & iK1
Next iK1
objBild.Add objZeile(iK2), "Zeile" & iK2
Next iK2
' es folgt die Ausgabekontrolle
For iK2 = 1 To 3
For iK1 = 1 To 3
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosA
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosZ
Next iK1
Next iK2
End Sub

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten verändern in kaskadierten Klassen
17.08.2022 19:01:49
Nepumuk
Hallo,
kannst du eine Mustermappe hochladen damit ich das nicht nachbauen muss.

Dazu müssen in der Klasse "cls2Zeile" und "cls3Bild" noch mindesten ein zusätzlicher Eintrag hinzukommen.
Meinst du damit jeweils eine zusätzliche Eigenschaft?
Gruß
Nepumuk
AW: Daten verändern in kaskadierten Klassen
17.08.2022 19:21:41
Horn
Hallo Nepumuk,
ich habe die Datei hochgeladen (ich hoffe sie ist auch angekommen)
https://www.herber.de/bbs/user/154695.xlsm
Was genau eingetragen werden muss kann ich nicht sagen (ich bin Anfänger in Klassen)
Aber ich vermute ein Property-Let, Property-Set oder eine Function.
Gruß Horn
Anzeige
AW: Daten verändern in kaskadierten Klassen
18.08.2022 08:57:03
Horn
Ich habe noch mal nachgedacht und bin zu vollenden Überlegungen gekommen.
(mit Vorsicht zu genießen, da ich bei Klassenmodule Anfänger bin)
Ein "Property-Let" kann es nicht sein, da sie nicht auf fremde Klassen einwirkt.
Eine "function" macht zwar bei einer Get-Eigenschaft Sinn, da ich als User etwas zurückbekommen will. Hier will ich ja etwas setzen, also geben. Also macht es vermutlich auch keinen Sinn.
"Property-Set" verstehe ich als Anfänger noch nicht. Aber vermutlich kann sie auch nicht in andere Klassen einwirken.
Bleibt also nur eine Methode mit "sub".
Gruß Horn
Anzeige
AW: Daten verändern in kaskadierten Klassen
18.08.2022 09:57:44
Nepumuk
Hallo Horn,
ich habe dir mal eine zusätzliche Eigenschaft (Test) in die Klasse "cls3Bild" eingebaut.
https://www.herber.de/bbs/user/154699.xlsm
Gruß
Nepumuk
AW: Daten verändern in kaskadierten Klassen
18.08.2022 13:58:24
Horn
Hallo Nepumuk,
Danke für deine Mühe. Jedoch will ich keine zusätzlichen Daten einfügen, wie in deiner Lösung, sondern eingegebene Daten nach der Befüllung ändern.
Ich brauche eine Lösung, in der zwischen meinen Codezeilen im Modul
"Next iK2" und
" ' es folgt die Ausgabekontrolle"
eine weitere Befehlszeile kommt in der Sinngemäß steht
"ändere den Wert Zeile(2).Feld(1).PosA auf 'neuer Wert'".
Also ähnlich wie die Befehlszeile in der Ausgabekontrolle, aber eben nicht Ausgabe(Get), sondern Änderung(Eingabe, aber nicht hinzufügen)
Dazu natürlich die notwendigen Anpassungen in den Klassenmodulen.
Gruß Horn
Anzeige
AW: Daten verändern in kaskadierten Klassen
18.08.2022 14:28:10
Nepumuk
Hallo Horn,
da hatte ich dich missverstanden. Zum Ändern eines vorhandenen Wertes benötigst du keine neue Prozedur. Da genügt deine Funktion, mit der du auf die Werte zugreifst.

Public Sub Erstellen_und_Testen()
Dim objBild As cls3Bild
Dim objFeld() As cls1Feld
Dim objZeile() As cls2Zeile
Dim iK1%, iK2%
Set objBild = New cls3Bild
ReDim objZeile(3)
For iK2 = 1 To 3
Set objZeile(iK2) = New cls2Zeile
ReDim objFeld(3)
For iK1 = 1 To 3
Set objFeld(iK1) = New cls1Feld
objFeld(iK1).PosA = "PosA_" & iK2 & iK1
objFeld(iK1).PosZ = "PosZ_" & iK2 & iK1
objZeile(iK2).Add objFeld(iK1), "Feld" & iK1
Next iK1
objBild.Add objZeile(iK2), "Zeile" & iK2
Next iK2
' es folgt die Ausgabekontrolle
For iK2 = 1 To 3
For iK1 = 1 To 3
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosA
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosZ
objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosA = "Test " & iK1 ' Wert ändern
Next iK1
Next iK2
For iK2 = 1 To 3
For iK1 = 1 To 3
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosA
Debug.Print objBild.GetEigenschaft("Zeile" & iK2).GetEigenschaft("Feld" & iK1).PosZ
Next iK1
Next iK2
End Sub
Gruß
Nepumuk
Anzeige
AW: Daten verändern in kaskadierten Klassen
18.08.2022 20:25:19
Horn
Hallo Nepumuk,
vielen Dank. Super. Es funktioniert wie es soll.
Gruß Horn

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige