EVALUATEUR D'EXPRESSION AVEC VARIABLES

Contenu du snippet

type TLogical  = type Boolean;      TText     = type AnsiString;      TVariable = type Variant;  class function WhatIsEvaluate(const _value:TText; _variables:TStrings; const _dot:Char):TVariable;                 var _actual:Char;                    _calculate:TText;                    _cursor:Integer;                 procedure _PleaseSkip;                           begin                               if _cursor > System.Length(_calculate)                                  then _actual := #9                                  else begin                                            _actual := _calculate[_cursor];                                             System.Inc(_cursor);                                       end;                                if _actual = ' '                                  then _PleaseSkip;                          end;                 function _ReplaceVariables(const _value:TText; _variables:TStrings):TText;                          var _cursor:Integer;                             _error:TLogical;                             _ok:TLogical;                             _replace:TText;                             _start:Integer;                             _stop:Integer;                             _text:TText;                             _variable:TText;                          begin                              _error := System.False;                              _ok    := System.False;                              _text  := SysUtils.Trim(_value);                               while not(_error)                              and   not(_ok)                                    do begin                                            _start := 1;                                             while (_start <= System.Length(_text))                                            and   not(_text[_start] in ['a'..'z', 'A'..'Z'])                                                  do System.Inc(_start);                                             if _start <= System.Length(_text)                                               then begin                                                         _stop     := _start;                                                         _variable := '';                                                          while (_stop <= System.Length(_text))                                                         and   (_text[_stop] in ['a'..'z', 'A'..'Z'])                                                               do begin                                                                       _variable := _variable + _text[_stop];                                                                        System.Inc(_stop);                                                                  end;                                                          if System.Length(_variable) > Math.ZeroValue                                                            then begin                                                                      _cursor := _variables.IndexOfName(_variable);                                                                       if _cursor = -1                                                                         then begin                                                                                   System.Insert('?', _text, _stop);                                                                                   _error := System.True;                                                                              end                                                                         else begin                                                                                   System.Delete(_text, _start, System.Length(_variable));                                                                                   System.Insert(_variables.ValueFromIndex[_cursor], _text, _start);                                                                              end;                                                                 end;                                                    end                                               else _ok := System.True;                                       end;                               Result := _text;                         end;                 function _WhatIsCalculate:TVariable;                          var _result:TVariable;                          function _WhatIsFactor:TVariable;                                   var _text:TText;                                   begin                                       _PleaseSkip;                                        if _actual in ['0'..'9']                                          then begin                                                    _text := '';                                                     repeat                                                          _text := _text + _actual;                                                           _PleaseSkip;                                                    until not(_actual in ['0'..'9']) and (_actual <> _dot);                                                     Result := SysUtils.StrToFloat(_text);                                               end                                          else                                       if _actual = '('                                          then begin                                                    Result := _WhatIsCalculate;                                                     _PleaseSkip;                                               end                                          else                                       if _actual = '+' then Result := +Result                                                        else                                       if _actual = '-' then Result := -Result;                                  end;                          function _WhatIsSubResult:TVariable;                                   var _result:TVariable;                                   begin                                       _result := _WhatIsFactor;                                        while _actual in ['*', '/']                                             do if _actual = '*'                                                   then _result := _result * _WhatIsFactor                                                   else _result := _result / _WhatIsFactor;                                        Result := _result;                                  end;                          begin                              _result := _WhatIsSubResult;                               while _actual in ['+', '-']                                    do if _actual = '+'                                          then _result := _result + _WhatIsSubResult                                          else _result := _result - _WhatIsSubResult;                               Result := _result;                         end;                 begin                     _cursor    := 1;                       _calculate := SysUtils.Trim(_value);                      if System.Assigned(_variables)                        then _calculate := _ReplaceVariables(_calculate, _variables);                      Result := SYsUtils.FloatToStr(_WhatIsCalculate);                end;

Compatibilité : Delphi 5

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.