为啥控件有漏网的没有被释放掉(Free)?
本帖最后由 冥界3大法王 于 2023-11-20 11:21 编辑procedure TForm7.Button3Click(Sender: TObject);
var
i, count: Integer;
comboBox: TComboBox;
begin
Randomize;
count := Random(10); // 随机生成10之间的数字
//label1.Caption := '随机生成的数为:' + count.ToString;
count := StrToInt(Edit1.Text); //这里重新赋值了来模拟实际得到需要生成的数量的情况(往上数3行随机生成的可以pass掉)
label1.Caption := count.ToString;
for i := 1 to count do
begin
comboBox := TComboBox.Create(Self); //根据程序上下文的count来动态生成ComboBox
comboBox.Parent := Panel1;
comboBox.Left := 10;
comboBox.Top := i * 50; // 控件顶部间距为50
comboBox.Items.Add('Item 1');
comboBox.Items.Add('Item 2');
comboBox.Items.Add('Item 3');
comboBox.Name := 'CC' + IntToStr(i); //这里已然按2位所说加了,还有代号为TAG的不会表达
// 添加更多的选项...
// 可以在这里设置其他ComboBox的属性,如宽度、高度、颜色等
comboBox.Show;
end;
end;
procedure TForm7.再来一个哟Click(Sender: TObject);
var
i, 计数: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if Components is TComboBox then
begin
计数 := 计数 + 1;
ShowMessage('是的!我是!入库!' + 计数.ToString);
//ComboBox+N free掉!
Components.Free; ===>>>看这里!为啥ComboBox被 ComboBox1 ComboBox3ComboBox5这样一个个被释放掉?漏网之鱼如何解决?
end
else
begin
ShowMessage('我不是!滚蛋');
end;
end;
ShowMessage('名为"CC+X"的ComboBox的总数是:' + 计数.ToString);
end;
@lies2014
@DEATHTOUCH
要考虑控件的释放最好还是自己维护一个列表,比如整一个TList<TComboBox>来处理。 DEATHTOUCH 发表于 2023-11-20 13:12
要考虑控件的释放最好还是自己维护一个列表,比如整一个TList来处理。
@DEATHTOUCH不会弄啊,帮助我修改下那行,能成立就成
CB不是问题啊。 不明白
procedure TForm7.有残疾的Click(Sender: TObject);
var
i, 计数: Integer;
begin
计数 := 0;
for i := 0 to ComponentCount - 1 do
begin
if Components is TComboBox then
begin
计数 := 计数 + 1;
ShowMessage(Components.Name); //为啥这个依次得到的就对呢?
//Components.Free; //为啥这里释放时是就有遗漏呢?
end;
end;
ShowMessage('ComboBox总数是:' + 计数.ToString);
end; 冥界3大法王 发表于 2023-11-20 14:34
不明白
procedure TForm7.有残疾的Click(Sender: TObject);
遗留是因为你用for循环遍历components,但是你调用了free之后会自动删除,components里面的就少了,不能完全遍历了。
可以用for downto倒着遍历。或者就是我之前说的创建一个列表自己来维护控件。 本帖最后由 lies2014 于 2023-11-20 15:34 编辑
for i := 0 to ComponentCount - 1 do
改为
for i := ComponentCount - 1 downto 0 do
你顺序释放的话,比如删了序号5,原来的6就变成了5,那么这个原来的6在下一个循环就不会删除
二是最终肯定会异常,因为只要删除了控件,最后的序号一定会超范围 DEATHTOUCH 发表于 2023-11-20 15:16
遗留是因为你用for循环遍历components,但是你调用了free之后会自动删除,components里面的就少了,不能 ...
@DEATHTOUCH
我要的效果是动态生成ComboBox
然后加载程序的参数/函数 到下拉列表中
然后再释放掉,再动态生成
软件的功能实现集代码生成、笔记总结、各类型文件打开、格式转换、查看、归档、查询、翻译。
反正方便一体化火速与编程代码实现的。。。统统努力整合进去。
页:
[1]