Ich habe zwei Windows mit jeweils den gleichen Objekten (Textfelder). Dazu gibt es ebenso einige Methoden die auf diese Textfelder zugreifen.
Wenn ich die Methoden in ein Modul auslagere und die Referenz des jeweiligen Window ( self ) als Parameter vom Typ Window übergebe, bremst mich spätestens der Compiler ein, der vollkommen zurecht behauptet das meine Textfelder nicht Bestandteil der Klasse Window sind.
Seht Ihr eine Möglichkeit zu verhindern, dass ich den gleichen Code in beide Windows kopiere…
(Den Code zu verwerfen und neu zu designen, um den Zugriff auf die Textfelder zu entfernen, ist leider keine Option…)
Beispiel:
Methode in einen Modul:
testmethode( win as Window )
win.textfield1 = “test”
return
Verwende die Syntax Extends w As Window zu Begin der Parameter Definition in der Methode. Dann kannst Du mittels “w” anstelle von “self” auf das Window Objekt zugreifen.
Die Methode wird dann z.B. mit Window.MethodenName angesprochen.
Je nach Anforderung, macht es evtl. Sinn, die Daten der Textfelder an die Methode zu übergeben.
Hallo,
alternativ könnte man eine neue Klasse (z.B. myTextField) anlegen mit dem Super TextField. In der Klasse myTextField kann man dann die benötigten Methoden (z.B. testmethode), Properties usw. anlegen.
Anschließend zieht man beliebig viele Textfelder (z.B. TextField_1, TextField_2 usw.) auf beliebige Fenster und ändert ihre Super-Eigenschaft von TextField auf myTextField. Nun kann man die testmethode innerhalb eines Fensters z.B. mit TextField_1.testmethode aufrufen.
Vielen Dank, Sascha und Christian für eure Vorschläge und Denkanstösse.
Ich habe damit herum experimentiert, bin aber meinem Ziel leider nicht näher gekommen. Gerade der für mich wichtige Punkt, dass ich aus einer Modul Methode heraus auf ein Textfeld in einem Objekt der Klasse Window zugreifen kann, den konnte ich damit nicht lösen. Vermutlich wird der einzig gangbare Weg Introspection sein…
Hallo,
wenn es über ein Modul gehen soll: Wenn die Textfelder auf einem Fenster sind, dass z.B. den Namen myWindow hat, dann müsste der Methodenaufruf so lauten:
Methode in einen Modul:
testmethode(win as myWindow )
win.textfield1.Text = "test"
return
Wenn also alle Fenster solche myWindow sind, d.h. sie werden alle über
dim w as new myWindow
w.Show
erzeugt werden, dann sollte das funktionieren.
Oder aber so:
Lege eine Klasse in deinem Projekt an mit dem Super Window.
Gib ihr eine Methode
Public Shared Sub setText(ControlName As String, Assigns Value as String)
dim NumberofControls as integer = ControlCount -1
For q As Integer = 0 To NumberofControls
Dim c As Control = Control(q)
If c.Name = ControlName Then
If c IsA TextField Then
TextField(c).Text = value
End If
Return
End If
Next
End Sub
(Und erweitere sie ggf. mittels ElseIf auf andere Control-Klassen, die du dann wiederum auf c castest und Value ihrer entsprechenden Eigenschaft beim Button wärs ja z.B. Caption statt Text zuweist. )
Dann lass deine Windows nicht mehr auf Window basieren, sondern auf der neuen Klasse.