Delphi动态创建组件,并释放内存
开发所用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动态创建组件,并释放内存的更多相关文章
- Delphi 动态创建组件,单个创建、单个销毁
效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 pro ...
- Angular动态创建组件之Portals
这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...
- Vue动态创建组件方法
组件写好之后有的时候需要动态创建组件.例如: 编辑文章页面,正文是一个富文本编辑器,富文本编辑器是一个第三方的组件,点击添加章节的时候需要动态的创建一个富文本编辑器这个时候怎么处理呢. 富文本编辑器也 ...
- 动态创建组件TEdit
//动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftSt ...
- angular4 动态创建组件 vs 动态创建模板
实现 模拟场景:页面上"帮助"按钮的点击触发帮助文档的弹出框,且每个页面的帮助文档不一样 因此弹出框里的帮助文档是一个动态模板而不是动态组件 以下comp均代表Type类型的动态 ...
- DELPHI 动态 创建和释放 多个 EDIT 控件
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...
- OAF 动态创建组件以及动态绑定属性
在开发中,我们遇到以下一个需求. 一个表格左侧有5列是固定存在的,右侧有N列是动态生成的,并且该N列中第一列可输入,第二列是不可编辑的,但是是数字,如果小于0,那么就要显示为红色,重点标识出来. 首先 ...
- ExtJS动态创建组件
J是代码动态创建dom: 或者 eval有后台组织代码,前台执 ======================= ExtJS组件的动态的创建: 程序中大多数时候需要在后台根据业务逻辑创建符合要求的组件, ...
- Delphi动态创建菜单
在程序运行中动态创建菜单,主要使用TMeunItem类,所有菜单的条目都是TMenuItem的一个实例. 打开Delphi7集成开发环境,在默认新建工程里,放置一个Button1按钮和MainMenu ...
随机推荐
- 【HDOJ】2255 奔小康赚大钱
最大二分图匹配,O(n^3). /* 2255 */ #include <iostream> #include <algorithm> #include <cstdio& ...
- ServiceStack.Redis 之 IRedisTypedClient
IRedisTypedClient IRedisTypedClient类相当于IRedicClient的强类型版,其方法与属性大多数与IRedisClient类似. 它支持在Redis中使用Linq查 ...
- Oracle数据库12560及更改密码为永久
小厂子的程序员还要折腾Oracle维护.这这里简单记录一下Oracle数据库服务器使用时遇到并解决的一些问题. 1. 在Oracle数据库服务器上(即安装Oracle数据库端的机器上),可以使用命令 ...
- Python中With的用法
在看Dive Into Python中有关描述文件读写那章节的时候,看到了有关with的用法,查阅下相关资料,记录下来,以备后用. 官方的reference上有关with statement是这样说的 ...
- galera mysql 多主复制启动顺序及命令
Mysql 被复制机 sql启动
- Ubuntu 下安装opencv 编译后执行找不到库
在ubuntu下编译opencv程序后,执行报下面到错误:error while loading shared libraries: libopencv_core.so.2.4: cannot ope ...
- Spring3 M2 quartz-2.1.7 解决bean不能注入问题
我们要达到这样的效果 public class CancelUnpaidOrderTask implements Job { @Autowired private AppOrderService or ...
- UISegmentedControl UISlider
self.view.backgroundColor = [UIColor whiteColor]; //UISegmentedControl 是iOS中的分段控件,事实上是多个button的组合视图, ...
- div+css3列布局,带详尽注释
直接看代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- [RxJS] Combination operator: combineLatest
While merge is an OR-style combination operator, combineLatest is an AND-style combination operator. ...