我在Delphi6过程中有这个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,这样我就可以关注结果了。
现在问题的症结是循环的控制变量没有正确初始化。index和JIndex都应该从1开始(跳过数组的前缘,它包含标题,而不是数据)。然而,我得到的是Index和Jindex在IEND和JEND从一开始。
我尝试注释掉整个块,只保留循环;我甚至注释掉了obj声明,以防这可能会影响循环。什么都没变。我仍然有错误的循环初始化。
以前有没有人见过这个?在我40年的编程生涯中,这是我第一次看到这样的事情,我也遇到过for循环错误!
由于缺乏解决方案,我用下面的代码替换了for循环,它是有效的:
procedure TNumbers.CleanTable(Sender:TObject);
var
Index: integer;
JIndex: integer;
IEND, JEND: integer;
Obj: TObject;
begin
IEND := length(Correspondence);
JEND := length(Correspondence[0]);
Index := 1;
while Index < IEND do
begin
JIndex := 1;
while JIndex < JEND 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;
inc(JIndex);
end; // JIndex while end
inc(Index);
end; // IIndex while end
end;如果我不能相信编译器有这么简单的循环系统,我就麻烦大了。
对于原因有什么建议吗?
发布于 2018-03-19 18:50:20
你确实把你的索引搞糊涂了。由于对于Index=0迭代只计算一次,因此JIndex显然是不正确的。
不要使用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;现在代码的可读性更强了。
https://stackoverflow.com/questions/49355952
复制相似问题