控件的创建(我觉得有意思!!)(100分)

  • 主题发起人 主题发起人 张剑波
  • 开始时间 开始时间

张剑波

Unregistered / Unconfirmed
GUEST, unregistred user!
在主窗体form1上动态创建panel,接着在panel上动态创建若干个button
这个创建过程是可以连续进行的,主窗体可以控制创建button的个数。
比如第一次创建5个button,第二次创建2个button,现在的问题是:
第二次创建2个button后,第一次创建的5个button并没有free
,第二次创建的panel上只有2个button,那么其余的button那里去了。

我的猜想:panel是容器控件,被创建后占了一块内存,再创建的button
也在这块内存中,再次创建后,这块内存被覆盖了。再猜想:应用程序结束
时释放资源时,只释放panel和当前的button就行了,管它以前创建了几万个
button
请大家指正,谢!
 
我...
好象没懂你的意思;(
 
>>应用程序结束
时释放资源时,只释放panel和当前的button就行了,管它以前创建了几万个
button

不对,应用程序结束的时候,所有由它申请的资源都会释放,不管你的能不能找到它,
包括用GetMem取的内存。

>>再次创建后,这块内存被覆盖了
不可能的,你前面的Button没释放,它会一直占住内存中的某个地方,
新建的Button不会在一块已经被占用的内存上建立的,放心好了。

为什么前面5个不见了的话,不敢确定。不过有一点提醒的是:
button创建之后,要使 button.parent := panel
 
要看你怎么样创建的了。
每次你创建一个按钮,系统都会分配一块内存,不过只要你写明了它的容器,就可以不用显
式地Free它了,窗口会自动在自己的控件列表中加入计数,结束时会去管理手下人的“死活”的。
如下,窗口会自动地Free这个按钮。
...
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
不过你要是这样写:
MyButton := TButton.Create(nil); //这里Self指的是Form1
MyButton.Parent := Form1;
那么你就得在程序结束的某个地方写上MyButton.Free

同理,就你程序里的问题,如果你这样写
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
系统只会显示一个按钮,第一块内存将会由窗口自动清除。

如果这样写,第一块内存就不能回收了。
MyButton := TButton.Create(nil); //这里Self指的是Form1
MyButton.Parent := Form1;
MyButton := TButton.Create(nil); //这里Self指的是Form1
MyButton.Parent := Form1;




 
没有发现你说的情况啊!
 
to 吕雪松:
同理,就你程序里的问题,如果你这样写
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
系统只会显示一个按钮,第一块内存将会由窗口自动清除。

上面这段话你了没有?不会被清除的。不信你试试如下代码看是一个还是两个:
var
MyButton : TButton;
begin
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
MyButton := TButton.Create(Self); //这里Self指的是Form1
MyButton.Parent := Form1;
MyButton.Top := 100;
end;
 
我是这样写的:
MyButton := TButton.Create(panel)
 
是不是新创建的控钮把原来的覆盖住了,你才看不见的?
 
应该搞清楚owner和parent的含义
 
多人接受答案了。
 
后退
顶部