procedure TForm1.DataSource1UpdateData(Sender: TObject); begin if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then begin showmessage('asdf'); end; end;
procedure TForm1.DataSource1UpdateData(Sender: TObject); begin if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then (sender as TDatasource).DataSet.Cancel; //取消数据更新,重新输入数据 end;
在QUERY的BEFORPOST中判断。如果不合法,则ABORT。
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的哪个事件中写?
TO 楼上:你那个语句把整个应用程序都终止了。你不会是在开玩笑吧? TO 楼主:在QUERY的BEFORPOST中判断。如果不合法,则ABORT。是完全可以的。首先,你是在BEFOREPOST中判断的,所以此时还没有真正的POST。所以此时如果你检查到有不合法的数据,ABORT就会直接退出并且产生一个哑异常,也就不会再执行POST了。 你可以试试。我去年刚学DELPHI时,也是遇到跟你一样的问题。
我都快崩溃了....
我这活用的都是TQuery,现在还只有单表的操作,等涉及到多表操作的时候,
在DBGrid中修改数据是不是不可能了?
是不是非的通过点击按钮,然后再在弹出的对话框中操作呀?
是不是DBGrid仅仅是用来显示查询到的数据呀?!
这些都是我的疑问,想通过书本了解,靠,都是写骗人的,什么都没讲,
我以前没用过delphi,现在是边做边学,可能有些问题是我的无知造成的。。盼大家告知。。谢谢。
ondataChange: 在程序中使用了next,previous,insert等数据导航操作时调用;
onUpdateData: 发生在post调用之后,真正写入数据之前;
onStateChange: 当Dataset的状态发生变化时调用。
begin
if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then
begin
showmessage('asdf');
end;
end;
begin
if Length((sender as TDatasource).DataSet.FieldByName('Fax_number').AsString) < 5 then
(sender as TDatasource).DataSet.Cancel; //取消数据更新,重新输入数据
end;
如果使用的是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的哪个事件中写?
在QUERY的BEFORPOST中判断。如果不合法,则ABORT。
====================
你的这个ABort是阻止数据提交的方法吗,能不能具体点告诉我是哪个组件的方法(是DataSource还是TQuery),格式如何?能不能给个简单的例子,谢谢。。
不太明白我也学习ing
你试一下这个 application.Terminate;应该可以了。
TO 楼主:在QUERY的BEFORPOST中判断。如果不合法,则ABORT。是完全可以的。首先,你是在BEFOREPOST中判断的,所以此时还没有真正的POST。所以此时如果你检查到有不合法的数据,ABORT就会直接退出并且产生一个哑异常,也就不会再执行POST了。
你可以试试。我去年刚学DELPHI时,也是遇到跟你一样的问题。
我的计划是这样,因为需要显示的信息都是多表查询的结果,所以我所有的数据表都用TQuery,查询到结果后,用DBGrid显示,用户若要修改数据的话,直接在DBGrid的单元格中进行。
比方说有三个表:
但我的疑问就来了:TQuery的多表查询结果是只读,这样DBGrid的单元格也只读了。。是不是DBGrid主要是显示多表查询的结果,而要修改数据的话还是通过另外弹出对话框用TTable结合DBEdit,DBComboBox等非DBGrid控件来实现真的好苦恼,我不太想别人在修改数据是弹对话框,添加数据时也弹对话框
首先谢谢你,我知道beforepost这个事件发生的时候还没真正写入数据,所以我想除了检测合法外,还想在遇到非法的输入时候,最好能取消当前的post,如果能用Abort就太好了,是TQuery.Abort吗?如果不能用,我就想在DBGrid的某行处于修该的时候,把它的所有字段值用一个数组保存起来,然后再在beforepost中遇到非法输入时候把数组中的原始数据写回到对应字段,这样行不行?不过好想有点麻烦,。。最好是TQuery有你说那个abort方法,就简单多了。。
另外...我几天前接触这个Delphi,是边做边学,手上的活时间紧,哎。。连思考的时间都没有,现在我的情况是好多事情知道怎么做,但不知道在Delphi中的哪个地方实现。。急死了。。
具体可以在帮助中找到说明
我觉得你第二个例子写的满好的啊,楼主你可以借用的啊,当然在beforepost事件之前进行判断也是正确的,不过还是前一个好
Abort 或 Exit都可以!
或者你自己在POST前验证