问题已经解决在csdn上找的,贴出来大家共享 uses Math,Sysutils; procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string); function Calc(mText: string): string;implementationprocedure Bracket(mText: string; var nLStr, nCStr, nRStr: string); var L, R: Integer; I: Integer; B: Boolean; begin nLStr := ''; nCStr := ''; nRStr := ''; B := True; L := 0; R := 0; for I := 1 to Length(mText) do if B then begin if mText[I] = '(' then Inc(L) else if mText[I] = ')' then Inc(R); if L = 0 then nLStr := nLStr + mText[I] else if L > R then nCStr := nCStr + mText[I] else B := False; end else nRStr := nRStr + mText[I]; Delete(nCStr, 1, 1); end; { Bracket }function Calc(mText: string): string; var vText: string; function fCalc(mText: string): string; var vLStr, vCStr, vRStr: string; I, J, K, L: Integer; begin L := Length(mText); if Pos('(', mText) > 0 then begin Bracket(mText, vLStr, vCStr, vRStr); Result := Calc(vLStr + fCalc(vCStr) + vRStr); end else if (Pos('+', mText) > 0) or (Pos('-', mText) > 0) then begin I := Pos('+', mText); J := Pos('-', mText); if I = 0 then I := L; if J = 0 then J := L; K := Min(I, J); vLStr := Copy(mText, 1, Pred(K)); vRStr := Copy(mText, Succ(K), L); if vLStr = '' then vLStr := '0'; if vRStr = '' then vRStr := '0'; if I = K then Result := FloatToStr(StrToFloat(fCalc(vLStr)) + StrToFloat(fCalc(vRStr))) else Result := FloatToStr(StrToFloat(fCalc(vLStr)) - StrToFloat(fCalc(vRStr))) end else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0) then begin I := Pos('*', mText); J := Pos('/', mText); if I = 0 then I := L; if J = 0 then J := L; K := Min(I, J); vLStr := Copy(mText, 1, Pred(K)); vRStr := Copy(mText, Succ(K), L); if vLStr = '' then vLStr := '0'; if vRStr = '' then vRStr := '0'; if I = K then Result := FloatToStr(StrToFloat(fCalc(vLStr)) * StrToFloat(fCalc(vRStr))) else Result := FloatToStr(StrToFloat(fCalc(vLStr)) / StrToFloat(fCalc(vRStr))) end else if Pos('_', mText) = 1 then Result := FloatToStr(-StrToFloat(fCalc(Copy(mText, 2, L)))) else Result := FloatToStr(StrToFloat(mText)); end; var I, L: Integer; begin vText := ''; L := Length(mText); for I := 1 to L do if (mText[I] = '-') and (I < L) and (not (mText[Succ(I)] in ['+', '-', '(', ')'])) then if (I = 1) or ((I > 1) and (mText[Pred(I)] in ['*', '/'])) then vText := vText + '_' else if (I > 1) and (mText[Pred(I)] in ['+', '-']) then vText := vText + '+_' else vText := vText + mText[I] else vText := vText + mText[I]; Result := fCalc(vText); end; { Calc } end.
ComObj.....
function Eval(expStr: string): string;
var
js: OleVariant;
begin
js := CreateOleObject('ScriptControl');
js.Language := 'JavaScript';
Result := js.Eval(expStr);
js := Unassigned;
end;Eval('((123+112)*12+21*(4562-60))*3/7 + 50')=41776.5714285714给分吧.哈哈.
比如Edit1.text是'((123+112)*12+21*(4562-60))*3/7 + 50',then
adoquery.sql.clear;
adoquery.sql.add('select '+edit1.text);
adoquery.sql.open;
edit2.text:=inttostr(adoquery.filelds[0].asinteger);
大体思路是这样,代码可能有不规范的地方,楼主试试吧,肯定行
adoquery.sql.open;编译都不能通过
uses
Math,Sysutils; procedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
function Calc(mText: string): string;implementationprocedure Bracket(mText: string; var nLStr, nCStr, nRStr: string);
var
L, R: Integer;
I: Integer;
B: Boolean;
begin
nLStr := '';
nCStr := '';
nRStr := '';
B := True;
L := 0;
R := 0;
for I := 1 to Length(mText) do
if B then begin
if mText[I] = '(' then
Inc(L)
else if mText[I] = ')' then
Inc(R);
if L = 0 then
nLStr := nLStr + mText[I]
else if L > R then
nCStr := nCStr + mText[I]
else B := False;
end else nRStr := nRStr + mText[I];
Delete(nCStr, 1, 1);
end; { Bracket }function Calc(mText: string): string;
var
vText: string; function fCalc(mText: string): string;
var
vLStr, vCStr, vRStr: string;
I, J, K, L: Integer;
begin
L := Length(mText);
if Pos('(', mText) > 0 then begin
Bracket(mText, vLStr, vCStr, vRStr);
Result := Calc(vLStr + fCalc(vCStr) + vRStr);
end else if (Pos('+', mText) > 0) or (Pos('-', mText) > 0) then begin
I := Pos('+', mText);
J := Pos('-', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) + StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) - StrToFloat(fCalc(vRStr)))
end else if (Pos('*', mText) > 0) or (Pos('/', mText) > 0) then begin
I := Pos('*', mText);
J := Pos('/', mText);
if I = 0 then I := L;
if J = 0 then J := L;
K := Min(I, J);
vLStr := Copy(mText, 1, Pred(K));
vRStr := Copy(mText, Succ(K), L);
if vLStr = '' then vLStr := '0';
if vRStr = '' then vRStr := '0';
if I = K then
Result := FloatToStr(StrToFloat(fCalc(vLStr)) * StrToFloat(fCalc(vRStr)))
else Result := FloatToStr(StrToFloat(fCalc(vLStr)) / StrToFloat(fCalc(vRStr)))
end else if Pos('_', mText) = 1 then
Result := FloatToStr(-StrToFloat(fCalc(Copy(mText, 2, L))))
else Result := FloatToStr(StrToFloat(mText));
end;
var
I, L: Integer;
begin
vText := '';
L := Length(mText);
for I := 1 to L do
if (mText[I] = '-') and (I < L) and (not (mText[Succ(I)] in ['+', '-', '(', ')'])) then
if (I = 1) or ((I > 1) and (mText[Pred(I)] in ['*', '/'])) then
vText := vText + '_'
else if (I > 1) and (mText[Pred(I)] in ['+', '-']) then
vText := vText + '+_'
else vText := vText + mText[I]
else vText := vText + mText[I];
Result := fCalc(vText);
end; { Calc }
end.
ADOQuery1.ExecSQL
不知道行不行啊,不过hlb1111(蜀狼)的例子现收藏了
>> ((123+112)*12+21*(4562-60))*3/7 + 50無非是求表達式的結果, 其實 netcrawller(放弃绑定-不用第三方控件)和
hellolongbin(一个人) 兩位就實現了
揭帖
不是ExecSQL,就是Open,因为是select操作