开发所用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. 此集合已经采用方案 http 的地址。此集合中每个方案中最多只能包含一个地址。

    错误信息:此集合已经采用方案 http 的地址.此集合中每个方案中最多只能包含一个地址.如果服务承载于 IIS 中,则可以通过将“system.serviceModel/serviceHostingE ...

  2. [LeetCode#12] Roman to Integer

    Problem: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range ...

  3. decodeURIComponent

    var s = '%%' try { s = decodeURIComponent(s) } catch(e) { console.log(e) } console.log(s)

  4. android逐行读取文件内容以及保存为文件

    用于长时间使用的apk,并且有规律性的数据 1,逐行读取文件内容 //首先定义一个数据类型,用于保存读取文件的内容 class WeightRecord { String timestamp; flo ...

  5. Digital Root - SGU 118(高精度运算)

    题目大意:有K组测试数据,然后每组有N个正整数,A1,A2,A3.....An,求出 A1 + A1*A2 + A1*A2*A3 + .......A1*A2*...An 的数根. 分析:有个对9取余 ...

  6. hdoj 1969 Pie【二分】

    Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. JQuery EasyUI之DataGrid列名和数据列分别设置不同对齐方式(转)

    需求如下 现有数据列三列 Name,Age,CreateDate 数据 张三,18,2000-12-09 :12:34:56 李四,28,2000-12-09 :12:34:56 王麻子,38,200 ...

  8. 趣解curl

    Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...

  9. 【设计模式 - 3】之建造者模式(Builder)

    1      模式简介 建造者模式也叫生成器模式,和抽象工厂模式相似,也是一种构建复杂对象的模式. 建造者模式中的角色分类: 抽象建造者Builder:接口类型,用于规范各个产品的组成部分: 具体建造 ...

  10. 【设计模式 - 16】之迭代器模式(Iterator)

    1      模式简介 迭代器模式是JAVA中非常常用的模式,List.Map.Set等常见集合中都封装了迭代器Iterator. 迭代器模式的介绍: 迭代器模式用于顺序访问集合对象中的元素,而不需要 ...