Ich möchte Popup-Menüs in Pascal dynamisch erzeugen können.
Ich möchte auch in der Lage sein, OnClick-Handler jedem Menüelement dynamisch zuzuweisen.
Dies ist die Art von Dingen, die ich gewohnt bin, in C # zu tun, das ist mein Versuch in Pascal.
Der Menüpunkt onClick-Event-Handler muss zu einem Objekt gehören ( of Object
), also erstelle ich ein Container-Objekt dafür.
Hier ist mein Code:
%Vor%
Klicken Sie auf den Menüpunkt 6
Das Programm zeigt die erwartete Nachricht
Die nächste Nachricht zeigte jedoch nicht das erwartete Ergebnis.
Anstelle von 6 wird Punkt 10 angezeigt
Egal welches Element in der Liste ich anklicke, alle scheinen den Event-Handler für das letzte Element in der Liste (10) auszulösen.
Es wurde mir vorgeschlagen, dass die NE
Objekt-Objektprozedur Event
dieselbe Speicheradresse für alle Instanzen dieses Objekts ist.
Egal welchen Menüpunkt ich anklicke, die Speicheradresse MI.OnClick
ist gleich.
Der Schlüssel zum Verständnis besteht darin zu verstehen, dass die Variablenerfassung Variablen anstatt Werte erfasst.
Ihre Anon-Methoden erfassen alle dieselbe Variable F
. Es gibt nur eine Instanz dieser Variablen, da FormCreate
nur einmal ausgeführt wird. Das erklärt das Verhalten. Wenn Ihre Anon-Methoden ausgeführt werden, hat die Variable F
den Wert, der ihr in der letzten Schleifeniteration zugewiesen wurde.
Was Sie brauchen, ist für jede unterschiedliche Anon-Methode, um eine andere Variable zu erfassen. Sie können dies tun, indem Sie beim Generieren jeder anderen Anon-Methode einen neuen Stapelrahmen erstellen.
%Vor% Da das Argument für die Funktion GetWrapper
eine lokale Variable im Stack-Frame dieser Funktion ist, erzeugt jeder Aufruf von GetWrapper
eine neue Instanz dieser lokalen Variable.
Sie können GetWrapper
dort platzieren, wo Sie möchten. Als verschachtelte Funktion in FormCreate
oder als private Methode oder im Einheitenbereich.
Dann erstellen Sie Ihre Menüs wie folgt:
%Vor%Weiterführende Literatur:
Tags und Links delphi delphi-xe6 anonymous-function