Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) DbNavigator


Eder

Pergunta

Ola..

tenho uma tela de lançamentos e nela uso o DbNavigator, porem para ajudar o usuario ou melhor facilitar a sua digitação eu gostaria de quando o usuario digitar o ultimo campo dos lançamentos o proximo foco seria o Post do dbnavigator, mas só focar e não gravar, somente marcar....pois neste caso se ele gostaria de proceguir daria um enter e gravaria, caso contrario cancelaria ou até mesmo se precisasse alterar poderia alterar ainda antes de gravar.

Teria como eu fazer desta maneira??

Grato

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0
tenho uma tela de lançamentos e nela uso o DbNavigator, porem para ajudar o usuario ou melhor facilitar a sua digitação eu gostaria de quando o usuario digitar o ultimo campo dos lançamentos o proximo foco seria o Post do dbnavigator, mas só focar e não gravar, somente marcar....pois neste caso se ele gostaria de proceguir daria um enter e gravaria, caso contrario cancelaria ou até mesmo se precisasse alterar poderia alterar ainda antes de gravar.

Teria como eu fazer desta maneira??

Tem sim .. entretanto isto dependerá de voce... veja neste endereço como customizar o DBNavigator

http://delphi.about.com/od/usedbvcl/l/aa090203a.htm

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Tem sim .. entretanto isto dependerá de voce... veja neste endereço como customizar o DBNavigator

http://delphi.about.com/od/usedbvcl/l/aa090203a.htm

abraço

Ola...Jonas...pelo que entendi no link menciona sobre o tratamento no dbnavigator no caso os captio´s, colocar imagens nele...mas no meu caso...somente focar..não achei. :blush:

poderias me dizer em que parte do link se refere?

Agradecido

Link para o comentário
Compartilhar em outros sites

  • 0
... o proximo foco seria o Post do dbnavigator, mas só focar e não gravar, somente marcar
Eder, não sei se irá funcionar com o seu D5, mas não custa tentar.

"Hackear" componentes, como feito no link postado pelo colega Jhonas, as vezes, pode não ser tarefa simples ou não ser possível de utilizar para atingir nosso objetivo - e este é um caso.

O componente TDBNavigator utiliza uma variável private (FocusedButton) para gerenciar qual botão "está com o foco" e, não sendo uma propriedade, não podemos expô-la para nossa aplicação (a menos que mudemos isto no código fonte, é claro).

Os botões são derivados da classe TSpeedButton e a simulação do foco é implementada no método Paint desta classe (TNavButton). Acessar um dos botões em si, é simples já que são adicionados à propriedade Componentes do TDBNavigator. A questão fica sobre como poderemos "setar o foco" do botão.

Verificando o código do componente, é possível verificar que o método BtnMouseDown, atribuido ao evento OnMouseDown de cada botão na sua criação, basicamente manipula o foco dos botões e inicializa a variável que não tínhamos acesso antes.

Assim, a idéia foi a de obter o botão referente a opção desejada (nbPost) e chamar seu evento OnMouseDown. Veja como ficou o código:

procedure .... (Sender :TObject);
var
  BtnPost :TNavButton;
begin
  BtnPost := TNavButton(DBNavigator1.Components[Ord(nbPost)]);
  BtnPost.OnMouseDown(BtnPost, mbLeft, [], 0, 0);
end;

Supondo que no seu form, a ordem de tabulação do componente TDBNavigator seja logo após a do último campo informado (seja de um DBGrid ou TDBEdt), eu acredito que você pudesse colocar este código no evento OnExit deste componente - que é quando o DBNavigator estará recebendo o foco (isso, apenas, se estiver habilita sua propriedade TabStop).

OBS: Estando o DBNavigator com o foco em um botão específico, o ENTER não tem função - neste caso a barra de espaço aciona o botão (a exemplo que como funciona com com os CheckBox)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
tenho uma tela de lançamentos e nela uso o DbNavigator, porem para ajudar o usuario ou melhor facilitar a sua digitação eu gostaria de quando o usuario digitar o ultimo campo dos lançamentos o proximo foco seria o Post do dbnavigator, mas só focar e não gravar, somente marcar....pois neste caso se ele gostaria de proceguir daria um enter e gravaria, caso contrario cancelaria ou até mesmo se precisasse alterar poderia alterar ainda antes de gravar.

