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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2013, 10:44   #1
and1733
Пользователь
 
Регистрация: 16.05.2013
Сообщений: 15
По умолчанию Сортировка в ListView

Имеется таблица ListView. Необходимо сделать сортировку по убыванию в пределах диапазона столбца 1. Буду признателен за любую помощь в решении данной задачи.

and1733 вне форума Ответить с цитированием
Старый 17.05.2013, 11:33   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Прочитайте про LVM_SORTITEMSEX
waleri вне форума Ответить с цитированием
Старый 17.05.2013, 11:36   #3
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Из хэлпа
Код:
int __stdcall CustomSortProc(long Item1, long Item2, long ParamSort)

{
  return -CompareText(((TListItem *)Item1)->Caption, 
                      ((TListItem *)Item2)->Caption);

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{
  ListView1->CustomSort(CustomSortProc, 0);
}
FataLL вне форума Ответить с цитированием
Старый 17.05.2013, 12:28   #4
and1733
Пользователь
 
Регистрация: 16.05.2013
Сообщений: 15
По умолчанию

Что-то не хочет компилироваться... Правильно ли я делаю? Добавляю функцию CustomSortProc в Unit1.h:

Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TListView *ListView1;
        void __fastcall FormCreate(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
        int __stdcall CustomSortProc(long Item1, long Item2, long ParamSort)
        {
        return -CompareText(((TListItem *)Item1)->Caption,((TListItem *)Item2)->Caption);
        }
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
и добавляю событие кнопке в Unit1.cpp:

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListView1->CustomSort(CustomSortProc, 0);
}
При компиляции ошибки:
[C++ Error] Unit1.cpp(20): E2034 Cannot convert 'int (__stdcall * (_closure )(long,long,long))(long,long,long)' to 'int (__stdcall *)(long,long,long)'
[C++ Error] Unit1.cpp(20): E2342 Type mismatch in parameter 'SortProc' (wanted 'int (__stdcall *)(long,long,long)', got 'void')
and1733 вне форума Ответить с цитированием
Старый 17.05.2013, 12:40   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Сделайте CustomSortProc() static
waleri вне форума Ответить с цитированием
Старый 17.05.2013, 13:08   #6
and1733
Пользователь
 
Регистрация: 16.05.2013
Сообщений: 15
По умолчанию

Цитата:
Сделайте CustomSortProc() static
waleri, я не так давно на С++ перешёл... подскажи пожалуйста как...
and1733 вне форума Ответить с цитированием
Старый 17.05.2013, 17:34   #7
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

если добавляешь функцию в класс, то
Код:
static int __stdcall CustomSortProc(long Item1, long Item2, long ParamSort)
А можно её в класс вообще не добавлять, а написать код до Button1Click, в хэлпе же не написано, что она член класса. К тому же, судя по твоему заданию, она должна быть не такой простой, как просто сравнивать Caption. Тебе кроме этого надо ещё и SubItem[0] сравнивать.

Последний раз редактировалось FataLL; 17.05.2013 в 17:36.
FataLL вне форума Ответить с цитированием
Старый 20.05.2013, 13:05   #8
and1733
Пользователь
 
Регистрация: 16.05.2013
Сообщений: 15
По умолчанию

Это работает только для первого столбца? А как сортировать по второму к примеру?

Код:
int __stdcall CustomSortProc(long Item1, long Item2, long ParamSort)
{
        return -CompareText(((TListItem *)Item1)->Caption,
        ((TListItem *)Item2)->Caption);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        ListView1->CustomSort(CustomSortProc, 0);
}
Код:
ListView1->CustomSort(CustomSortProc, 1);
???
and1733 вне форума Ответить с цитированием
Старый 20.05.2013, 14:46   #9
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Я ж тебе написал: сравнивай ещё и SubItem[0].
FataLL вне форума Ответить с цитированием
Старый 20.05.2013, 19:40   #10
and1733
Пользователь
 
Регистрация: 16.05.2013
Сообщений: 15
По умолчанию

Спасибо, FataLL!

Если кому пригодится, вот сортировка в обратном порядке по второму столбцу:

Код:
int __stdcall CustomSortProc(long Item1, long Item2, long ParamSort)
{
        return -CompareText(((TListItem *)Item1)->SubItems->Strings[1],
        ((TListItem *)Item2)->SubItems->Strings[1]);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        ListView1->CustomSort(CustomSortProc, 0);
}
and1733 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка ListView по выбранному столбцу lena pryadun C++ Builder 2 28.05.2012 17:53
Сложная сортировка в ListView Puhovoi Помощь студентам 0 02.01.2012 12:38
Сортировка данных в ListView Shouldercannon Общие вопросы Delphi 5 05.07.2011 15:11
Сортировка и цвет строк в ListView zver777 Общие вопросы Delphi 1 26.03.2010 22:24
ListView сортировка Viten2 Компоненты Delphi 6 25.03.2007 00:28