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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章