如何自定义listitem?????(300分)

  • 主题发起人 主题发起人 金洪
  • 开始时间 开始时间

金洪

Unregistered / Unconfirmed
GUEST, unregistred user!
如何自定义listitem,并且可以在Tlistview中显示自定义listitem,例如:自定义
listitem如何以Panel面板的形式在Tlistview中显示,并且可以在面板中显示图标。
分值还可以再加。希望各位高手能够解答,并给出例子!!!
 
这个东东有难度,参考一下其它的控件源码看看吧。
//学习中。
 
看看DELPHI自有的原码你会得到提示的
 
To hbezwwl
有没有相关控件的源码???
 
var listitem : TListItem;
begin
listitem := listView1.Items.Add;
listitem.ImageIndex := 1;
listitem.Caption := 'NewItme1';
listitem.SubItems.Add(SubItems[0]);
listitem.SubItems.Add(SubItems[1]);
...
end;
呵呵,没有调试,你试试,就是这么个用法
 
To 四库全书
我的意思是listitem项能够以Panel的样式显示在listview中。不是单纯的显示一个字符串
并为其指定一个图标!
不过,非常感谢!
 
"以Panel的样式显示在listview中",是个什么概念,我想像力比较差,想不出来,能给举个这样的例子吗?
 
To 四库全书
在资源管理器中文件或文件夹在列表视图中是以图标显示,我的意思为:为图标加个
外框,也就是说用panel作为图标显示的外框。
既在自定义的listitem类中,添加fpanel属性,并实现其相应的方法,也就是我邀请教
的地方!!!

 
这个问题好像应该是从customdraw,customdrawitem,tomdrawsubitem方面入手吧.
金洪的需求是不是象ACDSEE那样,有一个边框?

其实在CustomDrawItem事件中写如下代码就可以看到实现的希望:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
ARect : TRect;
begin
Arect := item.DisplayRect(drBounds);
listview1.Canvas.Rectangle(arect.left-2,arect.Top,arect.right+2,arect.bottom+2);
end;
很丑陋的一个demo,不过感觉上是这个意思.
 
To bluerain
确实像ACDSEE那样。在CustomDrawItem事件中我也试过,效果不好,而且这也非我的本意,
我的想法是为Tlistitem类,添加Fpanel属性,并实现其相应的方法。
感谢你的关注!也希望网友们给于帮助!!!讨论结束,会给大家分的!!!
Thank's a Lot!!!
 
问题你解决了吗,能不能说说思路,
好的控件我没有.
 
To hbezwwl
还没有,不过我正在研究TThumbview(缩略图浏览)控件,看能不能有点帮助,目前就
只有这样了。
希望高手能够帮忙!!!
 
Windows中对各种不同的文件以不同的图标显示出来,是Windwos操作系统的一大特色,并显得越来越重要,漂亮的图标也为各应用程序增添了不少的特色,如果能在我们自己编制的程序中根据文件的扩展名显示不同的图标,我想是很多编程爱好者非常感兴趣的东西。笔者用Delphi编写了一程序,能在ListItem中根据ListItem的文件名称(不管文件存不存在)的扩展名,获取与文件关联的图标。希望能给予各位参考。

打开Delphi新建一工程project1,在表单form1中添加listItem,任意在ListItem中添加Item,比如:file.doc,file.xls,file.zip,file.rar等。
源程序如下:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls,ShellAPI,ImgList;

type
TForm1 = class(TForm)
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
myImageList:TImageList;
end;

var
Form1: TForm1;
ShFileInfo: TSHFILEINFO;

implementation

{$R *.DFM}

//获取图标编号
function GetFileIconIndex(FileName:string):integer;
begin
ShGetFileInfo(Pchar(FileName), 0, SHFileInfo,SizeOf(SHFileInfo), SHGFI_LARGEICON or SHGFI_SYSICONINDEX or SHGFI_TYPENAME or SHGFI_SMALLICON);
Result:=SHFileInfo.iIcon;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
FStream:TFileStream;
i:integer;
begin
MyImageList:=TImageList.CreateSize(32,32);
myImageList.ShareImages:=True;
myImageList.Handle:=ShGetFileInfo('',0,SHFileInfo, SizeOf(SHFileInfo),SHGFI_LARGEICON or SHGFI_ICON or SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
ListView1.SmallImages:=myImageList;
ListView1.LargeImages:=myImageList;
for i:=0 to ListView1.Items.Count-1 do
begin
FStream:=TFileStream.Create('c:/'+ListView1.Items.Caption,fmCreate);
FStream.Write(i,sizeof(integer));
FStream.Free;
ListView1.Items.Item.ImageIndex:=GetFileIconIndex('c:/'+ListView1.Items.Caption);
deletefile('c:/'+ListView1.Items.Caption);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
myImageList.Free;
end;

end.



F5运行之后,程序就会根据ListItem中的Item中的名称提取windows中不同文件关联的图标。
以上程序在Delphi5.0+windows2000测试通过
 
To ugvanxk
还是没有涉及到问题的核心,不过非常感谢你的参与。
 
你可以试试自己给每个LISTITEM的内容画一个边框,就象画窗体一样,当FPANEL为真时就画,
为假时就不画,其实就是一个阴影的问题,看起来就跟有框是一样的。PANEL也是这样画的。
 
To 左右手
能给个例子吗?
 
当然不能用panel,panel浪费资源很厉害,只要画个boundsrect,比如frame3D什么的就可以了
在customdraw时完全可以搞定,画图标时多写一行画框的程序就行了,就为这行写个控件不太
值得
 
后退
顶部