was bedeutet das ||

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
denjo303
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 48
Registriert: Mo, 18. Jul 2011 18:10

was bedeutet das ||

Beitrag von denjo303 »

ich komme ja aus einer ganz anderen ecke, deshalb verstehe ich das { || blabla } nicht
Über 4.000.000 Menschen hören Hiphop. Schreib dich nicht ab, lern reden und gehen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: was bedeutet das ||

Beitrag von brandelh »

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 vorher
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: was bedeutet das ||

Beitrag von Tom »

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
Antworten