Guten Morgen, Wolfgang -
eine Codeblock ist ein Stück Code, der zur Laufzeit ausgeführt werden kann. Meist verwendet man ihn, um eine Funktion aufzurufen, man kann aber auch verschiedene Anweisungen darin abarbeiten.
Xbase-Parts führen beim Auftreten bestimmter Ereignisse Codeblöcke aus, und zwar nach dem Schema, das Du zitiert hast:
Code: Alles auswählen
oMenu:itemSelected := {|nItem,mp2,self| MenuSelect(nItem, mp2, self) }
Wenn ein Menüeintrag selektiert wird, führt die Laufzeitumgebung folgenden Code aus:
Eval(self:itemSelected, nItem, mp2, self)
Die Bereitstellung der drei Parameter, die zwischen den beiden |-Zeichen definiert sind, übernimmt also die Laufzeitumgebung. Du brauchst sie daher nicht selbst bereitzustellen.
Jetzt habe ich ein wenig gepfuscht, als ich Dich sinnentstellend zitiert habe, denn der Aufruf lautet anders:
Code: Alles auswählen
oMenu:itemSelected := {|nItem,mp2,obj| MenuSelect(obj, 200+nItem) }
Auffällig ist, dass z.B. mp2 nicht als Parameter an MenuSelect() übergeben wird. Und, dass obj als erster Parameter von MenuSelect() erwartet wird.
Die Codeblock-Definition sagt aus:
- nehme den dritter Parameter, den Eval() erhält, und übergebe ihn als ersten Parameter an die Funktion MenuSelect();
- nehme den ersten Parameter, den Eval() erhält, und addiere 200 auf diesen Wert und übergebe ihn als zweiten Parameter an die Funktion MenuSelect()
Denkbar ist auch, dass Du zusätzlich eigenen Parameter an die Funktion übergeben kannst:
Code: Alles auswählen
oMenu:itemSelected := {|nItem,mp2,obj| MenuSelect(obj, 200+nItem, dHeute, nAntwortzeit) }
In diesem Fall müssen die beiden Felder dHeute und nAntwortzeit in Deinem Programmcode definiert sein, sonst erhältst Du zur Laufzeit eine entsprechende Fehlermeldung.
Und dann möchte ich den beiden Vorredner noch was sagen:
Der Versuch, in MenuSelect() über ::self zu arbeiten: das wird nicht funktionieren. Ganz gewiss nicht. Und die Parameter, die zwischen | aufgelistet sind, sind nur dann in der aufgerufenen Funktion verfügbar, wenn sie auch in den () aufgeführt werden. mp2 wirst Du in MenuSelect() nicht ansprechen können, da es in der Codeblock-Definition nicht an MenuSelect() übergeben wird.