发新话题
打印

用TObjectList实现的控件数组代码:

用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.

TOP

支持!

TOP

InsertLbl := TLabel.Create(nil);
LabelList.Add(InsertLbl);


FreeAndNil(LabelList);
==========只是这样就可以Free那些Label了么?楼主有没有研究过,TObjectList的析构函数?我想,TObjectList里面的对象应该不由它去Free的,它只是保存一个引用指针吧?应该由外面的程序去Free吧?
人生,真的如路。。。。

TOP

呵呵,关于ObjectList的帮助,在Delphi中只有那么一点点的说明,说的含糊不清,Borland该打屁股。
你可以仔细看看TObjectList的Dertory的实现,会有很大收获的,总之可以肯定的是:
Var
      ObjList : TObjectList;
begin
/*
如下的实现内存是由TObjectList释放的,也就是只要Free到它就可以清空所有了
*/
      Object := TObjectList.Create();
      Object := TOjbectList.Create(True);
/*
如下的实现内存就必须由各自对象来释放内存
*/  
      Object := TOjbectList.Create(False);
end;

TOP

发新话题