你在dbedit连接的dataset中写判断事件。
如果:dbedit->datasource->table1
在table1上的mydate字段的onchange事件中写代码

解决方案 »

  1.   

    你可以在dbedit的onexit中写代码
    try
      strtodate(DBedtBysj.Text)
    except
      showmessage('请您按规定格式输入时间值');
      dbedit.setfocus;//聚焦在原组件上
    end;
      

  2.   

    to:dongys_2000
    你的方法不行
    我觉得好象是数据库先校验,然后才执行EXIT事件
    应该是
      

  3.   

    象时间这样的输入,最好还是不要用dbedit直接让用户输入。一来容易出错,二来是出错了也不好捕获和处理。
    我的经验是使用datetimepicker用用户选择,然后在table或query的beforepost事件中再把datetimepicker的值写到相应的字段里。不知君认同否?
      

  4.   

    还有,你的判断是对的——数据库先校验,然后才执行EXIT事件
      

  5.   

    TO:delphi_user
    好像在执行Onvalidate事件和onchage事件之前就执行了
    sql server的数据类型检查
    我也试了
      

  6.   

    谢谢bobi
    但是datatimepicker有个缺点,就是不能为空
    对么
      

  7.   

    如果您用的是query控件则
    可在该字段的onvalidate事件可写:
    var
      T:Tdatetime;
    begin
      try
         t:=query1.fieldbyname('myfield').asdatetime;
      except
        showmessage('err on date input');
        raise;
      end;
    end;
      

  8.   

    呵呵,教你一个方法,绝对正确,我经常写这种代码;
    1.写一个函数如下:
      procedure DateSetText(Sender :TField; const Text: String);
      begin
        try
          Sender.AsDateTime:=StrToDateTime(Text);
        except
          ShowMessage('日期格式错误!');
          Abort;
          Exit;
        end;
      end;
    2.在Table的AfterOpen事件中,写一句代码如下:
      Table1.FieldByName('DateField').OnSetText:=DateSetText;万事大吉,其实是重载了Field的OnSetText事件,绝对有效;
    如有问题,欢迎发问。  
      

  9.   

    建议你用MaskEdit,这样可以规定输入的格式,乱输就不行了,然后在onexit事件中写代码strtodatetime(MaskEdit.text)写入你的表中即可
      

  10.   

    呵呵,这种问题我也遇见过,记得当时是在query里的字段的OnValidate里判断的,然发现格式不对后先提示用户,然后(这步很重要)就要abort掉(当然,在abort前可以对dbedit先setfocus一下),试一下吧,呵呵~~
      

  11.   

    建议用时间输入控件,或MaskEdit控件,这样更好控制程序!!!!
      

  12.   

    new_life(新生)
    datatimepicker的缺点可以补救。让它配合一个edit控件,不允许用户写的,把datetimepicker的值写到它里面去,你就可以控制了。
      
      

  13.   

    系统报错是不是类型转换错误,英文信息大致是:ApplicationName.exe raised exception
    class EConvertError with message ...is not a Valid date and time ...
    这是与数据库日期类型字段有关的类型转换错误,一般的异常处理语句无法截获这种异常,但可以
    通过自定义Application对象的OnException事件中来截获处理这种异常,因为所有用户没有
    处理的异常最终都会到该事件中处理。具体过程如下:
    1.自定义一个异常处理过程MyOnException;
       procedure TMainForm.MyOnException(Sender: TObject; E: Exception);
       begin
           if E is EConvertError then
           begin 
               // 处理特定异常   
               ShowMEssage('This is a exception');
           end;
           else 
          //处理其他缺省的异常   
               Application.HandleException(Sender);   
       end;
    2. 把自定义异常事件赋给Application对象
      procedure TMainForm.FormCreate(Sender: TObject);
        begin
            Application.OnException := MyOnException;
        end;不知我的回答是否满足你的需要?
      

  14.   

    这个问题各位都有很多答案,不过MaskEdit也有问题,虽然规定了用户输入的格式,但是如果用户输入一个:1999-19-70,一样会出错;
    而重载Application.OnException确实可以解决问题,我最早也是这么写的。不过需要判断异常的类型,而这个异常是一个转换实数类型的异常,如果你的程序中有其他地方写有类似于StrToFloat函数的代码,当转换失败的时候,就会产生这个异常,而这时如果你重载掉了OnException,它可不会管你是因为时间输入错误引起的异常还是转换实数的异常,统统给你一个“时间错误”的提示(就是你自定义的提示),一般会让人莫名其妙的。
    还有问题吗?
      

  15.   

     1.对其他转换时间异常(StrToDateTime)只要不是与数据库相应字段输入有关,应该都能截获,截获后你自己进行处理,就不会传到OnException中来啦!
     2.此外,他说的这种情况只在与数据库输入有关时才发生,可以采用edit代替dbedit,虽然要多
    写点代码,但却是一种值得考虑的方法,一切都在你的控制之中。
      

  16.   

    TO:JABMOON
    确实有个问题
    就是用你的方法的时候,
    修改dbedit中原有的值的时候,修改了只要一离开就又恢复原来的值了
    (在DBEDIT中不按规定输入时间值,是出现规定的中文对话框,这是队的)
    我不晓得是怎么回事
      

  17.   

    你说修改了一离开就恢复为原来的值,是什么意思?
    你的意思是不是说你即使修改的是一个正确的值,仍然恢复成了原来的值?比如1999-11-1改为1999-11-2,可以一离开,这个值还是变为了1999-11-1。说实话,我没有碰见过这种情况,从代码的角度看,也不应该出现这种情况,如果确实有这种情况,我不知道原因,不过可能的解决办法是:重载OnGetText。
    procedure DateGetText(Sender: TField; var Text: String; DisplayText: Boolean);
    begin
      Text:=DateTimeToStr(Sender.AsDateTime);
    end;
    然后在Table.AfterOpen中,再加一句:
    Table.FieldByName('DateField').OnGetText:=DateGetText;
    估计可以解决问题,不过惭愧的是,我确实不知道原因,你可以研究一下。