大家好,我想用Delphi编一个程序,请大家帮我看看下面这段代码哪里出错了。  我用的是Delphi7,操作系统是XP,分别使用:TADOTable、TDataSource、TEdit、TRichEdit、TComboBox、TLabel、TButton,DataControls标签页下的组件只有一个:TDBGrid。  数据库名:HDDB.mdb(Access数据库);表名:“Record”。字段有:隐患编号、检查日期、被检单位、负责人、隐患内容、整改措施、检查人、检查日期、整改期限、复查人、复查日期、整改情况。(以上字段:编号、整改期限为Integer类型;检查日期、复查日期为TDateTime类型,其余全部为String类型)。  目的是这样:  1、单击“隐患录入” 按钮,新建一条记录。记录内各字段的值,通过TEdit、TComboBox、TRichEdit等组件获得。
  由于某些隐患字数少,在TRichEdit中可能只有1行、某些隐患字数会较多,在TRichEdit中可能就会有2行或多行。为了实现将TRichEdit中的每一行内容分别在数据库表中保存为一条记录,编写如下代码(窗体名:fmCollect,窗体上各组件命名规则:fmCO+组件类缩写+用途+窗体顺序。如“隐患录入”按钮.Name := fmCOBtnNew26):
  
  procedure TfmCollect.fmCOBtnNew26Click(Sender: TObject);
 Var
  RhEDLine: Integer;
begin   
 IF fmCOdsRecord.DataSet.State = dsBrowse Then
  begin
  fmCOADOtbMoveUp.Last; //窗体上的第2个TADOTable组件,为了在“新增”时避免“隐患编号”重复(主键)
  fmCOdsRecord.DataSet.Append;
  fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);
  FOR RhEDLine := 0 TO fmCORhEDDetails7.Lines.Count - 1 Do
  begin
  fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger := fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1;
  //fmCOADOTable2.FieldByName('隐患编号').AsInteger + 1;
  fmCOdsRecord.DataSet.FieldByName('检查日期').AsDateTime := fmCODTExamine2.Date;
  fmCOdsRecord.DataSet.FieldByName('被检单位').AsString := fmCOCBoxUnit3.Text;
  fmCOdsRecord.DataSet.FieldByName('负责人').AsString := fmCOCBoxReceived4.Text;
  fmCOdsRecord.DataSet.FieldByName('检查人').AsString := fmCOCBoxRummager5.Text;
  fmCOdsRecord.DataSet.FieldByName('检查单位意见').AsString := fmCOCBoxIdea9.Text;
  fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger := StrToInt(fmCOEDCode1.Text);
  fmCOdsRecord.DataSet.FieldByName('隐患内容').AsString := fmCORhEDDetails7.Lines.Strings[0];
  fmCORhEDDetails7.Lines.Strings[fmCORhEDLine];
  fmCOdsDetails.DataSet.FieldByName('整改措施').AsString :=
  fmCORhEDMeasure8.Lines.Text;
  end;
  end;
end;按F9后,出现两种情况的错误:
  1、当数据表Record为空表(不含一条记录)时,按“隐患录入”按钮,出现错误信息:'' is not a valid integer value.
  2、当数据表Record不为空表(哪怕只含一条记录)时,按“隐患录入”按钮,出现错误信息:“不能插入空的数据行。”  这是为什么呢?  本人Delphi水平属于没入门水平,平时由于工作繁忙也没时间去系统的学习。由于工作需要,这是我的第一个程序,可能数据库表的建立、组件命名、代码编写规则等存在一些问题,请各位高手帮我检查、指教,本人不胜感激。

