为什么会出现“Stack overflow”的异常提示

为什么会出现“Stack overflow”的错误提示?
各位高手,为什么我一按“隐患录入”按钮(即:新建数据表记录),就会出现“Stack overflow”的错误提示?

  我想编一个“隐患录入、汇总”的小程序,以减轻工作压力。但本人属于Delphi没入门的货色,出了错,都不知道错在哪儿,请各位高手指教。

详细介绍如下:

程序中体现到实际工作的数据表共有以下12个字段:

编号 检查日期 被检单位 责任人 检查人 隐患内容 整改措施 整改期限 检查单位意见 复查日期 复查人 复查情况

  在我的实际工作中,分成两步。第一步,每天入井检查到隐患后,点击“隐患录入”按钮,录入新隐患,这一步操作在数据库表中,从编号字段开始,截止到检查单位意见字段结束。第二步,“整改期限”到后,再次入井进行复查(如6月1日检查并进行隐患录入后,若“整改期限”规定为2日,则在6月3日进行复查),这一步操作在数据表中,需要修改“复查日期、复查人、复查情况”三个字段,(第二步在程序中,我将其放在“隐患跟踪”按钮的OnClick事件中,当点击“隐患跟踪”按钮时,数据表成为“修改”状态,只修改这三个字段)。

  同时,由于每日入井检查的隐患,每一个工作地点绝对不会只有一条隐患,并且只要有一条隐患,就绝对有一条整改措施。所以,我想在进行“隐患录入”操作时,数据表保存为:一个编号的记录中,隐患内容和整改措施字段中包含N条内容。其余字段无此种现象。

为实现这一目的,我将数据表中的“隐患内容、整改措施”做为一个从表,其余字段做为一个主表来进行存取。

主表字段:编号 检查日期 被检单位 责任人 检查人 整改期限 检查单位意见 复查日期 复查人 复查情况

从表字段:父编号 编号 内容类型 文本内容。

从表中“父编号”字段与主表中的“编号”字段进行关联。另外,由于是想将“隐患内容、整改措施”两个字段放在从表中,所以建立“内容类型”字段,其为“整数”类型,当其为1时,表示“文本内容”字段中存储的数据是“隐患内容”,当其为2时,表示“文本内容”字段中存储的数据是“整改措施”。

然后,我在“隐患录入”按钮的OnClick事件中输入如下代码:

procedure TfmHiddenRecord.fmHRBtnNew26Click(Sender: TObject);
Var
  HiddenLines, MeasureLines: Integer;
begin
 DMMain.dsHiddenMaster.DataSet.Append;
 fmHRedCode0.Text := IntToStr(DMMain.dsHiddenMaster.DataSet.RecordCount + 1);
 DMMain.dsHiddenMaster.DataSet.FieldByName('隐患编号').AsInteger := DMMain.dsHiddenMaster.DataSet.RecordCount + 1;
 DMMain.dsHiddenMaster.DataSet.FieldByName('检查日期').AsDateTime := fmHRdtExamine1.Date;
 DMMain.dsHiddenMaster.DataSet.FieldByName('被检单位').AsString := fmHRcboxUnit2.Text;
 DMMain.dsHiddenMaster.DataSet.FieldByName('负责人').AsString := fmHRcboxReceived3.Text;
 DMMain.dsHiddenMaster.DataSet.FieldByName('检查人').AsString := fmHRcboxRummager4.Text;
 DMMain.dsHiddenMaster.DataSet.FieldByName('整改期限').AsInteger := StrToInt(fmHRcboxDeadline5.Text);
 DMMain.dsHiddenMaster.DataSet.FieldByName('检查单位意见').AsString := fmHRedIdea6.Text;
 For HiddenLines := 0 To fmHRreDetails7.Lines.Count - 1 Do
  begin
  DMMain.dsHiddenDetails.DataSet.Append;
  DMMain.dsHiddenDetails.DataSet.FieldByName('父编号').AsInteger := DMMain.dsHiddenMaster.DataSet.FieldByName('隐患编号').AsInteger;
  DMMain.dsHiddenDetails.DataSet.FieldByName('编号').AsInteger := DMMain.dsHiddenMaster.DataSet.FieldByName('隐患编号').AsInteger + StrToInt('-1');
  DMMain.dsHiddenDetails.DataSet.FieldByName('内容类型').AsInteger := 1;
  DMMain.dsHiddenDetails.DataSet.FieldByName('文本内容').AsString := fmHRreDetails7.Lines.Strings[HiddenLines];
  end;
 For MeasureLines := 0 To fmHRreMeasure8.Lines.Count - 1 Do
  begin
  DMMain.dsHiddenDetails.DataSet.FieldByName('内容类型').AsInteger := 2;
  DMMain.dsHiddenDetails.DataSet.FieldByName('文本内容').AsString := fmHRreMeasure8.Lines.Strings[MeasureLines];
  end;
end;

以上代码中,fmHiddenRecord是窗体名称。

fmHRBtnNew26是“隐患录入”按钮名称。

DMMain是TDataMoudal的名称。

dsHiddenDetails是从表的TDataSource组件,dsHiddenMaster是主表的TDataSource组件。

fmHRedCode0指的是主表中的编号,是TEdit组件。在每次新建记录时,将其自动+1,从而避免主表中的主键——“编号”字段重复。

但是在运行时,却出现“Stack overflow”的错误提示。我不知道哪里出错了。

请各位高手帮我看看,并多多指教。我的QQ:593601458 E-mail:rxf2006xz@163.com

另外,本人欲拜一高手为师,若有愿意当我师傅的,请加我QQ。


------解决方案--------------------
这些代码只是一些字段赋值
设断点,用F7单步执行,看看是到那一句错误