发信人: 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]
  | 
 
 
 |