GARANTIR DESCONTO

Fórum Colocar o DBGrid na primeira posição #303791

30/11/2005

0

usando um locate, durante a digitação em um edit, com lopartialkey, o objeto procurado sempre fica no fim do dbgrid, existe alguma maneira de fazer com que o mesmo fique na primeira posição?


Edilcimar

Edilcimar

Responder

Posts

07/12/2005

Marco Salles

Por gentileza , poderia disponizar o fragmento de código do evento onchange para que eu possa testa-lo aqui .


Responder

Gostei + 0

07/12/2005

Edilcimar

If Edit1.Focused = True then
Begin
IBTable1.First;
IBTable1.IndexFieldNames := ´NOME´;
With IBTable1 do
Begin
Locate(´NOME´, Edit1.Text, [loPartialKey]);
If Edit1.Text = FieldByName(´NOME´).AsString then
Begin
Edit1.Text := FieldByName(´NOME´).AsString;
Edit3.Text := FieldByName(´FABRICANTE´).AsString;
Edit5.Text := FieldByName(´DIVISAO´).AsString;
Edit7.Text := FieldByName(´CODIGOBARRA´).AsString;
Edit8.Text := FieldByName(´ATIVO´).AsString;
DBgrid1.SetFocus;
End;
End;
End;
quando coloco este linha abaixo ele dá foco no dbgrid
SendMessage(DbGrid1.Handle,WM_VSCROLL,SB_Lineup,0);


Responder

Gostei + 0

07/12/2005

Massuda

Talvez isso seja útil mas talvez eu não tenha entendido o problema...

Todo grid tem uma propriedade .TopRow que define qual é a primeira linha visível no grid; a princípio, basta obter qual linha do grid o Locate encontrou e torná-la o .TopRow do grid.


Responder

Gostei + 0

08/12/2005

Edilcimar

Ok Massuda, vou pesquisar


Responder

Gostei + 0

08/12/2005

Marco Salles

Massuda Citou
Talvez isso seja útil mas talvez eu não tenha entendido o problema... Todo grid tem uma propriedade .TopRow que define qual é a primeira linha visível no grid; a princípio, basta obter qual linha do grid o Locate encontrou e torná-la o .TopRow do grid.


Edicilmar Citou:
Ok Massuda, vou pesquisar


Amigo , Edicilmar , se voce pesquisar e encontrar algo que possa elucidar a questão , por favor passe a resposta para a gente... Terei a imensa satisfação em colocar a resposta no meu caderno de soluções.

:idea:
Mas nesse meio termo achei ou acho que achei uma outra resposta para o problema... [b:d5f6f151ed]Quando não se tem Cão deve se latir com o Gato[/b:d5f6f151ed]

Fiz alguns testes aqui e a principio parecem satisfazer .


