Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1488to1492
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

Parent-Funktion in verschachtelten Klassen

Parent-Funktion in verschachtelten Klassen
19.04.2016 22:07:39
Luggesch
Hallo und Guten Abend zusammen,
folgendes Problem liegt vor:
Es existieren zwei Klassen, A und B, wobei B in A untergeordnet/verschachtelt ist.
B besitzt verschiedene Eigenschaftselemente zb. x.
Eine Wertezuweisung könnte also wie folgt aussehen:
A.B.x = 7
Jetzt zu meiner Frage; wenn ich den Wert wie in obiger Zeile ändere, bekommt Klasse A das in keinster Weise mit, da sich alles in Klassenmodul B abspielt. Wenn sich jedoch der Wert in B ändert sollen sich Parameter in A neu berechnen.
Wie kann ich daher in B abfragen, welcher Klasse (Parent) diese untergeordnet ist?
Geht das überhaupt.
Schon mal vielen Dank,
und allen einen schönen Abend
Gruß Luggesch

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Parent-Funktion in verschachtelten Klassen
20.04.2016 18:44:48
Nepumuk
Hallo,
ich kenn deine Konstellation nicht, aber wenn zu einer A-Klasse genau eine B-Klasse existiert dann könntest du bei Änderung eines Wertes in der B-Klasse per RaiseEvent ein Event in der zugehörigen A-Klasse auslösen.
Gruß
Nepumuk

AW: das war hier...
21.04.2016 21:44:07
Luggesch
Hallo ihr Beiden,
zuerst mal vielen Dank für eure Antworten.
Leider bin ich mit meiner Problematik noch nicht ganz am Ziel.
Mittlerweile frage ich mich ob das überhaupt geht was ich vorhabe. :D
Deswegen hier mal das Problem in Langform:
Gegeben seien vier Klassen:
clsVector
clsMatrix
clsQuad
clsFrame

Der Vektor setzt sich aus vier Zahlen zusammen.
Die Matrix setzt sich aus vier Vektoren zusammen
Das Quad setzt sich aus Zahl und Vektor zusammen.
Das Frame setzt sich aus Vektor und Quad zusammmen.
Nachfolgend sind die wichtigsten Schnispel der Klassen aufgeführt:
'--------clsVector-----------------
Private pX As Double
Private pY As Double
Private pZ As Double
Private pD As Double
Private Sub Class_Initialize(): End Sub
Private Sub Class_Terminate(): End Sub
Public Property Let X(Value As Double): pX = Value: End Property
Public Property Get X() As Double: X = pX: End Property
Public Property Let Y(Value As Double): pY = Value: End Property
Public Property Get Y() As Double: Y = pY: End Property
Public Property Let Z(Value As Double): pZ = Value: End Property
Public Property Get Z() As Double: Z = pZ: End Property
Public Property Let D(Value As Double): pD = Value: End Property
Public Property Get D() As Double: D = pD: End Property

'----------------------------------
'--------clsMatrix-----------------
Private pE1 As clsVector
Private pE2 As clsVector
Private pE3 As clsVector
Private pE4 As clsVector
Private Sub Class_Initialize()
Set pE1 = New clsVector
Set pE2 = New clsVector
Set pE3 = New clsVector
Set pE4 = New clsVector
End Sub
Private Sub Class_Terminate()
If pParent  0 Then Set Parent.Me = Me
Set pE1 = Nothing
Set pE2 = Nothing
Set pE3 = Nothing
Set pE4 = Nothing
End Sub
Public Property Set E1(Vec As clsVector): Set pE1 = Vec: End Property
Public Property Get E1() As clsVector: Set E1 = pE1: End Property
Public Property Set E2(Vec As clsVector): Set pE2 = Vec: End Property
Public Property Get E2() As clsVector: Set E2 = pE2: End Property
Public Property Set E3(Vec As clsVector): Set pE3 = E3: End Property
Public Property Get E3() As clsVector: Set E3 = pE3: End Property
Public Property Set E4(Vec As clsVector): Set pE4 = Vec: End Property
Public Property Get E4() As clsVector: Set E4 = pE4: End Property

'----------------------------------
'--------clsQuad-----------------
Private pRe As Double
Private pIm As clsVector
Private Sub Class_Initialize()
Set pIm = New clsVector
End Sub
Private Sub Class_Terminate()
Set pIm = Nothing
End Sub
Public Property Let re(Value As Double): pRe = Value: End Property
Public Property Get re() As Double: re = pRe: End Property
Public Property Set Im(Vector As clsVector): Set pIm = Vector: End Property
Public Property Get Im() As clsVector: Set Im = pIm: End Property

