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 .