吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 440|回复: 6
收起左侧

[求助] 为啥控件有漏网的没有被释放掉(Free)?

[复制链接]
冥界3大法王 发表于 2023-11-20 11:15
本帖最后由 冥界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   ComboBox3  ComboBox5这样一个个被释放掉?漏网之鱼如何解决?
    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[i] is TComboBox then
    begin
      计数 := 计数 + 1;
      ShowMessage(Components[i].Name); //为啥这个依次得到的就对呢?
     //Components[i].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在下一个循环就不会删除
二是最终肯定会异常,因为只要删除了控件,最后的序号一定会超范围

免费评分

参与人数 1吾爱币 +4 热心值 +1 收起 理由
冥界3大法王 + 4 + 1 谢谢@Thanks!

查看全部评分

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

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

软件的功能实现集代码生成、笔记总结、各类型文件打开、格式转换、查看、归档、查询、翻译。
反正方便一体化火速与编程代码实现的。。。统统努力整合进去。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-1 12:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表