D6 中 TShellTreeView 功能的扩展!(200分)

  • 主题发起人 主题发起人 OopsWare
  • 开始时间 开始时间
O

OopsWare

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个类似 D6 中 TShellTreeView 的控件,其中“我的电脑”并不是
TreeView的“根”,也就是说我的控件中的TreeView还有其他的节点,我的电脑
作为一个子节点出现,而且我的电脑中只显示硬盘(不显示软盘、光驱等..)
我一直在看 ShellCtrls 单元,简单的继承 TCustomShellTreeView 并不
能达到我的要求,但是继承 TCustomTreeView 和 IShellCommandVerb 又需要
ShellCtrls 中大量代码复制到我的单元。
有没有简单的方法,或比较经典的例子可以借鉴(源程序)?
 
看来 DFW 第一小气鬼非 taozhiyu 没数,我可是“铁公鸡”,哭的再惨也没分。[:D]
 
想听,也想银子 [:D]
 
最近,我倒是在网上狂找了一阵子Shell类控件,谈谈感受,供你参考吧,等你的控件做出来可别忘了给我
一份啊!呵呵:-)

你的意思我明白,就是不仅显示我的电脑、C盘、D盘什么的,包括桌面、控制面板、网上邻居等等都要显示,
在这些控件中都有一个属性可供设置,你看一下它们的源码就知道了。

以Windows自带的资源管理器为评价标准

1. ShellControlPack v1.6 (有源码) ★★★★☆
ShellControlPack在同类控件中,功能最强大、最全面!用它做出来的程序和资源管理器一模一样,
太棒了!!
但是,非常遗憾!!用它做的程序在我的WinNT4.0下不能运行(一运行就出错,连它自带的例子也一样),
而在Win98和Win2000上确没事。从表面上看,主要问题出在其中的ShellList控件上。我反复看了几遍
它的帮助,没有提示要注意些什么,只是说很快要加上中文包,可我到它的总部找了半天也没找到!
我的NT环境是WinNT4.0简体中文版 + sp6 + IE5.0 ,现在,使用NT的人还是不少的,所以,这个毛病
几乎是不可忍受的!!
下载地址:窑洞的ftp服务器 ftp://202.117.210.31 用户名:123 口令:123
官方网站:http://www.plasmatech.com/

2. ShellBrowser v2.4 (无源码) ★★★★
这个控件也非常不错,和ShellControlPack相比,缺点主要有两个:一是当左边的ShellTree控件的节点
改变时,右边的ShellList控件刷新太慢,颇为不爽!二是不提供源码,且需要注册。我已经将它的
for Delphi5 和 for C++Builder5 两个版本破解!但是没有源码,不能修改,相当遗憾的事!
下载地址:http://www.jam-software.com

3. Arisesoft Shell Pack v1.0 (有源码) ★★★★
按理来说,就目前的情况看,这个控件是不够四星级的,因为它尚有不足之处,但我却特别偏爱它!
优点:它的ShellList控件刷新极快!!比资源管理器还快!在目录之间切换时几乎不闪烁(当然,
目录下文件太多时就不能一点不闪烁了),在这一点上做得真是太优秀了!!!
缺点:(1) 没提供ShellComboBox控件
(2) 不能显示系统文件和系统目录
我准备功力再长一长后,重写这个控件!!!!
下载地址:http://www.arisesoft.com/shellpack/

4. DFS v0.98.5 Beta (有源码) ★★★
问题比较多,不支持拖放功能、ShellList刷新时闪烁得太厉害,经我修改后稍好一点,但仍不
能令人满意,还有其他小毛病
下载地址:http://www.delphifreestuff.com

5. LMD ShellPack v1.0 (有源码) ★★
这是霸王级控件包LMD Tools中的一部分,由于我用的是1.0版本,一句话:太恶心了!!简直有损
LMD的形象!现在已有2.0,我没搞到,不知2.0是不是会好一点
下载地址:窑洞

