Mudar a ordem dos botões do DBNavigator?!
Preciso mudar a ordem dos botões do DBNavigator! alguém sabe como fazer isso?
Pode ser qualquer coisa, até um novo componente a partir de TDBNavigator!
Pode ser qualquer coisa, até um novo componente a partir de TDBNavigator!
[color=red:f9cebf3d26]Título editado por Massuda
Removido: ´Estou desesperado!´[/color:f9cebf3d26]
Pedron
Curtidas 0
Respostas
Paullsoftware
28/03/2006
eu procurei tanto sobre isso uma vez e não achei, fiz no improviso...
coloquei dois DbNavigator, se vc conseguir posta ai que ainda quero...
coloquei dois DbNavigator, se vc conseguir posta ai que ainda quero...
GOSTEI 0
Adriano Santos
28/03/2006
Declare um novo Type:
Assim nós conseguimos acessar os buttons do DBNavigator.
Dá pra alterar tudo dos botões.
Aqui eu fiz uma brincadeira, alterei todas as posições. Elas começam em zero dentro do DBNabigator, ou seja, o First fica em left = 0, prior = 24 e etc.
type TDBNewNavigator = class( TDbNavigator );
Assim nós conseguimos acessar os buttons do DBNavigator.
procedure TForm1.Button1Click(Sender: TObject); var B: TNavigateBtn; begin for B := Low(TNavigateBtn) to High(TNavigateBtn) do begin with TDBNewNavigator(DBNavigator1).Buttons[B] do begin Case Index of nbFirst : Left := 72; nbPrior : Left := 216; nbNext : Left := 48; nbLast : Left := 0; nbInsert : Left := 192; nbDelete : Left := 96; nbEdit : Left := 144; nbPost : Left := 120; nbCancel : Left := 168; nbRefresh: Left := 24; end; end; end; end;
Dá pra alterar tudo dos botões.
Aqui eu fiz uma brincadeira, alterei todas as posições. Elas começam em zero dentro do DBNabigator, ou seja, o First fica em left = 0, prior = 24 e etc.
GOSTEI 0
Martins
28/03/2006
Com o código passado pelo amigo [b:330618b3f2]Adriano Santos[/b:330618b3f2], vc pode alterar outras coisas no componente DBNavigator, aproveite.
boa sorte!
boa sorte!
GOSTEI 0
Pedron
28/03/2006
Agora me explique porque declarando uma nova classe pra ele eu posso acessar os buttons que estão no protected da classe pai?
E como eu poderia mudar a ordem caso fosse criar um novo componente? só colocar esse código no create do componente?
E como eu poderia mudar a ordem caso fosse criar um novo componente? só colocar esse código no create do componente?
GOSTEI 0
Pedron
28/03/2006
Testei o código acima, ele funcionou, só tem um pórem, quando o dbnavigator é redimencionado ele volta a ordem original!
experimentem por um outro botão com o código:
DBNavigator1.Align:=alClient;
e vejam o resultado
experimentem por um outro botão com o código:
DBNavigator1.Align:=alClient;
e vejam o resultado
GOSTEI 0
Rjun
28/03/2006
Bom, as propriedades declaradas como protected são acessiveis as classes herdeiras. Isso é regra.
Deve ter algum evento do tipo OnResize. Coloque esse código nesse evento também.
Deve ter algum evento do tipo OnResize. Coloque esse código nesse evento também.
GOSTEI 0
Adriano Santos
28/03/2006
Bom, as propriedades declaradas como protected são acessiveis as classes herdeiras. Isso é regra.
Deve ter algum evento do tipo OnResize. Coloque esse código nesse evento também.
[b:1ae3d7bc1a]pedron[/b:1ae3d7bc1a] o [b:1ae3d7bc1a]Rjun[/b:1ae3d7bc1a] está certo. Ser olharmos a unit DBCtrls, onde se encontra declarada a classe DBNavigator, veremos que existe realmente um procedimento para redimencionamento automático do DBNavigator, o SetSize;
procedure TDBNavigator.SetSize(var W: Integer; var H: Integer); var Count: Integer; I: TNavigateBtn; Space, Temp, Remain: Integer; X: Integer; begin if (csLoading in ComponentState) then Exit; if Buttons[nbFirst] = nil then Exit; CalcMinSize(W, H); Count := 0; for I := Low(Buttons) to High(Buttons) do if Buttons[I].Visible then Inc(Count); if Count = 0 then Inc(Count); ButtonWidth := W div Count; Temp := Count * ButtonWidth; if Align = alNone then W := Temp; X := 0; Remain := W - Temp; Temp := Count div 2; for I := Low(Buttons) to High(Buttons) do begin if Buttons[I].Visible then begin Space := 0; if Remain <> 0 then begin Dec(Temp, Remain); if Temp < 0 then begin Inc(Temp, Count); Space := 1; end; end; Buttons[I].SetBounds(X, 0, ButtonWidth + Space, Height); Inc(X, ButtonWidth + Space); end else Buttons[I].SetBounds (Width + 1, 0, ButtonWidth, Height); end; end;
E mais um outro que detecta a alteração de tamanho do DBNavigator, WMSize;
procedure TDBNavigator.WMSize(var Message: TWMSize); var W, H: Integer; begin inherited; W := Width; H := Height; SetSize(W, H); end;
Como disse o [b:1ae3d7bc1a]Rjun[/b:1ae3d7bc1a] existe o evento onResize onde vc pode implementar seu algoritimo. Há ainda a opção de modificar todo o DBNav como mostrado no exemplo abaixo:
[list:1ae3d7bc1a]
[*:1ae3d7bc1a] Inclua um TImageList com 10 imagens
[*:1ae3d7bc1a] Inclua uma TTable ligada no DBDEMOS e selecione uma tabela para testar
[*:1ae3d7bc1a] Insira um DBGrid pra ver o resultado
[/list:u:1ae3d7bc1a]
No OnCreate do Form inclua o algoritimo:
procedure TForm1.FormCreate(Sender: TObject);
var
B: TNavigateBtn;
procedure Reajusta(ABotao : TNavigateBtn);
begin
with TDBNewNavigator(DBNavigator1).Buttons[ABotao] do
begin
Width := 70;
Height := 70;
Layout := blGlyphTop;
Case Index of
nbFirst : Top := 000;
nbLast : Top := 000;
nbInsert : Top := 000;
nbEdit : Top := 000;
nbPost : Top := 000;
nbPrior : Top := 070;
nbNext : Top := 070;
nbCancel : Top := 070;
nbDelete : Top := 070;
nbRefresh : Top := 070;
end;
end;
end;
procedure AtualizaBitmap(AIndex: Integer; ABotao : TNavigateBtn);
var
Bmp : TBitmap;
begin
Bmp := TBitMap.Create;
with Bmp do
begin
{configuramos que a cor transparente será branco}
TransparentColor := clWhite;
Transparent := True;
TransparentMode := tmAuto
end;
ImageList1.GetBitmap(AIndex, Bmp);
{Detectamos se a altura do título é suficiente para por a imagem}
with TDBNewNavigator(DBNavigator1).Buttons[ABotao] do
Glyph := Bmp;
FreeAndNil(Bmp);
end;
begin
Table1.Active := True;
TDBNewNavigator(DBNavigator1).ClientHeight := 140;
TDBNewNavigator(DBNavigator1).ClientWidth := 350;
TDBNewNavigator(DBNavigator1).Left := (Form1.Width div 2) - (350 div 2);
for B := Low(TNavigateBtn) to High(TNavigateBtn) do
Reajusta(B);
for B := Low(TNavigateBtn) to High(TNavigateBtn) do
begin
with TDBNewNavigator(DBNavigator1).Buttons[B] do
begin
Layout := blGlyphTop;
Font.Color := clNavy;
Font.Style := [fsBold];
Case Index of
nbFirst : begin Left := 000; Caption := ´Início´; Hint := ´Vai para o INÍCIO da tabela´; AtualizaBitmap(00, B); end;
nbLast : begin Left := 070; Caption := ´Fim´; Hint := ´Vai para o FIM da tabela´; AtualizaBitmap(02, B); end;
nbInsert : begin Left := 140; Caption := ´Novo´; Hint := ´Inclui um NOVO registro´; AtualizaBitmap(08, B); end;
nbEdit : begin Left := 210; Caption := ´Alterar´; Hint := ´ALTERA o registro atual´; AtualizaBitmap(10, B); end;
nbPost : begin Left := 280; Caption := ´Gravar´; Hint := ´GRAVA o registro atual´; AtualizaBitmap(16, B); end;
nbPrior : begin Left := 000; Caption := ´Anteior´; Hint := ´Vai para o regitro ANTERIOR´; AtualizaBitmap(04, B); end;
nbNext : begin Left := 070; Caption := ´Próximo´; Hint := ´Vai para o PRÓXIMO registro´; AtualizaBitmap(06, B); end;
nbCancel : begin Left := 140; Caption := ´Cancelar´; Hint := ´CANCELA a alteração atual´; AtualizaBitmap(14, B); end;
nbDelete : begin Left := 210; Caption := ´Apagar´; Hint := ´APAGA o registro atual´; AtualizaBitmap(12, B); end;
nbRefresh : begin Left := 280; Caption := ´Atualizar´;Hint := ´ATUALIZA a tabela´; AtualizaBitmap(18, B); end;
end;
end;
end;
end;
No OnResize do DBNavigator link o evento ao onCreate do Form;
[list:1ae3d7bc1a]
[*:1ae3d7bc1a]Obs 1 - A propriedade Align funciona assim mesmo, redimenciona automaticamente. Você pode criar um novo componente herdado do DBNav e sobrescrever todos os seus métodos, eventos e propriedades.
[*:1ae3d7bc1a]Obs 2 - O algoritimo do meu segundo exemplo está um pouco extenso, mas se notar estou mudando totalmente a posição dos botões, colocando novas figuras, mudando hints e etc.
[/list:u:1ae3d7bc1a]
Veja uma foto da tela funcionando:
GOSTEI 0