Executar uma fórmula dentro de uma string
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.
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
Curtidas 0
Melhor post
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
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.
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
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
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
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
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
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
13/08/2003
PS: Não é exatamente a resposta, mas já é o "caminho das pedras" que eu seguiria...
GOSTEI 0
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.
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 <>.
// 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
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.
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 <>.
// 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