我地窗體上有edit編輯框,為了方便,我想在edit中實現+、-、*、/ 運算,怎麼能實現這個呢?比如說edit中我輸入24*0.5後自動運算得到12呢?

解决方案 »

  1.   

    如果能连数据库的话,可以用select edit1.text ,然后取返回值以前回答过,这次就不写那么详细了,如果你知道如何连接数据库,我一说你就会明白;如果你不知道,我怎么说也没用……
      

  2.   

    to hellolongbin(一个人[散分贴收20%灌水税,非散分贴收10%资源占用税])
    不能聯接數據庫,只是窗體上放了一個edit,是錄入數據用的
    to 另兩位
    我不會實現所以才來問的
      

  3.   

    to hellolongbin(一个人[散分贴收20%灌水税,非散分贴收10%资源占用税])
    不能聯接數據庫,只是窗體上放了一個edit,是錄入數據用的,然後存儲到sql裡
      

  4.   

    TO  JuckFapan(?!囸㊣)
    那給個例子好麼?我剛開始學習delphi中,會的很少,謝謝樓上的各位大俠了
      

  5.   

    uses ComObj;
    ...
    function GetEval(AStr: string): string;
    var
      vScript: Variant;
    begin
      try
        vScript := CreateOleObject('ScriptControl');
        vScript.Language := 'JavaScript';
        Result := vScript.Eval(AStr);
      except
        Result := '';
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(GetEval('24*0.5'));
    end;
      

  6.   

    数据结构(PASCAL语言实现)书上讲述了一个把所有符号和数字推堆栈的方法实现的表达式解析,给你一段网上找到的例子: 
    一款设计精巧的表达式解析器---- 开发MIS系统时,报表设计中经常会碰到表达式解释器,完成用户自定义的公式运算。这种程序的设计需要有比较高的技巧,以下介绍一款用DELPHI4.0开发的程序[程序重在算法,语言特性很少,用其它语言的人也能读懂],只要按自已的要求稍加修改,即可做成组件或全局方法发部。它支持 "加[+]、减[-]、乘[*]、除[/]、商[$:两整数相除,结果的整数部分]、模[%]、括号[()]"四则混合运算,支持"与[&]、或[|]、异或[^]、左移[< ]、右移[ >]和非[!]"逻辑运算功能,同时它们可以出现在同一个表达式中,它们的优先级依次为括号、非、与或异或左右移、乘除商模、加减。如式:12.45+3*16 >2*(3+6*(3+2)-1)=12.45+3*4*32,计算结果为:396.45。程序包括两大部分功能:表达式拆解、因子计算,分别由两个类TBdsProc和TPUSHPOP完成。具体如下:CDIKind=recordcase id: Boolean ofTrue: (dval: Double);False: (ival: Integer);end;CDKind:区别表达式中的整数和浮点数类型,因为有些运算符不支持浮点数(如逻辑运算)。ValKind = CDIKind;TBdsProc = classprivateFghpd : Integer;//识别并标记左右括号是否成对出现function IsCalcFh(c: Char): boolean;//判别一个字符是否运算符function CopyRight(abds: String;start: Integer):String;//截取字符串表达式function BdsSs(var abds: String): ValKind;//返回一个子表达式的值function BdsYz(var abds: String): ValKind;//表达式因子,如:15、(13+5)function BdsItm(var abds: String): ValKind;//读取表达式中的一个因子publicfunction CalcValue(const bds: String): ValKind;//返回计算结果end;TPUSHPOP = classprivateffh: array [0..2] of Char;//符号数组value: array [0..3] of CDIKind;//值数组flevel: Byte;//因子个数fisfh: Boolean;//识别等待输入值或运算符fisnot: Boolean;//识别待计算数据项是否执行非运算function Calcsj(av1,av2: CDIKind;fh: Char): CDIKind;//执行两个数值的四则运算function Calclg(av1,av2: CDIKind; fh: Char): CDIKind;//执行两个数的逻辑运算procedure Calccur;{当输入数据项满足四个数后[依运算优先级层数求得,见下述算式解析原理]执行中间运算}function IsLgFh(fh: Char): Boolean;//一个符号是否逻辑运算符function IsCcFH(fh: Char): Boolean;// 一个符号乘除商模运算符publicconstructor Create;procedure PushValue(avalue: CDIKind);//存入一个数据项procedure PushFh(afh: Char);//存入一个符号function CalcValue: CDIKind;//计算并返回值end;---- 表达式解析基本原理:---- 1.表达式处理:---- 表达式的一个个数据项组成,中间由运算符连接,每个数据项为一个分析基本分析单元。表达式中如果包含有改变运算优先级别的括号运算,先计出括号中式子的值,再把该值当一个数据项处理,这一点在程序设计中只要运用递归功就能实现。---- 2.数据项计算处理---- a >非运算:---- 它为单目运算符,级别最高,在存入符号时做标记,存入数据时即时计算并去除标记。---- b >表达式运算:---- 设f1、f2、f3分别表示一二三级运算符,V1、V2、V3、V4分别表示顺序四个数,则极端表达式模型为R=V1 f1 V2 f2 V3 f3 V4 …,计算时顺序应为 R=…V4 f3 V3 f2 V2 f1 V1。为了简化运算,把其中运算级别最高的逻辑运算在存入数据时先计算完成, 初始化时设V1=0,第一个运算符设为'+'。则公式化为: R=…V4 f2(f1) V3 f2(f1) V2 f1 V1。这样,当V2与V3间的运算符级别为f2时,V4与V3间的运算符级别< =f2,则:V2 =(V2与V3计算值),V3后的值和运算符前移;若V2与V3间的运算级别为f1,可先算V1与V2,V2以后的值和运算符前移。则计算后的表达式为:R=V3 f2(f2) V2 f1 V1刚好满足循环取数条件。---- 3.实现:---- 程序比较长(TBdsProc和TPUSHPOP的源代码合计长度为400多行),完整代码见附件,以下对一些重要实现方法做介绍:---- < 1 >表达式拆解:由方法BdsSs和BdsYz完成表达式拆解和因子处理function TBdsProc.BdsSs(var abds: String): ValKind;varc: Char;lpp: TPushPop;beginlpp := TPushPop.Create;//建立数据计算对象while abds< >'' dobeginc := abds[1];if IsCalcFh(c) then//是否运算符beginlpp.PushFh(c);//保存运算符abds := CopyRight(abds,2);endelsebeginif c=')' thenbeginDec(Fghpd);//括号匹配abds := CopyRight(abds,2);if Fghpd < 0 thenRaise Exception.Create('括号不配对');Result := lpp.CalcValue;//返回括号中的子项值,进行下一步计算lpp.Free;Exit;endelsebeginif c='(' thenInc(Fghpd);//做括号层数标识lpp.PushValue(BdsYz(abds));//取下一项的值。end;end;end;if Fghpd< >0 thenRaise Exception.Create('括号不配对');Result := lpp.CalcValue;//返回最终运算值lpp.Free;end;function TBdsProc.BdsYZ(var abds: String): ValKind;beginif abds< >'' thenbeginif abds[1]='(' thenbeginabds := CopyRight(abds,2);Result := BdsSs(abds);//递归调用,求括号中的值endelseResult := BdsItm(abds);{读一个数据项,如果包括函数定义,可以在该方法中定义接口或连接}end;end;若表达式要支持函数功能,只要定义系统支持的函数,在取行表达式因子BdsItm中加入连接函数定义即可,如下:…..else if (c< ='Z') and (c >='A') thenbeginbhs := 取出函数名及参数Result := … //调用函数处理 (函数定义)abds := 下一项end….< 2 > 数据计算:主要包PushValue,PushFh,Calccur分别完成存入数、符号、中间计算procedure TPUSHPOP.PushValue(avalue: CDIKind);beginif fisfh=True thenRaise Exception.Create('缺少运算符');if fisnot then//进行非运算beginif avalue.id thenRaise Exception.Create('浮点数不能做非运算');avalue.ival := not avalue.ival;fisnot := False;end;if IsLgFh(ffh[flevel]) then//运行逻辑运算beginvalue[flevel] := Calclg(value[flevel],avalue,ffh[flevel]);//与当前值做逻辑运算endelsebeginInc(flevel);//存数位置指针加1value[flevel] := avalue;//存入值if flevel >2 then//数据个数达到4,进行中间运算Calccur;end;fisfh := True;//输入符号可见end;procedure TPUSHPOP.PushFh(afh: Char);beginif (fisfh=false) then//非运算是一级beginif (afh='!') and (not fisnot) then//标识非运算beginfisnot := True;Exit;endelseRaise Exception.Create('运算符重复');EndElsebeginffh[flevel] := afh;//存入运算符fisfh := False; 输入值可见end;end;procedure TPUSHPOP.Calccur;beginif IsCcFh(ffh[1]) then//二级运算符beginvalue[1] := Calcsj(value[1],value[2],ffh[1]);//计算2和3项的值ffh[1] := ffh[2];//后序运符和值前移value[2] := value[3];endelse//一级运算符beginvalue[0] := Calcsj(value[0],value[1],ffh[0]);//计算1和2项的值value[1] := value[2];{ 后序运符和值前移,2和3项的值不计算是为了保持第一个运算符为一级运算符}value[2] := value[3];ffh[0] := ffh[1];ffh[1] := ffh[2];end;Dec(flevel);//存数位置指针减1end; 
      

  7.   

    数据结构(PASCAL语言实现)书上讲述了一个把所有符号和数字推堆栈的方法实现的表达式解析,给你一段网上找到的例子: 
    一款设计精巧的表达式解析器---- 开发MIS系统时,报表设计中经常会碰到表达式解释器,完成用户自定义的公式运算。这种程序的设计需要有比较高的技巧,以下介绍一款用DELPHI4.0开发的程序[程序重在算法,语言特性很少,用其它语言的人也能读懂],只要按自已的要求稍加修改,即可做成组件或全局方法发部。它支持 "加[+]、减[-]、乘[*]、除[/]、商[$:两整数相除,结果的整数部分]、模[%]、括号[()]"四则混合运算,支持"与[&]、或[|]、异或[^]、左移[< ]、右移[ >]和非[!]"逻辑运算功能,同时它们可以出现在同一个表达式中,它们的优先级依次为括号、非、与或异或左右移、乘除商模、加减。如式:12.45+3*16 >2*(3+6*(3+2)-1)=12.45+3*4*32,计算结果为:396.45。程序包括两大部分功能:表达式拆解、因子计算,分别由两个类TBdsProc和TPUSHPOP完成。具体如下:CDIKind=recordcase id: Boolean ofTrue: (dval: Double);False: (ival: Integer);end;CDKind:区别表达式中的整数和浮点数类型,因为有些运算符不支持浮点数(如逻辑运算)。ValKind = CDIKind;TBdsProc = classprivateFghpd : Integer;//识别并标记左右括号是否成对出现function IsCalcFh(c: Char): boolean;//判别一个字符是否运算符function CopyRight(abds: String;start: Integer):String;//截取字符串表达式function BdsSs(var abds: String): ValKind;//返回一个子表达式的值function BdsYz(var abds: String): ValKind;//表达式因子,如:15、(13+5)function BdsItm(var abds: String): ValKind;//读取表达式中的一个因子publicfunction CalcValue(const bds: String): ValKind;//返回计算结果end;TPUSHPOP = classprivateffh: array [0..2] of Char;//符号数组value: array [0..3] of CDIKind;//值数组flevel: Byte;//因子个数fisfh: Boolean;//识别等待输入值或运算符fisnot: Boolean;//识别待计算数据项是否执行非运算function Calcsj(av1,av2: CDIKind;fh: Char): CDIKind;//执行两个数值的四则运算function Calclg(av1,av2: CDIKind; fh: Char): CDIKind;//执行两个数的逻辑运算procedure Calccur;{当输入数据项满足四个数后[依运算优先级层数求得,见下述算式解析原理]执行中间运算}function IsLgFh(fh: Char): Boolean;//一个符号是否逻辑运算符function IsCcFH(fh: Char): Boolean;// 一个符号乘除商模运算符publicconstructor Create;procedure PushValue(avalue: CDIKind);//存入一个数据项procedure PushFh(afh: Char);//存入一个符号function CalcValue: CDIKind;//计算并返回值end;---- 表达式解析基本原理:---- 1.表达式处理:---- 表达式的一个个数据项组成,中间由运算符连接,每个数据项为一个分析基本分析单元。表达式中如果包含有改变运算优先级别的括号运算,先计出括号中式子的值,再把该值当一个数据项处理,这一点在程序设计中只要运用递归功就能实现。---- 2.数据项计算处理---- a >非运算:---- 它为单目运算符,级别最高,在存入符号时做标记,存入数据时即时计算并去除标记。---- b >表达式运算:---- 设f1、f2、f3分别表示一二三级运算符,V1、V2、V3、V4分别表示顺序四个数,则极端表达式模型为R=V1 f1 V2 f2 V3 f3 V4 …,计算时顺序应为 R=…V4 f3 V3 f2 V2 f1 V1。为了简化运算,把其中运算级别最高的逻辑运算在存入数据时先计算完成, 初始化时设V1=0,第一个运算符设为'+'。则公式化为: R=…V4 f2(f1) V3 f2(f1) V2 f1 V1。这样,当V2与V3间的运算符级别为f2时,V4与V3间的运算符级别< =f2,则:V2 =(V2与V3计算值),V3后的值和运算符前移;若V2与V3间的运算级别为f1,可先算V1与V2,V2以后的值和运算符前移。则计算后的表达式为:R=V3 f2(f2) V2 f1 V1刚好满足循环取数条件。---- 3.实现:---- 程序比较长(TBdsProc和TPUSHPOP的源代码合计长度为400多行),完整代码见附件,以下对一些重要实现方法做介绍:---- < 1 >表达式拆解:由方法BdsSs和BdsYz完成表达式拆解和因子处理function TBdsProc.BdsSs(var abds: String): ValKind;varc: Char;lpp: TPushPop;beginlpp := TPushPop.Create;//建立数据计算对象while abds< >'' dobeginc := abds[1];if IsCalcFh(c) then//是否运算符beginlpp.PushFh(c);//保存运算符abds := CopyRight(abds,2);endelsebeginif c=')' thenbeginDec(Fghpd);//括号匹配abds := CopyRight(abds,2);if Fghpd < 0 thenRaise Exception.Create('括号不配对');Result := lpp.CalcValue;//返回括号中的子项值,进行下一步计算lpp.Free;Exit;endelsebeginif c='(' thenInc(Fghpd);//做括号层数标识lpp.PushValue(BdsYz(abds));//取下一项的值。end;end;end;if Fghpd< >0 thenRaise Exception.Create('括号不配对');Result := lpp.CalcValue;//返回最终运算值lpp.Free;end;function TBdsProc.BdsYZ(var abds: String): ValKind;beginif abds< >'' thenbeginif abds[1]='(' thenbeginabds := CopyRight(abds,2);Result := BdsSs(abds);//递归调用,求括号中的值endelseResult := BdsItm(abds);{读一个数据项,如果包括函数定义,可以在该方法中定义接口或连接}end;end;若表达式要支持函数功能,只要定义系统支持的函数,在取行表达式因子BdsItm中加入连接函数定义即可,如下:…..else if (c< ='Z') and (c >='A') thenbeginbhs := 取出函数名及参数Result := … //调用函数处理 (函数定义)abds := 下一项end….< 2 > 数据计算:主要包PushValue,PushFh,Calccur分别完成存入数、符号、中间计算procedure TPUSHPOP.PushValue(avalue: CDIKind);beginif fisfh=True thenRaise Exception.Create('缺少运算符');if fisnot then//进行非运算beginif avalue.id thenRaise Exception.Create('浮点数不能做非运算');avalue.ival := not avalue.ival;fisnot := False;end;if IsLgFh(ffh[flevel]) then//运行逻辑运算beginvalue[flevel] := Calclg(value[flevel],avalue,ffh[flevel]);//与当前值做逻辑运算endelsebeginInc(flevel);//存数位置指针加1value[flevel] := avalue;//存入值if flevel >2 then//数据个数达到4,进行中间运算Calccur;end;fisfh := True;//输入符号可见end;procedure TPUSHPOP.PushFh(afh: Char);beginif (fisfh=false) then//非运算是一级beginif (afh='!') and (not fisnot) then//标识非运算beginfisnot := True;Exit;endelseRaise Exception.Create('运算符重复');EndElsebeginffh[flevel] := afh;//存入运算符fisfh := False; 输入值可见end;end;procedure TPUSHPOP.Calccur;beginif IsCcFh(ffh[1]) then//二级运算符beginvalue[1] := Calcsj(value[1],value[2],ffh[1]);//计算2和3项的值ffh[1] := ffh[2];//后序运符和值前移value[2] := value[3];endelse//一级运算符beginvalue[0] := Calcsj(value[0],value[1],ffh[0]);//计算1和2项的值value[1] := value[2];{ 后序运符和值前移,2和3项的值不计算是为了保持第一个运算符为一级运算符}value[2] := value[3];ffh[0] := ffh[1];ffh[1] := ffh[2];end;Dec(flevel);//存数位置指针减1end; 
      

  8.   

    奇怪,怎么会有二个~~自己多查查,网上很多的
    http://61.186.252.131/Expert/topic/1935/1935483.xml?temp=.1215479
    http://61.186.252.131/Expert/topic/2009/2009526.xml?temp=.8133356
    http://61.186.252.131/Expert/topic/2620/2620420.xml?temp=.3915827
    http://61.186.252.131/Expert/topic/528/528425.xml?temp=.190777
      

  9.   

    to  weizi2000(秋风啊) 
    非常感謝!to JuckFapan(?!囸㊣) 
    也很感謝你的幫助!