有一个结构和一个数组如下:
TMyRec = packed record
 F1: Integer;
 F2: array[0..10] of char;
 F3: Byte;
 F4: array[0..5] of char;
end;MyArr: array of TMyRec;我现在把数组的内容显示到一个listview中,这个listview有四列,分别对应结构中的四个字段,第一列对应F1,第二列对应F2,第三列对应F3,第四列对应F4。
现在我要点击Listview的各列来进行排序,例如我先点第一列,则按照F1来排序,然后我再点第四列,这时要在按照F1排序的基础上再按F4来排序。
效果如下:
初始状态:
F1  F2  F3  F4
3   a   3   W
3   f   7   D
5   e   9   A点第一列按F1排序后:
F1  F2  F3  F4
3   a   3   W
3   f   7   D
5   e   9   A点第四列,在按F1排序的基础上再按F4排序:
F1  F2  F3  F4
3   f   7   D
3   a   3   W
5   e   9   A请问怎样才能实现这样的功能呢?

解决方案 »

  1.   

    这个好解决,比如我可以按住Ctrl键的时候连续点击列才实现组合排序的功能。主要问题是要解决如何才能实现组合排序
      

  2.   

    这个问题很好解决的,弄个变量记住每次点击的位置以及顺序,然后找一种排序算法,按照记住的顺序对数组的内容进行排序,排序完事之后再刷新到listview中。
    排序算法我的博客中有好多,给你个链接排序算法演示我博客中给的例子刚好也是对数组进行排序,只不过我给的是整形数组,你只要把数组的基础类型改成你的,然后再把比较函数改改就行了,其他的都不用动。
    function CompareData(Data1, Data2: PData;   
          Index1, Index2: Integer): Integer; virtual; //比较
    就是这个函数,呵呵
      

  3.   

    我最主要的就是不知道该怎么写这个排序算法,点第一列的时候普通的排序算法就可以了,但是点第二列的时候就要在不破坏第一列顺序的基础上排序,这样要怎么才能通用呢?我现在只是举了四列,但是也可能是n列点第一列按F1排序后:
    F1 F2 F3 F4
    3 a 3 W
    3 f 7 D
    5 e 9 A点第四列,在按F1排序的基础上再按F4排序:
    F1 F2 F3 F4
    3 f 7 D
    3 a 3 W
    5 e 9 A
      

  4.   

    谢谢wxieyang和CaiBirdy,我大致上明白了