六、Delphi 2009 泛型容器单元(Generics.Collections)[5]: TObject...<T> 系列

本文通过实例对比了Delphi中TList与TObjectList的使用差异,特别是在对象内存管理方面,TObjectList在移除元素时会自动释放对象内存。

已经有了: TList<T>、TQueue<T>、TStack<T>、TDictionary<TKey,TValue>
为什么还有: TObjectList<T>、TObjectQueue<T>、TObjectStack<T>、TObjectDictionary<TKey,TValue> ?

还记得 Classes.TList 和 Contnrs.TObjectList 的主要区别吗?
如果元素是对象, Contnrs.TObjectList 在删除元素时会同时释放对象, 而 Classes.TList 不会.

同样在这里, Generics.Collections.TObjectList<T> 会同时释放对象, 而 Generics.Collections.TList<T> 不会.
其他也是一样.

 

ContractedBlock.gifExpandedBlockStart.gifpas
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 
= class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    
procedure FormCreate(Sender: TObject);
    
procedure FormDestroy(Sender: TObject);
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
    
procedure Button4Click(Sender: TObject);
  
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Generics.Collections;

var
  List    : TList
<TButton>;       {譬如要管理 TButton 对象}
  ObjList : TObjectList
<TButton>;

procedure TForm1.FormCreate(Sender: TObject);
begin
  List :
= TList<TButton>.Create;
  ObjList :
= TObjectList<TButton>.Create;

  Button1.Caption :
= '创建 Button 并添加到 TList';
  Button2.Caption :
= '删除 TList 中的 Button';
  Button3.Caption :
= '创建 Button 并添加到 TObjectList';
  Button4.Caption :
= '删除 TObjectList 中的 Button';

  Button2.Enabled :
= False;
  Button4.Enabled :
= False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  List.Free;
  ObjList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  btn: TButton;
begin
  btn :
= TButton.Create(Self);
  btn.Caption :
= 'TList 中的 Button';
  btn.Parent :
= Panel1;
  btn.Width :
= 132;
  List.Add(btn);

  Button1.Enabled :
= False;
  Button2.Enabled :
= True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  List.RemoveAt(
0);

  Button1.Enabled :
= True;
  Button2.Enabled :
= False;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  btn: TButton;
begin
  btn :
= TButton.Create(Self);
  btn.Caption :
= 'TObjectList 中的 Button';
  btn.Parent :
= Panel2;
  btn.Width :
= 132;
  ObjList.Add(btn);

  Button3.Enabled :
= False;
  Button4.Enabled :
= True;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ObjList.RemoveAt(
0);

  Button3.Enabled :
= True;
  Button4.Enabled :
= False;
end;

end.

 

ContractedBlock.gifExpandedBlockStart.gifdfm
object Form1: TForm1
  Left 
= 0
  Top 
= 0
  Caption 
= 'Form1'
  ClientHeight 
= 153
  ClientWidth 
= 408
  Color 
= clBtnFace
  Font.Charset 
= DEFAULT_CHARSET
  Font.Color 
= clWindowText
  Font.Height 
= -11
  Font.Name 
= 'Tahoma'
  Font.Style 
= []
  OldCreateOrder 
= False
  OnCreate 
= FormCreate
  OnDestroy 
= FormDestroy
  PixelsPerInch 
= 96
  TextHeight 
= 13
  
object Panel1: TPanel
    Left 
= 8
    Top 
= 8
    Width 
= 193
    Height 
= 137
    Caption 
= 'Panel1'
    TabOrder 
= 0
    
object Button1: TButton
      Left 
= 8
      Top 
= 76
      Width 
= 177
      Height 
= 25
      Caption 
= 'Button1'
      TabOrder 
= 0
      OnClick 
= Button1Click
    
end
    
object Button2: TButton
      Left 
= 8
      Top 
= 107
      Width 
= 177
      Height 
= 25
      Caption 
= 'Button2'
      TabOrder 
= 1
      OnClick 
= Button2Click
    
end
  
end
  
object Panel2: TPanel
    Left 
= 207
    Top 
= 8
    Width 
= 194
    Height 
= 137
    Caption 
= 'Panel2'
    TabOrder 
= 1
    
object Button3: TButton
      Left 
= 8
      Top 
= 76
      Width 
= 177
      Height 
= 25
      Caption 
= 'Button3'
      TabOrder 
= 0
      OnClick 
= Button3Click
    
end
    
object Button4: TButton
      Left 
= 8
      Top 
= 107
      Width 
= 177
      Height 
= 25
      Caption 
= 'Button4'
      TabOrder 
= 1
      OnClick 
= Button4Click
    
end
  
end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值