Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка элементов TListBox, сортировка строк в ListBox 
V
    Опции темы
A11MaNi
Дата 26.3.2011, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Привет всем.!
Надеюсь кто-нибудь поможет решить мне мою задачу/проблему...
Итак, суть.
Имеется 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_mas[c0unt]);
Надеюсь не слишком запутанно, чтоб знающи люди прошли мимо  smile 

PM MAIL ICQ   Вверх
cat512
Дата 26.3.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Не проще ли из Acctssa вытаскивать в отсортированном порядке?
PM MAIL   Вверх
A11MaNi
Дата 26.3.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



может проще - но я не знаю как...
сейчас я делаю это так:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  count: Integer;
  SL: TStringlist;
begin
  Form1.ADOConnection1.Connected:=false;
  Form1.ADOConnection1.ConnectionString:=(ExtractFilePath(ParamStr(0))+'/work_bd.mdb');
  Form1.ADOConnection1.Connected:=true;
  sl:=TStringList.Create;
  ADOConnection1.GetTableNames(SL);
  for count:=0 to SL.Count-1 do
  begin
  ListBox1.Items.Add(SL[count]);
end;


Каким образом это изменить для загрузки в нужном мне порядке?
PM MAIL ICQ   Вверх
cat512
Дата 26.3.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Структуру таблицы покажи
PM MAIL   Вверх
cat512
Дата 26.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Код

SELECT
   'Понедельник' as DayOfWeek, '1' as Num
FROM AnyTable
  UNION
SELECT
   'Вторник' as DayOfWeek, '2' as Num
FROM AnyTable
  UNION
SELECT
   'Среда' as DayOfWeek, '3' as Num
FROM AnyTable
  UNION
SELECT
   'Четверг' as DayOfWeek, '4' as Num
FROM AnyTable
  UNION
SELECT
   'Пятница' as DayOfWeek, '5' as Num
FROM AnyTable
Order by Num;

и т. д.


PM MAIL   Вверх
A11MaNi
Дата 26.3.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Такая выборка вернет названия таблиц находящихся в базе?
PM MAIL ICQ   Вверх
cat512
Дата 26.3.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 7
Всего: 15



Причём тут таблицы в бд. Их названия что, необходимо выбирать? Я показал один из возможных вариантов запроса которыйв возвращает дни недели в отсортиров. прорядке

Добавлено через 1 минуту и 12 секунд
Просто вместо AnyTable, надо подставить название твоей таблицы
PM MAIL   Вверх
Keeper89
Дата 27.3.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Ну вот один из вариантов:
Код

uses
  Math;

...
  
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
      Exit(i);
end;

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

procedure TForm1.btn1Click(Sender: TObject);
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.Assign(ListBox1.Items);
    SL.CustomSort(CompareWithValues);
    ListBox1.Items.Assign(SL);
  finally
    FreeAndNil(SL);
  end;
end;


Цитата(cat512 @  26.3.2011,  14:20 Найти цитируемый пост)
Не проще ли из Acctssa вытаскивать в отсортированном порядке? 

+1. Еще бы лучше ХП, что-то типа этого.


--------------------
PM MAIL WWW   Вверх
A11MaNi
  Дата 27.3.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



cat512, Keeper89 спасибо за помощь smile!

предложения выбирать в нужном поряlке- то же интересно(и возможно наиболее логично), но изначально задача стояла в сортировке 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;


PM MAIL ICQ   Вверх
Keeper89
Дата 27.3.2011, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



A11MaNi, я зачем пример делал? Чтобы в результате получился получившийся пузырек?


--------------------
PM MAIL WWW   Вверх
A11MaNi
Дата 27.3.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Keeper89 , увы твой код у меня не заработал. 
компилятор ругается на g_DaysOfWeek undeclared identifer
PM MAIL ICQ   Вверх
Keeper89
Дата 27.3.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



В раздел объявления переменных, там где форма, объяви предопределенный массив строк с днями недели, забыл его добавить.


--------------------
PM MAIL WWW   Вверх
A11MaNi
Дата 27.3.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Код

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
      Exit(i);
end;


Ругается на exit(i) - missing operator or semicolon
Если изменить на просто exit; то результат таков:
до сортировки
user posted image
после
user posted image


PM MAIL ICQ   Вверх
Keeper89
Дата 27.3.2011, 21:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Для старых Delphi надо заменить на
Код

begin 
  Result := i;
  Exit
end


Это сообщение отредактировал(а) Keeper89 - 27.3.2011, 23:30


--------------------
PM MAIL WWW   Вверх
A11MaNi
Дата 28.3.2011, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Keeper89 - вот в этом варианте работает ! smile
Благодарю за помощь!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.