[DUG] Listview problem
Jolyon Smith
jsmith at deltics.co.nz
Fri Feb 25 16:55:37 NZDT 2011
A good spot, but this code doesn't solve it either. It provides a universal
way of handling scrollbar or mousewheel scroll notifications, although a bit
of extra work is then required to discriminate between H vs V scrolling,
but when I added this to my listview class it didn't get called as the
result of keyboard scrolling either.
Couple of supplementary questions:
1. Where do you get TWMNotifyLV from? Why not just use TWMNotify ?
2. Why not use the LVN_BEGINSCROLL/LVN_ENDSCROLL constants, rather
than literals + comments ?
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz] On
Behalf Of Jeremy North
Sent: Friday, 25 February 2011 16:21
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] Listview problem
Don't forget "scrolling" also occurs when you use the arrow keys.
My contribution (just made up then)...
unit ScrollingListView;
interface
uses
Windows, Messages, ComCtrls, CommCtrl, Controls;
type
TJSListView = class(TListView)
private
type
TJSScrollEvent = procedure (Sender: TObject; const BeginScroll:
Boolean) of object;
var
FOnEndScroll: TJSScrollEvent;
FOnBeginScroll: TJSScrollEvent;
protected
procedure DoScroll(const AStart: Boolean); virtual;
procedure CNNotify(var Message: TWMNotifyLV); message CN_NOTIFY;
public
property OnBeginScroll: TJSScrollEvent read FOnBeginScroll write
FOnBeginScroll;
property OnEndScroll: TJSScrollEvent read FOnEndScroll write
FOnEndScroll;
end;
implementation
{ TJSListView }
procedure TJSListView.CNNotify(var Message: TWMNotifyLV);
begin
if Message.NMHdr.code = -180 then // LVM_BEGINSCROLL
begin
DoScroll(True);
end;
if Message.NMHdr.code = -181 then // LVM_ENDSCROLL
begin
DoScroll(False);
end;
inherited;
end;
procedure TJSListView.DoScroll(const AStart: Boolean);
var
LEvent: TJSScrollEvent;
begin
if AStart then
LEvent := OnBeginScroll
else
LEvent := OnEndScroll;
if Assigned(LEvent) then
LEvent(Self, AStart);
end;
end.
On Fri, Feb 25, 2011 at 2:01 PM, David O'Brien <Dave at iccs.co.nz> wrote:
Sorted it thanks, had mixed versions of code in the component. The events do
fire.
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz] On
Behalf Of Jolyon Smith
Sent: Friday, 25 February 2011 3:43 p.m.
To: 'NZ Borland Developers Group - Delphi List'
Subject: Re: [DUG] Listview problem
A WM_VSCROLL message handler works perfectly for me.
However, this will only be sent for scrollbar directed scrolling. To also
handle mousewheel scrolling you will have to implement a WM_MOUSEWHEEL
message handler (and WM_HMOUSEWHEEL if appropriate to your needs). Could
it be mouse scrolling that you are missing ?
I would also note that you will almost certainly want to distinguish between
H and V scrolling, rather than have a "universal" "some sort of scrolling
has occurred" notification. You may also wish to be able to respond both
before and after scrolling has occurred.
In my list view class I have:
TScrollNotification = (
snBeforeHScroll,
snBeforeHWheel,
snBeforeVScroll,
snBeforeWheel,
snHScroll,
snHWheel,
snVScroll,
snWheel
);
procedure TXListview.WMVScroll(var aMessage: TWMVScroll);
begin
DoScroll(snBeforeVScroll);
inherited;
DoScroll(snVScroll);
end;
procedure TXListview.WMHScroll(var aMessage: TWMHScroll);
begin
DoScroll(snBeforeHScroll);
inherited;
DoScroll(snHScroll);
end;
and similar for mousewheel messages of course, where DoScroll:
procedure TXListview.DoScroll(const aNotification: TScrollNotification);
begin
if (aNotification in [snBeforeHScroll, snBeforeVScroll, snBeforeHWheel,
snBeforeWheel]) then
CancelEdit;
if Assigned(fOnScroll) then
fOnScroll(self, aNotification);
end;
i.e. my listview also provides a facility for sub-item editing and when
scrolling occurs, the first thing I do before doing the actual scrolling is
dismiss any sub-item editor that may be active, before then firing the
OnScroll event to allow my application code to respond as it may require.
hth
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz] On
Behalf Of David O'Brien
Sent: Friday, 25 February 2011 15:09
To: NZ Borland Developers Group - Delphi List
Subject: [DUG] Listview problem
I am working on an application (D2009) where I need to know when a TListView
is Scrolled.
I have used Application.OnMessage to look for WM_VScroll messages, but they
do not happen, also have tried creating the below which I thought should
work:
TLVScrollEvent = procedure(Sender: TObject) of object;
TICListView = class(TListView)
private
FOnScroll: TLVScrollEvent;
protected
Procedure WMVScroll( Var Msg: TMessage ); message WM_VSCROLL;
Procedure WMHScroll( Var Msg: TMessage ); message WM_HSCROLL;
property OnScroll: TLVScrollEvent read FOnScroll write FOnscroll ;
end;
procedure Register ;
implementation
procedure Register;
begin
RegisterComponents('Dave', [TICListView]);
end;
procedure TICListView.WMHScroll(var Msg: TMessage);
begin
OnScroll ;
inherited;
end;
procedure TICListView.WMVScroll(var Msg: TMessage);
begin
OnScroll ;
inherited;
end;
which also doesn't fire. I have written a list of all messages fired when
the scrollbar is moved, but there doesn't seem to be anything useful.
Anyone have a solution?
Regards,
Dave.
_______________________________________________
NZ Borland Developers Group - Delphi mailing list
Post: delphi at delphi.org.nz
Admin: http://delphi.org.nz/mailman/listinfo/delphi
Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject:
unsubscribe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20110225/a30324ff/attachment-0001.html
More information about the Delphi
mailing list