Registriert seit: 16.08.2020
Version(en): 2019 64bit
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
Registriert seit: 25.11.2021
Version(en): 2019, 365
15.11.2024, 13:02
(Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2024, 13:05 von Ralf A.)
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
Registriert seit: 22.09.2024
Version(en): 2010
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:1 Nutzer sagt Danke an knobbi38 für diesen Beitrag 28
• Egon12
Registriert seit: 16.08.2020
Version(en): 2019 64bit
15.11.2024, 14:07
(Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2024, 14:07 von Egon12.)
@ 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
Registriert seit: 25.11.2021
Version(en): 2019, 365
15.11.2024, 14:15
(Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2024, 14:17 von Ralf A.)
..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:1 Nutzer sagt Danke an Ralf A für diesen Beitrag 28
• Egon12
Registriert seit: 16.08.2020
Version(en): 2019 64bit
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
Registriert seit: 22.09.2024
Version(en): 2010
15.11.2024, 19:33
(Dieser Beitrag wurde zuletzt bearbeitet: 15.11.2024, 19:33 von knobbi38.)
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