Fórum Executar uma fórmula dentro de uma string #174795
13/08/2003
0
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
Curtir tópico
+ 0Post mais votado
13/08/2003
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?
Carlos Filho
Gostei + 1
Mais Posts
13/08/2003
Kalado_rj
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
13/08/2003
Getulio.gomes
Gostei + 0
13/08/2003
Allen74
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
14/09/2016
Lário Diniz
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
14/09/2016
Lário Diniz
Gostei + 0
16/09/2022
7
// 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
16/09/2022
7
// 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
Clique aqui para fazer login e interagir na Comunidade :)