was bedeutet das ||
Posted: Wed Jan 16, 2013 5:19 pm
http://www.xbaseforum.de/viewtopic.php?f=32&t=7006
von brandelh » Mi, 16. Jan 2013 15:33
Das ist die Syntax für einen CODEBLOCK !
Ein ARRAY wäre das: aVal := { "Wert1", 2, date() } // erzeugt ein Array mit 3 Elementen (String, num, Datum)
Bei einem CodeBlock wird || vorne angefügt, darin können sich Parameter befinden.
Beispiel
Code: Alles auswählen
bCode := { |cTxt| msgbox( cTxt ) } // durch direkte Eingabe wird der Codeblock direkt übersetzt und bCode referenziert ihn.
Eval( bCode, "Hallo Welt" ) // Eval() führt einen CodeBlock aus (=> 1. Parameter) und kann Parameter übergeben, hier "Hallo Welt".
Dieser Parameter wird dem codeblock übergeben und landet in dem Beispiel in cTxt.
Es gibt nun also eine MsgBox( "Hallo Welt" ) aus.
Codeblocks werden häufig eingesetzt um Aktionen für Clicks auf z.b. von PushButtons oder Menüs bereitzustellen.
Man kann einen Codeblock auch zusammenbauen und zur Laufzeit compilieren:
Code: Alles auswählen
cBlock := "{ |cTxt| msgbox( cTxt ) }" // es gehen auch sehr komplexe Sachen wie Werte für Suchanfragen.
bCode := &(cBlock) // ein Syntaxfehler in cBlock wird erst zur Laufzeit bemerkt
Eval( bCode, "Hallo Welt" ) // gleiches Ergebnis wie vorherGruß
Hubert
brandelh
Foren-Moderator
Beiträge: 9140
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Website Nach oben
--------------------------------------------------------------------------------
Re: was bedeutet das ||
von Tom » Mi, 16. Jan 2013 16:38
Etwas allgemeiner und zugleich spezieller gesprochen:
Zwischen den beiden senkrechten Strichen befinden sich die Parameter, die im Moment der Evaluierung an die Funktion im Codeblock übergeben werden (können). Hubert hat das schon mit diesem Beispiel gezeigt (ich habe die Variable "bCode" hier durch ihren Inhalt ersetzt):
Code: Alles auswählen
Eval( {|cTxt|msgbox( cTxt )}, "Hallo Welt" )
Hier wird erwartet, dass die Funktion im Codeblock (in diesem Fall "MsgBox") mindestens einen Parameter kennt. Der Codeblock nimmt diesen quasi entgegen, durch seine (Be)Nennung zwischen den ||. Würde dort nichts stehen, gäbe es einen Laufzeitfehler. Aus "Hallo, Welt" wird also im Moment der Evaluierung die Variable "cTxt", die an die Funktion übergeben wird.
Bei einem selbst gestalteten bzw. evaluierten Codeblock kann man da ziemlich beliebig vorgehen. Es gibt aber auch Codeblöcke, die von Objekten evaluiert werden, die wir benutzen. Dazu gehört beispielsweise der LbClick-Slot, den alle XbParts kennen, die von XbpWindow abgeleitet sind. Man kann ihn dazu verwenden, um für den Fall des Klicks mit der linken Maustaste ein zusätzliches oder abweichendes Verhalten zu programmieren. Was wir aber nur aus der Doku wissen: Dieser Codeblock wird mit drei Parametern evaluiert. Das heißt: Wenn wir ihn verwenden, können wir auf diese bis zu drei Parameter zugreifen, die ihm in diesem Moment gereicht werden. Der erste Parameter enthält die Position des Mauszeigers (der dritte enthält das Objekt, das die Methode besitzt):
Code: Alles auswählen
oXbp:LbClick := {|aPos|MsgBox("Mausposition: "+Var2Char(aPos))}
Wir haben hier also einen Codeblock gebaut, von dem wir wissen, dass er im Moment der Evaluierung mit drei (von denen wir hier nur einen verwenden) Parametern aufgerufen wird. Durch die Aufzählung zwischen den || stellen wir die Referenz auf diese Parameter her und benennen sie, deshalb können wir sie dann im eigentlichen Code des Codeblocks, hier also beim Aufruf der Funktion "MsgBox" verwenden. Statt "aPos" könnte dort auch an beiden Stellen "Heinz" stehen; "Heinz" enthielte trotzdem die Position des Mauszeigers. Aber ohne "aPos" oder "Heinz" könnte MsgBox nicht direkt auf die Mauskoordinaten zugreifen. Würde man diesen Code beispielsweise bei der Erzeugung eines Pushbuttons verwenden, würde dieser bei einem Klick zuerst die Mauskoordinaten anzeigen und dann seine Aktion ausführen.
Darüber, welche Slots/Callbacks welche Parameter zur Verfügung stellen, informiert die Xbase++-Dokumentation. Das ist in allen nutzbaren Varianten ein extrem mächtiges Hilfsmittel.Herzlich,
Tom