您的当前位置:我要购书网>在线阅读>Delphi/Perl

listview控件 -- 改良版,带箭头自动排序

来源:互联网  作者:我要购书网信息中心  发布:我要购物网收集整理  发布时间:2006-8-31 人气:208

{似乎很多人都需要这个。Delphi自带的listview无法在排序时自动加上箭头。如果设置Column[I].ImageIndex = a,箭头会出现在文字左边,需要修改ComCtrls.pas才能使图片出现在右边。并且TListItem的Caption项会自动加上图标,没有图标则留出一个空白,非常难看。这个修改过的控件解决了这些问题。这个控件需要从资源文件中装载两个箭头图片,你需要自己制作。或者下载SJListview,里面有SJListview.res资源文件。}{*******************************************************}{ }{ ComponentName : SJListView }{ Version : 2.2a }{ Author : SJ(小笨苯) }{ E_Mail : taibenle@163.com }{ Last Modified : 2002-5-15 }{ History : }{ 修改 : 2004-12-25 afan }{ }{*******************************************************}unit SJListView;interfaceuses Windows, Messages, SysUtils, Classes, ComCtrls, Commctrl, WinSock;type TListView2 = class(TListView) private { Private declarations } ArrowUp : HBitMap; ArrowDown : HBitMap; CurColumn: integer; vHandle: HWND; procedure SetHeaderBitmap(Col: integer);//画Header protected { Protected declarations } //procedure WndProc(var Msg : TMessage); override; public { Public declarations } constructor Create(AOwner: TComponent); override; procedure CreateWnd; override; destructor Destroy; override; published { Published declarations } end;type TMainListview = class(TListview2) protected procedure WndProc(var Msg: TMessage); override; end;type TMyListview = class(TListview2) protected procedure WndProc(var Msg: TMessage); override; end;procedure Register;implementation{R SJListView.res}{ 通用排序函数 }Function CustomSortProc( Item1, Item2 : TListItem; lParam : LongInt : Integer; stdcall;begin Result:=0; if (Item1=nil)or(Item2=nil)then exit; if lParam = 0 then result := CompareText(Item1.Caption,Item2.Caption else if lparam > 0 then result := CompareText(Item1.SubItems[Lparam-1],Item2.SubItems[Lparam-1]); Result:= Result * Item1.ListView.Column[lParam].Tag ;end;//验证合法ip地址function ValidateIP(const ip:string):boolean;var i,dotnum: byte;begin Result:=false; if ip = '' then exit; dotnum:= 0; for I:=1 to Length(ip) do if ip[I] = '.' then inc(dotnum); if dotnum <> 3 then exit; if (ip='255.255.255.255')or(inet_Addr(pchar(ip))<>Inaddr_none) then result:=true else result:=false;end;function CustomSortProcMain( Item1, Item2 : TListItem; lParam : LongInt : Integer; stdcall;var ip1,ip2:cardinal; s1,s2:String;begin Result:=0; if (Item1=nil)or(Item2=nil)then exit; if lParam = 0 then result := CompareText(Item1.Caption,Item2.Caption else if lparam =2 then begin s1:=Item1.SubItems[1]; s2:=Item2.SubItems[1]; if ValidateIP(s1) and ValidateIP(s2) then begin ip1:=htonl(inet_addr(pchar(s1))); ip2:=htonl(inet_addr(pchar(s2))); if ip1 > Ip2 then Result:= 1 else if ip1 = ip2 then result:=0 else result:=-1; end else result:= CompareText(s1,s2); end else result := CompareText(Item1.SubItems[Lparam-1],Item2.SubItems[Lparam-1]) ; Result:= Result * Item1.ListView.Column[lParam].Tag ;end;constructor TListview2.Create(AOwner: TComponent);begin inherited Create(AOwner); ArrowUp := LoadImage(hInstance, 'ArrowUp', IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); ArrowDown := LoadImage(hInstance, 'ArrowDown', IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); //SetHeaderBitmap;end;procedure TListview2.CreateWnd;begin inherited CreateWnd; if HandleAllocated then HandleNeeded; vHandle := ListView_GetHeader(Handle);end;destructor TListview2.Destroy;begin DeleteObject(ArrowUp); DeleteObject(ArrowDown); inherited Destroy;end;procedure TListview2.SetHeaderBitmap(Col: integer);var HdItem : THdItem;begin FillChar(HdItem, SizeOf(HdItem), #0); HdItem.Mask := HDI_FORMAT; Header_GetItem(vHandle, Col, HdItem); HdItem.Mask := HDI_BITMAP or HDI_FORMAT; if Column[Col].Tag = -1 then begin { 反向 } HdItem.fmt := HdItem.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT; HdItem.hbm := LoadImage(hInstance, 'ArrowDown', IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); end else if Column[Col].Tag = 1 then begin { 正向 } HdItem.fmt := HdItem.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT; HdItem.hbm := LoadImage(hInstance, 'ArrowUp', IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); end else if Column[Col].Tag = 0 then begin{ 消除箭头 } HdItem.fmt := HdItem.fmt and not (HDF_BITMAP or HDF_BITMAP_ON_RIGHT); HdItem.hbm := 0; end; Header_SetItem(vHandle, Col, HdItem);end;(*procedure TListview2.WndProc(var Msg : TMessage);var pHD : PHDNotify; i: integer;begin inherited WndProc(Msg); if Msg.Msg = WM_NOTIFY then //如果截获的消息是WM_NOTIFY begin pHD := PHDNotify(Msg.LParam); HwndFrom:= pHD.Hdr.hwndFrom ; if (hwndFrom = vHandle) and (vHandle <> 0) then begin wmCode:= 0; Case pHD.HDr.code of { 如果是点击Header } HDN_ITEMCLICK,HDN_ITEMCLICKW: begin CurColumn := Columns.Items[pHD.item].Index; wmCode:= pHD.Hdr.code ; { 做标记,正向或反向排序 } for i:= 0 to Columns.Count - 1 do begin if I = CurColumn then begin if Column[I].Tag = 0 then Column[I].Tag := 1 else Column[I].Tag := -1 * Column[I].Tag ; SetHeaderBitmap(I); end else begin if Column[I].Tag <> 0 then begin Column[I].Tag := 0; SetHeaderBitmap(I); end; end; end; {of FOR} { 排序 } //CustomSort(@CustomSortProc, CurColumn); end; { 拖动改变宽度时,ColumnItem <> 原来排序的列 } HDN_ENDTRACK,HDN_ENDTRACKW: Begin CurColumn:= Columns.Items[pHD.item].Index; if Columns[CurColumn].Tag <> 0 then SetHeaderBitmap(CurColumn); end; end; end; end;end;*)Procedure TMyListview.WndProc(var Msg: TMessage);var pHD : PHDNotify; i: integer;begin inherited WndProc(Msg); if Msg.Msg = WM_NOTIFY then //如果截获的消息是WM_NOTIFY begin pHD := PHDNotify(Msg.LParam); if (pHD.Hdr.hwndFrom = vHandle) and (vHandle <> 0) then begin Case pHD.HDr.code of { 如果是点击Header } HDN_ITEMCLICK,HDN_ITEMCLICKW: begin CurColumn := Columns.Items[pHD.item].Index; { 做标记,正向或反向排序 } for i:= 0 to Columns.Count - 1 do begin if I = CurColumn then begin if Column[I].Tag = 0 then Column[I].Tag := 1 else Column[I].Tag := -1 * Column[I].Tag ; SetHeaderBitmap(I); end else begin if Column[I].Tag <> 0 then begin Column[I].Tag := 0; SetHeaderBitmap(I); end; end; end; {of FOR} { 排序 } CustomSort(@CustomSortProc, CurColumn); end; { 拖动改变宽度时,ColumnItem <> 原来排序的列 } HDN_ENDTRACK,HDN_ENDTRACKW: Begin CurColumn:= Columns.Items[pHD.item].Index; if Columns[CurColumn].Tag <> 0 then SetHeaderBitmap(CurColumn); end; end; end; end;end;procedure TMainListview.WndProc(var Msg: TMessage);var pHD : PHDNotify; i: integer;begin inherited WndProc(Msg); if Msg.Msg = WM_NOTIFY then //如果截获的消息是WM_NOTIFY begin pHD := PHDNotify(Msg.LParam); if (pHD.Hdr.hwndFrom = vHandle) and (vHandle <> 0) then begin Case pHD.HDr.code of { 如果是点击Header } HDN_ITEMCLICK,HDN_ITEMCLICKW: begin CurColumn := Columns.Items[pHD.item].Index; { 做标记,正向或反向排序 } for i:= 0 to Columns.Count - 1 do begin if I = CurColumn then begin if Column[I].Tag = 0 then Column[I].Tag := 1 else Column[I].Tag := -1 * Column[I].Tag ; SetHeaderBitmap(I); end else begin if Column[I].Tag <> 0 then begin Column[I].Tag := 0; SetHeaderBitmap(I); end; end; end; {of FOR} { 排序 } CustomSort(@CustomSortProcMain, CurColumn); end; { 拖动改变宽度时,ColumnItem <> 原来排序的列 } HDN_ENDTRACK,HDN_ENDTRACKW: Begin CurColumn:= Columns.Items[pHD.item].Index; if Columns[CurColumn].Tag <> 0 then SetHeaderBitmap(CurColumn); end; end; end; end;end;procedure Register;begin RegisterComponents('Win32', [TMainListView, TMyListview]);end;end.
相关文章
· linux下tomcat的安装
· listview标题平面显示(vb)
· listview控件搜索函数(vb)
· listview 操作
· listbox多选状态下的自拖与互拖
· listview控件 -- 改良版,带箭头自动排序
· listcontrol的使用
· linux下配置jboss自动启动
· linux网络服务软件安装备忘录 ver 0.3
· listview custom draw - 不同行(列..
热点文章
%>
· creating user controls
· 提高fastreplace速度 (fstrrep.pas)
· asc ii 完整码表及简介
· 自动生成拼音(汉字反查到拼音)
· sql2000无法安装的解决办法
· 浏览器集成教学 自定义浏览器
· vc++技术内幕(第四版)笔记(第7章)
· mysql5.0中文乱码解决方案
· sql server日期计算
· vc下利用ado连接access数据库
 淘宝旺旺:我要购书网上书店『图书目录
本购书中心地址: 杭州市延安路111号清波商厦南楼D座(总部) 上海市闸北区老沪太路网上购书中心(沪部),  邮编:310002
电子邮件:books@51goushu.com  经营许可证编号:沪ICP备06038574号
版权所有 2003-2008 © All Rights Reserved .购书网