Как использовать эту функцию CustomSort для сортировки списка? - PullRequest
2 голосов
/ 04 ноября 2010

Если функция customsort передается с переменной, похоже, она получит доступ к нарушению.


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;

Это вызовет ошибки. // нарушение доступа

Но если мы изменим col в AnsicompareText на 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 ]

5 голосов
/ 04 ноября 2010

Вы не можете получить доступ к 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]);

Конечно, вы можете отправить значение col в OptionalParam, если это единственное, что вам нужно. Или вы можете сделать 'col' глобальной переменной вместо поля или использовать саму глобальную переменную Form1, которую IDE помещает непосредственно перед разделом реализации, если она не закомментирована.

Вы также можете использовать событие OnCompare .

2 голосов
/ 04 ноября 2010

Передайте 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 - он был быстрее:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...