我的窗体上有几个dbedit和edit,我想让edit.text跟随dbedit变化,我的代码如下procedure TForm8.FormCreate(Sender: TObject);var
  loginstr:string;
  sumday:integer;
beginloginstr:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+ExtractFilePath(ParamStr(0)) +'人事管理系统.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
ADOConnection1.Connected:=false;
ADOConnection1.ConnectionString:=loginstr;
ADOConnection1.Connected:=true;ADOQuery1.Active:=true;
sumday:=DaysInMonth(Strtodate(DBEdit4.text+'-01'));
edit2.Text:=FloatToStr(Round((StrToFloat(dbedit6.Text)/sumday )*StrToFloat(dbedit5.Text)));
edit1.Text:=FloatToStr(StrToFloat(DBEdit17.Text)+StrToFloat(DBEdit14.Text)+StrToFloat(DBEdit15.Text)+StrToFloat(DBEdit16.Text));
edit4.Text:=FloatToStr(StrToFloat(edit2.Text)+StrToFloat(DBEdit13.Text)+StrToFloat(DBEdit7.Text)+ StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text)+StrToFloat(DBEdit10.Text)+StrToFloat(DBEdit11.Text)+StrToFloat(DBEdit12.Text));
edit3.Text:=FloatToStr(StrToFloat(edit4.Text)-StrToFloat(edit1.Text));
end;
procedure TForm8.DBEdit4Change(Sender: TObject);var
  sumday1:integer;
begin
sumday1:=DaysInMonth(Strtodate(DBEdit4.text+'-01'));
edit2.Text:=FloatToStr(Round((StrToFloat(dbedit6.Text)/sumday1 )*StrToFloat(dbedit5.Text)));
edit1.Text:=FloatToStr(StrToFloat(DBEdit17.Text)+StrToFloat(DBEdit14.Text)+StrToFloat(DBEdit15.Text)+StrToFloat(DBEdit16.Text));
edit4.Text:=FloatToStr(StrToFloat(edit2.Text)+StrToFloat(DBEdit13.Text)+StrToFloat(DBEdit7.Text)+ StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text)+StrToFloat(DBEdit10.Text)+StrToFloat(DBEdit11.Text)+StrToFloat(DBEdit12.Text));
edit3.Text:=FloatToStr(StrToFloat(edit4.Text)-StrToFloat(edit1.Text));
end;
现在它老是提示‘'-01'‘不是一个有效的DATE,我的DBEdit4.text是’2008-06‘这样的格式,而且数据库中的DBEdit4.text都不为空,只运行FormCreate时并不报错。

解决方案 »

  1.   

    DBEdit4.text,在编辑状态下是读不到的,post后才能读到,所以不要用dbedit
      

  2.   

    sumday1:=DaysInMonth(Strtodate(trim(DBEdit4.text)+'-01'));
      

  3.   

    procedure TForm8.DBEdit4Change(Sender: TObject);var
      sumday1:integer;
      FormatSettings:TFormatSettings;
      vDate : TDateTime;
    begin
    if sender.isNull then exit;
      FormatSettings.DateSeparator:='-';
      FormatSettings.TimeSeparator:=':';
      FormatSettings.ShortDateFormat:='yyyy-MM-dd';
      TryStrToDateTime(trim(DBEdit4.text)+'-01',vDate,formatSettings);
      sumday1 := DaysInMonth(vDate);
    edit2.Text:=FloatToStr(Round((StrToFloat(dbedit6.Text)/sumday1 )*StrToFloat(dbedit5.Text)));
    edit1.Text:=FloatToStr(StrToFloat(DBEdit17.Text)+StrToFloat(DBEdit14.Text)+StrToFloat(DBEdit15.Text)+StrToFloat(DBEdit16.Text));
    edit4.Text:=FloatToStr(StrToFloat(edit2.Text)+StrToFloat(DBEdit13.Text)+StrToFloat(DBEdit7.Text)+ StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text)+StrToFloat(DBEdit10.Text)+StrToFloat(DBEdit11.Text)+StrToFloat(DBEdit12.Text));
    edit3.Text:=FloatToStr(StrToFloat(edit4.Text)-StrToFloat(edit1.Text));
    end;
    總體來說,你的代碼太不稱定。如果人家輸的不合法你也強制轉換也還是會錯。
      

  4.   

    不要写在OnChange里面,不然,日期的格式有可能不对
    比如说,你输入一个2,日期变成了'2-01'
    可以输入完成以后,按一个回车,写在OnKeyPress里面,判断回车。
      

  5.   

    dbedit是数据感知控件,而且写在onchange里面程序容易报错。
      

  6.   

    我想做出来的效果是上面是一个dbgrid,下面有一堆dbedit和edit,当拖动dbgrid时,下面的都跟着变化
      

  7.   


    那为什么只有formcreate事件可以呢?
      

  8.   

     如果你下面的確確是DBEDIT系統的感應組件,與數據集也做了關聯,那就不用寫上面的代碼。 對於整條記錄的滾動判斷放到:  adoquery1.afterscroll  這類事件去寫。 某一個字段改變了在ONCHANGE裏,但你的前期判斷要做好,不然太不穩定了。
      

  9.   

    华哥就是见多识广  adoquery1.afterscroll 这个事件刚刚好