使用Microsoft Script Control 控件,将其ActiveX控件导入Delphi即可使用。如: ScriptControl1.Language:='javascript'; Edt2.Text:=ScriptControl1.Eval(edt1.Text);其中,编辑框Edt1中输入的是表达式,支持括号等。
好 非常感谢pilicat
那么怎么控制输入的字符串呢? if not (key in ['0'..'9','+','-','*','/']) then key:=#0 这个语句只能控制输入的没有其他字符,但是不能控制表达式的正确性。 比如 123+ 用户又输入一个- 号,那么如何才变成 123- 而不是123+-呢? 我自己写了一个函数: procedure tform1.shuru(i:string); var m:string; begin if (i = '+' ) or (i = '-' )or (i = 'x') or (i= '/') then begin m:=copy(edit1.Text,Length(edit1.Text),1); end; if (m ='+') or (m ='-') or (m = 'x') or (m= '/') then begin edit1.Text:=copy(edit1.Text,0,length(edit1.Text)-1); edit1.Text:=edit1.Text+i; m:=''; end else begin edit1.Text:=edit1.Text+i; end; 可以实现,但是只能针对用户在输入时候使用屏幕上的按钮,对于直接输入不能有效控制 请问有没有什么好办法?郁闷 点错了加分帖子,成110分了 我就这么多家当 多问几个问题 大家分了吧。
那么怎么控制输入的字符串呢? if not (key in ['0'..'9','+','-','*','/']) then key:=#0 这个语句只能控制输入的没有其他字符,但是不能控制表达式的正确性。 比如 123+ 用户又输入一个- 号,那么如何才变成 123- 而不是123+-呢? 我自己写了一个函数: ----------- 这个应该让用户自己用DEL键去删除,会好点。 如果非要提供这个“便利”性能,那么就判断一下,当是运算操作符“+-*/”时,取上一个字符,如果上一个字符仍是运算操作符,就用这次的替换上个字符。 另外,考虑程序的独立性,还是不使用第三方控件比较好。
procedure TForm1.Button1Click(Sender: TObject); var vScript: Variant; str:string; begin str:=labelededit1.Text ; vScript:=CreateOleObject('ScriptControl'); vScript.Language := 'JavaScript'; str:=vScript.Eval(str); labelededit2.Text :=str; end; 上面这个是是用JavaScript下面的是利用SQLServer,估计ACCESS什么的也行 procedure TForm1.Button2Click(Sender: TObject); var str:string; result:real; begin str:=labelededit1.Text ; with adoquery1 do begin Close; SQL.Clear; SQL.Add('select result='+str); Open; Result:=FieldByName('result').Value; end; str:=FloatToStr(Result); labelededit2.Text :=str; end;
Edt2.Text:=ScriptControl1.Eval(edt1.Text);其中,编辑框Edt1中输入的是表达式,支持括号等。
if not (key in ['0'..'9','+','-','*','/']) then key:=#0
这个语句只能控制输入的没有其他字符,但是不能控制表达式的正确性。
比如 123+ 用户又输入一个- 号,那么如何才变成 123- 而不是123+-呢?
我自己写了一个函数:
procedure tform1.shuru(i:string);
var
m:string;
begin
if (i = '+' ) or (i = '-' )or (i = 'x') or (i= '/') then
begin
m:=copy(edit1.Text,Length(edit1.Text),1);
end;
if (m ='+') or (m ='-') or (m = 'x') or (m= '/') then
begin
edit1.Text:=copy(edit1.Text,0,length(edit1.Text)-1);
edit1.Text:=edit1.Text+i;
m:='';
end
else
begin
edit1.Text:=edit1.Text+i;
end;
可以实现,但是只能针对用户在输入时候使用屏幕上的按钮,对于直接输入不能有效控制
请问有没有什么好办法?郁闷 点错了加分帖子,成110分了 我就这么多家当 多问几个问题 大家分了吧。
退一步说,当然输入后弄成前缀式表达计算(像lisp之类)也还好。还能加点特殊的运算符之类的。C语言很好写(当年的数据结构作业),Pascal也差不多啊。
但我纯属胡扯,见笑了。
if not (key in ['0'..'9','+','-','*','/']) then key:=#0
这个语句只能控制输入的没有其他字符,但是不能控制表达式的正确性。
比如 123+ 用户又输入一个- 号,那么如何才变成 123- 而不是123+-呢?
我自己写了一个函数:
-----------
这个应该让用户自己用DEL键去删除,会好点。
如果非要提供这个“便利”性能,那么就判断一下,当是运算操作符“+-*/”时,取上一个字符,如果上一个字符仍是运算操作符,就用这次的替换上个字符。
另外,考虑程序的独立性,还是不使用第三方控件比较好。
var
vScript: Variant;
str:string;
begin
str:=labelededit1.Text ;
vScript:=CreateOleObject('ScriptControl');
vScript.Language := 'JavaScript';
str:=vScript.Eval(str);
labelededit2.Text :=str;
end;
上面这个是是用JavaScript下面的是利用SQLServer,估计ACCESS什么的也行
procedure TForm1.Button2Click(Sender: TObject);
var
str:string;
result:real;
begin
str:=labelededit1.Text ;
with adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select result='+str);
Open;
Result:=FieldByName('result').Value;
end;
str:=FloatToStr(Result);
labelededit2.Text :=str;
end;