TList, List.Pack 清除所有已是 nil 的对象

  // Add、Count、Items[n]
var
  List: TList;                       {声明 List}
  frmRed: TForm;                     {用于测试的对象, 这里选择了窗体}
begin
  List := TList.Create;              {建立列表}

  frmRed := TForm.Create( nil);       {建立 frmRed}
  frmRed.Caption := 'Red' ;           {frmRed 标题}
  frmRed.Color := clRed;             {frmRed 颜色} List.Add(frmRed); {添加到列表}

  ShowMessage(IntToStr(List.Count)); {1; 列表元素总数}
  //TForm(List.Items[0]).ShowModal;  {调用对象}
  TForm(List[ 0 ]).ShowModal;          {调用对象, 比上一行的写法简洁, 但是一样的}

  frmRed.Free;
  List.Free;
end;



// Insert、Remove、Delete、Clear、First、Last
var
  List: TList;                      
  frmRed,frmGreen,frmBlue: TForm;
  i: Integer;
begin
  List := TList.Create;

  {建立两个窗体: 红色、绿色}
  frmRed := TForm.Create( nil);
  frmRed.Caption := 'Red' ;
  frmRed.Color := clRed;

  frmGreen := TForm.Create( nil);
  frmGreen.Caption := 'Green' ;
  frmGreen.Color := clGreen;

  {添加到 List}
  List.Add(frmRed);
  List.Add(frmGreen);


  {再建立一个蓝色窗体}
  frmBlue := TForm.Create( nil);
  frmBlue.Caption := 'Blue' ;
  frmBlue.Color := clBlue;

  {插入到 List}
  List.Insert( 0 , frmBlue);

  ShowMessage(IntToStr(List.Count)); {3}
  TForm(List.First).ShowModal;       {显示第一个: 蓝色窗体}
  TForm(List.Last).ShowModal;        {显示最后一个: 绿色窗体}


  {看看红色窗体是第几个?}
  i := List.IndexOf(frmRed);
  ShowMessage(IntToStr(i));          {1; 是第二个}


  {从列表中删除 - 用对象指针}
  List.Remove(frmRed);
  ShowMessage(IntToStr(List.Count)); {2}
  frmRed.ShowModal;                  {frmRed 依然存在, 只是不在列表中了}


  {从列表中删除 - 用元素索引}
  List.Delete( 0 );
  frmBlue.ShowModal;                 {frmBlue 依然存在, 只是不在列表中了}

  {清空列表}
  List.Clear;

  frmRed.Free;
  frmGreen.Free;
  frmBlue.Free;
  List.Free;
end;



// Capacity、Move、Exchange、Extract
var
  List: TList;                      
  frmRed,frmGreen,frmBlue: TForm;
  p: Pointer;
  i: Integer;
begin
  List := TList.Create;

  List.Capacity := 3 ; {让 List 准备好接受 3 个元素}

  {建立红、绿、蓝三个窗体, 并添加到 List}
  frmRed := TForm.Create( nil);
  frmRed.Caption := 'Red' ; frmRed.Color := clRed;
  frmGreen := TForm.Create( nil);
  frmGreen.Caption := 'Green' ; frmGreen.Color := clGreen;
  frmBlue := TForm.Create( nil);
  frmBlue.Caption := 'Blue' ; frmBlue.Color := clBlue;
  List.Add(frmRed);
  List.Add(frmGreen);
  List.Add(frmBlue);

  {依次显示窗体标题}
  for i := 0 to List.Count - 1 do
    ShowMessage(TForm(List[i]).Caption); {将分别显示: Red Green Blue}


  {移动}
  List.Move( 2 , 0 ); {把第 3 个转移到第 1 个}
  for i := 0 to List.Count - 1 do
    ShowMessage(TForm(List[i]).Caption); {将分别显示: Blue Red Green}

  {置换}
  List.Exchange( 1 , 2 ); {把第 2 个与第 3 个交换}
  for i := 0 to List.Count - 1 do
    ShowMessage(TForm(List[i]).Caption); {将分别显示: Blue Green Red}

  {提取指针}
  p := List.Extract(frmGreen);
  ShowMessage(TForm(p).Caption);         {Green}

  frmRed.Free;
  frmGreen.Free;
  frmBlue.Free;
  List.Free;
end;



//定义排序函数
function MySort(p1, p2: Pointer): Integer;
begin
  Result := AnsiStrComp(p1,p2);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList;
  frmRed,frmGreen,frmBlue: TForm;
  i: Integer;
begin
  List := TList.Create;

  {建立绿、红、蓝三个窗体, 并添加到 List}
  frmRed := TForm.Create( nil);
  frmRed.Caption := 'Red' ; frmRed.Color := clRed;
  frmGreen := TForm.Create( nil);
  frmGreen.Caption := 'Green' ; frmGreen.Color := clGreen;
  frmBlue := TForm.Create( nil);
  frmBlue.Caption := 'Blue' ; frmBlue.Color := clBlue;
  List.Add(frmRed);
  List.Add(frmGreen);
  List.Add(frmBlue);

  {依次显示窗体标题}
  for i := 0 to List.Count - 1 do
    ShowMessage(TForm(List[i]).Caption); {将分别显示: Red Green Blue}

  {排序}
  List.Sort(MySort);
  for i := 0 to List.Count - 1 do
    ShowMessage(TForm(List[i]).Caption); {将分别显示: Blue Green Red}

//  FreeAndNil(frmBlue);
//  List.Pack; {这个没有测试成功! Pack 应该是清除所有已是 nil 的对象}


  {释放所有对象}
  for i := 0 to List.Count - 1 do
    TForm(List[i]).Free;

  List.Free;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值