开发所用delphi版本是xe2,效果图如下:
代码如下:
-----------------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
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 .
|