我正在使用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;
答案 0 :(得分:3)
您需要替换
for Kounter := 1 to Kontrolz do
与
for Kounter := 0 to Kontrolz-1 do
因为Controls
数组是从零开始的。
例如,如果有三个控件,则会将其编入索引0, 1, 2
而不是1, 2, 3
。