'----------------------------------
'--------clsFrame-----------------
Private pVector As clsVector
Private pQuad As clsQuad
Private Sub Class_Initialize()
Set pVector = New clsVector
Set pQuad = New clsQuad
End Sub
Private Sub Class_Terminate()
Set pVector = Nothing
Set pQuad = Nothing
End Sub
Public Property Set Vector(Vector As clsVector): Set pVector = Vector: End Property
Public Property Get Vector() As clsVector: Set Vector = pVector: End Property
Public Property Set Quad(Quad As clsQuad): Set pQuad = Quad: End Property
Public Property Get Quad() As clsQuad: Set Quad = pQuad: End Property

'----------------------------------
Unglücklicherweise kann jedes Frame auch als eine Matrix dargestellt werden. Diese Matrix soll nicht in der Klasse clsFrame gespeichert werden, aber temporär eingelesen und ausgelesen werden. Es fügt sich also folgende Property in der Klasse clsFrame an:
Public Property Set matrix(matrix As clsMatrix)
'hier wird die Matrix eingelesen und in Vector und Quad umrechnet und gespeichert.
End Property
Public Property Get matrix() As clsMatrix
'hier wird die Matrix aus Vector und Quad berechnet und ausgegeben
End Property

Jetzt (endlich) zum Problem:
Wenn ich jetzt einen Teil der Frame-Matrix ändere...
frame.matrix.e1.x = 5
...dann wird die Matrix-Property des Frames kurzzeitig erstellt und der Vector-Wert E1.x = 5 eingelesen. Da jedoch nur eine Eigenschaft der Matrix geändert wird springt das Programm nie in die Property "Set Matrix", die Änderung wird nie in die Seicherelemente des Frames umgerechnet und verpufft wenn sich die temporäre Matrix kurze Zeit später wieder selbst vernichtet.
Daher die Idee, jedem Element einen Parent zuzuweisen; bei jedem Terminieren würde die Klasse prüfen ob sie ein Parent hat und sich vor dem Terminieren in diese zurückspeichern (Auslösen der Set-Property).
Realisiert wurde das habe ich das Ganze wie von euch teilweise schon vorgeschlagen mit einer zusätzlichen Parent-Eigenschaft pro Klasse. Zusätzlich habe ich noch mit einer API einen Umweg genommen, damit die Klasse des Parent variabel bleibt.
Dies sind dafür die Schnipsel:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (_
pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public Function CParentFromPtr(ByVal Ptr As Long)
Dim tmp As Object
CopyMemory tmp, Ptr, 4
Set CParentFromPtr = tmp
CopyMemory tmp, 0&, 4
End Function
Die geänderte Klasse clsMatrix sähe dann so aus:
Private Sub Class_Initialize()
Set pE1 = New clsVector
Set pE2 = New clsVector
Set pE3 = New clsVector
Set pE4 = New clsVector
Set pE1.Parent = Me
Set pE2.Parent = Me
Set pE3.Parent = Me
Set pE4.Parent = Me
End Sub
In der Klassen clsVector soll das Rückschreiben vor dem Terminieren dann wie folgt geschehen:
Private pParent As Long
Private pX As Double
Private pY As Double
Private pZ As Double
Private pD As Double
Private Sub Class_Terminate()
If pParent  0 Then Set parent.Me = Me   'HIER BRICHT ER AB; HIER SOLL ER SICH ZURÜ _
CKSCHREIBEN
End Sub
Public Property Set Parent(cls)
pParent = ObjPtr(cls)
End Property
Public Property Get Parent()
If pParent = 0 Then Exit Property
Set Parent = CParentFromPtr(pParent)
End Property

So viel zu meinem Problem, ich hoff ich habe es verständlich formuliert.
Schon Mal vielen Dank fürs Lesen, mittlerweile glaube ich, dass es auf die oben beschriebene Art und Weise nicht realisiert werden kann.
Mal sehen.
Grüße Luggesch.

Anzeige
für Klassenprofis
21.04.2016 22:47:35
Michael
Hi Luggesch,
ich klinke mich mal aus; ich hatte Dir nur eines meiner Rechercheergebnisse gepostet, aber keine erwähnenswerte Erfahrung.
Deshalb aktiviere ich den Thread nochmal.
Schöne Grüße & gutes Gelingen,
Michael
P.S.: Es wird Dich nicht wirklich interessieren, aber wenn ich mir die viele Schreibarbeit ansehe, nur um ein paar Bytes durchzureichen, mag ich mir Klassen gar nicht erst antun.

AW: für Klassenprofis
23.04.2016 19:03:35
Luggesch
Servus zusammen,
habs doch noch hinbekommen:
Private Sub Class_Terminate()
If pParent  0 Then Set Parent.Matrix = Me
End Sub
So wird die Set Matrix - Property aktiviert und die Werte doch noch zurückgeschrieben. Zwar nicht ganz so schön, weil ".Matrix" nicht variabel ist, aber es funktioniert.
Gruß Luggesch
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige