GARANTIR DESCONTO

Fórum Navegação em lista usando TObjectList #397252

14/03/2011

0

Galera quero implementar uma navegação entre os registros de uma lista usando TObjectList através dos botões btnprimeiro, btnanterior, btnproximo e btnultimo. Alguém tem alguma idéia/exemplo?
Valeu.
Jordelino Santos

Jordelino Santos

Responder

Posts

14/03/2011

Marco Salles

Navegação entre os registros ou entre os objetos???   vc esta tentando fazer algo com POO ??
Responder

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar