TForm1 = class(TForm)
    Panel1: TPanel;
    Splitter1: TSplitter;
    Panel2: TPanel;
    Splitter2: TSplitter;
    Panel3: TPanel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    procedure N11Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
  private
    { Private declarations }
    LeftFrame:TFrame;
    CenterFrame:TFrame;
    RightFrame:TFrame;
  public
    { Public declarations }
  end;procedure TForm1.N11Click(Sender: TObject);
var
  I:integer;
begin  for I:=0 to Panel1.ControlCount -1 do
  begin
    if (Panel1.Components[I] is TFrame) then  
                        //当第二次单击此菜单项时,产生异常List index bouds(0)异常
      (Panel1.Components[I] as TFrame).Free;
  end;
  LeftFrame:=TFrame1.Create(nil);
  LeftFrame.Parent:=Panel1;
  LeftFrame.Align:=alClient;end;当第二次单击菜单项时
跟踪时 Panel1.ControlCount的值为1
但使用Panel1.Components[I]为何会产生异产?
当把此句改为LeftFrame:=TFrame1.Create(nil);
LeftFrame:=TFrame1.Create(Panel1);时确能正常运新
有点疑惑

解决方案 »

  1.   

    1. 当你把LeftFrame:=TFrame1.Create(nil); 改为LeftFrame:=TFrame1.Create(Panel1);后,你再看看Panel1.ControlCount的值?
    2. Panel1有ControlCount  也应该有ComponentCount;
    3. TFrame1.Create(temp1);  Create 方法的参数temp1 应该是说当前创建的这个控件的Parent 是 temp1;
    4.说不清了,你自己一点一点理清楚吧!!哈哈
      

  2.   

    偶认为:
    还是释放的问题,当你创建一个Frame的时候,首先产生了一个Frame的变量指针,紧接着在内存中分配了一个Frame的地址空间,而当你释放这个Frame的时候,仅仅释放了内存中分配的地址,但是没有释放Frame这个指针(或者说变量),系统中这个变量还是存在的,不过指向的地址已经被释放了,所以第二次点击的时候,系统发现变量存在就默认为内存空间还存在(而事实上你的Free已经释放掉了),所以才会产生异常的!
    一般情况下,建议使用FreeAndNil()来释放手动创建的东东……