ちょっと面白い記述になっています。普通に書くとこうなりますが、
var i, Cnt: Integer; begin SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, Cnt, 0); if (WheelDelta > 0) then begin if (ssCtrl in Shift) or (Cnt = -1) then Sendmessage(Self.Handle, WM_VSCROLL, SB_PAGEDOWN, 0) else begin for i:=1 to Cnt do Sendmessage(Self.Handle, VSCROLL, SB_LINEDOWN, 0); end; end else begin if (ssCtrl in Shift) or (Cnt = -1) then Sendmessage(Self.Handle, WM_VSCROLL, SB_PAGEUP, 0) else begin for i:=1 to Cnt do Sendmessage(Self.Handle,WM_VSCROLL, SB_LINEUP, 0); end; end; end;
こうなっています。
const StateNumber: array [Boolean, Boolean] of WPARAM = ((SB_LINEDOWN, SB_PAGEDOWN),(SB_LINEUP, SB_PAGEUP)); var i, Cnt: Integer; OP: WPARAM; begin SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, Cnt, 0); OP := StateNumber[(WheelDelta > 0), (ssCtrl in Shift) or (Cnt = -1)]; case OP of SB_LINEUP, SB_LINEDOWN: for i:=1 to Cnt do Sendmessage(Self.Handle, WM_VSCROLL, OP, 0); SB_PAGEUP, SB_PAGEDOWN: Sendmessage(Self.Handle, WM_VSCROLL, OP, 0) end; end;
この書き方を知らない方には???なコードかもしれませんね。
なお、SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, Cnt, 0); はホイールがページスクロールの場合には Cnt に -1 が返り、行スクロールの場合には設定されたスクロール行数が返ります。
See Also:
[Delphi と 三項演算子 (条件演算子) (Delphi Forum)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=270
[SystemParametersInfo function (Microsoft)]
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947%28v=vs.85%29.aspx
|