Eder ... voce pode tentar desta maneira

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin

   if (Key = #13) then
      if not (ActiveControl is TDBGrid) then
         begin
            Key := #0;
            Perform(WM_NEXTDLGCTL, 0, 0);
         end
      else if (ActiveControl is TDBGrid) then
         with TDBGrid(ActiveControl) do
         if selectedindex < (fieldcount -1 ) then
            begin
               selectedindex := selectedindex + 1;
            end
          else
            begin
               selectedindex := 0;
               DBNavigator1.SetFocus;

               for i := 1 to 7 do
                  begin
                     keybd_event(VK_LEFT,0,0,0);
                     keybd_event(VK_LEFT,$45, KEYEVENTF_KEYUP, 0);
                  end;

               for i := 1 to 7 do
                  begin
                     keybd_event(VK_RIGHT,0,0,0);
                     keybd_event(VK_RIGHT,$45, KEYEVENTF_KEYUP, 0);
                  end;
            end;


   if Key = #9 then
      if not (ActiveControl is TDBGrid) then
         begin
            Key := #0;
            Perform(WM_NEXTDLGCTL, 0, 0);
         end
      else if (ActiveControl is TDBGrid) then
         with TDBGrid(ActiveControl) do
         if selectedindex <= (fieldcount -1 ) then
            begin
               //
            end
         else
            begin
               selectedindex := 0;
               DBNavigator1.SetFocus;

               for i := 1 to 7 do
                  begin
                     keybd_event(VK_LEFT,0,0,0);
                     keybd_event(VK_LEFT,$45, KEYEVENTF_KEYUP, 0);
                  end;

               for i := 1 to 7 do
                  begin
                     keybd_event(VK_RIGHT,0,0,0);
                     keybd_event(VK_RIGHT,$45, KEYEVENTF_KEYUP, 0);
                  end;
            end;

end;

OBS: quando o usuario digitar o ultimo campo dos lançamentos o proximo foco seria o Post do dbnavigator, mas só focar e não gravar, somente marcar.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus...a sua dica funcionau...no meu D4.

Só um pequeno comentário...eu achei que após sair do ultimo dbedit ele poderia apenas tipo marcar em volta do botãozinho Posto do dbnavigator, como acontece quanto a gente usa o setfocus, haaa e também a questão de não poder usar o enter...

mas beleza...já me ajudou bastante...valeu..muito grato. :)

Jonas...a sua dica...eu não entendi direito, pois você mencionar o dbgrid...afinal este codigo devo usar no dbgrid?

tentei usar no Onexit do ultimo dbedit, mas não deu certo. :blush:

Haaa..parece que faltou declarar a variavel I:Integer;, mas eu notei e inseri..

Demais pessoal ...valeu a força..

Abraço a todos.. :D

t+

Link para o comentário
Compartilhar em outros sites

  • 0
Jonas...a sua dica...eu não entendi direito, pois você mencionar o dbgrid...afinal este codigo devo usar no dbgrid?

tentei usar no Onexit do ultimo dbedit, mas não deu certo.

Eder.. a dica que e passei é para usar no eventro OnKeyPress do DBgrid .. se quiser usar no Onexit do DBedit tem que usar desta maneira

procedure TForm1.DBEdit1Exit(Sender: TObject);
var i : integer;
begin
   DBNavigator1.SetFocus;

   for i := 1 to 7 do
      begin
         keybd_event(VK_LEFT,0,0,0);
         keybd_event(VK_LEFT,$45, KEYEVENTF_KEYUP, 0);
      end;

   for i := 1 to 7 do
      begin
         keybd_event(VK_RIGHT,0,0,0);
         keybd_event(VK_RIGHT,$45, KEYEVENTF_KEYUP, 0);
      end;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Só um pequeno comentário...eu achei que após sair do ultimo dbedit ele poderia apenas tipo marcar em volta do botãozinho Posto do dbnavigator, como acontece quanto a gente usa o setfocus,
