Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169

Сортировка данных в колонках ListView

11.03.2011, 10:32. Показов 6444. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Так делается сортировка для двух колонок;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  if FSortKey = Column.Index + 1 then FSortKey := -FSortKey else FSortKey := Column.Index + 1;
  if ListView1.SortType <> stText then ListView1.SortType := stText else ListView1.AlphaSort;
end;
 
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
  N1, N2: Integer;
begin
  if Abs(FSortKey) = 1 then Compare := AnsiCompareText(Item1.Caption, Item2.Caption)
  else
  begin
    N1 := StrToInt(Item1.SubItems[Abs(FSortKey) - 2]);
    N2 := StrToInt(Item2.SubItems[Abs(FSortKey) - 2]);
 
    if N1 = N2 then Compare := 0 else if N1 < N2 then Compare := -1 else Compare := 1;
  end;
  Compare := Compare * (FSortKey div Abs(FSortKey));
end;
Но это только для двух колонок, а если их три, четыре или более?
FSortKey - номер колонки.
Delphi
1
2
3
4
5
6
7
8
9
10
11
  if Abs(FSortKey) = 1 then
    begin
    end
  else
  if Abs(FSortKey) = 2 then
    begin
    end
  else
  if Abs(FSortKey) = 3 then
    begin
    end;
Как тут сделать сортировку не знаю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2011, 10:32
Ответы с готовыми решениями:

Сортировка данных в ListView из разных таблиц
Здравствуйте уважаемые форумчане. Снова прибегаю к вашей помощи. Необходимо сделать так, чтобы Листвью правильно сортировал полученные из 2...

Как можна редактировать данные в всех колонках listView через вторую форму
На первой форме мы дважды щелкаем на строку listView, открывается вторая форма и даные передаються в textBox1 и textbox2 где редактируем и...

Сортировка listView. Как узнать длину listview?
Есть listview состоящий из чисел(только числа в string). Как их сортировать по возрастанию? (т.е. так, чтобы на верхнем месте в listview...

7
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.03.2011, 11:28
Если Элемент1.Поле1 <> Элемент2.Поле1 Тогда
Начало
..
РезультатСрвнения = ..
Конец
Иначе Если Элемент1.Поле2 <> Элемент2.Поле2 Тогда
Начало
..
РезультатСрвнения = ..
Конец
Иначе Если Элемент1.Поле2 <> Элемент2.Поле2 Тогда
Начало
..
РезультатСрвнения = ..
Конец
..
Иначе Если Элемент1.ПолеN <> Элемент2.ПолеN Тогда
Начало
..
РезультатСрвнения = ..
Конец
Иначе
РезультатСрвнения = 0
1
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
11.03.2011, 12:12  [ТС]
Что подразумевается под Элемент.Поле
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
11.03.2011, 12:15
> Что подразумевается под Элемент
Item1 и Item2 - факт.параметры ф-ции сравнения

> Поле
Значение элемента в соответствующем поле ЛистВью
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
12.03.2011, 21:24  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  ...
 
  FSortKey: Integer;     //  Теперь в самом деле используется как номер колонки
  FBackSort: Boolean;  //   Направление сортировки
 
  ...
 
procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  if (FSortKey = Column.Index) then // Если это та же самая колонка - меняем направление сортировки
    FBackSort := not FBackSort
  else                                             // иначе - прямая сортировка
    FBackSort := False;
 
  FSortKey := Column.Index;
  ListView1.AlphaSort;
end;
 
procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
 N1, N2, SubItemInd: Integer;
begin
  if (FSortKey > 0) then  // Сортируем по субайтемсам
  begin
    SubItemInd := FSortKey -1;
 
    // StrToInt не годится, потому как вызовет ошибку если строчка пустая
    // либо не приводится к числу. Поэтому StrToIntDef
 
    N1 := StrToIntDef(Item1.SubItems[SubItemInd],0);
    N2 := StrToIntDef(Item2.SubItems[SubItemInd],0);
 
    if FBackSort then        // Обратная сортировка
      Compare := N2 - N1
    else                     // Прямая сортировка
      Compare := N1 - N2;
  end
  else                    // Сортируем по капшену айтемса
  begin
    if FBackSort then     // Обратная сортировка
      Compare := AnsiCompareText(Item2.Caption,Item1.Caption)
    else                  // Прямая сортировка
      Compare := AnsiCompareText(Item1.Caption,Item2.Caption);
  end;
end;
Сортировка перестаёт работать если в колонках есть что-то на подобии: 00:12:05 или русские буквы (один символ), или латиские буквы (один символ), или данные типа 1/2.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.03.2011, 22:14
Т.е. в одной и той же колонке в твоем ЛистВью могут быть данные совершенно разных типоформатов ?
Ну это бардак)
А наведение порядка в бардаке, как известно, автоматизации не поддается)
Ты разберись для начала, с какого перепугу в колонке, скажем, с целочисленными данными у тебя появились данные совершенно иного рода)
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
12.03.2011, 22:46  [ТС]
Знаю только одно, что данные в колонках могут быть какие угодно и колонок может быть сколько угодно.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.03.2011, 23:44
> данные в колонках могут быть какие угодно

Чума)

Ну и как же, позволь полюбопытствовать, ты собрался сортировать эту солянку сборную ?

Что, по-твоему больше - мешок урюка или ящик шнапса ?)
Попробуй-ка расставить их в порядке "возрастания" ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2011, 23:44
Помогаю со студенческими работами здесь

Listview вывод данных и переход по нажатию на другой Listview SQLite
Доброго извините за название темы, долго не мог сформировать название, В общем у меня беда с пытаюсь написать программу где первый экран...

Вывод данных в колонках
Вывести в 10 колонок с заголовками сначала номера отрицательных элементов массива, затем положительных. После таблицы вывести минимальный и...

Передача данных из ListView в другой Activity в ListView
Добрый день. Пытаюсь разобраться с передачей данных с ListView, но выходит что то непонятное, скриншоты приложения приложил. После...

Сравнение данных в двух колонках с копированием
Ребята, требуется помощь. В приведенном файле в листе &quot;1&quot; берутся значения ячеек B1, B2 и т.д. и ищется соответствие в листе...

Неполная конвертация данных в колонках (текст >> число)
Здравствуйте, уважаемые форумчане. Всплыла такая проблема. Написал некоторый макрос, в начале которого проводится конвертация типа данных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru