Dynamische Zuweisung anonymer Funktionen in Pascal

8

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.

    
sav 20.03.2015, 05:03
quelle

1 Antwort

7

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:

David Heffernan 20.03.2015, 05:24
quelle