A classe TList e usada para gerenciar uma colecao de ponteiros, com a grande vantagem de ser dinamica. Ela dispoe de metodos para fazer busca na lista e ordenar os elementos, entre outros. No exemplo abaixo fazemos uso de alguns desses metodos.unit Unit1;{$mode objfpc}{$H+}interfaceuses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;type TContato = class private NomeContato : String; TelefoneContato : String; public property Nome : String read NomeContato; property Telefone : String read TelefoneContato; constructor Create(const pNomeContato : String; const pTelefoneContato : String); end; { TfrmTlist } TfrmTlist = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { private declarations } Agenda : TList; procedure MostraAgenda; public { public declarations } end;var frmTlist: TfrmTlist;implementation{$R *.lfm}constructor TContato.Create(const pNomeContato : String; const pTelefoneContato : String);begin self.NomeContato := pNomeContato; self.TelefoneContato := pTelefoneContato;end;function comparaPorNome(Item1 : Pointer; Item2 : Pointer) : Integer;var contato1, contato2 : TContato;begin contato1 := TContato(Item1); contato2 := TContato(Item2); if contato1.Nome > contato2.Nome then Result := 1 else if contato1.Nome = contato2.Nome then Result := 0 else Result := -1;end;procedure TfrmTlist.Button1Click(Sender: TObject);var contato : TContato;begin Agenda := TList.Create; contato := TContato.Create('Nadia Alves', '3523-0001'); Agenda.Add(contato); contato := TContato.Create('Celio Silva', '3524-0000'); Agenda.Add(contato); Agenda.Add(TContato.Create('Helio Costa', '3320-1000')); Agenda.Add(TContato.Create('Aldo Sousa', '3321-0001')); MostraAgenda; ShowMessage('Ordenando pelo nome. Pressione OK'); Agenda.Sort(@comparaPorNome); MostraAgenda; ShowMessage('Inserindo novo contato. Pressione OK'); Agenda.Insert(2, TContato.Create('Luis Gonzaga', '3325-4000')); MostraAgenda; ShowMessage('Excluindo um contato. Pressione OK'); Agenda.Delete(4); ShowMessage('Pressione OK'); Agenda.free;end;procedure TfrmTlist.MostraAgenda;var i : Integer;begin ListBox1.Items.Clear; for i := 0 to Agenda.Count-1 do begin ListBox1.Items.Add(TContato(Agenda[i]).Nome+' - '+ (TContato(Agenda[i]).Telefone)); end;end;end.No exemplo criamos uma classe Contato que sera usada para povoar um TList que denominamos Agenda. Um TListBox e usado para apresentar os dados do TList.Nas linhas que vao de 74 a 95 e onde acontece tudo que pretendemos mostrar. Inicialmente o TList e criado. Em seguida, sao criados varios objetos Contato, que sao adicionados a Agenda utilizando o metodo Add(). Este metodo sempre adiciona um objeto no fim da lista.Apos isso chamamos o metodo MostraAgenda, que foi criado para visualizar os dados da Agenda no TListBox. Na linha 86 ha uma chamada ao metodo Sort(), que recebe como argumento o metodo comparaPorNome(). Aqui cabe uma explicacao mais detalhada.A ordenacao de uma lista de objetos nao e uma coisa tao natural como ordenar numeros inteiros ou strings. Como sabemos um objeto tem varios campos e por isso precisamos definir qual o criterio que sera usado para decidir que um objeto A e maior, menor ou igual a um outro objeto B. Por este motivo o metodo Sort() deve receber como parametro uma variavel procedural, ou seja, um metodo que estabelece o criterio de ordenacao.Dessa forma, foi criado o metodo comparaPorNome(), que recebe os ponteiros dos dois objetos a serem comparados. Tal metodo deve retornar -1 se o primeiro objeto for menor que o segundo, 1 se for maior e 0 se forem iguais. No nosso exemplo definimos que dois Contatos sao iguais quando tem nomes iguais. Leia mais sobre variaveis procedurais no post Free Pascal - Variaveis Procedurais. Deve-se ressaltar que o Free Pascal define apenas como deve ser a assinatura do metodo que ele espera receber em Sort(). A implementacao cabe