Executar uma fórmula dentro de uma string

Delphi

13/08/2003

Preciso resolver o seguinte problema:
exemplo:

var X,Y : integer;
formula: string;
begin
X:= 5;
Y:= 10;
formula := ´ X*Y ´;

Edit1.Text := Inttostr(formula);
end;

Ou seja, preciso que o compilador assuma o valor de X da string seja o valor da variável inteira X,e ao Y idem. Sendo assim o resultado para edit1 devera ser de 50. Se não me engano o clipper tem um operador especial que faz isso, mas em Delphi eu não consigo.

Se alguém puder me ajudar, agradeço.


Ednei_ti

Ednei_ti

Curtidas 0

Melhor post

Carlos Filho

Carlos Filho

13/08/2003

Preciso resolver o seguinte problema: exemplo: var X,Y : integer; formula: string; begin X:= 5; Y:= 10; formula := ´ X*Y ´; Edit1.Text := Inttostr(formula); end; Ou seja, preciso que o compilador assuma o valor de X da string seja o valor da variável inteira X,e ao Y idem. Sendo assim o resultado para edit1 devera ser de 50. Se não me engano o clipper tem um operador especial que faz isso, mas em Delphi eu não consigo. Se alguém puder me ajudar, agradeço.


Aparentemente ninguem entendeu o que vc quis dizer... Mas eu sim e por isso posso dizer que sua pergunta é excelente!

Sempre me perguntei como funcionava o avaliador de expressão do Delphi (sim, o delphi tem um avalidador de expressão acessível com CTRL+F7!). Para mim continua a ser um mistério como é q o delphi consegue interpretar algo como:

3 * (7+3-(4/3*7))


já que isso é digitado como texto...
a minha unica explicação é que há um parser FUDEROSO que interpreta caractere por caractere construindo a expressão final e avaliando, mas, não sei pq, acredito que seja algo bem mais simples em se tratando de delphi.

Não tenho sua resposta amigo, sinto muito, sua dúvida é a minha !!!

Espero que alguem dê uma resposta.

PS.: será que o avaliador do Torri.net é um componente que faz isso ou é algum programa compilado?
GOSTEI 1

Mais Respostas

Kalado_rj

Kalado_rj

13/08/2003

var X,Y : integer;
formula: string;

resposta -> formula devera ser integer
formula: integer;

calculos devem ser mantidos em variareis numericas.

begin
X:= 5;
Y:= 10;

sua -> formula := ´ X*Y ´;
correto -> formula := X * Y;

Edit1.Text := Inttostr(formula);


end;

Clipper ainda e presente, eheheh isso e fato !

um Abraco

Ou seja, preciso que o compilador assuma o valor de X da string seja o valor da variável inteira X,e ao Y idem. Sendo assim o resultado para edit1 devera ser de 50. Se não me engano o clipper tem um operador especial que faz isso, mas em Delphi eu não consigo.

Se alguém puder me ajudar, agradeço.
GOSTEI 0
Getulio.gomes

Getulio.gomes

13/08/2003

O clipper, ao compilar o prg carregava com sigo um interpletador, coisa que o Delphi não faz por isso não podemos usar macro subtituição no delphi.
GOSTEI 0
Allen74

Allen74

13/08/2003

Existem bibliotecas para Delphi que permitem avaliar expressões deste tipo. Você encontrará algumas no site:

http://www.torry.net - faça uma busca pela palavra expression

A biblioteca de componentes JediVCL também incorpora um avaliador de expressões. O link:

http://jvcl.sourceforge.net
GOSTEI 0
Lário Diniz

Lário Diniz

13/08/2003

Essa semana precisei fazer exatamente isso e acabei criando uma função que executa uma formula dentro de uma string.

Sei que o Post é antigo, mas como eu precisei e não encontrei em lugar algum, segue o link da função, talvez ajude mais alguém

:)


https://github.com/lariodiniz/FuncoesDelphi/blob/master/ExecutaOperacao
GOSTEI 0
Lário Diniz

Lário Diniz

13/08/2003

PS: Não é exatamente a resposta, mas já é o "caminho das pedras" que eu seguiria...
GOSTEI 0
7

7

13/08/2003

Apesar de ser um post antigo, também não encontrei nada que pudesse ajudar. Então criei uma função que acredito poder resolver.

// Campos da Query entre <>
Function FormulaNaString(Formula : string; sds1 : TFDQuery = nil) : Extended;
var
  I: Integer;
  texto,NomeCampo : string;
  Achou : Boolean;
  cds : TFDQuery;
begin
  texto := '';
  for I := 1 to length(Edit1.Text) do begin
    if Edit1.Text[i] = '<' then
      Achou := True
    else if Edit1.Text[i] = '>' then begin
      Achou := False;
      Texto := texto + StringReplace(FloatToStr(sds.FieldByName(NomeCampo).AsFloat),',','.',[rfReplaceAll]);
      NomeCampo := '';
    end else if Achou then
      NomeCampo := NomeCampo+Edit1.Text[i]
    else
      Texto := Texto + Edit1.Text[i];
  end;

  cds := TFDQuery.Create(nil);
  try
    cds.Connection := FDConnection1;  // aqui é necessário informar uma coxão FireDac;
    cds.open('select '+ texto + ' as Valor');
    result := cds.fieldbyname('Valor').asfloat;
  finally
    cds.Free;
  end;
end;


Chamadas;
FormulaNaString('((8*9)/10)-55');
FormulaNaString('((( <Total_Venda> - <Total_Custo>) *100) / <Total_Venda>)', Sua Query Que Contenha o Valor dos campos);
Os campos da tabela informada no segundo parâmetro estão entre <>.
GOSTEI 0
7

7

13/08/2003

Apesar de ser um post antigo, também não encontrei nada que pudesse ajudar. Então criei uma função que acredito poder resolver.

// Campos da Query entre <>
Function FormulaNaString(Formula : string; sds1 : TFDQuery = nil) : Extended;
var
  I: Integer;
  texto,NomeCampo : string;
  Achou : Boolean;
  cds : TFDQuery;
begin
  texto := '';
  for I := 1 to length(Formula) do begin
    if Formula[i] = '<' then
      Achou := True
    else if Formula[i] = '>' then begin
      Achou := False;
      Texto := texto + StringReplace(FloatToStr(sds.FieldByName(NomeCampo).AsFloat),',','.',[rfReplaceAll]);
      NomeCampo := '';
    end else if Achou then
      NomeCampo := NomeCampo+Formula[i]
    else
      Texto := Texto + Formula[i];
  end;

  cds := TFDQuery.Create(nil);
  try
    cds.Connection := FDConnection1;  // aqui é necessário informar uma coxão FireDac;
    cds.open('select '+ texto + ' as Valor');
    result := cds.fieldbyname('Valor').asfloat;
  finally
    cds.Free;
  end;
end;


Chamadas;
FormulaNaString('((8*9)/10)-55');
FormulaNaString('((( <Total_Venda> - <Total_Custo>) *100) / <Total_Venda>)', Sua Query Que Contenha o Valor dos campos);
Os campos da tabela informada no segundo parâmetro estão entre <>.
GOSTEI 0
POSTAR