Сортировать элементы TListBox по алфавиту в Delphi 7
Я пытаюсь вызвать сортировку элементов в элементе управления TListBox после добавления / редактирования записей.
Я вижу, что есть свойство Sorted, которое я установил в true, однако он не сортирует динамически ListBox каждый раз, когда я изменяю содержимое. Кажется, что нет никакой процедуры или функции Sort, и вызов Update или Refresh не дает желаемого эффекта.
Я достиг стадии, на которой я рассматриваю вытягивание содержимого ListBox в объект TStringList, сортировку этого и затем снова помещаем все обратно в ListBox. Это кажется немного безумным, хотя, конечно, я пропускаю какой-то лучший метод.
Вот пример изменения существующего элемента:
myListBox.Items[myIndex] := newString; // Update Text
myListBox.Items.Objects[myIndex] := TObject(my_object); // Update associated object
Я ожидаю, что элемент управления обновится, чтобы сохранить сортировку по алфавиту, но это не так.
1 ответ
Сортированное свойство списка действительно поддерживается в стиле списка Win32. LBS_SORT
, Это отсортирует список при добавлении нового элемента. Но этого не произойдет, когда существующий элемент будет изменен.
Таким образом, простой способ обойти это установить Sorted
в True
Затем, вместо изменения существующих значений, удалите старое значение и добавьте новое. Таким образом, ваш код станет:
myListBox.Items.Delete(myIndex);
myListBox.Items.AddObject(newString, TObject(my_object));
И если вы подумаете об этом, ваш код был бы обречен на провал, если бы окно списка велось так, как вы ожидали. Потому что после того, как вы изменили текст элемента, если список был пересортирован, то myIndex
больше не будет ссылаться на тот же элемент.