6. LsFileExplorer28 v2.84 (有源码) ★★★☆
这个控件性能真是不错,但不是太象资源管理器的样子,就是说Windows系统的东西用的不多,而
是自己硬编出来的,比如:他用自己的菜单代替资源管理器的右键菜单。难能可贵的是运行速度
这么快!可见作者功力深厚啊!说实在的,给三星半,有点冤枉了:-(
下载地址:忘了:-(

我觉得速度快慢是整个体系结构的问题,好了,就说这么多,应该可以满足你的需要了!
 
等我看看,随后给分!
 
看了看 Arisesoft Shell Pack v1.0 的源程序,90%照抄 Borland 的 ShellCtrls.pas
不过加入了 Drop 属性,还值得一看。我是感觉 ShellCtrls.pas 写的太麻烦,才寻找
一种简单的解决方法的,Arisesoft Shell Pack 也并没有达到我的要求。

请 HD_Copy 继续....
 
to OopsWare:
>>请 HD_Copy 继续....
老大,还要我谈些什么呀?到现在你也没说清楚你到底想写一个什么样的控件啊?实现什么功能?做
什么用啊?如果仅仅是题目中提到的不显示软盘、光驱等...我想你看了这些控件的代码,应该能解决
了吧。

我现在特别关心Shell控件的整体性能问题,以至于在上面不断地提到ShellList刷新速度问题,因为
我正打算写一个管理磁盘资料的软件,这就要用到数据库中的说明文字和具体磁盘文件相匹配,并快速
得显示出来,现在看来,体系结构一定要做好,我发现DFS控件就比较差,它是先显示第一列,当显示
第二列时还要再刷新第一列,依此类推,所以闪烁得特别厉害,在速度慢的机器上看起来都很有意思,
我在其中加入了几行锁屏幕的代码,稍好一点,但解决不了根本问题。

老大,你再说说你的具体要求吧。

to All:
大家也谈谈看法吧。
 
HD-Copy的那个控件好用!
 
速度快那是用FindFile...系列的API,没有用IShellFolder。速度相差极大。
还有ImageList最好也自己Cache(根据扩展名),不用接口。
这是唯一的两种办法。

 
啊???!!!

to sspeak:
你说的“FindFile...系列的API”是指TSearchRec结构、FindFirst、FindNext、FindClose函数吗?
用它们的组合确实是遍历目录、文件的标准方法,速度的确非常快。可这和我说的刷新速度快有什
么关系啊?众所周知,TreeView和ListView控件在添加大量数据时为了解决速度慢的问题是要有一
定技巧的,我说的是这个,不是搜索。再说,不用IShellFolder用啥呀?
老大,向多请教。
 
ListView在添加大量数据时速度慢,有经验的程序员一般都不会出现这个问题。
(最快的是Virtual List Control,虽然很少有人用。用这个会出现另外一个问题,
那就是拖动滚动条的时候要拖尾)
在排除了这个问题后,刷新速度就取决于获取目录内内容的速度,这也是实质性的编程内容。
当初我作的时候,试了许多方法,只要用IShellFolder,速度不会有大的改变(肯定
不会超过Explorer)。(注意同时还有图标的显示,文件大小,日期,类型等问题).
只有用FindFile...系列的API。缺点就是只能列出文件系统内容。
IShellFolder是标准做法。二者各有优缺点。


 
用 FindFile 查找并不可取,控件是要捕获目录事件的(重命名、删除等...)
这还要使用 Shell 的接口.....
 
to sspeak:
>>ListView在添加大量数据时速度慢,有经验的程序员一般都不会出现这个问题。
呵呵,我正是那种没有经验的程序员,所以才虚心向你请教啊。可是你说了半天也没说出到底用什么
方法解决呀!Virtual List Control到底用的是什么方法呀?既然有拖尾现象,怎么还叫最快呢?请
你给我讲一讲好吗?谢谢!
>>只要用IShellFolder,速度不会有大的改变(肯定不会超过Explorer)。(注意同时还有图标的显示,
>>文件大小,日期,类型等问题).只有用FindFile...系列的API。
我在上面倍加推崇的Arisesoft Shell Pack v1.0中就用了不少的IShellFolder,而却没有用到什么
FindFile...系列的API。可它的刷新速度为什么比Explorer快呢?我在上面已经给出了它的下载地址,
你可以去看一看。
>>...这也是实质性的编程内容。...只有用FindFile...系列的API...
在你这个有经验的程序员看来,使用什么所谓的FindFile...系列的API就是实质性的编程咯?!我可
以告诉你,能在大富翁上露面的人(刚刚开始学的除外)没有几个不会用什么FindFile...系列的API
的!下面是我函数库中的一个函数,请检查一下我写的对吗?
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
58. 遍历目录及文件搜索

函数体:

void __fastcall TForm1::SearchFiles(AnsiString APath, AnsiString AMask, bool bSubDir)
{ //起始路径 文件类型 是否搜索子目录
TSearchRec sr;
int iFound;
/* ----------首先,搜索当前目录下的文件------------ */
iFound = FindFirst(APath + "//" + AMask, faAnyFile, sr);
while( iFound == 0 )
{
if( (sr.Name != ".") && (sr.Name != "..") && ((sr.Attr & faDirectory) != faDirectory) )
{
......
//找到文件后的处理代码
}
iFound = FindNext(sr);
}
FindClose(sr);
/* ----------搜索子目录------------ */
if( bSubDir )
{
iFound = FindFirst(APath + "//*.*", faAnyFile, sr);
while( iFound == 0 )
{
if( (sr.Name != ".") && (sr.Name != "..") && ((sr.Attr & faDirectory) == faDirectory) )
{
......
//找到子目录后的处理代码
SearchFiles(APath + "//" + sr.Name, AMask, bSubDir); //递归调用
}
iFound = FindNext(sr);
}
FindClose(sr);
}
}

说明部分: 根据上面的原理,稍加改动就可实现只搜索目录,只搜索文件,文件和目录一起搜索.
如果仅仅是要统计目录个数,或文件总容量等等,则可以更简单.

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

老大,不管你水平有多高,在外面说话要注意分寸!
呵呵,欢迎你多多指教!
 
你根本没有理解我说的话!
1。VirtualListControl:MSDN里有,自己找。
(连VirtualListControl都没听说过,就可以被称为没有经验的!)
你所谓的那些引以自豪的技巧,我认为只是基本常识,不屑讲!
2。我说的实质性内容是指如何填充目录内容,findfile系列API是我认为最快的方法,而且不只快了一点。
(而且你连我说的API跟Delphi函数都没分清)。
3。只有你才认为会用几个函数是什么了不得的事。
4。你倍加推崇的Arisesoft Shell Pack v1.0是用了IShellFolder,但你有没有看过填充目录内容的那部分代码?
5。我对你的代码不感兴趣。
6。我并没认为自己的水平很高。第一贴我也只是实事求是的跟你探讨问题。
7。请少用几个虚伪的“哈哈”。
8。我认为已经从你的帖子里看出你的编程水平。
9。原谅我的粗暴。
10。不再回复。

 
to sspeak:
是够粗暴的啊!
>>API跟Delphi函数都没分清
惭愧!惭愧!妈的,怎么搞的,不应该呀!!
看来水平是不及你,不如你就向你学习,这没什么丢人的,不打不相识吗!大侠能否
留下E_Mail,好向你请教,我的是HD_Copy@163.com
 
还是在 Borland 的 Code Center Down 到的 ShellCtrl.pas 权威一些...
尽早分分了 ...
 
后退
顶部