CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样实现这样的功能,在Tedit框内输入5*7+1,回车后框内变为数值36?

楼主jhzhao2001(zhao)2004-05-01 23:42:55 在 Delphi / VCL组件开发及应用 提问

在Tedit框内输入计算公式,回车后,框内的值变为计算后的数值。即实现计算功能?请问应如何实现? 问题点数:30、回复次数:3Top

1 楼jemsn(曙光软件)回复于 2004-05-02 00:21:19 得分 20

//====================================================================  
  //表达式计算  
  //====================================================================  
  procedure   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   :=   fCalc(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   ['+',   '-']))   or  
                  ((I   >   1)   and   (mText[Pred(I)]   =   ')')   and   (I   <   L)   and  
                  (not   (mText[Succ(I)]   in   ['+',   '-',   '(',   ')'])))   then  
                  vText   :=   vText   +   '+_'  
              else   vText   :=   vText   +   mText[I]  
          else   vText   :=   vText   +   mText[I];  
      Result   :=   fCalc(vText);  
  end;   {   Calc   }  
   
   
  例:   edit1.text   :=   calc(5*7+1);Top

2 楼miky(miky)回复于 2004-05-02 00:33:35 得分 5

uses   comobj;  
   
   
  procedure   TForm1.Edit1KeyPress(Sender:   TObject;   var   Key:   Char);  
  var  
      vScript:   Variant;  
      str:string;  
  begin  
      if   key   =   #13   then  
      begin  
          str:=Edit1.Text;  
          vScript:=CreateOleObject('ScriptControl');  
          vScript.Language   :=   'JavaScript';  
          str:=vScript.Eval(str);  
          Edit1.Text   :=   str;  
      end;  
  end;Top

3 楼ly_liuyang(Liu Yang LYSoft http://lysoft.7u7.net)回复于 2004-05-02 00:54:14 得分 5

公式计算,例子有很多  
  用ScriptControl比较简单,但功能有限Top

相关问题

  • 如何在CEdit输入框内相应回车?
  • 如何用代码控制在文本框内回车另起一行
  • 输入框内输入完毕按回车会自动跳转页面?!
  • 如何实现在Edit框内按回车就执行Button按钮里的语句?
  • 如何在多行文本框内设按Ctrl加回车发信息?像QQ发信息的快捷键
  • 怎样使表单里内的文本框内按回车后,表单不会被提交?
  • 救命!!!赋值一个带"\n"(回车)的字符串到文本编辑框内为什么不行?请看代码!
  • 新手请教,如何在TEdit和TComboBox中响应回车?
  • 在线等待!急!一下忘了怎样将一个表单中的文本框内容转成数值型,并判断其大小!
  • 回车?!

关键词

  • mtext
  • 框内
  • ncstr
  • nlstr
  • nrstr
  • vlstr
  • vcstr
  • fcalc
  • bracket
  • 实现

得分解答快速导航

  • 帖主:jhzhao2001
  • jemsn
  • miky
  • ly_liuyang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo