[DUG] MouseWheel and DBGrid in D6
Wayne Roser
rr at kristin.school.nz
Wed May 31 09:38:57 NZST 2006
Hi Stefan
Thanks for your explanation.
I tried:
if (HiWord(Msg.wParam) and $8000)=0
then Msg.wParam := VK_UP else Msg.wParam := VK_DOWN;
but got the same error message as previously.
Also tried Msg.wParamHi instead of HiWord() but that appears to be available for a TMessage and
I've got Msg: tagMSG. Should I be using an event that gives me a TMessage instead of the
TApplicationEvents.OnMessage that I am using?
Wayne
Appendix 1: tagMSG in Windows.pas
{ Message structure }
PMsg = ^TMsg;
tagMSG = packed record
hwnd: HWND;
message: UINT;
wParam: WPARAM;
lParam: LPARAM;
time: DWORD;
pt: TPoint;
end;
Appendix 2: TMessage in Messages.pas
{ Generic window message record }
PMessage = ^TMessage;
TMessage = packed record
Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
NZ Borland Developers Group - Delphi List <delphi at ns3.123.co.nz> writes:
>I would try:
>
>I := smallint(msg.paramhi);
>
>or .. my preferred way:
>
>If (Msg.wParamHi and $8000)=0
> then vk_down
> else vk_up;
>
>the problem is with mixing signed and unsigned datatypes. "Word" datatype is
>unsigned (only has positive range) .. while smallint is "signed" (has +/-
>range).
>
>Range of datatype:
> Word = 0.. 65534;
> smallint = -32768..+32767
>
>a value in a signed datatype is negative if the highest bit is set:
>
> +2 = $0002
> +1 = $0001
> 0 = $0000
> -1 = $ffff
> -2 = $fffe
>
>As you can see ... the value of -1 is stored as $ffff in your wparamhi word.
>Assigning $ffff to a smallint will raise a range error as the compiler
>thinks you try to assign $ffff=65535 to it.
>
>Kind Regards,
>Stefan Mueller
>
>
>
>-----Original Message-----
>From: delphi-bounces at ns3.123.co.nz [mailto:delphi-bounces at ns3.123.co.nz] On
>Behalf Of Wayne Roser
>Sent: Tuesday, 30 May 2006 2:47 p.m.
>To: NZ Borland Developers Group - Delphi List
>Subject: [DUG] MouseWheel and DBGrid in D6
>
>I found an article in Delphi.about.com and got this code to fix MouseWheel
>behaviour in a DBGrid:
>
>procedure TForm1.ApplicationEvents1Message (var Msg: TMsg; 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) ; // this line gives me a problem
> if i > 0 then
> Msg.wParam := VK_UP
> else
> Msg.wParam := VK_DOWN;
> Handled := False;
> end;
>end;
>
>So I dropped a TApplicationEvents component on my form and used the code.
>
>I get a problem at the line
> i := HiWord(Msg.wParam) ;
>Msg.wParam is -7864320 and an ERangeError pops up with message 'Range check
>error'
>
>My working version has
> i := Msg.wParam div abs(Msg.wParam);
>in place of the offending line but I'd like to know wassup with the original
>code.
>
>Wayne Roser
>
>_______________________________________________
>Delphi mailing list
>Delphi at ns3.123.co.nz
>http://ns3.123.co.nz/mailman/listinfo/delphi
>
>_______________________________________________
>Delphi mailing list
>Delphi at ns3.123.co.nz
>http://ns3.123.co.nz/mailman/listinfo/delphi
More information about the Delphi
mailing list