迭代面板控件会导致索引超出范围错误。为什么?

时间:2014-04-06 12:56:01

标签: delphi loops indexing controls

我正在使用Delphi 7(是的,我听到了狂笑)。我有一个标签式笔记本,我希望某些控件只出现在先前控件正确完成的序列中。对于笔记本中的每个页面,我都有一个命名表。对于该工作表上的控件,我使用tag属性来确定它们是否在每一步都可见。一些步骤导致一个新控件显示,一些步骤有多达五个控件弹出视图。我想简单地遍历视图中任何标签页上的控件,并关闭任何标签大于当前步长值的标签。在相关页面上,总共有23个控件,一些标签始终在视图中,一些编辑字段弹出视图,一些箭头形按钮用于在新弹出的字段发生变化时前进。看似简单,除了我不断生成索引超出范围错误。该序列将关闭,并显示EurekaLog的详细错误消息,而不是应该打开的任何东西。我终于解决了#39;通过插入检查我知道的控件的NAME的问题是列表中的最后一个并在此时退出循环。我还为Kounter.tag添加了额外的测试<>零,以避免在某些路由中保留提交和取消按钮。为什么Kounter在23岁之前保持这种想法?

procedure TFrmMain.VizToggleWTP;
var
  kounter: Integer;
  kontrol: TControl;
  Kontrolz: Integer;
begin
  Kontrolz := sheetPrintouts.ControlCount;
  for Kounter := 1 to Kontrolz
  do begin
    // To avoid index error, check for the Cancel Button and exit at that point
    if sheetPrintouts.Controls[kounter].Name = 'BtnCancelwtp'
      then Break;
    if (sheetPrintouts.Controls[Kounter]) is TNXEdit
      then begin
        kontrol := TNXEdit(sheetPrintouts.Controls[Kounter]);
        kontrol.visible := (kontrol.Tag <= wtpStep);
        end;
    if (sheetPrintouts.Controls[Kounter]) is TJvShapedButton
      then begin
        kontrol := TJvShapedButton(sheetPrintouts.Controls[Kounter]);
        kontrol.visible := ((kontrol.Tag <= wtpStep) and (kontrol.Tag <> 0));
        end;
    end;
end;

1 个答案:

答案 0 :(得分:3)

您需要替换

for Kounter := 1 to Kontrolz do

for Kounter := 0 to Kontrolz-1 do

因为Controls数组是从零开始的。

例如,如果有三个控件,则会将其编入索引0, 1, 2而不是1, 2, 3