Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2013, 20:29   #1
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию Проблема с сортировкой.

Приветствую всех.

Проблема такая: пытаюсь сортировать ListView(vsReport) но вываливается ошибка "access violation at address...". Странно что когда щёлкаю по колонке в пустой таблице то ничего не происходит(сообщение не вылазит), но если таблица заполнена то вылазит ошибка. В каждой строчке в колонке 2 русских слова. Код брал в гугле.

Код:
type
....
function SortCaptionAsString(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
...

...
var
...
Sort: integer = 1;
...

...
procedure TForm1.sListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
   Sort := -Sort;
   if Column = sListView1.Columns[0] then
      sListView1.CustomSort(@TForm1.SortCaptionAsString, Sort)
end;


function TForm1.SortCaptionAsString(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
  Result := 0;
  if AnsiUpperCase(Item1.Caption) > AnsiUpperCase(Item2.Caption) then Result := ParamSort
  else
  if AnsiUpperCase(Item1.Caption) < AnsiUpperCase(Item2.Caption) then Result := -ParamSort;
end;
...
Артём_2 вне форума Ответить с цитированием
Старый 20.09.2013, 20:39   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

А причём здесь форма CustomSort(@TForm1.?
ReportCube вне форума Ответить с цитированием
Старый 20.09.2013, 20:42   #3
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

Без этого: [dcc32 Error] Unit1.pas(527): E2036 Variable required
Артём_2 вне форума Ответить с цитированием
Старый 20.09.2013, 20:52   #4
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Без чего этого?

Цитата:
function SortCaptionAsString(Item1, Item2: TListItem; ParamSort: integer): integer;
begin
Result := 0;
if AnsiUpperCase(Item1.Caption) > AnsiUpperCase(Item2.Caption) then Result := ParamSort
else
if AnsiUpperCase(Item1.Caption) < AnsiUpperCase(Item2.Caption) then Result := -ParamSort;
end;
ReportCube вне форума Ответить с цитированием
Старый 20.09.2013, 20:56   #5
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

А лучше посмотрите сортировку в исходниках для TStringList
procedure TStringList.Sort;
ReportCube вне форума Ответить с цитированием
Старый 21.09.2013, 06:34   #6
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

Если убрать форм1 то ошибка "E2036 Variable required" в строке " sListView1.CustomSort(@SortCaptionA sString, Sort)"
Артём_2 вне форума Ответить с цитированием
Старый 21.09.2013, 10:07   #7
Артём_2
Пользователь
 
Регистрация: 17.09.2013
Сообщений: 39
По умолчанию

В общем опишу ход моих действий.

1) В var добавляю "Sort: integer = 1;"

2) В type добавляю "function SortCaptionAsString(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;"

3) Нажимаю ctrl+shift+c

4) Появляется:
Код:
function TForm1.SortCaptionAsString(Item1, Item2: TListItem;
  ParamSort: integer): integer;
begin

end;
5) Добавляю туда код, получается:
Код:
function TForm1.SortCaptionAsString(Item1, Item2: TListItem;
  ParamSort: integer): integer;
begin
  Result := 0;
  if AnsiUpperCase(Item1.Caption) > AnsiUpperCase(Item2.Caption) then Result := ParamSort
  else
  if AnsiUpperCase(Item1.Caption) < AnsiUpperCase(Item2.Caption) then Result := -ParamSort;
end;
6) Выбираю в "design" sListView1

7) В "events" 2 раза щёлкаю по "onColumnClick"

8) Появляется:
Код:
procedure TForm1.sListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin

end;
9) Пишу туда код, получается:
Код:
procedure TForm1.sListView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
   Sort := -Sort;
   if Column = sListView1.Columns[0] then
   sListView1.CustomSort(@TForm1.SortCaptionAsString, Sort)
end;
10) Компилирую. Ошибок нет.

11) При запуске программы таблица пуста, при щелчке на первую колонку ничего не происходит.

12) Таблица заполняется.

13) При щелчке на первую колонку: "access violation at address..."

Что я делаю не так?
Артём_2 вне форума Ответить с цитированием
Старый 21.09.2013, 11:00   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А просто посмотреть пример в дельфийской справке?
Код:
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer): integer; stdcall;
begin
  Result := -CompareText(Item1.Caption,Item2.Caption);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListView1.CustomSort(@CustomSortProc, 0);
end;
Цитата:
В type добавляю
Ничего туда не надо добавлять
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.09.2013, 11:01   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Пример сортировки в ListView
Вложения
Тип файла: zip Project.zip (243.7 Кб, 48 просмотров)
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с сортировкой Alex_12Proxy Помощь студентам 1 30.03.2012 12:41
ПРОБЛЕМА С СОРТИРОВКОЙ S@n4eeeeez Помощь студентам 4 19.01.2012 21:28
проблема с Сортировкой в Excel! Romka12345 Microsoft Office Excel 2 30.11.2011 14:18
Проблема с сортировкой matbe14 Помощь студентам 0 29.09.2011 11:16
Проблема с сортировкой Anubys Помощь студентам 0 19.04.2011 17:10