Fórum Navegação em lista usando TObjectList #397252
14/03/2011
0
Valeu.
Jordelino Santos
Curtir tópico
+ 0Posts
14/03/2011
Marco Salles
Gostei + 0
14/03/2011
Jordelino Santos
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Contnrs, StrUtils;
type
TLista = class
private
FNome: string;
FEndereco: string;
FFone: string;
FEmail: string;
FLista: TObjectList;
public
constructor Create(Nome,Endereco,Fone,Email : string);
property Nome : string read FNome write FNome;
property Endereco : string read FEndereco write FEndereco;
property Fone : string read FFone write FFone;
property Email : string read FEmail write FEmail;
property Lista : TObjectList read FLista;
end;
type
TFormLista = class(TForm)
gbxCadastro: TGroupBox;
edtFone: TLabeledEdit;
edtNome: TLabeledEdit;
edtEnd: TLabeledEdit;
gbxLista: TGroupBox;
lstDados: TListBox;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
gbxOperacoes: TGroupBox;
btnLimpar: TButton;
btnMostrar: TButton;
btnAdicionar: TButton;
lblTot: TLabel;
edtEmail: TLabeledEdit;
btnExcluir: TButton;
GroupBox1: TGroupBox;
rdbPesqIncremental: TRadioButton;
rdbPesqExata: TRadioButton;
edtLocalizar: TLabeledEdit;
btnPesqExata: TButton;
btnSalvar: TButton;
btnLoad: TButton;
btnFirst: TButton;
btnPrior: TButton;
btnNext: TButton;
btnLast: TButton;
procedure btnAdicionarClick(Sender: TObject);
procedure btnMostrarClick(Sender: TObject);
procedure btnLimparClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure edtLocalizarChange(Sender: TObject);
procedure btnExcluirClick(Sender: TObject);
procedure btnPesqExataClick(Sender: TObject);
procedure rdbPesqExataClick(Sender: TObject);
procedure rdbPesqIncrementalClick(Sender: TObject);
procedure btnSalvarClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
procedure btnFirstClick(Sender: TObject);
procedure btnPriorClick(Sender: TObject);
procedure btnNextClick(Sender: TObject);
procedure btnLastClick(Sender: TObject);
private
{ Private declarations }
procedure navegaemlista(acao : SmallInt);
public
{ Public declarations }
Filhos : TLista;
Lista : TObjectList;
end;
var
FormLista: TFormLista;
implementation
{$R *.dfm}
{ TLista }
constructor TLista.Create(Nome,Endereco,Fone,Email : string);
begin
Self.Nome := Nome;
Self.Endereco := Endereco;
Self.Fone := Fone;
Self.Email := Email;
end;
procedure TFormLista.btnAdicionarClick(Sender: TObject);
var
i : integer;
begin
if not(Assigned(Lista)) then
Lista := TObjectList.Create;
Filhos := TLista.Create(
IfThen(edtNome.Text = '', 'Não informado', edtNome.Text),
IfThen(edtEnd.Text = '', 'Não informado', edtEnd.Text),
IfThen(edtFone.Text = '', 'Não informado', edtFone.Text),
IfThen(edtEmail.Text = '', 'Não informado', edtEmail.Text)
);
Lista.Add(Filhos);
i := Lista.IndexOf(Filhos);
lblTot.Caption := 'Total de Itens na lista: ' + IntToStr(Lista.Count);
lstDados.Items.Add('Nome : ' + TLista(Lista[i]).Nome);
lstDados.Items.Add('Endereço : ' + TLista(Lista[I]).Endereco);
lstDados.Items.Add('Fone : ' + TLista(Lista[I]).Fone);
lstDados.Items.Add('Email : ' + TLista(Lista[I]).Email);
lstDados.Items.Add('##################################################################################');
end;
procedure TFormLista.btnExcluirClick(Sender: TObject);
begin
lstDados.Items.Delete(lstDados.ItemIndex);
end;
procedure TFormLista.btnFirstClick(Sender: TObject);
begin
navegaemlista(1);
end;
procedure TFormLista.btnLastClick(Sender: TObject);
begin
navegaemlista(4);
end;
procedure TFormLista.btnLimparClick(Sender: TObject);
var
i : Integer;
begin
lstDados.Clear;
if Assigned(Lista) then
begin
for I := 0 to Pred(Lista.Count) do
Lista.Clear;
FreeAndNil(Lista);
end;
lblTot.Caption := 'Total de Itens na lista: 0';
end;
procedure TFormLista.btnLoadClick(Sender: TObject);
begin
try
if FileExists(ExtractFilePath(Application.ExeName) + 'dados.txt') then
lstDados.Items.LoadFromFile(ExtractFilePath(Application.ExeName) + 'dados.txt');
except
raise Exception.Create('Não possivel carregar a estrutura!');
end;
end;
procedure TFormLista.btnMostrarClick(Sender: TObject);
begin
if Assigned(Lista) then
begin
// Mostra o item selecionado
if lstDados.ItemIndex <> -1 then
ShowMessage(lstDados.Items.Strings[lstDados.ItemIndex]);
end;
end;
procedure TFormLista.btnNextClick(Sender: TObject);
begin
navegaemlista(3);
end;
procedure TFormLista.btnPesqExataClick(Sender: TObject);
var
posNome, posEnd, posFone, posEmail : Integer;
begin
if Trim(edtLocalizar.Text) <> '' then
begin
posNome := lstDados.Items.IndexOf('Nome : ' + edtLocalizar.Text);
posEnd := lstDados.Items.IndexOf('Endereço : ' + edtLocalizar.Text);
posFone := lstDados.Items.IndexOf('Fone : ' + edtLocalizar.Text);
posEmail := lstDados.Items.IndexOf('Email : ' + edtLocalizar.Text);
if (posNome = -1) and (posEnd = -1) and (posFone = -1) and (posEmail = -1) then
ShowMessage('Palavra não encontrada!')
else
begin
if posNome <> -1 then
lstDados.ItemIndex := (posNome)
else if posEnd <> -1 then
lstDados.ItemIndex := (posEnd)
else if posFone <> -1 then
lstDados.ItemIndex := (posFone)
else if posEmail <> -1 then
lstDados.ItemIndex := (posEmail);
end;
end;
end;
procedure TFormLista.btnPriorClick(Sender: TObject);
begin
navegaemlista(2);
end;
procedure TFormLista.btnSalvarClick(Sender: TObject);
begin
try
if Assigned(Lista) then
begin
if FileExists(ExtractFilePath(Application.ExeName) + 'dados.txt') then
DeleteFile(ExtractFilePath(Application.ExeName) + 'dados.txt');
lstDados.Items.SaveToFile(ExtractFilePath(Application.ExeName) + 'dados.txt');
ShowMessage('Dados salvos com sucesso!');
end;
except
raise Exception.Create('Não possivel salvar a estrutura!');
end;
end;
procedure TFormLista.edtLocalizarChange(Sender: TObject);
var
texto : Array[0..255] of char;
begin
if Trim(edtLocalizar.Text) <> '' then
begin
StrPCopy(texto, edtLocalizar.Text);
lstDados.ItemIndex := -1;
if texto <> '' then
begin
with lstDados do
begin
Perform(LB_SELECTSTRING, 0, LongInt(PChar('Nome : ' + texto)));
Perform(LB_SELECTSTRING, 0, LongInt(PChar('Endereço : ' + texto)));
Perform(LB_SELECTSTRING, 0, LongInt(PChar('Fone : ' + texto)));
Perform(LB_SELECTSTRING, 0, LongInt(PChar('Email : ' + texto)));
end;
end;
end;
end;
procedure TFormLista.FormClose(Sender: TObject; var Action: TCloseAction);
begin
btnLimpar.Click;
end;
procedure TFormLista.navegaemlista(acao: SmallInt);
var
pos : Integer;
begin
if Assigned(Lista) then
begin
case acao of
1 : pos := 0; // Primeiro registro da lista
2 : // Registro anterior da lista
begin
pos := Lista.IndexOf(Filhos);
if ( pos <> 0 ) then
pos := pos - 1;
end;
3 : // Próximo registro da lista
begin
pos := Lista.IndexOf(Filhos);
if ( pos <> 0 ) and ( pos > Lista.Count ) then
pos := pos + 1;
end;
4 : pos := ( Lista.Count - 1 ); // Último registro da lista
end;
edtNome.Text := TLista(Lista[pos]).Nome;
edtEnd.Text := TLista(Lista[pos]).Endereco;
edtFone.Text := TLista(Lista[pos]).Fone;
edtEmail.Text := TLista(Lista[pos]).Email;
end;
end;
procedure TFormLista.rdbPesqExataClick(Sender: TObject);
begin
edtLocalizar.OnChange := nil;
edtLocalizar.Text := '';
end;
procedure TFormLista.rdbPesqIncrementalClick(Sender: TObject);
begin
edtLocalizar.OnChange := edtLocalizarChange;
edtLocalizar.Text := '';
end;
end.
Aqui esta a imagem da tela e todo o código fonte. Tem orientação a objetos. Tem uma classe TLista onde armazeno o registro individualmente a cada clique em Adicionar e uma variável Lista do tipo TObjectList onde vou armazenando essa cada objeto criado da classe Lista. Esta tudo perfeito apenas a questão de navegação entre os registros que não esta perfeita. Se eu adicionar por exemplo 2 registros e navegar atravéz dos botões ao lado bo botão Limpar TList que são respectivamente btnFirst, btnPrior, btnNext e btnLast navega normalmente mas se eu adicionar mais registros a rotina se perde.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)