我可能描述的不正确,本质还是计算器,不过是在用户输入完所有表达式后在进行运算的。
我已经完成了一部分工作,而且用的最笨的办法,pos()和copy()等字符操作函数。
不知道有没有什么更好的办法来实现?或者思路。

解决方案 »

  1.   

    还不如使用微软的东东,微软有一个控件的,在Delphi中引入它的ActiveX控件,即:ScriptControl 控件。
      

  2.   

    使用Microsoft Script Control 控件,将其ActiveX控件导入Delphi即可使用。如:  ScriptControl1.Language:='javascript';
      Edt2.Text:=ScriptControl1.Eval(edt1.Text);其中,编辑框Edt1中输入的是表达式,支持括号等。
      

  3.   

    好 非常感谢pilicat  
      

  4.   

    那么怎么控制输入的字符串呢?
    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分了 我就这么多家当 多问几个问题 大家分了吧。
      

  5.   

    FastReport 里有一个FastScript 我一直用它。
      

  6.   

    个人感觉用树形结构输入计算会有意思的多(于是算式的正确性检验应该简单的多)。
    退一步说,当然输入后弄成前缀式表达计算(像lisp之类)也还好。还能加点特殊的运算符之类的。C语言很好写(当年的数据结构作业),Pascal也差不多啊。
    但我纯属胡扯,见笑了。
      

  7.   

    那么怎么控制输入的字符串呢? 
    if   not   (key   in   ['0'..'9','+','-','*','/'])   then   key:=#0 
    这个语句只能控制输入的没有其他字符,但是不能控制表达式的正确性。 
    比如   123+   用户又输入一个-   号,那么如何才变成   123-   而不是123+-呢? 
    我自己写了一个函数: 
    -----------
      这个应该让用户自己用DEL键去删除,会好点。
      如果非要提供这个“便利”性能,那么就判断一下,当是运算操作符“+-*/”时,取上一个字符,如果上一个字符仍是运算操作符,就用这次的替换上个字符。
      另外,考虑程序的独立性,还是不使用第三方控件比较好。
      

  8.   

    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;