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);时确能正常运新
有点疑惑
2. Panel1有ControlCount 也应该有ComponentCount;
3. TFrame1.Create(temp1); Create 方法的参数temp1 应该是说当前创建的这个控件的Parent 是 temp1;
4.说不清了,你自己一点一点理清楚吧!!哈哈
还是释放的问题,当你创建一个Frame的时候,首先产生了一个Frame的变量指针,紧接着在内存中分配了一个Frame的地址空间,而当你释放这个Frame的时候,仅仅释放了内存中分配的地址,但是没有释放Frame这个指针(或者说变量),系统中这个变量还是存在的,不过指向的地址已经被释放了,所以第二次点击的时候,系统发现变量存在就默认为内存空间还存在(而事实上你的Free已经释放掉了),所以才会产生异常的!
一般情况下,建议使用FreeAndNil()来释放手动创建的东东……