我在Delphi 6程序中有这个order
循环对:
Event
我添加了for
和procedure TNumbers.CleanTable(Sender: TObject);
var
Index: integer;
JIndex: integer;
IEND, JEND: integer;
Obj: TObject;
begin
IEND := length(Correspondence);
JEND := length(Correspondence[0]);
for Index := 1 to IEND-1 do
begin
for JIndex := 1 to JEND -1 do
begin
obj := SearchForTagID(Correspondence[Index,JIndex], Sender);
if obj = nil then continue;
if obj is TComponent then
begin
if TComponent(Obj).Tag = Correspondence[Index, JIndex] then
// make sure search was successful
begin
VoidCaption(obj);
end;
end;
end;
end;
end;
变量,而不是直接调用IEND
,因此我可以关注结果。
现在问题的症结在于循环的控制变量未正确初始化。 JEnd
和length
都应该从1开始(跳过数组的前沿,包含标题,而不是数据)。但是,我从index
和JIndex
开始就是Index
和Jindex
。
我尝试评论整个块,只保留循环;我甚至评论了IEND
声明,以防可能影响循环。没有改变。我仍然有错误的循环初始化。
有没有人见过这个?在我40年的编程中,这是我第一次看到这样的东西,并且我公平地分享了JEND
循环错误!
由于缺少解决方案,我使用此代码替换了obj
循环,该代码有效:
for
如果我不能用这么简单的循环系统来信任编译器,那我就陷入了深深的麻烦。
有关原因的任何建议吗?
答案 0 :(得分:0)
您确实对索引感到困惑。 JIndex
明显不正确,因为Index=0
次迭代只计算一次。
不要使用while
,而是使用两个嵌套for
循环:
procedure TNumbers.CleanTable(Sender:TObject);
var
i, j: integer;
obj: TObject;
begin
for i := 0 to high(Correspondence) do
for j := 0 to high(Correspondence[i]) do begin
obj := SearchForTagID(Correspondence[i,j], Sender);
if (obj <> nil) and (obj is TComponent) then
if TComponent(Obj).Tag = Correspondence[i,j] then
// make sure search was successful
VoidCaption(obj);
end;
end;
现在代码更具可重复性。