delphi 7中Tlistview的使用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

今天刚注册了,  先发一篇文章试试, 照朋友的话说, 我是稀缺人才, 现在没有人用delphi了, anyway, 把自己多年的一点经验share一下.

如果不使用第3方空间的话, delphi 中的tlistview是个好东西, , 可以作很多事, 我用的最多的是在viewstyle=vsReport的状态下, 下面把握自己做的一些通用的function share一下

1.从一个listview 移动到另一个中, 即选择操作

//如果checked=true,则move item 为checked, 否则默认为selected item
//返回被move的item的caption的组合, 格式为'caption,caption,caption'
function MoveLvItem(lvOrig,lvDest:TListView;checked:boolean=false):string;
var i,j:integer;
    ItemList:TObjectlist;
    listitem,newlistitem:TListItem;
begin
  ItemList:=TObjectList.Create(false);
  //获取所有需要移动的item
  if not checked then
  begin
    for i:=lvOrig.Selected.Index to lvOrig.Items.Count-1 do
    begin
      if lvOrig.Items[i].Selected then ItemList.Add(lvOrig.Items[i]);
    end;
  end
  else
  begin
    for i:=0 to lvOrig.Items.Count-1 do
    begin
      if lvOrig.Items[i].Checked then ItemList.Add(lvOrig.Items[i]);
    end;
  end;
  //在lvdest创建需要move的item的copy
  for i:=0 to ItemList.Count-1 do
  begin
    listitem:=ItemList[i] as TListItem;
    newlistitem:=lvDest.Items.Add;
    newlistitem.Caption:=listitem.Caption;
    for j:=0 to listitem.SubItems.Count-1 do
    begin
      newlistitem.SubItems.Add(listitem.SubItems[j]);
    end;
  end;
  //记录caption list 同时删除
  Result:=(ItemList[0] as TListItem).Caption;
  (ItemList[0] as TListItem).Delete;
  for i:=1 to ItemList.Count-1 do
  begin
    Result:=Result+','+(ItemList[i] as TListItem).Caption;
    (ItemList[i] as TListItem).Delete;
  end;
  ItemList.Free;
end;

2.  对Tlistview 的column进行排序,

下面的function CompareItem是能够被tlistview.customsort直接作为参数调用的, 也可以通过tlistview.oncompare来调用.在这个function后面会分别说一下两种方法, 这个function会自动判断数字(数字中可以带千分位)或string来进行排序,并且根据lParamSort正负决定升序还是降序

function CompareItem(Item1, Item2: TListItem;
  lParamSort: Integer):Integer; stdcall;
var CompItem1,compItem2:string;
    item1Num,item2Num:boolean;
    Date1,date2:TDate;
    F1,F2:real;
    ColIndex,gsort:Integer;
begin
    f1:=0;
    f2:=0;
    gsort:=1;
    if lParamSort<0 then
    begin
      gSort:=-gSort;
      ColIndex:=-lParamSort;
    end
    else
    begin
      ColIndex:=lParamSort;
    end;
    CompareItem:=0;
    item1Num:=true;
    item2Num:=true;
    if ColIndex=1 then
    begin
        CompItem1:=item1.Caption;
        compItem2:=item2.Caption;
    end
    else
    begin
        CompItem1:=item1.SubItems[ColIndex-2];
        compItem2:=item2.SubItems[ColIndex-2];
    end;
    try
        date1:=StrToDate(CompItem1);
        date2:=StrToDate(CompItem2);
        if date1>date2 then CompareItem:=gSort;
        if date1=date2 then CompareItem:=0;
        if date1<date2 then CompareItem:=-gSort;
    except
        on EConvertError do
        begin
          try
              F1:=strtofloat(StringReplace(CompItem1,',','',[rfReplaceAll]));
          except
              item1Num:=false;
          end;
          try
              F2:=strtofloat(StringReplace(CompItem2,',','',[rfReplaceAll]));
          except
              item2Num:=false;
          end;
          if (item1Num and item2Num)  then
          begin
              if f1>f2 then
                CompareItem:=gSort;
              if f1=f2 then
                CompareItem:=0;
              if f1<f2 then
                CompareItem:=-gSort;
          end
          else
          begin
            if item1Num then
                CompareItem:=-1
            else if item2Num then
                CompareItem:=1
            else if gSort=1 then
                CompareItem:=CompareStr(CompItem1,compItem2)
            else
                CompareItem:=CompareStr(CompItem2,compItem1);
          end;
        end;
    end;
