ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problema no dbgrid
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Seg Ago 06, 2012 4:24 pm    Assunto: Problema no dbgrid Responder com Citação

Boa tarde a todos.
Estou com um pequeno problema no dbgrid: tenho um formulário onde faço a exibição de uma tabela num dbgrid com pouco mais de vinte linhas. Na primeira vez que abro a janela, o dbgrid exibe os registros a partir do primeiro registro da tabela; se posiciono o cursor no décimo registro, fecho a janela e abro o formulário novamente o registro que está na primeira linha é o décimo e não o primeiro. Antes de abrir o formulário, tentei usar o método First no dataset da tabela, mas não funcionou.
O que preciso fazer para exibir o dbgrid a partir do primeiro registro da tabela? Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Ago 06, 2012 4:28 pm    Assunto: Responder com Citação

Boa tarde,

Experimente colocar a execução do método First no evento OnShow do Form.

Espero que ajude.


Editado pela última vez por imex em Qua Mar 08, 2023 10:21 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Seg Ago 06, 2012 5:23 pm    Assunto: Responder com Citação

imex escreveu:
Boa tarde,

Experimente colocar a execução do método First no evento OnShow do Form.

Espero que ajude.

Imex, fiz o que você sugeriu e funcionou em parte. Se eu faço a navegação no dbgrid "no braço", isto é, usando as teclas de seta do teclado, não rola, mas se uso os botões de navegação da barra de navegação associada ao data source da tabela funciona corretamente. Alguma dica? Abraços.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Ago 06, 2012 5:43 pm    Assunto: Responder com Citação

O DBGrid estava com o foco quando você pressionou as teclas de seta?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Seg Ago 06, 2012 6:16 pm    Assunto: Responder com Citação

imex escreveu:
O DBGrid estava com o foco quando você pressionou as teclas de seta?

Sim, estava. Se não estivesse, provavelmente, eu não teria conseguido navegar pela tabela, não é?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Ago 06, 2012 8:27 pm    Assunto: Responder com Citação

Acho que entendi de forma errada o seu post anterior.
No trecho onde você disse "usando as teclas de seta do teclado, não rola", o "não rola" significa que ao abrir o Form novamente, o DataSet não fica posicionado no primeiro registro?
Eu havia entendido que você não estava conseguindo navegar pelos registros exibidos no DBGrid pressionando as teclas de seta do teclado.

Voltando a questão, acho que você vai ter que executar a sua aplicação com debug para descobrir o que está acontecendo, principalmente para ver os códigos que são executados após a execução do método First.
Se não me engano não é necessário, mas experimente acrescentar a execução do método Cancel do DataSet antes do First para fazer um teste.
Acho que o First sempre posiciona o DataSet no primeiro registro, independente da forma como foi feita a navegação pelos registros (teclas, botões ou código).
Só se existia um filtro ativo (propriedade Filter) ao executar o First, e depois da execução do First o filtro foi desativado; neste caso acho que poderia acontecer de não ficar no primeiro registro.

Espero que ajude.Acho que entendi de forma errada o seu post anterior.
No trecho onde você disse
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Ter Ago 07, 2012 11:05 am    Assunto: Responder com Citação

imex escreveu:
Acho que entendi de forma errada o seu post anterior.
No trecho onde você disse "usando as teclas de seta do teclado, não rola", o "não rola" significa que ao abrir o Form novamente, o DataSet não fica posicionado no primeiro registro?
Eu havia entendido que você não estava conseguindo navegar pelos registros exibidos no DBGrid pressionando as teclas de seta do teclado.

Voltando a questão, acho que você vai ter que executar a sua aplicação com debug para descobrir o que está acontecendo, principalmente para ver os códigos que são executados após a execução do método First.
Se não me engano não é necessário, mas experimente acrescentar a execução do método Cancel do DataSet antes do First para fazer um teste.
Acho que o First sempre posiciona o DataSet no primeiro registro, independente da forma como foi feita a navegação pelos registros (teclas, botões ou código).
Só se existia um filtro ativo (propriedade Filter) ao executar o First, e depois da execução do First o filtro foi desativado; neste caso acho que poderia acontecer de não ficar no primeiro registro.

Espero que ajude.Acho que entendi de forma errada o seu post anterior.
No trecho onde você disse

Imex, na verdade o erro foi meu ao usar a expressão "não rola"; eu deveria ter escrito "não funciona", quer dizer, eu navego pelo dbgrid, mas o número do registro não se altera.
Fiz um teste e coloquei um comando ShowMessage para exibir o número do registro ao entrar no formulário: o número exibido está correto, isto é, é exibido o número do registro em que posicionei o cursor do dbgrid antes de fechá-lo, mas a tela não exibe o registro correto. Tentei dar um refresh no dbgrid, mas não funcionou.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Ago 07, 2012 12:09 pm    Assunto: Responder com Citação

Você agora está querendo que o DataSet / DBGrid continuem posicionados no mesmo registro em que estavam antes do Form ser fechado?
Não quer mais que fiquem posicionados no primeiro registro?
Você está fechando o Form mas não a aplicação certo?
Existem outros Form's ou unit's que utilizam esta mesma instância deste DataSet que está ligado com o DBGrid? Se existe, a posição será alterada quando o outro Form ou unit navegar pelo DataSet.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Ter Ago 07, 2012 1:19 pm    Assunto: Responder com Citação

imex escreveu:
Você agora está querendo que o DataSet / DBGrid continuem posicionados no mesmo registro em que estavam antes do Form ser fechado?
Não quer mais que fiquem posicionados no primeiro registro?
Você está fechando o Form mas não a aplicação certo?
Existem outros Form's ou unit's que utilizam esta mesma instância deste DataSet que está ligado com o DBGrid? Se existe, a posição será alterada quando o outro Form ou unit navegar pelo DataSet.

