开发所用delphi版本是xe2,效果图如下:

代码如下:

-----------------------------------------------------------------------------------------------------------------

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.

Delphi动态创建组件,并释放内存的更多相关文章

  1. Delphi 动态创建组件,单个创建、单个销毁

    效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 pro ...

  2. Angular动态创建组件之Portals

    这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...

  3. Vue动态创建组件方法

    组件写好之后有的时候需要动态创建组件.例如: 编辑文章页面,正文是一个富文本编辑器,富文本编辑器是一个第三方的组件,点击添加章节的时候需要动态的创建一个富文本编辑器这个时候怎么处理呢. 富文本编辑器也 ...

  4. 动态创建组件TEdit

    //动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftSt ...

  5. angular4 动态创建组件 vs 动态创建模板

    实现  模拟场景:页面上"帮助"按钮的点击触发帮助文档的弹出框,且每个页面的帮助文档不一样 因此弹出框里的帮助文档是一个动态模板而不是动态组件 以下comp均代表Type类型的动态 ...

  6. DELPHI 动态 创建和释放 多个 EDIT 控件

    unit Unit1;   interface   uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...

  7. OAF 动态创建组件以及动态绑定属性

    在开发中,我们遇到以下一个需求. 一个表格左侧有5列是固定存在的,右侧有N列是动态生成的,并且该N列中第一列可输入,第二列是不可编辑的,但是是数字,如果小于0,那么就要显示为红色,重点标识出来. 首先 ...

  8. ExtJS动态创建组件

    J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...

  9. Delphi动态创建菜单

    在程序运行中动态创建菜单,主要使用TMeunItem类,所有菜单的条目都是TMenuItem的一个实例. 打开Delphi7集成开发环境,在默认新建工程里,放置一个Button1按钮和MainMenu ...

随机推荐

  1. java学习面向对象之父子构造函数初始化

    在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...

  2. REST client 基于浏览器的测试工具

    以前在开发webservice服务,都是自己基于HTTP协议,自己写一个测试程序来进行测试,最近在研究RestFul,对以前webservice服务进行了重构,总结了不少经验,今天就给大家介绍下几款R ...

  3. Linux学习笔记29——IPC状态命令

    一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...

  4. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery 解决方法

    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使 ...

  5. 用Objective-C的Category特性添加类的属性

    http://www.cnblogs.com/wupher/archive/2013/01/05/2845338.html Category是Objective-C中常用的语法特性,通过它可以很方便的 ...

  6. 像素,分辨率,PPI(像素密度),BPP 扫盲

    像素于分辨率 像素,又称画素,为图像显示的基本单位,译自英文“pixel”,pix是英语单词picture的常用简写,加上英语单词“元素”element,就得到pixel,故“像素”表示“图像元素”之 ...

  7. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  8. Myeclipse Professional 2014使用软件获取激活码的方法(声明:破解仅仅是为个人使用Myeclipse,不作为商业获利.商业活动请购买正版软件)

    一下说明全部为网络来源,已经忘了原地址了,一直保留的是获取激活码用的软件和说明, 原著看见可联系(非常谢谢原作者): 获取激活码用的软件下载地址(个人百度云):http://pan.baidu.com ...

  9. ecshop获取url_domain

    <?php function url_domain() { $curr = strpos($_SERVER['PHP_SELF'], '/') !== false ? preg_replace( ...

  10. html或jsp实现打印三种方法

    1.使用window.print()方法 优点:支持多浏览器 缺点:取消打印,隐藏打印不必要的信息后再显示比较麻烦 如下实现,可以打印当前页面 <input name ="Button ...