网事如风 2005-9-13 18:30
用TObjectList实现的控件数组代码:
今天有人在一个群里反复在问Delphi里有没有类似于VB中控件数组的东西,不过感觉Delphi控件数组的管理稍显麻烦,所以写了如下的测试代码,大家可以看看:
{**
* 作者:网事如风
* 作用:用TObjectList实现的控件数组代码:
* 使用:
**}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Contnrs, Math;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
LabelList : TObjectList;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
InsertLbl : TLabel;
I,RecCou : Integer;
begin
LabelList := TObjectList.Create();
RecCou := 8;
for I := 0 to RecCou - 1 do
begin
InsertLbl := TLabel.Create(nil);
InsertLbl.Parent := Self;
InsertLbl.Name := 'Test' + IntToStr(I);
InsertLbl.SetBounds( 20*(I+1), 20*(I+1), 20, 20);
InsertLbl.Color := IfThen( Odd(I), clred, ClYellow ); //颜色区分
LabelList.Add(InsertLbl);
InsertLbl := Nil;
end;
//使用
for I := 0 to LabelList.Count - 1 do
begin
TLabel(LabelList.Items[I]).Caption := IntToStr(I);
end;
//最后在FormClose的时候需要 : FreeAndNil(LabelList);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(LabelList);
end;
end.
lion 2005-9-29 21:10
InsertLbl := TLabel.Create(nil);
LabelList.Add(InsertLbl);
FreeAndNil(LabelList);
==========只是这样就可以Free那些Label了么?楼主有没有研究过,TObjectList的析构函数?我想,TObjectList里面的对象应该不由它去Free的,它只是保存一个引用指针吧?应该由外面的程序去Free吧?
网事如风 2005-10-2 17:46
呵呵,关于ObjectList的帮助,在Delphi中只有那么一点点的说明,说的含糊不清,Borland该打屁股。
你可以仔细看看TObjectList的Dertory的实现,会有很大收获的,总之可以肯定的是:
Var
ObjList : TObjectList;
begin
/*
如下的实现内存是由TObjectList释放的,也就是只要Free到它就可以清空所有了
*/
Object := TObjectList.Create();
Object := TOjbectList.Create(True);
/*
如下的实现内存就必须由各自对象来释放内存
*/
Object := TOjbectList.Create(False);
end;