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

Scroll Não Funciona Bem No Dbgrid E Dblookupcombobox


Guest - rochajl -

Pergunta

Guest - rochajl -

Olá. Usei a dica para scroll em dbgrid, e ela funcionou parcialmente. Em meu form o foco do dbgrid, é mostrado nos edit's, quando rolo o scroll pela primeira vez, ele se move para baixo, mas os valores dos edit's não mudam, na segunda rolagem, ele novamente se move para baixo, e os edit's recebem o valor da linha de cima do dbgrid, assim sucessivamente, tanto de baixo para cima, quanto de cima para baixo. Alguém poderia me ajudar?

Até mais.

Segue código da abertura do form:

procedure TfrmVLENTR.EdtRecebeDados(Sender: TObject);

begin

dm.IBQSelVlentrega.Open ;

frmVLENTR.EdtCodVlEntr.Text:=dbgrid1.DataSource.DataSet.Fields[0].AsString;

frmVLENTR.EdtEntrega.Text:=dbgrid1.DataSource.DataSet.Fields[1].AsString;

frmVLENTR.EdtValor.Text:=FormatFloat('R$ ###,###,##0.00',dbgrid1.DataSource.DataSet.Fields[2].AsFloat) ;

end;

procedure TfrmVLENTR.FormActivate(Sender: TObject);

begin

operacao:= 0 ;

EdtRecebeDados(Sender);

dbgrid1.DataSource.DataSet.First;

//Ativar/Desativar campos//

btnins.Enabled:=true;

btnalt.Enabled:=true;

btncan.Enabled:=true;

btngra.Enabled:=false;

btnrev.Enabled:=false;

btnsair.Enabled:=true;

dbnavigator1.Enabled:=true;

frmVLENTR.DBGrid1.Enabled := true;

DBGrid1. SetFocus ;

end;

Código para utilitazação do scroll:

procedure TFrmPrincipal.ApplicationEvents1Message(var Msg: tagMSG;

var Handled: Boolean);

var

i: SmallInt;

begin

if Msg.message = WM_MOUSEWHEEL then

begin

Msg.message := WM_KEYDOWN;

Msg.lParam := 0;

i := HiWord(Msg.wParam) ;

if i > 0 then

Msg.wParam := VK_UP

else

Msg.wParam := VK_DOWN;

Handled := False;

end;

end;

O problema acima também está na DBLookupComboBox, quando uso o scroll do mouse, o keyValue do DBLookupComboBox recebe um valor diferente do mostrado no campo.

Se alguém puder ajudar, agradeço.

Até mais.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
Olá. Usei a dica para scroll em dbgrid, e ela funcionou parcialmente. Em meu form o foco do dbgrid, é mostrado nos edit's, quando rolo o scroll pela primeira vez, ele se move para baixo, mas os valores dos edit's não mudam, na segunda rolagem, ele novamente se move para baixo, e os edit's recebem o valor da linha de cima do dbgrid, assim sucessivamente, tanto de baixo para cima, quanto de cima para baixo. Alguém poderia me ajudar?

Até mais.

Testei o código para utilitazação do scroll e está funcionando corretamente com o DBGrid, ou seja, o foco da linha se modifica corretamente.

Acredito que seja uma questão de atualizar seus edit's adequadamente. A dica funcionará 100% se você estiver utilizando componentes dataware (os TDB... da paleta Data Controls), isto porque são linkados ao dadaset e refletem qualquer posicionamento no mesmo. Assim, a sugestão que tenho é que você simule esta situação utilizando um DataSource em seu form, que apontará para o mesmo dataset que DBGrid, de tal modo que através do seu evento OnDataChange você aciona o procedimento que atualiza os edit's.

Sugestão:

1) adicione um TDataSource ao form frmVLENTR, vamos chamá-lo de DSSelLocal;

2) configure a propriedade DataSet com o mesmo valor utilizado nesta propriedade do DataSource ligado ao DBGrid. Voce pode fazer isso em design-time ou em run-time adicionando no evento OnActivate a linha: DSSelLocal.DataSet := DBGrid1.DataSource.DataSet;

3) no evento OnDataChange do DSSelLocal você adiciona a chamada ao seu procedimento EdtRecebeDados;

procedure TfrmVLENTR.DSSelLocalDataChange(Sender: TObject; Field: TField);
begin
  EdtRecebeDados(Sender);
end;

Com isto, qualquer movimentação no DBGrid se refletirá nos edit's. Caso o dataset associado ao seu DBGrid1 esteja em um datamodule, talvez você tenha que testar se ele está alocado (if Assigned(datamodule) then) antes de chamar EdtRecebeDados.

Comentários:

Se EdtRecebeDados é um procedimento apenas para inicializar os dados dos edit's:

- não há necessidade de definir o parâmtro Sender, principalmente porque não é utilizado para nada;

- se IBQSelVlentrega é aberto na atualização dos edit's, aparentemente ele retorna algum tipo de totalização para a linha selecionada, então ele não deveria ser fechado antes da abertura? Ou talvez ele seja aberto apeanas uma vez, e então, provavelmente devesse ser aberto em outro ponto que não a cada movimentação no grid.

Quando você acessa os componentes dentro de seu próprio form ou datamódule, não há necessidade de referenciá-lo agregando o nome do mesmo. Por ex., a linha em EdtRecebeDados:

frmVLENTR.EdtCodVlEntr.Text:=dbgrid1.DataSource.DataSet.Fields[0].AsString;

poderia ficar simplesmente:

EdtCodVlEntr.Text:=dbgrid1.DataSource.DataSet.Fields[0].AsString;

O problema acima também está na DBLookupComboBox, quando uso o scroll do mouse, o keyValue do DBLookupComboBox recebe um valor diferente do mostrado no campo.
Voce não mostrou onde atribui um valor a KeyValue, mas se for utilizar o procedimento acima citado, provavelmente funcionará.

Abraços

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,3k
    • Posts
      652,3k
×
×
  • Criar Novo...