A classe TList é usada para gerenciar uma coleção de ponteiros, com a grande vantagem de ser dinâmica. Ela dispõe de métodos para fazer busca na lista e ordenar os elementos, entre outros. No exemplo abaixo fazemos uso de alguns desses métodos.
No exemplo criamos uma classe Contato que será usada para povoar um TList que denominamos Agenda. Um TListBox é usado para apresentar os dados do TList.
Nas linhas que vão de 74 a 95 é onde acontece tudo que pretendemos mostrar. Inicialmente o TList é criado. Em seguida, são criados vários objetos Contato, que são adicionados à Agenda utilizando o método Add(). Este método sempre adiciona um objeto no fim da lista.
Após isso chamamos o método MostraAgenda, que foi criado para visualizar os dados da Agenda no TListBox. Na linha 86 há uma chamada ao método Sort(), que recebe como argumento o método comparaPorNome(). Aqui cabe uma explicação mais detalhada.
A ordenação de uma lista de objetos não é uma coisa tão natural como ordenar números inteiros ou strings. Como sabemos um objeto tem vários campos e por isso precisamos definir qual o critério que será usado para decidir que um objeto A é maior, menor ou igual a um outro objeto B. Por este motivo o método Sort() deve receber como parâmetro uma variável procedural, ou seja, um método que estabelece o critério de ordenação.
Dessa forma, foi criado o método comparaPorNome(), que recebe os ponteiros dos dois objetos a serem comparados. Tal método 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 são iguais quando tem nomes iguais. Leia mais sobre variáveis procedurais no post Free Pascal - Variáveis Procedurais. Deve-se ressaltar que o Free Pascal define apenas como deve ser a assinatura do método que ele espera receber em Sort(). A implementação cabe ao desenvolvedor.
Na linha 90 um novo objeto é inserido na posição 2 do TList. Note que a primeira posição é 0.
Usamos o método Delete() para deletar um objeto em uma determinada posição. Na linha 93 excluímos o objeto da posição 4.
Quando a TList não é mais necessária, liberamos a memória usada chamando Free. Para criar uma lista de strings prefira usar TStrings ou sua descendente TStringList.
unit Unit1; {$mode objfpc}{$H+} interface uses 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('Nádia Alves', '3523-0001'); Agenda.Add(contato); contato := TContato.Create('Célio Silva', '3524-0000'); Agenda.Add(contato); Agenda.Add(TContato.Create('Hélio 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 será usada para povoar um TList que denominamos Agenda. Um TListBox é usado para apresentar os dados do TList.
Nas linhas que vão de 74 a 95 é onde acontece tudo que pretendemos mostrar. Inicialmente o TList é criado. Em seguida, são criados vários objetos Contato, que são adicionados à Agenda utilizando o método Add(). Este método sempre adiciona um objeto no fim da lista.
Após isso chamamos o método MostraAgenda, que foi criado para visualizar os dados da Agenda no TListBox. Na linha 86 há uma chamada ao método Sort(), que recebe como argumento o método comparaPorNome(). Aqui cabe uma explicação mais detalhada.
A ordenação de uma lista de objetos não é uma coisa tão natural como ordenar números inteiros ou strings. Como sabemos um objeto tem vários campos e por isso precisamos definir qual o critério que será usado para decidir que um objeto A é maior, menor ou igual a um outro objeto B. Por este motivo o método Sort() deve receber como parâmetro uma variável procedural, ou seja, um método que estabelece o critério de ordenação.
Dessa forma, foi criado o método comparaPorNome(), que recebe os ponteiros dos dois objetos a serem comparados. Tal método 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 são iguais quando tem nomes iguais. Leia mais sobre variáveis procedurais no post Free Pascal - Variáveis Procedurais. Deve-se ressaltar que o Free Pascal define apenas como deve ser a assinatura do método que ele espera receber em Sort(). A implementação cabe ao desenvolvedor.
Na linha 90 um novo objeto é inserido na posição 2 do TList. Note que a primeira posição é 0.
Usamos o método Delete() para deletar um objeto em uma determinada posição. Na linha 93 excluímos o objeto da posição 4.
Quando a TList não é mais necessária, liberamos a memória usada chamando Free. Para criar uma lista de strings prefira usar TStrings ou sua descendente TStringList.
Comentários
Sou usuário do GNU/Pascal, não conheço muito, porém a minha aprendizagem é crescente.
Sistema como calculadora, agenda, entre outros já consigo programar e usar, agora estou buscando um material que me auxilie a usar essa linguagem como se usa o PHP, em páginas para inserir dados e recuperá-los, pois usando o SGDB Postgresql faço todo desenvolvimento com PHP e HTML, e gostaria de implementar o conhecimento, como Gnu/Pascal.
Tudo faço no Slackware.
Grato.
http://konlinux.com
Professor Carlos estou querendo tirar uma dúvida, para instalar o firebird sendo que meu propósito é para o desenvolvimento de aplicações, como devo instalar? É como serviço ou aplicação? E
De qualquer maneira uma aplicação se conectará ao banco de dados. Mas, se você instalar como aplicação cuide para que o servidor rode automaticamente na inicialização do sistema operacional. Isso dá pra configurar durante a instalação.