Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
fliperstaa
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 8
#1

Отсортировать элементы в ListBox - C++ Builder

27.11.2014, 17:20. Просмотров 914. Ответов 8
Метки нет (Все метки)

Здравствуйте!
Нужно сделать сортировку файлов по весу и дате создания элементов в ListBox. в ListBox я посылаю из ListBox1.
Как это реализовать?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 17:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отсортировать элементы в ListBox (C++ Builder):

ListBox не вмещает элементы. Почему?
Здравствуйте. Подскажите пожалуйста. У меня в группу с выравниванием слева не...

Показать все выбранные элементы ListBox
Как показать все выбранные элементы ListBox в Label?

В массиве найти сумму, минимальный и отсортировать элементы.
В одномерном массиве, состоящем из n целых элементов, вычислить: 1)...

Как при выборе radiobutton отобразить некоторые элементы listbox
Когда переключатель стоит на radiobutton как отобразить некоторые элементы...

При выделении строки в ListBox отображать ее в Edit, где можно отредактировать и заменить в ListBox-е
Подскажите пожалуйста как зделать задачку:При выделении строки в поле ListBox ...

Перенести данные из ListBox на форме в Listbox на PageСontrol
Доброго времени суток! Как заставить данные которые вносятся на Form в ListBox...

8
SatanaXIII
Супер-модератор
Эксперт С++
5766 / 2764 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
28.11.2014, 10:59 #2
Все просто. Те файлы, вес и дата создания которых меньше, нужно разместить раньше (либо позже - в зависимости от направления сортировки) тех, нежели вес и дата создания которых больше.

А если серьезно, то поподробнее распишите что есть и что необходимо сделать.
1
fliperstaa
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 8
29.11.2014, 20:20  [ТС] #3
Есть вот такое задание: Для выбранной пользователем папки реализовать вывод на экран список файлов в данной папке. Реализовать сортировку файлов в папке а) по дате создания; б) по размеру файла.
Файлы вывожу в FileListBox, как реализовать сортировку, понять не могу.
0
gunslinger
случайный прохожий
1269 / 800 / 317
Регистрация: 20.07.2013
Сообщений: 2,248
30.11.2014, 16:03 #4
Вчера ночью "наваял" (исходный пример - не мой, просто немного изменил). Но работает странно. Для моего списка нужно 9 раз (вместо одного) кликнуть по кнопке для достижения результата. Вроде не напортачил в реализации пузырьковой сортировки.
У кого взгляд "свежий", могут глянуть.
Итак, сортировка по размеру файлов (по возрастанию).
Для обратной сортировки заменить знак "меньше" на "больше" в
C++
1
if (nFileSize < temp)
Чтобы сделать сортировку по времени (последнего редактирования) файла, используй
C++
1
fData.ftLastWriteTime
с соответствующим изменением кода.
Ниже "глючный" (хз почему) алгоритм сортировки по размеру файла по возрастанию (FLB = FileListBox)
C++
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
void __fastcall TForm1::FormShow(TObject *Sender)
{
  FLB->Directory = "E:\\Games\\Warcraft III\\";
  Caption = FLB->Directory;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  unsigned __int64 nFileSize = 0, temp;
  WIN32_FILE_ATTRIBUTE_DATA fData;
 
  for (int i = 0; i < FLB->Count-1; i++)
  {
    GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[i]).c_str(), GetFileExInfoStandard, &fData);
    temp = (fData.nFileSizeHigh * (MAXDWORD+1)) + fData.nFileSizeLow;
 
    for (int j = i+1; j < FLB->Count; j++)
    {
      GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[j]).c_str(), GetFileExInfoStandard, &fData);
      nFileSize = (fData.nFileSizeHigh * (MAXDWORD+1)) + fData.nFileSizeLow;
      if (nFileSize < temp)
      {
        String s = FLB->Items->Strings[i];
        FLB->Items->Strings[i] = FLB->Items->Strings[j];
        FLB->Items->Strings[j] = s;
      }
    }
  }
}
На первом скрине исходный список

Отсортировать элементы в ListBox


На втором - после нажатия на Button

Отсортировать элементы в ListBox


На третьем - то, что должно быть в итоге (мне пришлось нажать на кнопку 9 раз, хотя такой результат нужно получить после первого же нажатия)

Отсортировать элементы в ListBox


