Delphi.Вычисление выражений

Модуль uEvalStr содержит реализацию класса TEvalStr для вычисления выражений в run-time. Например:

pascal
uses uEvalStr
//...
var C:TEvalStr;
    N : integer;
begin
   C := TEvalStr.Create;
   try
      N := C.Eval('1235+785/5-4565');
      ShowMessage(IntToStr(N));
   finally
      C.Free;
   end;

Метод не ограничен числовыми типами. Поддерживаются строковые константы, даты, тип boolean. Кроме обычных математических операций (+, -, *, /) поддерживаются возведение в степень (^), операции сравнения (<, >, =, ≠, ≥, ≤), логические операции (или битовые, в зависимости от типа) (&, |, !).

В выражениях можно использовать функции: exp, ln, abs, int, round, тригонометрические функции, тернарная операция if().

Реализация класса позволяет легко добавлять собственные функции. Для этого достаточно создать класс-наследник от TEvalStr и описать в этом классе public-функции. Их сразу же можно будет использовать в выражениях. Например:

pascal
type
   TMyEvalStr = class(TEvalStr)
   public
      function MyFunc(D:integer):integer;
   end;

function TMyEvalStr.MyFunc(D:integer):integer;
begin
   result := D * D;
end;

procedure TForm3.Button2Click(Sender: TObject);
var C:TMyEvalStr;
    N:integer;
begin
   C := TMyEvalStr.Create;
   try
      N := C.Eval('if(MyFunc(5) > 10, 2*MyFunc(10), 3)');
      ShowMessage(IntToStr(N));
   finally
      C.Free;
   end;
end;



Downloads
Исходный код модуля uEvalStr и примеры (evalstr.zip) (9.5 Кб, просмотров: 767 )

Comments
04.01.2013 07:37 Геннадий
 Если это модуль мне поможет и будет работать хорошо, то я вам буду очень признателен и благодарен.
 
04.01.2013 08:05 Геннадий
 Ужас. Ошибки за ошибкой. Возможно из-за версии Delphi (у меня Delphi 7). В любом случае 
 ничего не получилось. Пытался исправить, но ничего не вышло.
 
07.01.2013 11:35 alexBlack
 Компилировалось и проверялось в Delphi 2006 (10-ка). Вполне допускаю что со времен Delphi 7 
 в RTL произошли изменения. К сожалению я не представляю как реализовать подобную функциональность 
 без зависимости от версии. Я имею в виду в первую очередь вызовы public-методов 
 по имени. Если же Вам этого не нужно, можно урезать модуль, выбросив ссылки на модули 
 TypInfo и ObjAuto и все, что с ними связано. 

 Если есть желание пообщаться на эту тему, напишите мне. e-mail есть на страничке контактов.
 
Вы можете оставить комментарий или задать вопрос
Ваше имя:

Текст сообщения:


Copyright © 2009-2014 by