end;
调用方法:

1. 直接调用: 注意Origcol 是全局变量, 用来记录上次点击的column, 如果两次点击同一个column, 将在降序升序之间切换, 注意CompareItem前加@ 表示function的地址

var Origcol;
procedure Tform1.listvew1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
    if Abs(Origcol)-1=Column.Index then Origcol:=-Origcol else Origcol:=Column.Index+1;
    (Sender as TListView).CustomSort(@CompareItem,Origcol);
end;

2. 通过tlistview.oncompare 调用, 要想使oncompare有效,  必须在oncolumnclick里调用CustomSort 时sortproc设为nil, 然后在oncompare中加入处理的代码, 可以加入一些其他条件进行排序,如下

procedure Tform1.listvew1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
    if Abs(Origcol)-1=Column.Index then Origcol:=-Origcol else Origcol:=Column.Index+1;
    (Sender as TListView).CustomSort(nil,Origcol);
end;

//oncompare event
procedure Tform1.listview1Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
   //先按照checked 状态排序, 再按照column排序, 即 checked listitem永远排在前面
    if item1.Checked and (not Item2.Checked) then Compare:=-1;
    if item2.Checked and (not Item1.Checked) then Compare:=1;
    if item2.Checked and Item1.Checked then Compare:=CompareItem(item1,item2,Data);
    if (not item1.Checked) and (not Item2.Checked) then Compare:=CompareItem(item1,item2,Data);

end;

Delphi 基础知识 28】ListView控件的详细使用 Listview的详细使用方法 阅读详情

相关推荐

DELPHI 7仿QQ好友列表实战项目开发

标准Tree外观太单调?开启OwnerDraw自己画!然后处理OnDrawNode事件:varbegin// 根据选中状态填充背景beginend;// 绘制头像(仅好友节点)beginendelse// 绘制文本end;这样一来,圆角头像、渐变背景、富文本排版都不在话下!✨你以为Delphi 7只是怀旧玩具?错了!它教会我们的是一种极致高效的开发哲学✅可视化+代码混合开发:UI所见即所得,逻辑精确掌控✅。

weixin_30798867的博客 1024

Delphi ListView用法(常用技巧)

<br /><br />//增加<br />   i := ListView1.Items.Count;<br />   with ListView1 do<br />   begin<br />     ListItem:=Items.Add;<br />     ListItem.Caption:= IntToStr(i);<br />     ListItem.SubItems.Add('第 '+IntToStr(i)+' 行');<br />     ListItem.SubItems.Add('第

haiou327’blog 919

[转]Delphi ListView快速操作通用实现

Delphi ListView快速操作通用实现   2009-09-21 02:47:44|  分类: 软件开发 |  标签: |字号大中小 订阅 众所周知,Delphi ListView类直接进行Add、Update、Delete操作的速度是比较慢的,尤其是当数据量较大时,比如数据量达到5000、10000、50000时,速度真是可以说是“慢得惊人”。其实

zgp的专栏 1023

两个完全一样的listview,将第一个中的全部数据复制到第二个中去

