开发所用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. 【HDOJ】1325 Is It A Tree?

    并查集.需要考虑入度. #include <stdio.h> #include <string.h> #define MAXNUM 10005 int bin[MAXNUM]; ...

  2. Android Fragment实现分屏

    在项目中碰到一个问题,新开发一个平板APP,项目要求是把原来的一个手机端APP放在项目左侧显示,右侧添加新加的功能. 首先想到了Fragment,以前做过Fragment的一些简单的Demo,但是都没 ...

  3. HDU-4974 A simple water problem

    http://acm.hdu.edu.cn/showproblem.php?pid=4974 话说是签到题,我也不懂什么是签到题. A simple water problem Time Limit: ...

  4. HDOJ/HDU 1321 Reverse Text(倒序输出~)

    Problem Description In most languages, text is written from left to right. However, there are other ...

  5. Django中的Ajax

    Ajax 很多时候,我们在网页上请求操作时,不需要刷新页面.实现这种功能的技术就要Ajax!(本人定义,不可迷信) jQuery中的ajax就可以实现不刷新页面就能向后台请求或提交数据的功能,我们仍然 ...

  6. hibernate一对多关系映射(自身关联)

    示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别. public class Category  { private Integer id; private String ...

  7. ELK Packetbeat 部署指南(15th)

    原文链接:http://www.ttlsa.com/elk/elk-packetbeat-deployment-guide/ Packetbeat 是一个实时网络数据包分析工具,与elasticsea ...

  8. java第四周学习

    这一周学习的还是面向对象的方法和应用 Java中方法的使用和注意事项 如果没有返回值,就不允许通过return关键字返回结果 方法中不允许嵌套使用 Return返回值只允许返回一个值,不允许返回多个 ...

  9. 用if做了一个简单的猜拳游戏(做的不好还请指点,谢谢!)

    #include "stdio.h" #include "stdlib.h" #include "time.h" //随机函数的头文件 ma ...

  10. java web实现 忘记密码(找回密码)功能及代码

    java web实现 忘记密码(找回密码)功能及代码 (一).总体思路 (二).部分截图 (三).部分代码 (一).总体思路: 1.在 找回密码页面 录入 姓名.邮箱和验证码,录入后点击[提交]按钮, ...