我的DBGRID现有3列有计算关系:A*B=C,我想在A或B内输入时自动计算显示C,在C输入时又能自动计算显示A
现在我在DataSet的字段A和C的onchange()中写了计算代码,但是会引起循环计算;
如果写在dataset的onbeforepost()中也不行,因为用户要求实时显示,不能最后计算。
如何实现好呢?

解决方案 »

  1.   

    写在DBGrid1KeyPress事件中,先判断当前输入是哪一列,然后进行相应计算
      

  2.   

      判断一下就行了,要是输入 A B列就按 A*B计算,要是输入C A  或B 就按  c/A 或B算,就这样,你可以这样判断 ,只要列的数据不为空时才会计算
      

  3.   

    moshao6:如果判断是哪一列输入呢?
      

  4.   

    A会改变C,C又会改变A; 沒有控制条件不论怎么写都会循环,设计本身就有问题?例1*2=2; C=2时改变A=2 那么2*2=4; 即C=4,C变了是不是A又要改变呢,无限下去...
      

  5.   

    kaikai_kk:
    我的本意是不让循环的。即只要满足A*B=C,或者A=C/B即可。
    循环是系统本身造成的,所以,只要加个限制条件,不让循环,即能满足我的需要。
    babydog01:
    具体如何操作呢?
      

  6.   

    如果是用AOD的话就用onFieldChangeComplete事件:判断一下被修改的是哪个字段,如果是所指定的字段就修改其它关联字段就可以了。
      

  7.   

    谢谢babydog01,你说的就是我需要的。
      

  8.   

    dataset.FieldbyName('A').OnValidate := datasetAValidate;
    dataset.FieldbyName('B').OnValidate := datasetAValidate;
    dataset.FieldbyName('C').OnValidate := datasetCValidate;
    在show的事件里面写名类似这样的代码。tb_datasetAValidate这是一个过程,在过程里面可以写C栏位的计算方式,但是在这个里面要先把dataset.FieldbyName('C').OnValidate := nil,最后再加上dataset.FieldbyName('C').OnValidate := datasetCValidate;
    以免造成循环,在datasetCValidate里面就写A栏的计算方式,同样要把A的dataset.FieldbyName('A').OnValidate :=nil,最后再加上dataset.FieldbyName('A').OnValidate := datasetAValidate;
    不知道我这样写你是否看得明白
      

  9.   

    liw125008:你的方法也不错,不过,用字段的onchange()不是很好吗?