ListViewItem[] additem = new ListViewItem[tmplv.Items.Count]; int i=0; foreach (ListViewItem item in tmplv.Items) { additem[i++] ...

sjrhero 721

delphi TListView使用

 ListView1.Items 为标准 Tlistitems类ListView1.Items(1)赋值with ListView1.Items.Add dobeginCaption:=caption; //添加第一项SubItems.add(aaaaa); //添加后面数据SubItems.add(1234);SubItems.add(1234);end; //一定要使用WITH结构.(

zhengbo2006的专栏 5393

Delphi XE7 beta1的新功能之TListView滑动刷新数据功能

介绍 本文章介绍了Delphi XE7 beta1的新功能之Pull To Refresh,Delphi XE7TListView增加划动刷新数据的功。 设置ListView的属性:PullToRefresh=True 然后处理ListViewPullRefresh事件,下面是示例代码 procedure TForm1.ListView1PullRefres

newsxy的专栏 2768

Delphi 2010 TListView一些使用

Delphi 2010的TListView扩展了一些功能,其中就有项分组功能,在XP和Vista以上系统有效。但是扩展的更多一些功能只对Vista系统有效。下面在XP SP3下实现TListView的分组效果: 1.新建一个应用程序,拖动一个TListView到窗体上; 2.在窗体创建函数,写入以下代码: 001 002 003 004 005 006 007

无幻 7484

Delphi 7使用VT实现树型列表结合控件

Delphi 7下有TTreeView和TListView控件,有时候我们需要这两个控件相结合的功能,除了自己组合成这样的复合控件,还可以使用VT(Virtual TreeView)来实现。

无幻 7739

DelphiListView类的用法

<br />//增加<br />   i := ListView1.Items.Count;   //这里得到的是ListView中的行数,也叫项数(Items)<br />   with ListView1 do<br />   begin<br />     ListItem:=Items.Add;   //这里相当于增加一行<br />     ListItem.Caption:= IntToStr(i);   //ListView的第一列是Caption,这是固定的<br />     ListIt

fjclc2008的专栏 6927

Delphi TListView(TListBox+图标显示)

unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.ImageList,...

weixin_30732825的博客 292

Listview_简单使用_(Virtual)

1、代码来自于“C:\Program Files (x86)\Borland\Delphi7\Demos\Virtual Listview”   1.1、是使用 ListView来显示数据   1.2、自己管理 ListView里面显示的信息(也就是说,不是像StringGrid那样一格一格内容往里面插入) 2、ListView 控件,属性设置:   2.1、ViewStyle 设置为 v...

weixin_33806300的博客 182

Delphi7 listview基本用法大全

//增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Items[0].Caption:='id'; ListView1.Columns.Items[1]

u013436459的专栏 2617

Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(二)

D7zTool是一个基于7-zip库开发的解压缩示例程序,除了应用程序本身,仅包含一个7z.dll 主要界面: D7zTool示例程序demo的pas源码 unitUnit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Contro...

weixin_30655569的博客 364

html把图像转换为图像映射,构建HTML图像映射的编辑器

要点:我开始使用Delphi 7构建一个用于创建/编辑HTML图像映射或图片中的“热点”的工具。应用程序的概念很清楚,如下所述。我以前做过类似的项目,我相信我可以用自己采取的任何方法做到这一点。我需要帮助的是找出如何在内存中存储图像映射的最佳方法。图像地图可能如下所示:isMap useMap=#someImageMap />AREA是图像中给定形状和坐标的区域,用于放置不可见的超链接。它们...

weixin_35917052的博客 288

TListView Header重绘和高度设置

TListView 的 Header 部分默认 BtnFace 颜色,高度也不能改变。我们可以通过编写一些代码来实现这些功能; 获得TListView 的Header 的句柄;     TListView的Header其实是一个 HeaderContorl 控件。要获得他的句柄需要调用下面的代码 //-------------------------------------...

weixin_30588729的博客 384

Delphi 常用控件之TlistView总结

TlistView组件功能: (1) TListView 控件可以用来显示各项带图标的列表,包括大图标和小图标的;也可以用来显示带有子项的列表,Windows操作系统的资源管理器中文件夹窗口就是最好的应用例子,就是我们打开"我的电脑"后能够看到各个盘符的界面 ( 2) TListView控件基本能实现和DBGrid控件一样的功能,很多时候根据程序需要可以完全用TListView来替换D

chinajobs的专栏 9889

listview的一些用法

ListView使用中的一些要点。以下以一个两列的ListView为例。  →增加一行:with ListView1 do  begin    ListItem:=Items.Add;    ListItem.Caption:=第一列内容;    ListItem.SubItems.Add(第二列内容);  end;   →清空ListView1:ListView1.Items.Cle

569
t2wei
博客等级 码龄19年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值