Informações pessoais Informações Pessoais
Ciência e Tecnologia Ciência e Tecnologia
Embarcadero Delphi Delphi
Para Sua Área Profissional Área Profissional

 

Delphi Delphi

Pgina sobre a Linguagem
de programao da Embarcadero

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


Usando Virtual-Key Codes - 27-03-2015

Usando a classe TDictionary - 26-03-2015

Sua Primeira Aplicao FireMonkey - 22-03-2015

Efeitos de imagem no Delphi - 22-03-2015

Timer: criando um cronmetro - 10-09-2013

Criando um Tocador de udio com Playlist - 03-09-2013

Criando um Navegador Web com TWebBrowser - 03-09-2013

Como Esmaecer um Formulrio - 24-09-2010

Procure um assunto especfico:  

 

  - Todos os artigos -