冥界3大法王 发表于 2023-11-20 11:15

为啥控件有漏网的没有被释放掉(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

DEATHTOUCH 发表于 2023-11-20 13:12

要考虑控件的释放最好还是自己维护一个列表,比如整一个TList<TComboBox>来处理。

冥界3大法王 发表于 2023-11-20 13:37

DEATHTOUCH 发表于 2023-11-20 13:12
要考虑控件的释放最好还是自己维护一个列表,比如整一个TList来处理。

@DEATHTOUCH不会弄啊,帮助我修改下那行,能成立就成
CB不是问题啊。

冥界3大法王 发表于 2023-11-20 14:34

不明白

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;

DEATHTOUCH 发表于 2023-11-20 15:16

冥界3大法王 发表于 2023-11-20 14:34
不明白

procedure TForm7.有残疾的Click(Sender: TObject);


遗留是因为你用for循环遍历components,但是你调用了free之后会自动删除,components里面的就少了,不能完全遍历了。
可以用for downto倒着遍历。或者就是我之前说的创建一个列表自己来维护控件。

lies2014 发表于 2023-11-20 15:31

本帖最后由 lies2014 于 2023-11-20 15:34 编辑

for i := 0 to ComponentCount - 1 do
改为
for i := ComponentCount - 1 downto 0 do

你顺序释放的话,比如删了序号5,原来的6就变成了5,那么这个原来的6在下一个循环就不会删除
二是最终肯定会异常,因为只要删除了控件,最后的序号一定会超范围

冥界3大法王 发表于 2023-11-20 18:22

DEATHTOUCH 发表于 2023-11-20 15:16
遗留是因为你用for循环遍历components,但是你调用了free之后会自动删除,components里面的就少了,不能 ...

@DEATHTOUCH
我要的效果是动态生成ComboBox
然后加载程序的参数/函数 到下拉列表中
然后再释放掉,再动态生成

软件的功能实现集代码生成、笔记总结、各类型文件打开、格式转换、查看、归档、查询、翻译。
反正方便一体化火速与编程代码实现的。。。统统努力整合进去。
页: [1]
查看完整版本: 为啥控件有漏网的没有被释放掉(Free)?