Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 20.12.10 19:34 
Ich muss das leider ins OT stellen, da es keine fertige Unit ist.

In .NET gibt es ja Lambda-Expressions (für Linq). Damit ist es möglich, dass man z. B. eine Datenbank where-Klausel inline im C#-Quelltext schreibt und diese dann zur Laufzeit in SQL umgewandelt bekommt. Im Prinzip geht das so, dass man zur Laufzeit den Code in der Lambda-Expression als Baumstruktur auslesen kann und diesen beliebig in SQL Statements oder was auch immer umwandeln kann.

Das geht (ein bisschen) auch in Delphi 32!

Folgender Code kompiliert und gibt den angegebenen String zurück:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
uses DB, Expressions;

{$apptype console}

var
  I: Integer;
  A: TValueExpression;
  B: TBooleanExpression;
  Field: TField;
begin
  Field := TField.Create(nil);
  Field.FieldName := 'MyField';

  I := 2;
  A := 1 + I;
  B := 3 < -A * 2 + Max(Field);

  Writeln(B.ToString); // Output: "(3 < (((-3) * 2) + Max([MyField])))"
  Readln;
end.


Die dazu notwendige Unit ist im Anhang. Ich hab das jetzt nur schnell zusammengebastelt als "proof of concept". Man ist natürlich sehr eingeschränkt aber die Idee ist ganz interessant ;)

Das ganze funktioniert nur mit einer neueren Version von Delphi (vermutlich ab 2006).
Einloggen, um Attachments anzusehen!
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 07.06.11 10:05 
Hi!

Ich bin zufällig über den Blogeintrag Lambdas and expression trees in Delphi auf diesen Beitrag hier gestoßen. Ich habe mir die Codeunit allerdings noch nicht angeschaut aber vom Ansatz sieht es schon mal sehr interessant aus! :zustimm:

Sobald ich mal ein wenig Zeit habe schaue ich mir die Codeunit an! ;-)

Gruß, Tino