先看代码:
动态创建TImage:
DymicImg := TImage.Create(PanelPreview);//n个……
然后删除:
procedure TForm1.DelImg;
var
  i:integer;
  ChildComponent: TComponent;
begin
  for i := 0 to PanelPreview.ComponentCount - 1 do
  begin
    ChildComponent := PanelPreview.Components[i];
    if PanelPreview.Components[i] is TImage then
    begin
      try
        (PanelPreview.Components[i] as TImage).Free;
      except
      end;
    end;
  end;
end;报错:out bound of list(1),只能删除Components[0]郁闷了3小时后,偶然把:
for i := 0 to PanelPreview.ComponentCount - 1 do
换成:
for i := PanelPreview.ComponentCount - 1 downto 0 do
居然正常了!!!
大家有这样的情况吗?我用的D7

解决方案 »

  1.   

    for i := 0 to PanelPreview.ComponentCount - 1 do注意这行
    你每删除一行,Count就会变化的~~~
      

  2.   

    其实可能我还说错了点
    第一次循环删除[0],那么原来的[1]就变成了[0],[2]变成了[1],到最后,你删除得越多,实际的COUT与刚开始的差别就越多,这个时候,当变量超出现有的COUNT时,就会报错了。
      

  3.   

    啊,因为Owner是PanelPreview,还不如把PanelPreview干掉,然后在创建PanelPreview.
      

  4.   

    这种低级错误也敢发出来,真是搞笑-------------------------------------------------------
    本回复由大傻的破玩意儿【CSDN's forum Explorer】完成!
    大傻的破玩意儿,今天你用了木有 !!
    软件功能强大,速度超快!!支持中...
    软件下载地址:http://CoolSlob.ys168.com
      

  5.   

    1 建议 PanelPreview.ComponentCount - 1 用一个变量代替2 删除列表的时候,如果要用for循环删除多个,则要从最后一个开始,倒着删除。3 用while 循环删除
      

  6.   

    xzhifei(饭桶超人(最讨厌两种人,一种是有种族歧视的人,一种是日本人!))
    这种低级错误也敢发出来,真是搞笑
    --------------------
    你的错误都高级?切……,你要说你小时没用过尿片我就信你
      

  7.   

    一般象LISTBOX类似的都是从最后个开始删除,你这里也一样
      

  8.   

    这个故事告诉我们:以后遇到问题多检查自己的代码,不要动不动怀疑有BUG