解决方案 »

  1.   

    fmCOADOtbMoveUp.Last; //窗体上的第2个TADOTable组件,为了在“新增”时避免“隐患编号”重复(主键)
    fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);  
    fmCOdsRecord.DataSet.Append;
    …………………………
    …………………………
    fmCOdsRecord.DataSet.Post;
      
      

  2.   

    很多错误:1.有Append;没有看到post
    2.TRichEdit一行一笔数据,append与post应该放在循环体内
    3.fmCOADOtbMoveUp.Last;保证不了号码不重复,多次添加数据时,要刷新才行
    4.第2次循环后,"隐患编号" 已经取不到最后一个ID了
    5.fmCORhEDDetails7.Lines.Strings[fmCORhEDLine];这句在这里不知做什么用,中括号内必要是数字,
    fmCORhEDLine是什么,没看出来;(第1个错误提示,估计就是出现在这里)
    6.循环变量RhEDLine没有用到,"隐患内容了"一直取的是第1行数据,即Strings[0]
    7.有2个地方对隐患编号重复赋值了
    8.看到2个数据集在操作fmCOdsRecord.DataSet和fmCOdsDetails.DataSet
    ...找本书来看看吧,照着书本的例子先敲上几遍,再实战做项目
      

  3.   

    fmCORhEDLine是变量,Integer类型的
      

  4.   

    1、Post在“保存”按钮里书写了。
    2、领教了,谢谢
    3、4、明白了,谢谢
    5、这句是为了给“隐患内容”字段赋值。该字段在窗体中用的是TRichEdit,TRichEdit的名字是:fmCORhEDDetails7。难道这句是错误的?哪里错了?
    fmCORhEDLine是变量,Integer类型的
    6、这个不会了,怎么才能取到?
    7、不明白是哪2个地方对隐患编号重复赋值了
    8、fmCOdsDetails改为fmCOdsRecord。修改一些文字性的错误:
    procedure TfmCollect.fmCOBtnNew26Click(Sender: TObject);
     Var
      RhEDLine: Integer;
    begin   
     IF fmCOdsRecord.DataSet.State = dsBrowse Then
      begin
      fmCOADOtbMoveUp.Last; //窗体上的第2个TADOTable组件,为了在“新增”时避免“隐患编号”重复(主键)
      fmCOdsRecord.DataSet.Append;
      fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);
      FOR RhEDLine := 0 TO fmCORhEDDetails7.Lines.Count - 1 Do
      begin
      fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger :=  fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1;    fmCOdsRecord.DataSet.FieldByName('检查日期').AsDateTime := fmCODTExamine2.Date;
      fmCOdsRecord.DataSet.FieldByName('被检单位').AsString := fmCOCBoxUnit3.Text;
      fmCOdsRecord.DataSet.FieldByName('负责人').AsString := fmCOCBoxReceived4.Text;
      fmCOdsRecord.DataSet.FieldByName('检查人').AsString := fmCOCBoxRummager5.Text;
      fmCOdsRecord.DataSet.FieldByName('检查单位意见').AsString := fmCOCBoxIdea9.Text;
      fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger := StrToInt(fmCOEDCode1.Text);
      fmCOdsRecord.DataSet.FieldByName('隐患内容').AsString := fmCORhEDDetails7.Lines.Strings[0];
      fmCORhEDDetails7.Lines.Strings[RhEDLine];
      fmCOdsRecord.DataSet.FieldByName('整改措施').AsString :=
      fmCORhEDMeasure8.Lines.Text;
      end;
      end;
    end;
      

  5.   

    保存按钮代码如下:
    procedure TfmCollect.fmCOBtnSave30Click(Sender: TObject);
    begin
      IF fmCOdsRecord.DataSet.State In [dsInsert, dsEdit] Then
      begin
       fmCOdsRecord.DataSet.Post;
      end;
    end;
      

  6.   

    1、另外,当数据表Record为空表(不含一条记录)时,按“隐患录入”按钮,出现错误信息:'' is not a valid integer value.后,Delphi指向代码:
    fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);要想实现在“新增”时避免“隐患编号”重复(主键)的目的,这句应该怎么改?2、我设置的是,只有数据集是“新建”状态,TEDIT、TRichEdit、TComboBOX等组件的Enabeld才为真。将Append这行语句放入循环内后,这些组件的Enabeld仍为假。
      

  7.   


    最后再修改一遍,先睡觉去:1、2、意思我知道了,可是我设置的是,只有数据集是“新建”状态,TEDIT、TRichEdit、TComboBOX等组件的Enabeld才为真。将Append这行语句放入循环内后,这些组件的Enabeld仍为假。点击“隐患录入”按钮,不能做任何操作。
    3、4、是否应该将fmCOADOtbMoveUp.Last;和fmCOEDCode1.Text := IntToStr(* + 1);这两句放入循环内?
    5、6、fmCORhEDLine属文字性错误,应改为:RhEDLine,即Integer类型变量。
    7、不明白哪两个地方对“隐患编号”重复赋值了。
    8、fmCOdsDetails属文字性错误,应改为:fmCOdsRecord。另外,另外,当数据表Record为空表(不含一条记录)时,按“隐患录入”按钮,出现错误信息:'' is not a valid integer value.后,Delphi指向代码:
    fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);要想实现在“新增”时避免“隐患编号”重复(主键)的目的,这句应该怎么改?最后修改文字性错误后,代码如下:procedure TfmCollect.fmCOBtnNew26Click(Sender: TObject);
     Var
      RhEDLine: Integer;
    begin   
     IF fmCOdsRecord.DataSet.State = dsBrowse Then
      begin
      fmCOADOtbMoveUp.Last; //窗体上的第2个TADOTable组件,为了在“新增”时避免“隐患编号”重复(主键)
      fmCOdsRecord.DataSet.Append;
      fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);
      FOR RhEDLine := 0 TO fmCORhEDDetails7.Lines.Count - 1 Do
      begin
      fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger := fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1; 
    fmCOdsRecord.DataSet.FieldByName('检查日期').AsDateTime := fmCODTExamine2.Date;
      fmCOdsRecord.DataSet.FieldByName('被检单位').AsString := fmCOCBoxUnit3.Text;
      fmCOdsRecord.DataSet.FieldByName('负责人').AsString := fmCOCBoxReceived4.Text;
      fmCOdsRecord.DataSet.FieldByName('检查人').AsString := fmCOCBoxRummager5.Text;
      fmCOdsRecord.DataSet.FieldByName('检查单位意见').AsString := fmCOCBoxIdea9.Text;
      fmCOdsRecord.DataSet.FieldByName('隐患编号').AsInteger := StrToInt(fmCOEDCode1.Text);
      fmCOdsRecord.DataSet.FieldByName('隐患内容').AsString := fmCORhEDDetails7.Lines.Strings[0];
      fmCORhEDDetails7.Lines.Strings[RhEDLine];
      fmCOdsRecord.DataSet.FieldByName('整改措施').AsString :=
      fmCORhEDMeasure8.Lines.Text;
      end;
      end;
    end;保存按钮代码如下:
    procedure TfmCollect.fmCOBtnSave30Click(Sender: TObject);
    begin
      IF fmCOdsRecord.DataSet.State In [dsInsert, dsEdit] Then
      begin
      fmCOdsRecord.DataSet.Post;
      end;
    end;我自定义了一个“设置组件状态”的事件,代码如下:procedure TfmCollect.fmCOSetComponentStatus;
    begin
     fmCOEDCode1.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCODTExamine2.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxUnit3.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxReceived4.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxRummager5.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxDeadline6.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCORhEDDetails7.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCORhEDMeasure8.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxIdea9.Enabled := fmCOdsRecord.DataSet.State = dsInsert;
     fmCOCBoxReviewName10.Enabled := fmCOdsRecord.DataSet.State = dsEdit;
     fmCODTReviewDate11.Enabled := fmCOdsRecord.DataSet.State = dsEdit;
     fmCOCBoxReviewStatus12.Enabled := fmCOdsRecord.DataSet.State = dsEdit;
     fmCOCBoxChooseUnit19.Enabled := fmCOdsRecord.DataSet.State = dsBrowse;
     fmCOBtnCollect20.Enabled := fmCOdsRecord.DataSet.State = dsBrowse;
     fmCOBtnCancelFilter21.Enabled := fmCOdsRecord.DataSet.State = dsBrowse;
     fmCOBtnFirst22.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                               (Not fmCOdsRecord.DataSet.Bof);
     fmCOBtnPrior23.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                               (Not fmCOdsRecord.DataSet.Bof);
     fmCOBtnNext24.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                              (Not fmCOdsRecord.DataSet.Eof);
     fmCOBtnLast25.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                              (Not fmCOdsRecord.DataSet.Eof);
     fmCOBtnNew26.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse);
     fmCOBtnEdit27.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                              (Not fmCOdsRecord.DataSet.Bof) Or
                              (Not fmCOdsRecord.DataSet.Eof);
     fmCOBtnDelete28.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse) And
                                (Not fmCOdsRecord.DataSet.Bof) Or
                                (Not fmCOdsRecord.DataSet.Eof);
     fmCOBtnRefresh29.Enabled := (fmCOdsRecord.DataSet.State = dsBrowse);
     fmCOBtnSave30.Enabled := (fmCOdsRecord.DataSet.State in [dsInsert, dsEdit]);
     fmCOBtnCancel31.Enabled := (fmCOdsRecord.DataSet.State in [dsInsert, dsEdit]);
    end;分别在TDataSource的StateChange和AfterScroll事件中调用这个“自定义事件”