Fórum Colocar o DBGrid na primeira posição #303791
30/11/2005
0
Edilcimar
Curtir tópico
+ 0Posts
07/12/2005
Marco Salles
Gostei + 0
07/12/2005
Edilcimar
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);
Gostei + 0
07/12/2005
Massuda
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.
Gostei + 0
08/12/2005
Edilcimar
Gostei + 0
08/12/2005
Marco Salles
Edicilmar Citou:
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
Gostei + 0
08/12/2005
Edilcimar
é 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)
Gostei + 0
08/12/2005
Edilcimar
Gostei + 0
08/12/2005
Edilcimar
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!
Gostei + 0
08/12/2005
Marco Salles
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
Melhor ainda... :P :P
Gostei + 0
08/12/2005
Marco Salles
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] ???? :?: :?: :?:
Gostei + 0
08/12/2005
Edilcimar
Gostei + 0
11/12/2005
Caninha51
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!![:)]
Gostei + 0
27/06/2015
Willerson Santos
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)