2010-11-04 84 views
2

如果通过一个变量传入的是传递函数,它似乎会访问冲突。如何使用此CustomSort函数对listview进行排序?


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; 

如何解决此问题。 请帮忙。非常感谢。

+3

可以请编辑您的问题,并使其更具可读性? – 2010-11-04 11:47:15

回答

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'变成一个全局变量而不是一个字段,或者如果没有被注释掉,就使用IDE放在实现部分之前的'Form1'全局变量本身。您可以使用OnCompare事件。

2

通关口的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答案 - 他快:)

+0

非常感谢。 SERG。 – Dylan 2010-11-04 12:14:01

相关问题