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.
8 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.