Usando BookMark de maneira simples
Autor: José Henrique | Publicado: 2009-11-25T21:30:00-02:00

Olá amigos, estou trazendo hoje uma dica rápida para quem deseja usar o bookmark. Primeiro vamos esclarecer o que é BookMark e depois mostrar uma das mais simples maneiras de utilizar esse recurso.
O que é BookMark ?Bookmark é um artifício que temos a nossa disposição para marcar um registro no ClientDataSet e depois localizá-lo rapidamente. Imagine o BookMark como um marcador de páginas (seria essa a tradução ao pé da letra), sendo assim você marca o registro no qual quer retornar futuramente, navega pelos outros registros do ClientDataSet e quando desejar, faz a chamada para o seu bookmark e retorna ao registro marcado. Parece fácil não é? 
É fácil sim!Para utilizar o bookmark da maneira mais simples, devemos utilizar o marcador como uma string. Crie uma variável private no seu form do tipo string. Ela será utilizada para receber o marcador do ClientDataSet, como também para indicar qual a posição o ClientDataSet deve colocar o ponteiro posteriormente.
Está parecendo complicado né, mas você verá que é brincadeira de criança fazer isso.
Construa um form conforme o modelo abaixo ou baixe aqui o exemplo completo.
 
Não se preocupe com os dados isso será resolvido no exemplo criando uma tabela temporária. Agora vamos a codificação para aqueles que não baixaram o exemplo vou colocar abaixo o código da unit.


unit uExemploBookMark;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBClient, Grids, DBGrids;

type
TExemploBookMark = class(TForm)
DBGrid1: TDBGrid;
CDS: TClientDataSet;
ds: TDataSource;
BitBtn1: TBitBtn;
MemorizaBookMark: TBitBtn;
LocalizaBookMark: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure MemorizaBookMarkClick(Sender: TObject);
procedure LocalizaBookMarkClick(Sender: TObject);
private
{ Private declarations }
BookMarkString : String;  // essa variavel ira auxiliar no uso do bookmark
public
{ Public declarations }
end;

var
ExemploBookMark: TExemploBookMark;

implementation

{$R *.dfm}

procedure TExemploBookMark.BitBtn1Click(Sender: TObject);
var
  I: Integer;
begin
  // aqui estamos criando nossa tabela temporaria
  CDS.FieldDefs.Add('codigo',ftInteger);
  CDS.FieldDefs.Add('descricao',ftString, 50);
  CDS.CreateDataSet;

  // aqui estamos criando os registros na tabela temporaria
  for I := 1 to 10 do
  begin
    CDS.Append;
    CDS.FieldByName('codigo').AsInteger   := i;
    CDS.FieldByName('descricao').AsString := 'Descrição - '+inttostr(i);
    CDS.Post;
  end;
end;

procedure TExemploBookMark.LocalizaBookMarkClick(Sender: TObject);
begin
  // dessa maneira dizemos ao clientdataset para ir para o endereco 
  // armazenado na nossa variavel
  CDS.Bookmark := BookMarkString;
end;

procedure TExemploBookMark.MemorizaBookMarkClick(Sender: TObject);
begin
  // aqui estamos atribuindo o endereco atual do registro na nossa 
  // variavel
  BookMarkString := Cds.Bookmark;
end;

end.





Para testar aponte o cursor para um registro qualquer selecionando o registro e depois clique no botão Memoriza BookMark, feito isso navegue pelo gride apontando agora qualquer outro registro e depois clique no botão Localiza BookMark, nesse instante o cursor deverá retornar para o registro memorizado anteriormente.


Vocês perceberam como foi fácil utilizar o bookmark dessa maneira? Para marcar nosso registro utilizamos BookMarkString := Cds.Bookmark; e para retornar ao registro marcado fizemos o contrário CDS.Bookmark := BookMarkString; . 


Claro que alguns irão dizer que é melhor utilizar o bookmark criando um ponteiro,&nbsp; etc. Sim, realmente se criarmos um ponteiro do tipo TBookMark, poderemos utilizar funcionalidades mais complexas, proporcionando um controle maior e mais seguro, mas o objetivo aqui era justamente demonstrar a parte fácil desse recurso e sua implementação sendo feita da maneira mais simples possível, espero que tenham gostado.