Usando BookMark de maneira simples
Autor: José Henrique | Publicado: 2009-11-25T15:30:00-08: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;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Buttons, DB, DBClient, Grids, DBGrids;typeTExemploBookMark = 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 bookmarkpublic{ Public declarations }end;varExemploBookMark: 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.