WM_MOUSEWHEEL - DBGrid Scroll, mas...

Delphi

17/07/2009

Sei que o DBGrid é decencente de TControl. Deveria funcionar a procedure abaixo quando colocado no escopo private do formulário.
...
private
  { Private declarations }
  procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
public
...

Quando não estou com o foco no DBGrid, a procedure executa, porem parece que o DBGrid cancela a ação do scroll do mouse nesta procedure. Venho até vocês para buscar ajuda. Sei que posso utilizar a captura da mensagem responsável pelo movimento do scroll do mouse para tratar. Estou usando o [color=brown:4e214c4f51]Delphi 6[/color:4e214c4f51]. (Aqui na empresa utiliza o D6 e D7, neste sistema utiliza o D6)

Aqui na empresa não posso obstruir os componentes e nem criar sem que tenha vinda um conjunto de ideias suficiente para gerar um componente com um numero de opções adicionais. Portanto, criar um componente que faça isso está fora de cogitação.

O sistema em si tem milhares de exceções, enfim, usar o [color=darkblue:4e214c4f51]ApplicationEvents[/color:4e214c4f51] também não poderia.
Estou num beco onde so posso recorrer a mensagem responsável pelo scroll. [color=blue:4e214c4f51]Preciso capturar o scroll do mouse quando o foco estiver num DBGrid.[/color:4e214c4f51]
Alguem pode me ajudar!?


.lg.

.lg.

Curtidas 0

Respostas

Danielrsanches

Danielrsanches

17/07/2009

o ApplicationEvents não funcionaria ??? pq ??

procedure Tform_principal.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;


seria só colocar uma checagem se o foco está no Grid... (DBGrid1.Focused)....


abraços !!!


GOSTEI 0
.lg.

.lg.

17/07/2009

Como eu falei. O sistema já está grande, para a equipe e ainda mais o meu chefe não permite colocar o [color=darkblue:3e60d17246]applicationEvents[/color:3e60d17246], pois há muitas exceções e mensagens sendo tratadas em muitas partes do sistema. O TApplicationEvents já causou um problema uma vez quando um estagiário aqui resolveu utiliza-lo para gerar um log de exceções. A ideia e a intenção é boa, mas ele eliminou todas as exceções tratadas no sistema. O patrão não gostou. (Não adiantou colocar [color=green:3e60d17246]inherited[/color:3e60d17246])

A questão não é porque não funcionaria, é porque eu não posso usa-lo mesmo. Até gostaria de usa-lo para tratar tudo.

Ps.: ´Seria interessante se existisse um [color=darkblue:3e60d17246]FormEvents[/color:3e60d17246], assim não capturasse tudo da aplicação. Nem todos os forms podem ser declarados na [b:3e60d17246]uses[/b:3e60d17246] do form principal.´

Aprecio sua iniciativa, se souber de mais alguma solução...
Atenciosamente,
.LG.


GOSTEI 0
Woinch

Woinch

17/07/2009

A impressão que passa olhando os fontes do Delphi (não sei se é o caso do Delphi 6, mas no 2007 está assim) é que já existe um evento para tratar essas mensagens: procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; (dê uma olhada no componente TCustomGrid). Já tentou utilizar ele?


GOSTEI 0
Danielrsanches

Danielrsanches

17/07/2009

só uma pergunta:

o evento OnMouseWheel do Form não resolveria seu problema ???


GOSTEI 0
.lg.

.lg.

17/07/2009

A impressão que passa olhando os fontes do Delphi (não sei se é o caso do Delphi 6, mas no 2007 está assim) é que já existe um evento para tratar essas mensagens: procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; (dê uma olhada no componente TCustomGrid). Já tentou utilizar ele?

Implementei, porém, não surtiu nenhum efeito.
só uma pergunta: o evento OnMouseWheel do Form não resolveria seu problema ???

Infelizmente eu já havia tentado!
O problema é que com o DBGrid, esse evento do form não é executado. Parece que o dbgrid faz o foco do form ser perdido para o grid, fazendo o evento não acontecer enquanto o mouse esta sobre o dbgrid. Mas o evento acontece quando deixa a posição do grid.


GOSTEI 0
POSTAR