如何使用此CustomSort函数对listview进行排序?

时间:2010-11-04 11:18:15

标签: delphi callback

如果使用变量传递了海关功能,它似乎将访问违规。


public 
...
col: integer;
...

Procedure listviewcol;
begin
  col:=5
...
end;

procedure TForm1.sortcol(listview: tlistview);
  function CustomSortProc(Item1,Item2: TListItem;
    OptionalParam: integer): integer;stdcall;
  begin
    Result := AnsiCompareText(Item2.subitems.Strings[col], Item1.subitems.Strings[col]);
  end;
begin
  ListView.CustomSort(@CustomSortProc,0);
end;

这会提示错误。 //访问冲突

但是如果我们将AnsicompareText中的col更改为5,那么它运行良好。

procedure TForm1.sortcol(listview: tlistview);
  function CustomSortProc(Item1,Item2: TListItem;
    OptionalParam: integer): integer;stdcall;
  begin
    Result := AnsiCompareText(Item2.subitems.Strings[5], Item1.subitems.Strings[5]);// it works.
  end;
begin
  ListView.CustomSort(@CustomSortProc,0);
end;

如何修复它。 请帮忙。非常感谢。

2 个答案:

答案 0 :(得分:5)

您无法在回调函数中访问col,它不是您表单的方法。在方法中嵌套回调的技巧是徒劳的。 ;)如果您需要访问表单字段,请使用OptionalParam在回调中引用您的表单。

begin
  ListView.CustomSort(@CustomSortProc, Integer(Self));
  [...]

function CustomSortProc(Item1,Item2: TListItem;
  OptionalParam: integer): integer; stdcall;
var
  Form: TForm1;
begin
  Form := TForm1(OptionalParam);
  Result := AnsiCompareText(Item2.subitems.Strings[Form.col],
      Item1.subitems.Strings[Form.col]);

当然,如果这是您唯一需要的东西,您可以在'OptionalParam'中发送col的值。或者,您可以将'col'设置为全局变量而不是字段,或者使用“Form1”全局变量本身,如果没有注释掉,IDE将在实现部分之前放置。

您还可以使用OnCompare事件。

答案 1 :(得分:2)

将col传递给OptionalParam:

function CustomSortProc(Item1,Item2: TListItem; col: integer): integer;stdcall;
begin
  Result := AnsiCompareText(Item2.subitems.Strings[col], Item1.subitems.Strings[col]);
end;

begin
  ListView.CustomSort(@CustomSortProc, col);
end;

或者使用Sertac回答 - 他更快:)