Delphi - Szövegesen megadott képlet kiszámítása programból

forráskód letöltése
Ha van egy sztringünk, melyben az található, hogy 2+2, akkor ehhez komoly algoritmust kellene írnunk, hogy értelmezzük, elvégezzük az összeadás műveletet, majd az eredményt visszaírjuk a felhasználónak. Az algoritmus elkészítésének problémái ott fokozódnak, amikor a felhasználónk által megadott sztring így néz ki: (200/3)*(500-96)/((5+10)*10).

Mellékelt cikkben megvalósítjuk, hogy egy tetszőleges sztringként megadott képletet kiértékelünk, majd annak eredményét számként adjuk vissza. A megvalósításhoz egy igen egyszerű trükköt használunk fel: ha az MS Excel-nek átadunk egy ilyen képletet egy munkalap cellájába, akkor az innen visszaolvasott érték a képlet kiértékelésének eredménye lesz. Így nincs szükségünk arra, hogy komoly értelmező algoritmust fejlesszünk. Mivel az Excel a háttérben fut, így programunk felhasználója nem is veszi észre, hogy alkalmazásunk elindította az Excel-t.

A megvalósításhoz programunk indulásakor létrehozunk egy kapcsolatot az Excel-el és egy új munkalapot adunk hozzá.
procedure TForm1.FormCreate(Sender: TObject);
begin
  FApplication:=CreateOleObject('Excel.Application');
  FWorkBook:=FApplication.Workbooks.Add;
end;
A program bezárásakor zárjuk ezt a munkalapot úgy, hogy ne legyen mentve, majd megszüntetjük a kapcsolatot is az Excel-el.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FWorkBook.Close(false);
  FApplication.Quit;
end;
Készítünk egy Calculate nevű függvényt, mely egy sztringet vár, amely a kiértékelendő képlet lesz. Visszatérési értékként a kiszámított értéket adja át. A számítás elvégzéséhez a sztring elé egy egyenlőségjelet kell illesztenünk, hiszen az Excel csak ebben az esetben végzi el a számítást. Ezek után egy cellába beírjuk a sztringet, majd rögtön ki is olvassuk annak értékét, ami már a kiszámított érték lesz.
function TForm1.Calculate(s: string): double;
var
  a: OleVariant;
begin
  a:='='+s;
  FApplication.Cells.Item[1, 1]:=a;
  result:=FApplication.Cells.Item[1, 1];
end;