如果使用变量传递了海关功能,它似乎将访问违规。
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;
如何修复它。 请帮忙。非常感谢。
答案 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回答 - 他更快:)