三十、详测 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.
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.