首页 > 系统相关 >Delphi动态创建组件,并释放内存

Delphi动态创建组件,并释放内存

时间:2023-03-23 12:36:28浏览次数:46  
标签:begin end Delphi Vcl 动态创建 内存 Integer Panel1 Memo1

unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    function getmaxval(myarray: array of Integer):Integer;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
var
  rec: Integer = 0;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,m,n,p:Integer;
  edt: TEdit;
  arr: array of Integer;
begin
  Inc(rec);  //按钮点击次数
  m := 0;
  n := 0;
  p := 0;
  Memo1.Clear;
  for i := 0 to Panel1.ControlCount - 1 do
  begin
    if Panel1.Controls[i] is TEdit then
    inc(m);  //记录edit个数
  end;
  SetLength(arr,m);
  Memo1.Lines.Add('创建组件前的记录:' + #13#10 + '--------------------------');
  Memo1.Lines.Add('Edit组件个数:' + IntToStr(m) + #13#10 + '--------------------------');
  for j := 0 to Panel1.ControlCount - 1 do
  begin
    if Panel1.Controls[j] is TEdit then
    begin
      if n <= m then
      begin
        arr[n] := TEdit(Panel1.Controls[j]).Top;
        Memo1.Lines.Add('Edit' + IntToStr(n + 1) + '的Top值:' + IntToStr(arr[n]));
        Inc(n);
      end else Break;
    end;
  end;
  p := getmaxval(arr); //记录panel里最下面的edit的top值
  Memo1.Lines.Add('最大Top值:' + inttostr(p));
  //动态创建Edit
  //TEdit.Create(),参数是一个AOwner: TComponent,只要是窗体上的组件都可以,
  //但必须要在创建后重新指明父组件的名称,否则没法显示
  edt := TEdit.Create(Panel1);  //指明了owner,可以不释放内存,窗口关闭时由父组件销毁
  edt.Parent := Panel1;
  edt.Left := Edit1.Left;
  edt.Top := p + Edit1.Height + 3;
  edt.Width := Edit1.Width;
  edt.Height := Edit1.Height;
  edt.Text := 'Edit' + IntToStr(rec + 1);
  edt.Show;
end;
 
procedure TForm1.Button2Click(Sender: TObject);  //释放内存,并初始化
var
  i,j,m:Integer;
  edts: array of TEdit;
begin
  j := 0;  //数组edts的键[key]
  SetLength(edts,rec + 1);  //button1次数 + 原有的edit1
  for i := 0 to Panel1.ControlCount - 1 do
  begin
    if Panel1.Controls[i] is TEdit then
    begin
      edts[j] := TEdit(Panel1.Controls[i]);
      Inc(j);
    end;
  end;
  for m := Length(edts) downto 1 do  //edit1不释放,注意此处的downto,根据栈后进先出原则,否则会报错
  begin
    try
      edts[m].Free;
      rec := 0;
      Memo1.Clear;
    except
      //ShowMessage('释放动态创建组件的内存失败!');
    end;
  end;
end;
 
function TForm1.getmaxval(myarray: array of Integer):Integer;  //遍历数组取得最大值
var
  i,max:Integer;
begin
  max := myarray[0];
  for i := 1 to Length(myarray) - 1 do
  begin
    if myarray[i] >= max then
    max := myarray[i];
  end;
  Result := max;
end;
 
end.

 

标签:begin,end,Delphi,Vcl,动态创建,内存,Integer,Panel1,Memo1
From: https://www.cnblogs.com/sixty-five/p/17247006.html

相关文章

  • 内存管理
    内存的基础知识绝对装入(静态装入)由编译器(此时还没有OS)把物理地址计算好。只适用于单道程序环境,可以由编译器来决定物理地址,也可以由程序员在汇编代码中直接给出。......
  • 决战圣地玛丽乔亚Day39 -----GC、内存模型、类加载
    内存模型:java内存模型定义了JVM虚拟机如何与计算机的内存进行交互。java内存模型把内存划分为两部分:主内存和工作内存。主内存共享,工作内存线程私有。java内存模型的实现......
  • 使用 go tool pprof 跟踪优化 cpu 和 内存
    搜了一些文章来看实在是没有重点,自己归纳一下。其实直接看文档已经比较清楚但是文档部分似乎没有一些介绍如何看火焰图之类的细节,这里一并归纳总结一下。 收集性能数......
  • 数据在内存中的存储---浮点型
    数据在内存中,有intshortchar等等---他们在limit.h中定义而doublefloatlongdouble在float.h中定义  IEEE  S(符号位)E(指数) M(有效数字)      ......
  • 服务器sel日志结合mcelog分析故障主要针对CPU以及内存
    两个CPU平台介绍:Grantley以及Purley建议装最新的mcelog工具到系统下,mcelog-help查看支持的平台两个关键要素:1.CPU位置和BANK位置可以使用命令:cat/proc/cpuinfo|......
  • jenkins jvm内存调整以及一些说明
    jenkins调整jvm内存有几个配置地方,比如通过/etc/sysconfig/jenkins以及通过直接修改systemd的服务定义(以centos来说)systemd配置/usr/lib/systemd/system/jenkins.s......
  • Redis内存碎片和Pipeline管道
    本文已收录至Github,推荐阅读......
  • (一)内存扫描器(面向过程版)
    以下是一个基于C语言和Win32API的内存扫描器的实现代码首先定义一个结构体MEMBLOCK,用来存储内存块的信息点击查看代码typedefstruct_MEMBLOCK{ HANDLEhProcess;/......
  • delphi 保存FontDialog设置到ini文件
    public{Publicdeclarations}procedureSetIniFile(Strtitle,StrName:String;FileName:String);functionReadIniFile(Strtitle,StrName:String):......
  • 记一次线上OOM内存溢出的排查历程
    #环境准备1.内存泄露文件注:在运行java项目的时候,添加参数,当内存溢出的时候可以生成hprof二进制文件,这个可以百度下java_pid200378.hprof2.内存泄露分析工具eclipsememor......