[DUG] Listview problem
Jeremy North
jeremy.north at gmail.com
Fri Feb 25 16:21:14 NZDT 2011
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/857b2ac4/attachment.html
More information about the Delphi
mailing list