Zugriff auf Mutterelement aus Klasse
#1
Hallo Miteinander,

ich möchte aus einer Klasse cls_Textboxen das Change Ereignis von dynamisch erzeugten Textboxen in einem Frame auswerten und in eine Textbox außerhalb des Frames übergeben.
Innerhalb des Frames auf Elemente zugreifen geht mit der .Parent Eigenschaft.

Außerhalb kann man dies mit Mutterelement.Textbox machen also in meinem Fall UserForm1.TextBox1.

Gibt es eine Eigenschaft wo der Zugriff aus der Klasse aufs Elternelement des Frames also das UserForm1.

Es geht eigentlich nur darum, wenn mal der Userformname geändert wird, dass man in der Klasse nichts ändern muss.

 
Gruß Uwe
Antworten Top
#2
Hi,

zunächst einmal die Frage,warum sollte der Name der Userform geändert werden? Wenn man den gleich am Anfang vernünftig wählt, dann gibt es keinen Grund dafür. Kann je eh nur vom Programmierer gemacht werden. Und selbst wenn, dann kann er ja mit der Name Eigenschaft der Form arbeiten, statt ihn (den Namen) statisch zu übergeben.
Zum Anderen, was haben Deine dynamisch erzeugten Textboxen im Frame mit den statischen der Form denn am Hut? Nichts. Die dyn. Textboxn müssen ja in einem Array vom Typ der Klasse gespeichert und verwaltet werden. Die stehen in keiner Beziehung zu den Textboxen der Form. Die musst Du schon selbst irgendwie herstellen. Z. Bsp. im Change Ereignis der Textboxklasse: 

Userform1.TextBox1.Text = KlassenvariablennameDerTextbox.Text
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#3
Hallo Uwe,

in der clsTextboxen, wo du das ChangeEvent auswertest, löst du entweder ein neues Event aus, welches dann von einer EventSink ausgewertet wird, oder du übergibst beim instanziieren einer clsTextbox ein Objekt, welches eine Callback Methode enthält. Im Falle eines Events wird dann in diesem übergebenen Objekt diese Callbackroutine aufgerufen. In dem Fall muß aber sichergestellt werden, daß vor dem Terminieren von clsTextboxen Objekten diese ext. Referenz explizit gelöscht wird.

Gruß
Ulrich
[-] Folgende(r) 1 Nutzer sagt Danke an knobbi38 für diesen Beitrag:
  • Egon12
Antworten Top
#4
@ Ralf,

das ist mir schon alles klar. Mein Gedanke war eben nur, dass es vielleicht schön bequem ein Eigenschaft zum Rückrefenzieren aufs UserForm gibt.

Ich habe da mal was für einem ehemaligen Schüler gebaut. Da war mir wieder in die Finger geraten und habe noch einiges umgebaut. Man entwickelt sich ja eben weiter.

@ Ulrich, 
Danke für die Info. Das muss ich mir mal gründlich zu Gemüte führen.

Zur Ergänzung: Manchmal hat man einfach Tomaten auf den Augen. Ganz Einfach so:
statt --> UserForm1.TextBox1 = m_Textbox
dann --> m_Textbox.Parent.Parent.TextBox1 = m_Textbox

Gruß Uwe
Antworten Top
#5
..na ja... Du könntest Dir im Klassenmodul eine Variable vom Typ Userform dimensionieren. Die muss dann an der entprechenden Stelle gesettet werden. Damit kannst Du dann zugreifen.
Bsp.:

Im allg. Teil des Klassenmoduls:

Dim frm as Userform

Und da, wo Du drauf zugreifen willst:

Set frm = UserForm1 'und an dieser Stelle kannst Du dann auch die geänderte Form anpassen
'Hier verschaffst Du Dir Zugriff auf die Controls dieser Form und deren Eigenschaften. Entweder über deren Index oder Namen...
Debug.Print frm.Controls.Count, frm.Controls(2).Name, frm.Controls("Controlname").Text
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

[-] Folgende(r) 1 Nutzer sagt Danke an Ralf A für diesen Beitrag:
  • Egon12
Antworten Top
#6
ja, das hatte ich ja vorher so schön brav in ein Property (Set/Get) angelegt.
Gut via Parent verleidet für außenstehende zum Nichtnachdenken.
Aber ich habe nun was ich wollte den Weg selbst erkannt. 
Danke für deinen Hinweis.
 
Gruß Uwe
Antworten Top
#7
Hallo,

das wäre aber nicht ganz nach der Lehre von OOP, da so die Datenkapselung aufgehoben wird. Vereinfacht ausgedrückt, die Klasse clsTextbox muß nichts darüber wissen, wer oder was noch an der Änderung, sprich dem ChangeEvent, interessiert ist und was damit gemacht werden soll. Nur so bleibt die Klasse clsTextbox generisch.

Beispiel:
Es könnte ja durchaus sein, daß der Inhalt nicht nur in einer Textbox erscheinen soll, sondern z.B. in einem Label. Dafür müßte man die clsTextbox entsprechend anpassen und die Übergabe von zwei Objekttypen ermöglichen, einmal Label und einmal Textbox. Außerdem muß dann die Klasse wissen, daß einmal die Caption Eigenschaft und einmal die Text Eigenschaft je nach Objekt zu verwenden ist.

Also der Vorschlag sieht es mal verlockend aus und läßt sich auch einfach umsetzen, macht aber die Vorteile von OOP wieder zunichte. Der Code für die weitere Verarbeitung gehört nicht un die Klasse clsTextbox, sondern der steht in der Sink, sprich dem Empfänger von dem Event oder dem Callback.

Gruß
Ulrich
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste