详测 Generics Collections: TObjectList、TObjectQueue、TObjectStack


TObjectList<T>、TObjectQueue<T>、TObjectStack<T> 分别继承自:
TList<T>、TQueue<T>、TStack<T>;

它们是专门用于对象的列表, 都增加了一个 OwnsObjects 布尔属性, 决定对象会不会自动释放(这也通过 Create 的参数来决定)

其他基本同它们的父类, 仅给 TObjectList<T> 测试一例(至此泛型相关内容学习完毕):

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



uses Generics.Collections;



procedure TForm1.Button1Click(Sender: TObject);

const

  w = 100; h = 20;

var

  ObjList: TObjectList<TEdit>;

  Edit: TEdit;

  i: Integer;

begin

  ObjList := TObjectList<TEdit>.Create();

  //ObjList := TObjectList<TEdit>.Create(False); {如果这样建立, 对象退出列表是则不会自动释放}

  

  Randomize;

  for i := 0 to 5 do {建立 6 个 Edit, 并加入列表}

  begin

    Edit := TEdit.Create(Self);

    Edit.Parent := Self;

    Edit.SetBounds(Random(ClientWidth-w), Random(ClientHeight-h), w, h);

    ObjList.Add(Edit);

  end;



  {2 秒钟后删除一个}

  Sleep(2000);

  ObjList.Delete(0);



  {2 秒钟后提取一个, 让被提取的变红; 提取的对象不会被自动释放的}

  Sleep(2000);

  Edit := ObjList.Extract(ObjList[0]);

  Edit.Color := clRed;

  Edit.Repaint;



  //ObjList.OwnsObjects := False; {如果这样, 对象退出列表是也不会自动释放}



  {2 秒钟后销毁列表; 列表中的对象也会随之释放}

  Sleep(2000);

  ObjList.Free;

end;



end.


 
   

你可能感兴趣的:(Collections)