Во вложении исходный и итоговой список в Total Commander.
P.S.: для отображения "типов файлов" "поиграй" с параметром FileType FileListBox'a.

Название: b32985d8342a82b9d65835e17c989850.jpg
Просмотров: 83

Размер: 8.5 Кб
0
Миниатюры
Отсортировать элементы в ListBox   Отсортировать элементы в ListBox  
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
30.11.2014, 21:40 #5
gunslinger, пузырьковая сортировка - сравнение двух соседних элементов и их обмен при необходимости. У тебя сравнение очередного элемента со всеми последующими, отсюда и глюк.
0
gunslinger
случайный прохожий
1269 / 800 / 317
Регистрация: 20.07.2013
Сообщений: 2,248
01.12.2014, 12:22 #6
Да, в определении ошибся, но не суть.
Пробовал и настоящей пузырьковой сортировкой, так вообще не пойми что получается.
Или у меня уже что-то с головой, или снова магнитные бури.
0
gunslinger
случайный прохожий
1269 / 800 / 317
Регистрация: 20.07.2013
Сообщений: 2,248
02.12.2014, 11:37 #7
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Вот я "лошара". Отоспался и снова стал соображать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  unsigned __int64 nFileSize = 0, temp;
  WIN32_FILE_ATTRIBUTE_DATA fData;
 
  for (int i = 0; i < FLB->Count-1; i++)
  {
    for (int j = i+1; j < FLB->Count; j++)
    {
      GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[i]).c_str(), GetFileExInfoStandard, &fData);
      temp = (fData.nFileSizeHigh * (MAXDWORD+1)) + fData.nFileSizeLow;
 
      GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[j]).c_str(), GetFileExInfoStandard, &fData);
      nFileSize = (fData.nFileSizeHigh * (MAXDWORD+1)) + fData.nFileSizeLow;
 
      if (nFileSize < temp)
      {
        String s = FLB->Items->Strings[i];
        FLB->Items->Strings[i] = FLB->Items->Strings[j];
        FLB->Items->Strings[j] = s;
      }
    }
  }
2
Миниатюры
Отсортировать элементы в ListBox  
gunslinger
случайный прохожий
1269 / 800 / 317
Регистрация: 20.07.2013
Сообщений: 2,248
02.12.2014, 12:21 #8
Ну и сортировка по дате (по возрастанию)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  _FILETIME LastWriteTime, temp;
  WIN32_FILE_ATTRIBUTE_DATA fData;
 
  for (int i = 0; i < FLB->Count-1; i++)
  {
    for (int j = i+1; j < FLB->Count; j++)
    {
      GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[i]).c_str(), GetFileExInfoStandard, &fData);
      temp = fData.ftLastWriteTime;
 
      GetFileAttributesEx((FLB->Directory + "\\" + FLB->Items->Strings[j]).c_str(), GetFileExInfoStandard, &fData);
      LastWriteTime = fData.ftLastWriteTime;
 
      if ((LastWriteTime.dwHighDateTime < temp.dwHighDateTime) ||
          ((LastWriteTime.dwHighDateTime == temp.dwHighDateTime) && (LastWriteTime.dwLowDateTime < temp.dwLowDateTime)))
      {
        String s = FLB->Items->Strings[i];
        FLB->Items->Strings[i] = FLB->Items->Strings[j];
        FLB->Items->Strings[j] = s;
      }
    }
  }
1
Миниатюры
Отсортировать элементы в ListBox  
fliperstaa
0 / 0 / 0
Регистрация: 26.11.2014
Сообщений: 8
02.12.2014, 12:43  [ТС] #9
gunslinger, спасибо большое, очень помог!
0
02.12.2014, 12:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2014, 12:43
Привет! Вот еще темы с решениями:

Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при чтении из ListBox получать путь к файлам?
Возможно ли при выборе через opendialog заносить в ListBox имена файлов, а при...

Сравнить два ListBox-а, совпадающие элементы вывести в третий ListBox
Друзья, есть два Listbox, в которых храниться значения = папка и путь( пример...

Отсортировать строки в listbox
Здравствуйте, в listbox есть подобные строки: -12 да 11 нет 8 да 4 да 12...

Отсортировать рамдомный числовой массив в listbox
Как отсортировать рамдомный числовой массив в listbox всеми видами сортировок?...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru