[DUG] MouseWheel and DBGrid in D6
Stefan Mueller
muellers at orcl-toolbox.com
Thu Jun 1 16:34:09 NZST 2006
to get around your problem you could just forget about hiword function and
test like this:
If (Msg.wParam and $80000000)=0
then ..vk_down
else ..vk_up;
using $80000000 instead of just $8000.
Also, another thing - you might want to check if the message is actually
intended for the DBGrid or not (compare msg.hwnd with fbgrid.handle).
If you think about having this wheelsupport in more than just this one
dbgrid then you should probably go for a tdbgrid descendant (overwrite
WinProc to handle it there).
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 Rohit Gupta
Sent: Wednesday, 31 May 2006 10:54 a.m.
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] MouseWheel and DBGrid in D6
Wayne,
I was not following the thread so I dont knwo what you were after. However,
I have had mousewheel working in my apps bt overriding the
DoMouseWheel method with the following code in it
if WheelDelta = 0
then { Nothing }
else if WheelDelta < 0
then DoScroll (True,SB_LINEDOWN)
else DoScroll (True,SB_LINEUP);
Result := True;
I do remember that there were some controls that were not calling this
method. For these, I overrode the parents method and called the
childcomponents DoMouseWheel.
Date sent: Wed, 31 May 2006 09:38:57 +1200
Subject: Re: [DUG] MouseWheel and DBGrid in D6
To: "NZ Borland Developers Group - Delphi List"
<delphi at ns3.123.co.nz>
From: "Wayne Roser" <rr at kristin.school.nz>
Send reply to: NZ Borland Developers Group - Delphi List
<delphi at ns3.123.co.nz>
<mailto:delphi-request at ns3.123.co.nz?subject=unsubscribe>
<mailto:delphi-request at ns3.123.co.nz?subject=subscribe>
[ Double-click this line for list subscription options ]
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
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
Regards
Rohit
======================================================================
CFL - Computer Fanatics Ltd. 21 Barry's Point Road, AKL, New Zealand
PH (649) 489-2280
FX (649) 489-2290
email rohit at cfl.co.nz or r.gupta at xtra.co.nz
======================================================================
_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi
More information about the Delphi
mailing list