Eval()
Eval() – Ausführung eines Codeblocks
Die Funktion führt einen precompilierten CodeBlock-Text ("TEvalBlock"-Objekt) aus (geliefert von der Funktion Compile()), oder führt einen direkt übergebenen CodeBlock-Text aus. Bei einem Fehler wird eine Exception ausgeworfen.
Wird im ersten Parameter ein Codeblock (Character) übergeben, so wird der auszuwertende Ausdruck optimiert, berechnet und sofort wieder verworfen. Dies führt bei längeren Funktionen, die mehrfach aufgerufen werden, zu einer niedrigen Ablaufgeschwindigkeit. Wird im ersten Parameter ein Objekt vom Typ 'TEvalBlock' (zovor mit Complile() erzeugt) übergeben, so bliebt die optimierte Funktion erhalten und Eval übergibt nur noch die Parameter an den Block.
Das Objekt "TEvalBlock" besitzt die Eigenschaft 'FuncText', die jederzeit änderbar ist. Eine neue Zuweisung erzeugt eine neue Funktionalität. Ein Fehler beim Erzeugen des Objektes oder bei der Änderung von 'FuncText' löst eine Exception aus, die im Rahmen einer Fehlerauffangroutine behandelt werden kann. Hier kann die Fehlernummer über die Eigenschaft 'ErrCode' ausgewertet werden.
Parameter | Beschreibung |
---|---|
aBlock:U | Vollständiger CodeBlock-Text oder TEvalBlock-Objekt |
aLocalParam:U | Parameter; default = null() |
Rückgabewert
Undefiniert - Rückgabewert des CodeBlock-Textes
Beispiel
| aBlock, aFunction, i, aMax, oDab000:DB := 'waDAB000, 1' |
function MyBlockEval(aBlock)
ShowMessage(Eval(aBlock, Time())),
end,
aFunction := '| oDab000, aIntro, aResult | ' + crlf +
' aResult := aIntro + ' + crlf +
' AllTrim(AllTrim(oDab000:Name1) + " " + ' + crlf +
' AllTrim(oDab000:Name2)), ' + crlf +
' DbSkip(1, oDab000), ' + crlf +
' aResult',
aMax := 10,
// Ausführung eines nicht vorkompilierten Blocks mittels "Eval()"
DbGoTop(oDab000),
for i := 1 to aMax do
WriteLn(Eval(aFunction, oDab000, 'Name: ')),
next,
// Ausführung eines vorkompilierten Blocks
// erzeugt ein TEvalBlock-Objekt
aBlock := Compile(aFunction),
if not Empty(aBlock) then
for i := 1 to aMax do
WriteLn(Eval(aBlock, oDab000, 'Name: ')),
next,
// eine neue Funktion zuweisen
aBlock.FuncText := '"Nur noch Text ..."',
WriteLn(Eval(aBlock)),
// einen Fehler abfangen
startseq,
// A und B sind nicht definiert
aBlock.FuncText := 'A + B',
WriteLn('Dies wird nie ausgeführt!'),
onerror
WriteLn('Fehler im Codeblock: Code = ' + Str(aBlock.ErrCode)),
stopseq,
aBlock.FuncText := '| t | ' + crlf +
' t + " - Ende"',
// Übergabe als Parameter an Funktionen
MyBlockEval(aBlock),
DestroyObject(aBlock),
endif,