:arrow:
[b:d5f6f151ed]Veja a figuara abaixo , que é antes da Pesquisa[/b:d5f6f151ed]
[URL=http://imageshack.us][img:d5f6f151ed]http://img229.imageshack.us/img229/4923/imagemparaedicilmar16hv.jpg[/img:d5f6f151ed][/URL]

:arrow: :arrow:
[b:d5f6f151ed]logo Abaixo a figura quando a tecla V (Maiscula) é preesionada[/b:d5f6f151ed]
[URL=http://imageshack.us][img:d5f6f151ed]http://img228.imageshack.us/img228/9648/imagemparaedicilmar25lk.jpg[/img:d5f6f151ed][/URL]

Abaixo o código que usei ;

procedure TForm1.Edit1Change(Sender: TObject);
var
i:Integer;
begin
  With IBTable1 do
    Begin
      //coloquei um if then aqui...
      if Locate(´Descricao_Produto´, Edit1.Text, [loPartialKey]) then
        begin
         If Edit1.Text = FieldByName(´Descricao_Produto´).AsString then
          Begin
            Edit1.Text := FieldByName(´Descricao_Produto´).AsString;
            DBgrid1.SetFocus;
         end
       //coloquei um else aqui
       else
          begin
            //desabilita o controle consciente de dados
            IBTable1.DisableControls;
            //Foco vai temporariamente para o DbGrid
           Dbgrid1.SetFocus;
           //Executo um laço , onde os parametros vai depender do 
          //tamanho do Grid e de onde o dado localizado aparece na Grid
         //No meu PC O Dado Localizado sempre aparecia no Meio e Nunca 
        //na final 
            for i:=0 to 9 do
              begin
                 //simulo o pressionamento da tecla Down , objetivando
                //abaixar os dados da Grid . Efetuo esse deslocamento ate 
               //o dado aparecer no top da grid . por isso os parametros do 
              //Laço deve ser calculados para o seu caso 
                 keybd_event(VK_DOWN,0,0,0);
             //finalizo toda mensagem pendende
                Application.ProcessMessages;
             end;
          // o laço acima move o registro para baixo , por isso devo 
         // deslocar a edição para cima novamente
          SendMessage(DbGrid1.Handle,WM_VSCROLL,SB_Lineup,0);
         //habilito o controle consciente de dados
          IBTable1.enablecontrols;
        //retorno o foco para o edit novamente
          edit1.setfocus;
        //posiciono o ponteiro do edit
         edit1.SelStart:=length(edit1.text);
      end;
  end;
end;


PS1 :[b:d5f6f151ed] Mais uma vez reitifico a necessidade de efetuar um controle no Loop For i:=0 To **** Do ....o Valor *** Vai depender do Seu Caso especifico[/b:d5f6f151ed]

P:S2 Coloquei a grid em[color=darkred:d5f6f151ed] DgRowSelect em True e DgAllShowSelectd [/color:d5f6f151ed]em True . Iso não é necessário e so para melhor destacar o registro dando um efeito de azulado
Se for conveniente , para que a [b:d5f6f151ed]Grid[/b:d5f6f151ed] fique em modo de [b:d5f6f151ed]edição [/b:d5f6f151ed], toda vez que ela receber o foco , volte as configuraçoes originais da Propriedade Options. E Toda vez que a grid perder o foco , volte novamente com o efeito Azulado.. Isto pode ser facilmente programado atraves dos eventos
onExit e OnEnter da Grid...

P:S3[b:d5f6f151ed] No seu código inicial não entendi o efeito da instrução[/b:d5f6f151ed]

If Edit1.Focused = True then 
Begin 
IBTable1.First; 
IBTable1.IndexFieldNames := ´NOME´; 


Toda vez que pressionar qualquer tecla no OnChange , Mover para a primeira posição e seguida indexar a tabela... Acho que esta indexação so é necessária fazer uma única vez , e não vejo necessidade mover o registro para a primeira posição ??????

Boa sorte


Responder

Gostei + 0

08/12/2005

Edilcimar

Marcos, vou testar o código, quanto a
P:S3 No seu código inicial não entendi o efeito da instrução Código: If Edit1.Focused = True then Begin IBTable1.First; IBTable1.IndexFieldNames := ´NOME´;


é que tenho diversos edit´s e cada um usa um índice diferente, por isto que tem o focused, para saber quem está mudando, pois eu preencho os outros campos com dados da ibtable, quanto a troca do indice, eu poderia ter colocado no onenter do edit , quanto ao first foi uma tentativa para mudar a posição no grid (afinal chutei de tudo para conseguir aquilo que queria)


Responder

Gostei + 0

08/12/2005

Edilcimar

Valeu Marcos, este funcionou corretamente, agora só preciso inventar um DBGRid.RowCount para fazer o loop tipo for i := 1 to dbgrid1.rowcount


Responder

Gostei + 0

08/12/2005

Edilcimar

se substituir esta linha
keybd_event(VK_DOWN,0,0,0);
por
keybd_event(VK_NEXT,0,0,0);
pode tirar o loop que funciona perfeitamente, seria o meu dbgrid.rowcount!


Responder

Gostei + 0

08/12/2005

Marco Salles

Valeu Marcos, este funcionou corretamente, agora só preciso inventar um DBGRid.RowCount para fazer o loop tipo for i := 1 to dbgrid1.rowcount


No meus testes , usando um Tamanho de dbGrid Fixo , o DBGRid.RowCount foi no Chutommetro... Fui modificando o loop ate chegar no Ponto que gostaria

se substituir esta linha keybd_event(VK_DOWN,0,0,0); por keybd_event(VK_NEXT,0,0,0); pode tirar o loop que funciona perfeitamente, seria o meu dbgrid.rowcount!


Melhor ainda... :P :P


Responder

Gostei + 0

08/12/2005

Marco Salles

:idea:
Gostaria de alertar que para tabelas com pouco registros (Cujo Numero seje inferior) á capacidade da area visivel do DbGrid , ocorrerá um efeito indesejável , que aparecá como bug da função
Nesse caso , suponhamos que se tenha tres registros e que a capacidade do Grid e de mostrar [b:b1c6478182]mais de tres registros[/b:b1c6478182], :arrow: logo a barra de rolagem esta desabilitada..
:wink:
Mesmo com tres registros o usuário resolva fazer uma pesquisa ,(Confesso que seria bem mais fácil olhar para o Grid) , suponha hipoteticamente que ele consulte o Ultimo registro , que nesse caso é o Terceiro
:arrow:
[b:b1c6478182]O Resultado da pesquisa nessa situação particular sera sempre , o primeiro Registro[/b:b1c6478182]
[b:b1c6478182][color=red:b1c6478182]A Razão disso é simples , visto que o Ultimo Registro (Nesse caso o Terceiro) não pode passar por cima do Primeiro.. Isto é , não há condiçoes de rolagem dos Registros da Grid[/color:b1c6478182][/b:b1c6478182]

[b:b1c6478182]A Saidá :[/b:b1c6478182]
Uma saida é limitar o Uso da Função na situação em que o Numero de registro For Maior que o Numero de Registros Que podem ser visiveil pelo DbGrid.
Em outras palavras :

if IBTable1.RecCount > NumeroRegistrosQuePodemSerVisiveisDbGrid
  begin
    blablabla..
  end


[b:b1c6478182]fui claro[/b:b1c6478182] ???? :?: :?: :?:


Responder

Gostei + 0

08/12/2005

Edilcimar

mas isto utilizando o for, pois com a minha substituição a coisa funciona como um simples page down (não testei)


Responder

Gostei + 0

11/12/2005

Caninha51

[quote:b2aacca4b6=´Marco Salles´]
If Edit1.Text = FieldByName(´Descricao_Produto´).AsString then
          Begin
            Edit1.Text := FieldByName(´Descricao_Produto´).AsString;
            DBgrid1.SetFocus;
         end

[/quote:b2aacca4b6]

Muito interessante esse tópico!

Só naum entendi a utilidade do edit receber a mesma coisa, já q eh igual!![:)]


Responder

Gostei + 0

27/06/2015

Willerson Santos

Amigos, vocês resolveram como fazer para o resultado do locate no dbgrid ficar na primeira opção? Ainda não consegui aqui.
O meu problema é o seguinte:
Tenho uma busca por referencias, de modo que existem as referencias,
5040.001
5040.002
5040.003
5040.004
5040.005
5040.006
Eu pesquisei por "5040", achou o primeira referencia 5040.001 mas essa fica na ultima posicão do dbgrid na tela, o ideal que ficasse em primeira, bem acima de modo que usuario
visse as outras em baixo sem ter que pressionar qualquer tecla. Ainda não descobri a solução pra isso. Se alguem poder me ajudar eu agradeço.

Willerson Wagner.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar