rt

解决方案 »

  1.   

    与DataSource之Dataset(TTable)BeforePost event
      

  2.   

    我用的是Tquery,不过查询的是单表,我把Tquery的RequestLive属性设置为true,可以在在DBGrid中修改数据,但是不知道在哪儿进行有效性验证,在TQuery的beforeEdit事件中,系统返回表不是处于编辑状态,在TQuery的beforePost事件中写,运行后在DBGrid中修改数据都显示‘请重新输入’...
     我都快崩溃了....
    我这活用的都是TQuery,现在还只有单表的操作,等涉及到多表操作的时候,
    在DBGrid中修改数据是不是不可能了?
    是不是非的通过点击按钮,然后再在弹出的对话框中操作呀?
    是不是DBGrid仅仅是用来显示查询到的数据呀?!
    这些都是我的疑问,想通过书本了解,靠,都是写骗人的,什么都没讲,
    我以前没用过delphi,现在是边做边学,可能有些问题是我的无知造成的。。盼大家告知。。谢谢。
      

  3.   

    cchip() 呵呵。。你的是方法可以,我所说的出现:"请重新输入"是我自己在TQuery的beforePost事件中测试的时候自己写上去的。。头都麻了。。晕的很,要睡觉去了。。
      

  4.   

    TDatasource的事件
    ondataChange: 在程序中使用了next,previous,insert等数据导航操作时调用;
    onUpdateData: 发生在post调用之后,真正写入数据之前;
    onStateChange: 当Dataset的状态发生变化时调用。
      

  5.   

    procedure TForm1.DataSource1UpdateData(Sender: TObject);
    begin
      if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then
      begin
        showmessage('asdf');
      end;
    end;
      

  6.   

    procedure TForm1.DataSource1UpdateData(Sender: TObject);
    begin
      if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then
       (sender as TDatasource).DataSet.Cancel;  //取消数据更新,重新输入数据
    end;
      

  7.   

    在QUERY的BEFORPOST中判断。如果不合法,则ABORT。
      

  8.   

    47522341(睡到8:30) ( ):
    如果使用的是TQuery查询的数据,BeforePost,OnUpDateData等事件是否有效?
    另外这些事件过程中进行有效性验证时,若发现非法,能不能直接取消修改操作?比方说你给我的例子:
    procedure TForm1.DataSource1UpdateData(Sender: TObject);
    begin
      if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then
      begin
        showmessage('asdf');
      end;
    end;
    虽然能够检测到Fax_number长度是否合法,但都阻止不了post方法的进行,有没有直接取消修改的语句。
    若没有,那是不是要在修改前用一个变量先保存Fax_number的原始数据?那这个保存Fax_number的原始数据代码,应该在DBGrid的哪个事件中写?
      

  9.   

    coffee36(咖啡) :
    在QUERY的BEFORPOST中判断。如果不合法,则ABORT。
    ====================
    你的这个ABort是阻止数据提交的方法吗,能不能具体点告诉我是哪个组件的方法(是DataSource还是TQuery),格式如何?能不能给个简单的例子,谢谢。。
      

  10.   

    To SellAutumn(学习怎么谈恋爱..)  你是要在DBGrid中直接修改并提交吗?
    不太明白我也学习ing
      

  11.   

    同意咖啡,abort停止继续执行其它语句
      

  12.   

    虽然能够检测到Fax_number长度是否合法,但都阻止不了post方法的进行,有没有直接取消修改的语句。
    你试一下这个  application.Terminate;应该可以了。
      

  13.   

    TO 楼上:你那个语句把整个应用程序都终止了。你不会是在开玩笑吧?
    TO 楼主:在QUERY的BEFORPOST中判断。如果不合法,则ABORT。是完全可以的。首先,你是在BEFOREPOST中判断的,所以此时还没有真正的POST。所以此时如果你检查到有不合法的数据,ABORT就会直接退出并且产生一个哑异常,也就不会再执行POST了。
    你可以试试。我去年刚学DELPHI时,也是遇到跟你一样的问题。
      

  14.   

    另外也可以使用ADOQUERY的CANCEL方法。取消提交
      

  15.   

    我是楼主,谢谢大家参与,我的疑问真的好多..
    我的计划是这样,因为需要显示的信息都是多表查询的结果,所以我所有的数据表都用TQuery,查询到结果后,用DBGrid显示,用户若要修改数据的话,直接在DBGrid的单元格中进行。
    比方说有三个表:
    但我的疑问就来了:TQuery的多表查询结果是只读,这样DBGrid的单元格也只读了。。是不是DBGrid主要是显示多表查询的结果,而要修改数据的话还是通过另外弹出对话框用TTable结合DBEdit,DBComboBox等非DBGrid控件来实现真的好苦恼,我不太想别人在修改数据是弹对话框,添加数据时也弹对话框
      

  16.   

    见意用ADO控件,它可以支持!
      

  17.   

    coffee36(咖啡) 
    首先谢谢你,我知道beforepost这个事件发生的时候还没真正写入数据,所以我想除了检测合法外,还想在遇到非法的输入时候,最好能取消当前的post,如果能用Abort就太好了,是TQuery.Abort吗?如果不能用,我就想在DBGrid的某行处于修该的时候,把它的所有字段值用一个数组保存起来,然后再在beforepost中遇到非法输入时候把数组中的原始数据写回到对应字段,这样行不行?不过好想有点麻烦,。。最好是TQuery有你说那个abort方法,就简单多了。。
    另外...我几天前接触这个Delphi,是边做边学,手上的活时间紧,哎。。连思考的时间都没有,现在我的情况是好多事情知道怎么做,但不知道在Delphi中的哪个地方实现。。急死了。。
      

  18.   

    dbgrid 的 editchanged事件
      

  19.   

    abort 可以直接用,他是一个过程。
    具体可以在帮助中找到说明
      

  20.   

    To (睡到8:30)
    我觉得你第二个例子写的满好的啊,楼主你可以借用的啊,当然在beforepost事件之前进行判断也是正确的,不过还是前一个好
      

  21.   

    直接用
    Abort 或 Exit都可以!
      

  22.   

    BEFOREPOST。。
    或者你自己在POST前验证
      

  23.   

    最好用ABORT,因为它可以返回到POST前的状态,相当于撤消