本帖最后由 zhengyc653 于 2012-10-15 17:00:42 编辑

解决方案 »

  1.   

    listview采取快速排序,快速排序需要比较两项数据大小,但你无法比较两个listitem的大小,对吧?所以你需要一个自定义函数:function  NumberSort(list: TStringList; index1, index2: Integer): Integer;
    其中 index1, index2表示待比较两个项序号,程序员可根据自己需要完善比较函数,用以排序
      

  2.   

    谢谢你的回复,明白了一点点,测试了一下,已经知道怎么用了。但是还是不明白它是怎么运作的:
    index1, index2表示待比较两个项序号,比较哪两项呢? 我List里可是有好几十甚至是几百个项.
    在函数中,我们只做了两件事:
    1、把两个项分别赋值给value1和value2,然后再做比较。
    2、返回一个值。但实际上,我的项那么多,也不知道它到底取出哪两项进行比较,而且可以根据这两项的大小决定所有项的顺序?返回值是指明是升序还是降序,但整个函数并没有说明用什么东西来排序。
    难道这两句:
      value1 := StrToInt(list.Strings[index1]);   
      value2 := StrToInt(list.Strings[index2]);
    就可以指明用 List 的字符进行排序?那如果把
      value1 := StrToInt(list.Strings[index1]);   
      value2 := StrToInt(list.Strings[index2]);
    改成
      value1 := 1;   
      value2 := 2;
    呢?它用什么排序??
    测试结果是程序卡死。我如果在函数中只写一句 Result:=1 ,则程序也卡死。
    期待继续解释。
      

  3.   

    你是否了解快速排序算法?不知道就上网查一下。如果是单纯的一组数据排序,其中会有一段类似于if a[i]>a[j] then这样的比较代码。但如果你想比较TList的两个项,像list.items[i]>list.items[j]这样的语句是不合法的对吧?所以你需要一个自定义函数Compare(value1,value2:integer):boolean来代替list.items[value1]>list.items[value2]。每当系统调用你这个自定义函数,若返回true则相当于list.items[value1]>list.items[value2],若返回false则相当于list.items[value1]<list.items[value2]。所以说这个自定义函数并不是说具体比较哪两个项,而是提供一个比较的标准。
      

  4.   

    你可以阅读一下delPhi帮助,表面上你只写了一个比较函数,实际上你提供了一个比较标准,而系统在背后已利用这个标准帮你排好序了。