谁能告诉我Ttreeview.customsort 的使用方法?(50分)

  • 主题发起人 主题发起人 flyinsky
  • 开始时间 开始时间
F

flyinsky

Unregistered / Unconfirmed
GUEST, unregistred user!
在treeview中的排序问题,看了书上的例子,好象有点
不懂,请各位快来检分,
要求给我个完整的例子,就来个treeview.alphasort的
逆排序吧(按字母从大到小),一定要完整可运行,最好关键部位加点解释,
特别说明一下在调用 treeview1.customsort(@yoursortproc(),参数)
时的原理,
因为我编的时候,@yoursortproc(参数) 的参数我不知到是什么意思。
多谢!
 
@yoursortproc的参数:
function(lParam1, lParam2, lParamSort: Longint): Integer stdcall;
其中lParam1, lParam2是用来比较的两个TTreeNode,你只要用自己的规则
判断他们的先后顺序就可以了.
这是delphi自己的例子:
//这就是@yoursortproc
function CustomSortProc(Node1, Node2: TTreeNode;
Data: integer): integer;
stdcall;
begin
Result := -AnsiStrIComp(PChar(Node1.Text), PChar(Node2.Text));
//看!这里就在判断两个Node的前后顺序
//返回值的意思: -1 表示node1在前,node2在后
// 0 表示相等
// 1 表示node1在后,node2在前
end;

This procedure can then
be used as a parameter to CustomSort to sort the nodes of the tree view:
TreeView1.CustomSort(@CustomSortProc, 0);
其实原理就是,排序的时候,TreeView把每一对node都传送给@yoursortproc
供你进行判断,你只要告诉他哪个大哪个小,treeview自己知道该如何排列.
 
我有一个老外写的讲TreeView的教程,是目前我见过的最好的,几乎涵盖了Treeview的各个方面,压缩后只有85k,要的言话留下email.
 
TreeView1.CustomSort(@CustomSortProc, 0);中@CustomSortProc
不用参数吗?,我还是用点不明白,
这个node1,node2,我需要定义,并传给排序函数吧,是不是将treeview
遍历,取出各个node 来比较一番呢?
我看过delphi的例子,并照着做了,可是编译总说参数不对,
我想是 node1,node2的问题上,
请原谅我的无力要求,最好还是给我把例子(就这个吧)完整贴给我吧。
我毕竟是小虫级的。。。。。
 
好啊,老兄,
不知到如何感谢你呀!
来吧: f.zhou@gislab.ecnu.edu.cn
 
>>TreeView1.CustomSort(@CustomSortProc, 0);中@CustomSortProc不用参数吗?,
不用,因为这里需要的是你的函数的地址,有一个函数名就够了.
>>这个node1,node2,我需要定义,并传给排序函数吧
不用,当你调用TreeView1.CustomSort(@CustomSortProc, 0)时,实际执行的操作
就是treeview自动把一对一对的node传送到你的函数,由你来判断大小.你的函数
返回判断结果,TreeView就知道那个大,那个小,那个在前,那个在后了. 等所有的
node全部完毕,新的排列结果就出来了.
所以,你要做的就是先定义一个比较大小的函数,就是那个@yourproc.
然后调用TreeView1.CustomSort(@yourproc,0),把你的函数地址通过@这个操作符
告诉TreeView,其他的事情就是自动完成的了.
 
哦?!!,真神奇呀,我一开始就是这样做的呀,
但编译就是说我 TreeView1.CustomSort(@CustomSortProc, 0);
缺少参数,那是它在玩我吗,我得好好修理修理它,
在让我试试看。
小弟先拜谢了
___
(*_*)
 
cAkk>>
我理解了这个方法,但是DELPHI好象不理解我,还是老样子,
编译显示:“variable required”光标直至
treeview1.CustomSort(@mysortproc,|0);
帮忙看看吧。
//////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
ImageList2: TImageList;
TreeView1: TTreeView;
procedure Button1Click(Sender: TObject);
private
function mysortproc(node1,node2:Ttreenode;Data:Integer):integer;stdcall;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
function tform1.mysortproc(node1,node2:Ttreenode;Data:Integer):integer;stdcall;
begin
result:=-lstrcmp(Pchar(node1.text),pchar(node2.text));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
treeview1.CustomSort(@mysortproc,0);
end;
end.
////////////////////////////////////
 
receyes:>>
先多谢你的email,但这个文件如何使用呀,我直接用WORD打开,
全是乱码(应该是英文吧),不知如何使用,望好人做到底,请告知。
 
这个问题我已经在你的那个imagelist的问题里面回答了,你看看吧.
我的方法已经通过调试了.
 
用前看看帮助, 特别是定义 :)
customsort的回调函数是一个static函数, 不是类的方法.
不能是
function TXXXX.xxxx(....)而是function xxxx(....);
如果非要用类的方法不可, 可以用makeobjectinstance将类的方法转换成
标准函数或方法, 然后赋给TreeView.CustomSort.
 
flyinsky>>
我发给你的是一个用winrar压缩过的包,需要解压,Winrar是常用压缩软件,
很多站点都有下载。里边的教程是html格式的。Good Luck.
 
这个问题已经解决了,怎么还不结束?
 
多人接受答案了。
 
后退
顶部