Hallo,
warum nicht? Der Compiler wird ja vermutlich nicht bei jedem Aufruf neuen Code für die gleiche Methode erzeugen (das wäre schon ein wenig verschwenderisch). Normalerweise müsste er einfach Objekte erzeugen, die die verwendeten Variablen beinhalten, und diese Objekte mit den Methodenreferenzen verwenden (natürlich wird für jeden Button eine neues Delegatobjekt instanziiert - aber das ist ja normalerweise nicht aufwändiger, als z.B. einen Button zu instanziieren).
Wenn man das nicht will, kann man entweder eine Methode angeben, die man dann wiederverwendet, und dann aber beispielsweise den Button aus der sender-Variable ermitteln; oder man könnte eine Klasse definieren, die bestimmte Instanzvariablen hat, und in der Schleife jeweils neue Instanzen der Klasse erzeugen und einen Handler auf eine Methode der Klasse erzeugen (hat den gleichen Effekt wie der andere Code, nur ist hier die Funktionalität des Verwendens äußerer Variablen in Lambda-Ausdrücken manuell nachgebildet). Dann wird auch nur eine Methode wiederverwendet, aber natürlich für jeden Button ein neuer Delegat erzeugt (was ja kein Problem ist).
Public Class Form2
Private Class MyButtonHandler
Private ReadOnly myChar As Char
Private myForm As Form2
Public Sub New(myChar As Char, myForm As Form2)
Me.myChar = myChar
Me.myForm = myForm
End Sub
Public Sub HandleClick(sender As Object, e As EventArgs)
myForm.HandleChar(myChar)
End Sub
End Class
Public Sub New()
InitializeComponent()
'Anzuzeigende Tastatur-Zeilen
Dim zeilen As String() = {"qwertzuiopü+", "asdfghjklöä#", "yxcvbnm,.-"}
For y As Integer = 0 To zeilen.Length - 1
For x As Integer = 0 To zeilen(y).Length - 1
Dim zeichen As Char = zeilen(y)(x) 'akt. Taste
' Button erzeugen, positionieren und anzeigen
Dim btn As New Button() With { .Text = zeichen.ToString() }
btn.Bounds = New Rectangle(If(y Mod 2 = 1, 10, 0) + 20 + x * _
30, 20 + y * 30, 25, 25)
Controls.Add(btn)
Dim handler As New MyButtonHandler(zeichen, Me)
AddHandler btn.Click, AddressOf handler.HandleClick
Next
Next
End Sub
Private Sub HandleChar(myChar As Char)
MessageBox.Show("Taste " & myChar & " gedrückt!")
End Sub
End Class
Beitrag wurde zuletzt am 04.01.12 um 11:56:44 editiert. |