Перейти к содержанию
Fire Monkey от А до Я
  • 0

Сортировка TListBoxItem по алфавиту


VirusZ2D

Вопрос

Доброго времени суток

 

как отсортировать по алфавиту  Listbox1.sorted := true;

если так то он сортирует начиная с цифр а хотелось бы чтоб он начинал  с букв можно ли научить listbox этому ? спасибо

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Незнаю, можно ли напрямую сортировку делать - но можно воспользоваться кастомной сортировкой массива. Возможно у меня не совсем правильно - но вот работающий пример:

 TArray.Sort<String>(YouArrayName, TDelegatedComparer<String>.Construct(
    function(const Left, Right: String): Integer
    var
      Custom: TCustomerComparer;
    begin
      Custom := TCustomerComparer.Create;
      try
        Result := Custom.Compare(Left, Right);
      finally
        Custom.Free;
      end;
    end));

TCustomerComparer.Compare(Left, Right); - ваш вариант сортировки. Я брал реализацию Александра (Rouse_) Багеля. Выглядит она так:

{ TCustomerComparer }

function TCustomerComparer.Compare(const Left, Right: String): Integer;
var
  S1IsInt, S2IsInt: Boolean;
  S1Cursor, S2Cursor: PChar;
  S1Int, S2Int, Counter, S1IntCount, S2IntCount: Integer;
  SingleByte: Byte;
begin
  // Проверка на пустые строки
  if Left = '' then
    if Right = '' then
    begin
      Result := 0;
      Exit;
    end
    else
    begin
      Result := -1;
      Exit;
    end;
  if Right = '' then
  begin
    Result := 1;
    Exit;
  end;

  S1Cursor := @AnsiLowerCase(Left)[1];
  S2Cursor := @AnsiLowerCase(Right)[1];

  while True do
  begin
    // проверка на конец первой строки
    if S1Cursor^ = #0 then
      if S2Cursor^ = #0 then
      begin
        Result := 0;
        Exit;
      end
      else
      begin
        Result := -1;
        Exit;
      end;

    // проверка на конец второй строки
    if S2Cursor^ = #0 then
    begin
      Result := 1;
      Exit;
    end;

    // проверка на начало числа в обоих строках
    S1IsInt := CharInSet(S1Cursor^, ['0' .. '9']);
    S2IsInt := CharInSet(S2Cursor^, ['0' .. '9']);
    if S1IsInt and not S2IsInt then
    begin
      Result := -1;
      Exit;
    end;
    if not S1IsInt and S2IsInt then
    begin
      Result := 1;
      Exit;
    end;

    // посимвольное сравнение
    if not(S1IsInt and S2IsInt) then
    begin
      if S1Cursor^ = S2Cursor^ then
      begin
        Inc(S1Cursor);
        Inc(S2Cursor);
        Continue;
      end;
      if S1Cursor^ < S2Cursor^ then
      begin
        Result := -1;
        Exit;
      end
      else
      begin
        Result := 1;
        Exit;
      end;
    end;

    // вытаскиваем числа из обоих строк и сравниваем
    S1Int := 0;
    Counter := 1;
    S1IntCount := 0;
    repeat
      Inc(S1IntCount);
      SingleByte := Byte(S1Cursor^) - Byte('0');
      S1Int := S1Int * Counter + SingleByte;
      Inc(S1Cursor);
      Counter := 10;
    until not CharInSet(S1Cursor^, ['0' .. '9']);

    S2Int := 0;
    Counter := 1;
    S2IntCount := 0;
    repeat
      SingleByte := Byte(S2Cursor^) - Byte('0');
      Inc(S2IntCount);
      S2Int := S2Int * Counter + SingleByte;
      Inc(S2Cursor);
      Counter := 10;
    until not CharInSet(S2Cursor^, ['0' .. '9']);

    if S1Int = S2Int then
    begin
      if S1Int = 0 then
      begin
        if S1IntCount < S2IntCount then
        begin
          Result := -1;
          Exit;
        end;
        if S1IntCount > S2IntCount then
        begin
          Result := 1;
          Exit;
        end;
      end;
      Continue;
    end;
    if S1Int < S2Int then
    begin
      Result := -1;
      Exit;
    end
    else
    begin
      Result := 1;
      Exit;
    end;
  end;
end;

Загрузка в ЛистБокс:

ListBox11.Items.AddStrings(YouArrayName);
Ссылка на комментарий
  • 0

что ж так сложно то O_O

выделить из строки подстроку - на 100 строк процедура?

 

а еще как обычно замечу, что данные нужно хранить в модели данных а не на экране

тогда доступ к ним гораздо проще

и сортировка тоже

Ссылка на комментарий
  • 0

что ж так сложно то O_O

выделить из строки подстроку - на 100 строк процедура?

 

а еще как обычно замечу, что данные нужно хранить в модели данных а не на экране

тогда доступ к ним гораздо проще

и сортировка тоже

действительно спасибо засыпал уже не подумал )))

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...