Fórum Validar uma expressão aritmética #340046
08/04/2007
0
alguém sabe como posso validar uma expressão aritmérica?
exemplo:
tenho um edit e um botão.
no edit irei colocar:
2+(1+1)
quero validar se a sintaxe da expressão esta correta.
exemplos:
2+{2+[1+1+(6/3)]}
esta correta
mas
2+{2+[1+1+(6/3)}]
esta errada. e assim por diante.
obrigado. :)
Otto
Curtir tópico
+ 0Posts
08/04/2007
Catunda
´select ´+edit1.text+´ from rdb$database´
executar essa instrução e tratar o erro. se não retornar nenhum erro então é válida.
Gostei + 0
09/04/2007
Otto
valeeu
Gostei + 0
10/04/2007
Marco Salles
se encontrar algum erro , post por favor.
function testarExpressao(texto:String):Boolean;
Const
tipo: Array[1..6] of Char = (´{´,´[´,´(´,´)´,´]´,´}´);
procedure interno(var i:integer;a,b,c,d,e,f:integer);
var
Aux:String;
posini,posFim,Primeiro:integer;
begin
posIni:=i;
While posIni > 0 Do
begin
primeiro:=posini;
posini:=PosEx(tipo[a],texto,posIni+1);
end;
posFim:=posEx(Tipo[b],texto,primeiro);
Aux:=Copy(texto,primeiro,posfim-primeiro);
if (pos(Tipo[c],Aux)>0)or(pos(Tipo[d],Aux)>0)or
(pos(Tipo[e],Aux)>0)or(pos(Tipo[f],Aux)>0)then
begin
abort;
end
else
if posFim > primeiro Then
begin
Delete(texto,primeiro,1);
Delete(Texto,posfim-1,1);
i:=i-1;
end;
end;
procedure Localizar(a,b:integer);
begin
if (pos(Tipo[a],texto) > 0)or(pos(Tipo[b],texto) > 0) then
abort;
end;
var
i:integer;
resultado:Boolean;
begin
try
result:=false;
for I:=1 to length(texto) do
if not (texto[i] in [´{´,´[´,´(´,´)´,´]´,´}´]) then
delete(texto,i,1);
i:=1;
while i <= length(texto) do
begin
case texto[i] of
´(´:interno(i,3,4,1,2,5,6)
end;
i:=i+1;
end;
localizar(3,4);
i:=1;
while i <= length(texto) do
begin
case texto[i] of
´[´: begin
interno(i,2,5,1,6,1,6)
end;
end;
i:=i+1;
end;
localizar(2,5);
i:=1;
while i <= length(texto) do
begin
interno(i,1,6,2,3,4,5);
i:=i+1;
end;
localizar(1,6);
//exceção silenciosa
except
on e:Eabort do
result:=True;
end;
end;procedure TForm1.Button1Click(Sender: TObject); begin if testarExpressao(edit1.Text) then showmessage(´tem erro´) else showmessage(´não tem erro´); end;
Gostei + 0
10/04/2007
Marco Salles
se encontrar algum erro , post por favor.
function testarExpressao(texto:String):Boolean;
Const
tipo: Array[1..6] of Char = (´{´,´[´,´(´,´)´,´]´,´}´);
procedure interno(var i:integer;a,b,c,d,e,f:integer);
var
Aux:String;
posini,posFim,Primeiro:integer;
begin
posIni:=i;
While posIni > 0 Do
begin
primeiro:=posini;
posini:=PosEx(tipo[a],texto,posIni+1);
end;
posFim:=posEx(Tipo[b],texto,primeiro);
Aux:=Copy(texto,primeiro,posfim-primeiro);
if (pos(Tipo[c],Aux)>0)or(pos(Tipo[d],Aux)>0)or
(pos(Tipo[e],Aux)>0)or(pos(Tipo[f],Aux)>0)then
begin
abort;
end
else
if posFim > primeiro Then
begin
Delete(texto,primeiro,1);
Delete(Texto,posfim-1,1);
i:=i-1;
end;
end;
procedure Localizar(a,b:integer);
begin
if (pos(Tipo[a],texto) > 0)or(pos(Tipo[b],texto) > 0) then
abort;
end;
var
i:integer;
resultado:Boolean;
begin
try
result:=false;
for I:=1 to length(texto) do
if not (texto[i] in [´{´,´[´,´(´,´)´,´]´,´}´]) then
delete(texto,i,1);
i:=1;
while i <= length(texto) do
begin
case texto[i] of
´(´:interno(i,3,4,1,2,5,6)
end;
i:=i+1;
end;
localizar(3,4);
i:=1;
while i <= length(texto) do
begin
case texto[i] of
´[´: begin
interno(i,2,5,1,6,1,6)
end;
end;
i:=i+1;
end;
localizar(2,5);
i:=1;
while i <= length(texto) do
begin
interno(i,1,6,2,3,4,5);
i:=i+1;
end;
localizar(1,6);
//exceção silenciosa
except
on e:Eabort do
result:=True;
end;
end;procedure TForm1.Button1Click(Sender: TObject); begin if testarExpressao(edit1.Text) then showmessage(´tem erro´) else showmessage(´não tem erro´); end;
Gostei + 0
10/04/2007
Dmenin
PS: vc eh o oto q participava da lista de delphi da UOL há uns 3 anos?
Gostei + 0
10/04/2007
Marco Salles
biblioteca JVCL tem tb. mas fazer e acontecer é mais gostoso :wink:
Gostei + 0
10/04/2007
Dmenin
Gostei + 0
13/04/2007
Otto
abraço
Gostei + 0
13/04/2007
Marco Salles
fico muito feliz que tenha gostado...
confesso que levei horas para desenvolver
mas o final é gratificante....
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)