如何避免在与日期字段相连的DBEdit中输入非法日期(如1999.06.66)引起的程序错误(100分)

  • 主题发起人 主题发起人 罗罗
  • 开始时间 开始时间

罗罗

Unregistered / Unconfirmed
GUEST, unregistred user!
在与日期字段相连的DBEdit中输入非法日期(如1999.06.66)时,
会引起的程序错误,请问如何解决?
 
在Table的事件中先检查一下,如果合法就修改,否则重新输入
 
方法一:TField.EditMask
对相应的字段设置EditMask属性,限制输入
方法二:TDataSet.BeforePost
在BeforePost事件中判断输入是否正确,
不正确时报错、Abort掉;
 
在主程序的OnCreate中写:
DateSeparator := '.';
LongDateFormat := 'YYYY.MM.DD';
ShortDateFormat := 'YYYY.MM.DD';
在数据库字段的Edit Mask中写
9999.99.99;1;
(注意:最后有个空格!)
DisplayFormat设为
YYYY.MM.DD

 
建议你使用数据库日历控件,如rx的
 
直接使用日期控件或用异常判断。
 
改与日期字段相连的DBEdit为TDateTimePicker,
再将DateTimePicker中的日期写表中或从表中读出。
 
在主程序的OnCreate中写:
DateSeparator := '.';
LongDateFormat := 'YYYY.MM.DD';
ShortDateFormat := 'YYYY.MM.DD';
在数据库字段的Edit Mask中写
9999.99.99;1; (注意:最后有个空格!)
DisplayFormat设为
YYYY.MM.DD
然后在字段的OnSetText事件中写
begin
if (Text = ' . . ') then
exit;
try
StrToDate(Text);
except
ShowMessage('日期错误!(正确格式应为 "年.月.日")');
Abort;
end;
Sender.AsDateTime := StrToDate(Text);
end;
 
在TABLE的字段编辑器里编辑字段的显示格式(displayformat)为 yyyy/mm/dd

或是在TABLE 的 BEFORE OPEN事件里写
table1.fieldbyname( 'today' ).Displayformat := 'yyyy/mm/dd'

这样, 用户就无法在 DBEDIT里 输入错误的 "." 号
在 DBEDIT 的 ONEXIT 事件里检查 日期是否合法
就是用
try
strtodate( dbedit1.text);
flag:=true;
except
flag := false;
end;
也就是说日期正确的话,就设置一个日期正确标志为TRUE
否则出现异常就写一个 错误标志
在 TABLE POST之前判断此标志是否为真即可

 
其一,事实上,引起的不是程序错误,是系统对异常的处理过程。

其二,没有人能保证用户不犯输入错误,从这个意义上讲异常的产生是无法避免的。

你的意思应该是当用户输入了错误的日期后如何截获系统对该异常的处理过程并改

由你自己来处理?那你只能将Applicatin.OnExceptiong指向你自己的一个异常处

理程序,由你自己所编的过程来作相应的异常处理。

 
用datatimepick是不错的解决方法,编程量小

有和数据连接的DBDateTimePick,这样更方便
 
多人接受答案了。
 
try
//convert to DATE
except
on Econverterror do
application.messagebox('输入的日期无效!','错',16);
 
后退
顶部