大家好,我想用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水平属于没入门水平,平时由于工作繁忙也没时间去系统的学习。由于工作需要,这是我的第一个程序,可能数据库表的建立、组件命名、代码编写规则等存在一些问题,请各位高手帮我检查、指教,本人不胜感激。
由于某些隐患字数少,在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水平属于没入门水平,平时由于工作繁忙也没时间去系统的学习。由于工作需要,这是我的第一个程序,可能数据库表的建立、组件命名、代码编写规则等存在一些问题,请各位高手帮我检查、指教,本人不胜感激。
fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);
fmCOdsRecord.DataSet.Append;
…………………………
…………………………
fmCOdsRecord.DataSet.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
...找本书来看看吧,照着书本的例子先敲上几遍,再实战做项目
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;
procedure TfmCollect.fmCOBtnSave30Click(Sender: TObject);
begin
IF fmCOdsRecord.DataSet.State In [dsInsert, dsEdit] Then
begin
fmCOdsRecord.DataSet.Post;
end;
end;
fmCOEDCode1.Text := IntToStr(fmCOADOtbMoveUp.FieldByName('隐患编号').AsInteger + 1);要想实现在“新增”时避免“隐患编号”重复(主键)的目的,这句应该怎么改?2、我设置的是,只有数据集是“新建”状态,TEDIT、TRichEdit、TComboBOX等组件的Enabeld才为真。将Append这行语句放入循环内后,这些组件的Enabeld仍为假。
最后再修改一遍,先睡觉去: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事件中调用这个“自定义事件”