Personalizando o DBNavigator 01-09-2013
O
DBNavigator um componente bastante til, j que
possibilita uma interface para navegao e gerenciamento de dados. A navegao
pelos registros d-se atravs dos botes First, Next, Prior, e Last (que, respectivamente, vai
para o primeiro, o prximo, o anterior e o ltimo registro).
No entanto, o DBNavigator peca pela personalizao No se
pode inserir novas figuras (glyphs), textos descritivos abaixo delas, etc...
Um DBNavigator Mais Poderoso
Os
componentes costumam possuir membros chamados protegidos ("protected"), que
so invisveis aos desenvolvedores. Felizmente, h um meio de acess-los,
utilizando uma tcnica conhecida como "protected hack".
O DBNavigator tem propriedades protegidas em seus botes. Este membro
um array (matriz) do tipo TNavButton, um objeto descendente de
TSpeedButton ( ,
da paleta Additional). E, j que cada boto nesta propriedade protegida
herda as caractersticas de um TSpeedButton, com algumas modificaes,
possvel trabalhar com algumas de suas propriedades-padro, tais como
Caption (uma string que permite que um texto aparea no boto), Glyph (a
figura do boto), Layout (que determina onde a imagem ou o texto aparecero no boto), e
etc.
Da unit DBCtrls (onde o
componente DBNavigator est definido), ns iremos ler as propriedades
protegidas dos botes conforme segue:
Buttons: array[TNavigateBtn] of TNavButton;
onde TNavButton herda de
TSpeedButton e TNavigateBtn uma enumerao, definida como:
TNavigateBtn = (nbFirst, nbPrior,
nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Note que TNavigateBtn armazena 10
valores, cada um identificando um boto diferente do objeto TDBNavigator. Agora,
vejamos como hacker um DBNavigator:
Herdando Uma Nova Classe a Partir de
DBNavigator
Primeiro, crie um novo
aplicativo no Delphi (clicando no menu File > New > Application) e
adicione um DBNavigator, um DBGrid, um DataSoure e um componente do tipo Dataset
de sua escolha (da paleta ADO, BDE, dbExpres, ...). Certifique-se de que as
ligaes entre esses componentes esto feitas corretamente.
Em segundo lugar, defina uma nova
classe herdada de DBNavigator, antes da declarao do Form, conforme segue:
type
THackDBNavigator = class(TDBNavigator);
type
TForm1 = class(TForm)
... |
Em seguida, para que possamos exibir
captions e grficos em cada boto do DBNavigator, ns precisamos selecionar
algumas glyphs (figuras). Uma sugesto usar um componente TImageList e
adicionar 10 figuras a ele (do tipo .bmp ou .ico), cada um representando uma
ao em particular do DBNavigator.
Depois, na parte
private do formulrio, coloque isso:
type
TForm1 = class(TForm)
...
private
procedure SetupHackedNavigator(const
Navigator : TDBNavigator; const Glyphs : TImageList);
...
|
Adicione, na clusula uses, a unit
Buttons. Depois, clique sobre a procedure
SetupHackedNavigator e pressione CTRL+SHIFT+C no teclado para criar o
corpo da funo. Edite-a para que fique conforme mostrado a seguir:
procedure
TForm1.SetupHackedNavigator (const Navigator : TDBNavigator; const
Glyphs : TImageList);
const
Captions: array[TNavigateBtn] of string = ("Primeiro",
"Anterior", "Prximo", "ltimo", "Adicionar", "Apagar", "Editar", "Gravar",
"Cancelar", "Atualizar");
var
btn
: TNavigateBtn;
begin
for btn := Low(TNavigateBtn) to High(TNavigateBtn) do
with THackDBNavigator(Navigator).Buttons[btn] do
begin
//do array de constantes Captions
Caption := Captions[btn];
//o nmero de imagens na propriedade Glyph
NumGlyphs := 1;
// Remove glyph antiga.
Glyph := nil;
// Associa a glyph personalizada
Glyphs.GetBitmap(Integer(btn),Glyph);
// gylph acima do texto
Layout := blGlyphTop;
end;
end;
(*SetupHackedNavigator*) |
Por fim, no evento OnCreate do Form1, chame a nossa
funo:
procedure
TForm1.FormCreate(Sender: TObject);
SetupHackedNavigator(DBNavigator1, ImageList1);
end; |
OK, vamos explicar a funo SetupHackedNavigator recm-criada. Ns
criamos uma iterao com todos os botes do DBNavigator e fizemos cada boto
acessvel a partir de suas propriedades protegidas declaradas no array Buttons
que agora pertence classe THackDBNavigator. J que o que temos no array
Buttons so objetos do tipo TNavigateBtn, ns percorremos esta matriz
desde o primeiro boto at o ltimo, usando, respectivamente, as funes Low
e High. Para cada boto, removemos a figura antiga e associamos uma
nova (atravs do parmetro Glyphs), adicionamos captions a partir do
array Captions e ajustamos o layout de cada glyph para que ela ficasse
posicionada acima do texto.
Note que voc pode controlar
quais botes podem estar visveis num DBNavigator atravs de sua propriedade
VisibleButtons, mas isso no se aplica mais a nossa nova classe
THackDBNavigator. Outra propriedade que talvez voc queira mudar seja Hints,
usada para mostrar dicas informativas na tela sobre cada boto do DBNavigator,
quando o usurio move o mouse sobre eles. Voc pode permitir que essas dicas
sejam exibidas simplesmente deixando a propriedade ShowHints em True.
Fonte: delphi.about.com
|