`
javasogo
  • 浏览: 1845308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ListView扩展

阅读更多

在论坛上看一个贴,问能不能在ListView的列表头移动时响应事件,随翻查了ListView的事件,发现竟没有。于是自己动手来写一个。

其实要响应这个事件也不算难,关键是了解ListView的结构,ListView的列头其实也是一个窗口,不信用Spy看一下。我们只要获得了这个头的句柄,那它的一举一动便逃不过程序的眼睛了(^ ^)。

获得了句柄,再用一个新的窗口过程代替旧的窗口过程,当然这个新的窗口过程最后得成一个类的成员,这个用DelphiMakeObjectInstance可以轻松完成。这样就可以在新的窗口过程中操纵列表头。

理论已经具备,接下来就是动手,想了一想,该功能还是挺常用的,不如扩展到控件去,造福他人,岂不是快哉!

于是就有了下面的控件,可以装上去,用起来更方便,OnHeadMoved事件,处理这个事件即可。不过先声明,这个事件可是等你移动完成之后才触发的:

unit ListviewEx;

{*******************************************

* brief: 一个可以响应列表头移动事件的ListView

* autor: linzhenqun

* date: <chsdate w:st="on" isrocdate="False" islunardate="False" day="14" month="8" year="2005">2005-8-14</chsdate>

* email: linzhengqun@163.com

* blog: http://blog.csdn.net/linzhengqun

********************************************}

interface

uses

Windows, Messages, SysUtils, Classes, Controls, ComCtrls, CommCtrl;

type

TListviewEx = class(TListView)

private

FHeaderHandle: THandle;

FHeaderInst: Pointer;

FOldHeaderProc: Pointer;

FOnHeaderMoved: TNotifyEvent;

FDown: Boolean;

FColsWidth: array of Integer;

procedure SaveColumnsWidth;

function ColumnsWidthChange: Boolean;

protected

procedure CreateWnd; override;

procedure NewHeaderProc(var Message: TMessage);

public

destructor Destroy; override;

published

property OnHeadMoved: TNotifyEvent read FOnHeaderMoved

write FOnHeaderMoved;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Samples', [TListviewEx]);

end;

{ TListviewEx }

function TListviewEx.ColumnsWidthChange: Boolean;

var

i, C: Integer;

begin

Result := False;

if Length(FColsWidth) > Columns.Count then

C := Columns.Count

else

C := Length(FColsWidth);

for i := 0 to C - 1 do

if FColsWidth[i] <> Columns[i].Width then

begin

Result := True;

break;

end;

end;

procedure TListviewEx.CreateWnd;

begin

inherited;

FDown := False;

FHeaderHandle := ListView_GetHeader(Handle);

if FHeaderHandle <> 0 then

begin

FHeaderInst := MakeObjectInstance(NewHeaderProc);

FOldHeaderProc := Pointer(GetWindowLong(FHeaderHandle, GWL_WNDPROC));

SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FHeaderInst));

end;

end;

destructor TListviewEx.Destroy;

begin

if FHeaderHandle <> 0 then

begin

SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FOldHeaderProc));

FreeObjectInstance(FHeaderInst);

end;

inherited;

end;

procedure TListviewEx.NewHeaderProc(var Message: TMessage);

begin

Message.Result := CallWindowProc(FOldHeaderProc, FHeaderHandle,

Message.Msg, Message.WPARAM, Message.LPARAM);

if not (csDesigning in ComponentState) then

if Message.Msg = WM_LBUTTONDOWN then

begin

FDown := True;

SaveColumnsWidth;

end

else if Message.Msg = WM_LBUTTONUP then

begin

if FDown and ColumnsWidthChange then

if Assigned(FOnHeaderMoved) then

FOnHeaderMoved(Self);

FDown := False;

end

else if Message.Msg = WM_LBUTTONDBLCLK then

begin

if ColumnsWidthChange then

if Assigned(FOnHeaderMoved) then

FOnHeaderMoved(Self);

FDown := False;

end;

end;

procedure TListviewEx.SaveColumnsWidth;

var

i: Integer;

begin

FColsWidth := nil;

SetLength(FColsWidth, Columns.Count);

for i:= 0 to Columns.Count - 1 do

FColsWidth[i] := Columns[i].Width;

end;

end.

分享到:
评论

相关推荐

    xe8 移动开发之listview扩展

    标题提到的"xe8 移动开发之listview扩展"着重强调了对原生ListView的增强和优化,使其更适合于移动设备的界面设计和用户体验。 ListView控件的基础功能包括显示多项数据,每一项可以包含多个子项(SubItems),并且...

    WinForm多个listview 扩展控件

    2. **ListView扩展控件** ListView控件允许展示数据的多种视图,如列表视图、小图标视图、大图标视图和详细信息视图。扩展后的ListView控件可能包含以下特性: - 多列排序:用户可以通过点击列头进行排序。 - ...

    Delphi 10_delphilistview_ListView扩展源码_ListView_源码.zip

    这个名为"Delphi 10_delphilistview_ListView扩展源码_ListView_源码.zip"的压缩包文件包含了一些针对Delphi 10的ListView组件的扩展源码,这些源码可能提供了对ListView功能的增强或定制,以满足开发者在实际项目中...

    Delphi 10_delphilistview_ListView扩展源码_ListView_源码.rar

    本资源"Delphi 10_delphilistview_ListView扩展源码_ListView_源码.rar"提供了对Delphi 10中的ListView组件的扩展源码,旨在增强其功能和定制性。 ListView组件的基本功能包括: 1. 多列:ListView可以展示多列数据...

    ListView扩展源码

    "ListView扩展源码"通常指的是开发者为了增强ListView的功能或者优化其性能,对其进行的自定义和改进。这个压缩包文件名"BlurStickyHeaderListView-master"暗示了我们可能在探讨一个具有模糊背景效果(Blur)和粘性...

    listview扩展控件

    本项目名为“listview扩展控件”,显然,它是对标准ListView控件功能的增强和扩展,旨在提供更加丰富和多样化的显示效果。 首先,我们来了解一下ListView的基本特性。ListView控件通常用于显示一个项目的列表,每个...

    Android ListView扩展(图片+文字)

    通过以上步骤,我们就可以在Android Studio中实现一个具有图片和文字的扩展ListView。这只是一个基础示例,实际应用中还可以根据需求添加更多功能,如头尾视图、侧滑删除、动画效果等。记得在开发过程中,遵循...

    控件重绘 C# WinForm控件美化扩展系列之ListView

    本教程将聚焦于“控件重绘”这一主题,特别是针对ListView控件的美化和扩展。控件重绘允许开发者自定义控件的显示样式,以实现更丰富、更具吸引力的视觉效果。 ListView控件是Windows Forms中最常用的控件之一,它...

    ListView功能扩展

    本项目“ListView功能扩展”旨在提供一个增强版的ListView控件,名为EXListView,它具备了更多的特性和定制选项。 1. 多视图模式:EXListView扩展了默认的视图模式,除了列表视图、小图标视图和大图标视图,还增加...

    VB LISTVIEW空间扩展

    在提供的压缩包文件"www.NewXing.com"中,可能包含了关于VB ListView扩展使用的示例代码。通过研究这些代码,你可以更深入地了解如何在实际项目中实现上述技巧,优化ListView的性能和功能。记住,实践是最好的老师,...

    ListView扩展,Expandlistview嵌套GridView

    有类似美团上的美食购物分类,有类似QQ分组的,有listview里面嵌套gridview的。几乎项目中个能用到的二级菜单这里都有,而且界面还是比较简洁的,很实用,又得直接可以在项目中应用。项目代码量也不是很多,而且都有...

    超高速度显示最漂亮的ListView增强美化版(VB)

    ListView控件在Windows应用程序开发中扮演着重要角色,它用于展示数据列表,具有灵活的布局和多种视图模式。在VB(Visual Basic)环境中,ListView的美化和性能优化是开发者经常面临的问题。"超高速度显示最漂亮的...

    扩展的自定义listview控件[ExpandListview.rar]-精品源代码

    本案例中的"扩展的自定义listview控件"是一个专门针对ListView控件进行增强和定制的源代码,可以帮助开发者创建更加复杂和功能丰富的用户界面。 首先,我们看到压缩包中的文件主要是Visual Basic 6(VB6)的工程...

    带CheckBox的listView 支持多选,全选,反选

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。在许多场景下,我们需要在ListView中加入复选框(CheckBox),实现多选、全选和反选的功能,例如在选择联系人、设置菜单等场景。这个“带...

    Expandable-Listview:android listview 扩展,支持父子关系数据结构,可折叠,伸展

    ==== ListView 扩展,使列表视图可扩展。 ##Feature 如果你有父子关系结构数据,那么你可以让 listview 用这个扩展来显式显示它。这个扩展使用的示例包含在这个 repo 中,这是一些截图:##Screenshots 支持: :

    listView上下拖动换位置

    2. **DragSortListView**:这个自定义的ListView扩展了原生的ListView,增加了拖放排序的特性。它会调用DragSortController来处理触摸事件,并在拖放过程中更新视图。 3. **ItemTouchHelper**:虽然这个名称在官方...

    ListView侧拉第三方JAR包

    SwipeListView是一个强大的ListView扩展,它提供了滑动显示更多操作的功能。用户可以通过左右滑动ListView的项来显示额外的内容或执行特定的操作,如删除、收藏等。这个特性在许多应用中都很常见,例如邮件应用中的...

    ListView可扩展例程

    本示例主要探讨如何在单文档界面(SDI)应用中实现ListView的可扩展性,涵盖多种表现形式以及数据的添加方法。以下是关于ListView可扩展性的详细解释和实践要点。 1. **ListView的基本概念** - ListView控件是MFC...

    Android自定义可扩展ListView

    本文将深入探讨如何在Android中创建一个自定义的可扩展ListView。 首先,我们要理解可扩展ListView的基本概念。这种ListView允许子项(items)展开或折叠,通常用于展示具有层级结构的数据。例如,我们可能有一个...

Global site tag (gtag.js) - Google Analytics