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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2011, 15:39   #1
ydav_kaa
 
Регистрация: 26.03.2011
Сообщений: 4
Вопрос Сортировка строк в ListBox

Привет всем.!
Надеюсь кто-нибудь поможет решить мне мою задачу/проблему...
Итак, суть.
Имеется ListBox в который из бд access загружаются названия таблиц.
(названия таблиц - дни недели + одна таблица с исключениями)
После загрузки названий listbox выглядит следующим образом:


Цитата:
воскресенье
вторник
исключения
понедельник
пятница
среда
суббота
четверг

То есть - названия отсортированы по алфавиту. Мне же необходимо упорядочить дни недели:

Цитата:
Понедельник
Вторник
...
Исключения

для этого Я сделал следующее:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  c0unt: integer;
  day_mas: array[0..7] of integer;
 begin
   for c0unt:=0 to listbox1.Count-1 do
    begin
      case ANSIIndexText(ListBox1.Items[c0unt], ['Понедельник','Вторник','Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье', 'Исключения']) of
        0: day_mas[c0unt]:=0;
        1: day_mas[c0unt]:=1;
        2: day_mas[c0unt]:=2;
        3: day_mas[c0unt]:=3;
        4: day_mas[c0unt]:=4;
        5: day_mas[c0unt]:=5;
        6: day_mas[c0unt]:=6;
        7: day_mas[c0unt]:=7;
      end;
    end;
    for c0unt:=0 to ListBox1.Count-1 do
    begin
      listbox1.Items.Exchange(c0unt,day_mas[c0unt]);
    end;
 end;

Но результат был не тот что я ожидал.
Код:
Понедельник
Вторник
Среда
Исключения
Пятница
Воскресенье
Четверг
Суббота
При трассировке значения day_mas = (6,1,7,0,4,2,5,3) - то есть именно такой порядок - который мне нужен.
Так что, видимо, все дело в listbox1.Items.Exchange(c0unt,day_m as[c0unt]);
Надеюсь не слишком запутанно, чтоб знающи люди прошли мимо :crazy

Последний раз редактировалось ydav_kaa; 26.03.2011 в 21:17.
ydav_kaa вне форума Ответить с цитированием
Старый 26.03.2011, 23:03   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

вы заполняете массив day_mas числами в зависимости от дня недели:
изначально day_mas = (6,1,7,0,4,2,5,3).
Потом сортируйте его по возрастанию и при перестановке его элементов переставляйте соответствующие строки в ListBox.

Код:
var
  day_mas: array [0..7] of byte;
  i, j, T: integer;
begin
  for i:=0 to ListBox1.Count - 1 do
    begin
      if AnsiUpperCase(ListBox1.Items[i]) = 'ПОНЕДЕЛЬНИК' then day_mas[i]:=0;
      if AnsiUpperCase(ListBox1.Items[i]) = 'ВТОРНИК' then day_mas[i]:=1;
      if AnsiUpperCase(ListBox1.Items[i]) = 'СРЕДА' then day_mas[i]:=2;
      if AnsiUpperCase(ListBox1.Items[i]) = 'ЧЕТВЕРГ' then day_mas[i]:=3;
      if AnsiUpperCase(ListBox1.Items[i]) = 'ПЯТНИЦА' then day_mas[i]:=4;
      if AnsiUpperCase(ListBox1.Items[i]) = 'СУББОТА' then day_mas[i]:=5;
      if AnsiUpperCase(ListBox1.Items[i]) = 'ВОСКРЕСЕНЬЕ' then day_mas[i]:=6;
      if AnsiUpperCase(ListBox1.Items[i]) = 'ИСКЛЮЧЕНИЯ' then day_mas[i]:=7;
    end;

  for i:=0 to 6 do
    for j:=0 to 6 - i do
      if day_mas[j] > day_mas[j+1]
        then
            begin
              ListBox1.Items.Exchange(j, j+1);
              T:=day_mas[j];
              day_mas[j]:=day_mas[j+1];
              day_mas[j+1]:=T;
            end;
end;
А Listbox тут непричем
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 27.03.2011, 19:58   #3
ydav_kaa
 
Регистрация: 26.03.2011
Сообщений: 4
Хорошо

Спасибо! Именно то, что нужно!
А то уж было я стал подумывать над тем, как сделать выборку названий таблиц в нужном порядке из базы!
А вообще удивлен, что ни у кого такой задачи не возникало - сортировать листбокс... в поиске ничего нет
ydav_kaa вне форума Ответить с цитированием
Старый 28.03.2011, 08:31   #4
ydav_kaa
 
Регистрация: 26.03.2011
Сообщений: 4
Хорошо

На соседнем форуме подсказали вот такой вариант решения задачи - тоже рабочий:

Код:
function GetDayIndex(const DayName: string): Integer;
var
  i: Integer;
begin
  Result := High(g_DaysOfWeek) + 1;
  for i := Low(g_DaysOfWeek) to High(g_DaysOfWeek) do
    if (AnsiCompareText(DayName, g_DaysOfWeek[i]) = 0) then
      begin
  Result := i;
  Exit;
end;
end;

function CompareWithValues(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareValue(GetDayIndex(List[Index1]), GetDayIndex(List[Index2]));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  SL2: TStringList;
begin
  SL2 := TStringList.Create;
  try
    SL2.Assign(ListBox2.Items);
    SL2.CustomSort(CompareWithValues);
    ListBox2.Items.Assign(SL2);
  finally
    FreeAndNil(SL2);
  end;
end;
ydav_kaa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Listbox grigorill2 C# (си шарп) 1 22.02.2011 20:16
ListBox сортировка данных one1991 Общие вопросы Delphi 5 30.05.2010 22:16
Удаление из ListBox строк S.T.A.L.K.E.R. Общие вопросы Delphi 2 27.09.2009 05:15
ListBox (количество строк) Vali_T Помощь студентам 6 06.10.2008 15:30
ListBox Кол-во строк ruPy Компоненты Delphi 1 14.12.2007 17:51