conversão de formulas passadas via variáveis

207 views
Skip to first unread message

Ricardo Stelmach

unread,
Jan 16, 2013, 8:45:25 AM1/16/13
to dug...@googlegroups.com

Bom dia,

Algum dos senhores sabe me dizer se existe alguma função no delphi que permita que mande uma formula matemática por uma variável ?
tenho a seguinte situação

a=:2;
b=:3;
c=:4;

formula=:edit1.text;
resultado=: formula; // exemplo no edit estaria a+b-c , neste caso o resultado teria que assumir o valor 1.

Samuel N. Junior

unread,
Jan 16, 2013, 8:59:44 AM1/16/13
to dug...@googlegroups.com
Ricardo,

Uma vez eu precisei fazer algo parecido e acabei desenvolvendo uma rotina que fazia as quatro operações básicas e antes de processar o comando eu substituía as variáveis pelos seus valores.

Por exemplo:

Se a fórmula do EDIT1.TEXT fosse "A + B + C", então via ReplaceSTR() eu substituía o A pelo valor da variável A, B pelo valor da variável B e assim por diante.

Depois, eu processava o conteúdo final com a seguinte função:

function CalculaExpressao(expressao: string; digitos: Byte; var Retorno: Extended): Boolean;
// Calculo de expressoes matematicas simples
// Suporta numeros inteiros, numeros reais, parenteses
// By Samuel N. Junior - 2011 (www.natsam.com.br)
var
   z: Char;
   ipos: Integer;
   function StrToReal(chaine: string): Real;
   var
      r: Real;
      Pos: Integer;
   begin
      Val(chaine, r, Pos);
      if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
        Result := r;
   end;

   function RealToStr(inreal: Extended; digits: Byte):string;
   var
      S: string;
   begin
      Str(inreal: 0: digits, S);
      realToStr := S;
   end;

   procedure NextChar;
   var
      s: string;
   begin
      if ipos > Length(expressao) then begin
        z := #9;
        Exit;
      end else begin
        s := Copy(expressao, ipos, 1);
        z := s[1];
        Inc(ipos);
      end;
   if z = ' ' then
      nextchar;
   end;

   function Expression: Real;
   var
      w: Real;

      function Factor: Real;
      var
        ws: string;
      begin
        Nextchar;
        if z in ['0'..'9'] then begin
          ws := '';
          repeat
              ws := ws + z;
              nextchar
          until not (z in ['0'..'9', DecimalSeparator, ThousandSeparator ]);
          Factor := StrToReal(ws);
        end else
            if z = '(' then
              begin
                Factor := Expression;
                nextchar
              end
        else
          if z = '+' then
              Factor := +Factor
            else
                if Z = '-' then
                    Factor := -Factor;
      end;

      function Term: Real;
      var
        W: Real;
      begin
        W := Factor;
        while Z in ['*', '/'] do
        if z = '*' then
            w := w * Factor
        else
            w := w / Factor;
        Term := w;
      end;
   begin
      w := term;
      while z in ['+', '-'] do
        if z = '+' then
            w := w + term
        else
            w := w - term;
      Expression := w;
   end;
begin
    ipos := 1;
    Try
        Result:=False;
        Retorno := StrToFloatDef(ReplaceStr(RealToStr(Expression, digitos),ThousandSeparator,DecimalSeparator),-1234567890);
        if Retorno = -1234567890 then
            Retorno:=0
        Else
            Result:=True;
    Except
        Retorno:=0;
        Result:=False;
    End;
end;

Funcionava bem mas com o tempo surgiu a necessidade de usar funções matemáticas, fazer IFs, definir variáveis e outras coisas e então passei a utilizar o componente TBCParser da BestCode (US$ 19,95).

Maiores informações sobre o TBCParser no endereço: http://www.bestcode.com/html/tbcparser.html

[ ]s

Samuel

--
--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
 
Twitter: @dugrs
http://www.facebook.com/groups/dugrs/
http://www.Vimeo.com/dugrs
 
 
 

Gabriel Teixeira

unread,
Jan 16, 2013, 9:06:15 AM1/16/13
to dug...@googlegroups.com
Olá,

teve um tempo no qual trabalhei com calculos de folha de pagamento onde tinhamos formulas dinamicas para calculo de eventos e impostos que variavam de clientes em clientes, utilizei na época um componente chamado PascalScript for Delphi da RemObject.

Possibilitava criar funções, variáveis e procedimentos, interpretar e calcular resultados.

Demos e documentação bem elaborados.


Abraço.
--
Att,

Gabriel Teixeira da Silva
Engenheiro de Sistemas
Sapucaia do Sul, RS - Brasil

Contato:
(51) 8153-3574

Ricardo Stelmach

unread,
Jan 16, 2013, 9:28:11 AM1/16/13
to dug...@googlegroups.com
Muito obrigado vou dar uma olhada no componente indicado e posto se ele me atende !!

Gabriel Teixeira

unread,
Jan 16, 2013, 10:48:18 AM1/16/13
to dug...@googlegroups.com
Acabei postando o link de um outro componente que utiliza a mesma metodologia.

o PScript você encontra aqui: http://www.remobjects.com/ps.aspx

Abraço.
Reply all
Reply to author
Forward
0 new messages