Foi por isso que mencionei que não sabia se funcionaria no seu D5 (na verdade D4. rsrs)

Eu tinha testado no D3 e D7, sendo que no D7 fica corretamente um retângulo pontilhado em torno da imagem no centro do botão. Já no D3, isto só ocorre nos botões desabilitados. Experimente, após sair do último campo, quando o foco estará no DBNavigator e use as setas para o lado em direção a algum botão que esteja desabilitado (se não houver algum, apenas para teste, ative a visualização de todos os botões do DBNavigator - propriedade VisibleButtons). Confirmado isto, parece que o "problema" persiste na sua versão também. Por acaso, você teria os fontes do componente (é a unit DBCtrls.pas)?

haaa e também a questão de não poder usar o enter...
como disse, é uma condição que já existe, mas contornável.

Como o componente TDBNavigator não tem evento para tratamento do teclado, coce pode habilitar a propriedade KeyPreview do form onde ele está e colocar o seguinte código no evento OnKeyPress (do form):

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if (ActiveControl = DBNavigator1) and
     (DBNavigator1.DataSource.State in [dsInsert, dsEdit])  then
  begin
    case Key of
      #13 : DBNavigator1.DataSource.DataSet.Post;
      #27 : DBNavigator1.DataSource.DataSet.Cancel;
    end;
  end;
end;

estamos verificando quem gerou o evento e se o dataset está em modo edição ou inserção. No caso da pressionado o ENTER fazemos o post e se pressionado o ESC, cancelamos a edição/inserção.

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

Ola..Micheus...

Testei..o esqueminha...

porem da no mesmo a questão da marcação dos botões...ele marca os que já estão desabilitados, porem os que não estão...não marca...ai só da post quando apertar a BARRA de espaço...

Acontece o mesmo caso no codigo do Jonas...

Neste caso...eu optei por usar o ActionList e ai...coloquei F5=POST, pronto resolveu meu problema e ficou até bom.....então quando o usuario quizer gravar...não precisa pegar o mouse e clickar no post do dbnav....somente aperta o F5.

valeu...muito Grato...pela força. :)

t+

Link para o comentário
Compartilhar em outros sites

  • 0
Testei..o esqueminha...

porem da no mesmo a questão da marcação dos botões...ele marca os que já estão desabilitados, porem os que não estão...não marca...

pois então, este último "esqueminha" era apenas para utilizar o ENTER de modo a executar o post. A questão da marcação dos botões, pensei já ter explicado que houve falha no Delphi 3, mas não com o Delphi 7 e como ocorre com a sua versão (Delphi 4), parece que esse problema foi corrigido bem depois. :(

Neste caso...eu optei por usar o ActionList e ai...coloquei F5=POST, pronto resolveu meu problema e ficou até bom.....então quando o usuario quizer gravar...não precisa pegar o mouse e clickar no post do dbnav....somente aperta o F5.
muito boa solução. Parabéns! :D

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
QUOTE(Eder @ 24/10/2008 - 16:08)

Testei..o esqueminha...

porem da no mesmo a questão da marcação dos botões...ele marca os que já estão desabilitados, porem os que não estão...não marca...

pois então, este último "esqueminha" era apenas para utilizar o ENTER de modo a executar o post. A questão da marcação dos botões, pensei já ter explicado que houve falha no Delphi 3, mas não com o Delphi 7 e como ocorre com a sua versão (Delphi 4), parece que esse problema foi corrigido bem depois.

R.: Ok...entendido.

QUOTE

Neste caso...eu optei por usar o ActionList e ai...coloquei F5=POST, pronto resolveu meu problema e ficou até bom.....então quando o usuario quizer gravar...não precisa pegar o mouse e clickar no post do dbnav....somente aperta o F5.

muito boa solução. Parabéns!

R.: valeu...Obrigado :blush:

Abraço :)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...