当前位置:主页>销售管理软件> 列表

listview排序问题

销售管理软件版1楼: delphi 6.0 自带demo中有个Virtual Listview例子

1,在这个例子中,怎样让它能排序(点一下列标头就升序,再点一下就降序)
2,怎样一运行这个例子,是否可以直接在combobox中指定一个盘符,并在listview中显示文件

2楼: 点标题头会自动排序的吧?
直接打开嘛不知道是不是有相应的点击事件,有filename属性的,可以用winexec或者shellexecute的吧 如免费的财务软件

3楼: 待续!!!!

4楼: 问题还没解决,继续啊!!!!!

5楼: 使用Delphi7,就在“Win 3.1”控件组里面的控件就可以实现你说的功能。

6楼: [:)]

销售管理软件版7楼: listview控件本身有个排序的功能,根据具体情况,如果你需要复杂一些的排序的话,可能要自己写个排序方法了

8楼: Virtual Listview里的数据都是存到一个Tlist里的:FIDList,他里面存的指针为PShellItem类型

他使用了ownerdata属性
所以你只需要对这个Tlist排序就行了

下面这个例子你可以做参考:

TDData=record //数据属性
Datas:array of string;
DataExists:boolean;
end;


PDData=^TDData; //Tlist里的指针类型,相当于Virtual Listview里的PShellItem

var //公共变量
SortColumn:integer; //要排序的列
SortType:integer; //排序类型 正排/逆排
DList:Tlist;


function comp(Item1, Item2: Pointer): Integer;
var
s1,s2:Variant;
begin
s1:=PDData(Item1)^.Datas[SortColumn];
s2:=PDData(Item2)^.Datas[SortColumn];

if SortType>0 then
if s1 > s2 then
Result:=1 //返回大于0表示 Item1 是大于 Item2 的
else if s1 < s2 then
Result:= -1 //返回小于0表示 Item1 是小于 Item2 的
else
Result:=0 //返回0表示 Item1 是等于 Item2 的
else
if s1 < s2 then
Result:=1 //返回大于0表示 Item1 是大于 Item2 的
else if s1 > s2 then
Result:= -1 //返回小于0表示 Item1 是小于 Item2 的
else
Result:=0; //返回0表示 Item1 是等于 Item2 的
end;

procedure Tfrm_main.LV_clientColumnClick(Sender: TObject;
Column: TListColumn);
begin
//排序
SortColumn:=1; //你要排序的列,注意显示的列和你的Tlist里指针属性的对应关系
if SortType=0 then
SortType:=1
else
SortType:=-SortType;
ViewColumn[SortColumn][3]:=inttostr(SortType);
Dlist.Sort(@comp);
LV_client.Refresh; //排序完毕后重新显示
end;

9楼: 问题2
procedure TForm1.FileSearch(PathName:string);
var
F : TSearchRec;
Found : Boolean;
begin
ChDir(PathName);
Found := (FindFirst(''*.*'', faAnyFile, F) = 0);
while Found do
begin
if (F.Name = ''.'') or (F.Name = ''..'') then
begin
Found := (FindNext(F) = 0);
Continue;
end;
if (F.Attr and faDirectory)>0 then
begin
Application.ProcessMessages;
end;
if FileExists(GetCurrentDir+''\''+F.Name) then
ListView1.Items.Add.Caption := F.Name ;
Found := (FindNext(F) = 0);
end;
FindClose(F);
end;

10楼: ListView1.CustomSort(nil, Column.Index)

11楼: 在ListView1.ColumnClick(Sender: TObject; Column: TListColumn);事件中写
ListView1.CustomSort(nil, Column.Index)

12楼: hs-kill:
在这里的时候出错:procedure Tfrm_main.LV_clientColumnClick(Sender: TObject;
里面的这句:ViewColumn[SortColumn][3]:=inttostr(SortType);
//提示错误信息,viewcolumn没有定义 如进销存软件破解版

13楼: 哦 ViewColumn是我自己定义的一个2维数组 可以不加这句

我是因为属性里有的列不一定要全部显示到listview里,所以,listview里的列和我的属性不是一一对应的,所以中间用了个数组来记录所有列的排序状态

把这句注释掉就行了

销售管理软件版14楼: ViewColumn:array of array of string; //显示的属性:列名(中文),
// 列名(英文)
// 是否显示 0永远不显示/1显示/2不显示
// 排序 0未排序/1顺序/-1倒序
// 列宽

这是我对ViewColumn里的定义

我因为要控制有些属性是否显示,并且可以随意改变列在listview里的位置,所以做的有点复杂



可以不考虑这个

15楼: hs-kill:
注掉后.可以,但只能对第一列标头排序,当我点击其它列标头时(按其它列标头排序),出错.
出错信息:
Access violation at address 004152A8 in module virtuallistview.exe’,Read of address 0000004 ‘,process stopped

16楼: ? -_-!。。。在哪句出的错?

SortColumn:=1; //你要排序的列,注意显示的列和你的Tlist里指针属性的对应关系
这个,你该成对应的列,不过你要注意,实际你排序的是Tlist,而Tlist排序是根据SortColumn来找具体对哪个属性的的

你按某列的时候要找到该列对应的Tlist里的具体哪个属性
我这里的SortColumn就是为了把当前按的列的标号转和Tlist里的属性对应起来

17楼: hs-kill:
这个Virtual Listview例子中的列标头
分别是name size type modified attribute
我想要按modified排序,于是按modified列标头(并把SortColumn:=4),但是出错.
出错信息:
Access violation at address 004152A8 in module virtuallistview.exe’,Read of address 0000004 ‘,process stopped

18楼: 你是直接改到Virtual Listview里的?
那我这个不能直接用啊

我这里是把listview列标号对应到指针里的数组标号里了,而Virtual Listview用的指针不是数组,你要自己另外写一个对应

不一定按我给的例子写,反正排序的根本原理就是对Tlist排序,至于如何把列和Tlist里的指针属性对应,应该是你自己的程序设计的问题