Não, não estou querendo que o dbgrid fique no mesmo registro antes de ser fechado.
Eu estava apenas fazendo um teste para ver o comportamento dele.
Não existem outros forms ou units utilizando esse dataset, o problema ocorre somente nele sem interferencia de outros objetos.
O nó está aí: como é que faço para fazer que o dbgrid sempre exiba a tabela a partir do primeiro registro mesmo se o form foi fechado com o dbgrid posicionado no enésimo registro?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Ago 07, 2012 2:17 pm    Assunto: Responder com Citação

Para posicionar um DataSet no primeiro registro, e consequentemente o DBGrid, deve ser executado o método First.
Experimente executar o código abaixo imediatamente antes e depois do First, e em outros locais depois para tentar descobrir o que está acontecendo:

Código:
ShowMessage('Bof: ' + BoolToStr(dm.DataSet1.Bof, true) +
            sLineBreak +
            'RecNo: ' + IntToStr(dm.DataSet1.RecNo));


Se você não descobrir o problema, acho melhor você dizer qual tipo de DataSet está utilizando para acessar a tabela, postando também os códigos utilizados nos eventos OnShow e OnActivate do Form, e informando quando o DataSet é aberto e fechado.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Qua Ago 08, 2012 10:16 am    Assunto: Responder com Citação

imex escreveu:
Para posicionar um DataSet no primeiro registro, e consequentemente o DBGrid, deve ser executado o método First.
Experimente executar o código abaixo imediatamente antes e depois do First, e em outros locais depois para tentar descobrir o que está acontecendo:

Código:
ShowMessage('Bof: ' + BoolToStr(dm.DataSet1.Bof, true) +
            sLineBreak +
            'RecNo: ' + IntToStr(dm.DataSet1.RecNo));


Se você não descobrir o problema, acho melhor você dizer qual tipo de DataSet está utilizando para acessar a tabela, postando também os códigos utilizados nos eventos OnShow e OnActivate do Form, e informando quando o DataSet é aberto e fechado.

Espero que ajude.

Imex,

Fiz o que você sugeriu e coloquei em outros pontos do código também para ver o que está acontecendo. Notei que se navego pelo dbgrid usando os botões da barra de navegação, o comando ShowMessage exibe os dados corretos, mas se clico dentro do grid para posicionar o cursor em um registro aleatório, o ShowMessage não mostra o número de registro, mas se, em seguida, clico no botão "registro anterior" ou "registro posterior" o ShowMessage exibe o nº do último registro para onde naveguei usando os botões da barra de navegação, quer dizer o nº do registro posicionado antes de clicar sobre o dbgrid.

Na minha aplicação tenho um data module com os seguintes componentes:

SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource.

A propriedade DataSource do dbgrid está associada ao DataSource acima como não poderia deixar de ser.

Estou usando o driver UIB FireBird15.

Depois que enviei esta mensagem, continuei a trabalhar no projeto, cuidando de outras funcionalidades. Só que em determinado momento, ao fazer um teste com a aplicação ocorreu um erro estranho pois uma tabela que faz parte do banco de dados não foi reconhecida. Após verificar a causa do problema, verifiquei que ao abrir as propriedades do SQLConnection havia um dado incorreto; corrigi o problema e testei novamente.

Esse problema foi resolvido, o dbgrid passou a funcionar de forma satisfatória, mas ainda há um pequeno problema: se clico em uma célula e aperto as teclas para cima ou para baixo, as linhas se deslocam, mas o cursor fica parado no mesmo lugar, como se houvesse algo como uma propriedade Scroll Lock = True. Procurei nas propriedades do dbgrid e não achei nada. O que pode ser isso?


Editado pela última vez por jfranco.delphi2 em Qua Ago 08, 2012 11:38 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Ago 08, 2012 11:35 am    Assunto: Responder com Citação

Acho estranho, mas se agora está funcionando...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Qua Ago 08, 2012 11:39 am    Assunto: Responder com Citação

imex escreveu:
Acho estranho, mas se agora está funcionando...

Imex, veja que editei a mensagem passada. Há dados novos lá.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Ago 08, 2012 11:44 am    Assunto: Responder com Citação

Você está utilizando algum código no evento OnDrawColumnCell ou outro do DBGrid?
Ou algum código para as quando teclas de seta para cima e para baixo são pressionadas?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jfranco.delphi2
Novato
Novato


Registrado: Segunda-Feira, 2 de Julho de 2012
Mensagens: 37
Localização: São Paulo / SP

MensagemEnviada: Qua Ago 08, 2012 12:14 pm    Assunto: Responder com Citação

imex escreveu:
Você está utilizando algum código no evento OnDrawColumnCell ou outro do DBGrid?
Ou algum código para as quando teclas de seta para cima e para baixo são pressionadas?

Imex,

Bem lembrado: eu me esqueci que coloquei códigos lá. Embora o dbgrid esteja funcionando, o número do registro não se altera quando uso o teclado. O código que escrevi segue abaixo:

procedure TfrmDVD.DBGridDVDKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
dmDVD.cldtsDVD.Next;
dmDVD.cldtsDVD.RecNo := dmDVD.cldtsDVD.RecNo + 1;
edtNumReg.Text:=IntToStr(dmDVD.cldtsDVD.RecNo);
end;

procedure TfrmDVD.DBGridDVDKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
dmDVD.cldtsDVD.Prior;
dmDVD.cldtsDVD.RecNo := dmDVD.cldtsDVD.RecNo - 1;
edtNumReg.Text:=IntToStr(dmDVD.cldtsDVD.RecNo);
end;

Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB