发信人: windfire()
整理人: windfire(2000-12-05 19:09:57), 站内信件
|
【 在 zhoubaochen (与狼共舞) 的大作中提到: 】
: 我想在 ListView 的 vsReports 方式下显示一些特定的数据,其效果就象
: Windows 的资源管理器中显示文件的 名称、大小、类型...,但问题出来
: 了,ListView 的第一列的数据可以用
: for i := 0 to 10 do
: .......
给你一个sample是装载CSV文件到ListView:)
列是动态加入,列宽自动设定
包括简单点击column排序的例子
Var
SortDirect:Boolean=True;
SortIndex:Integer;
InSepChar:Char;
OutSepChar:Char;
Procedure LoadCSV(fName:String);
Var
fText:TextFile;
sTemp,sTmp,Buffer,tBuf:String;
ListItem: TListItem;
// ColItem:TListColumns;
iPos,iPos1,iPos2,iCount:Integer;
Begin
try
iCount:=0;
ListItem:=nil;
AssignFile(fText,fName);
ReSet(fText);
MainForm.LVPreview.Items.BeginUpdate;
While Not EOf(fText) Do Begin
ReadLn(fText,Buffer);
tBuf:=Copy(Buffer,1,Length(Buffer));
With MainForm.LVPreview Do Begin
iPos:=AnsiPos(InSepChar,tBuf);
sTemp:=Copy(tBuf,1,iPos-1);
Delete(tBuf,1,iPos);
If iCount=0 Then Begin
Columns.Add;
Columns.Items[Columns.Count-1].Caption:=sTemp;
End
Else Begin
ListItem:=Items.Add;
ListItem.Caption:=sTemp;
End;
Repeat
iPos:=AnsiPos(InSepChar,tBuf);
If iPos=0 Then
sTemp:=tBuf
Else
sTemp:=Copy(tBuf,1,iPos-1);
Delete(tBuf,1,iPos);
If icount=0 Then Begin
Columns.Add;
Columns.Items[Columns.Count-1].Caption:=sTemp;
End
Else Begin
iPos1:=AnsiPos('SMTP:',sTemp);
If iPos10 Then Begin
sTmp:=Copy(sTemp,iPos1,Length(sTemp)-iPos1);
iPos2:=AnsiPos('%',sTmp);
sTemp:=Copy(sTmp,6,iPos2-6);
ListItem.SubItems.Add(sTemp);
End
Else Begin
ListItem.SubItems.Add(sTemp);
End;
End;
Until iPos=0
End;
Inc(iCount);
End;
With MainForm.LVPreview Do Begin
For iCount:=0 To Columns.Count-1 Do Begin
SendMessage(Handle,LVM_SETCOLUMNWIDTH,iCount,LVSCW_AUTOSIZE_US
EHEADER);
End;
End;
MainForm.PanelStatus.Caption:=fName;
finally
MainForm.LVPreview.Items.EndUpdate;
CloseFile(fText);
end;
//
End;
procedure TMainForm.LVPreviewColumnClick(Sender: TObject;
Column: TListColumn);
begin
If SortIndex=Column.Index Then
SortDirect:=Not SortDirect
Else
SortDirect:=SortDirect;
SortIndex:=Column.Index;
LVPreview.CustomSort(@pSort, 0);
end;
function pSort(Item1, Item2: TListItem; ParamSort: integer): integer;
stdcall;
Var
Str1,Str2:String;
I,lStr1,lStr2,iSort:Integer;
begin
If SortIndex=0 Then Begin
Str1:=UpperCase(TListItem(Item1).Caption);
Str1:=UpperCase(TListItem(Item1).Caption);
End
Else Begin
Str1:=UpperCase(TListItem(Item1).SubItems[SortIndex-1]);
Str2:=UpperCase(TListItem(Item2).SubItems[SortIndex-1]);
End;
lStr1:=Length(Str1);
lStr2:=Length(Str2);
If lStr1
-- 读万卷书 行万里路 乘万里风 破万里浪
-============================================-
博览群书:)
个人主页:http://done.163.net
镜像站点:http://www.netease.com/~top
※ 修改:.windfire 于 May 26 17:35:00 修改本文.[FROM: 202.96.151.158] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 203.127.206.132]
|
|