Введение
Компонент TFileListBox в Lazarus предоставляет удобный способ отображения списка файлов в заданной директории. Однако при использовании свойства Sorted (сортировка) через Object Inspector разработчики могут столкнуться с неожиданным поведением, например, некорректным подсчётом элементов. В этой статье разберём причины этой ошибки, официальное решение от разработчиков Lazarus и альтернативные способы её устранения.
Описание проблемы
Пользователь jipété обнаружил, что при установке свойства Sorted := True для TFileListBox через Object Inspector, количество элементов в списке (доступное через Items.Count) отображается некорректно. Например, в директории /usr/share/fonts выводилось значение 13, хотя фактическое количество файлов было больше. Проблема проявлялась в среде Linux (GTK2) при использовании Lazarus 3.8 и FreePascal 3.2.2.
Причина ошибки
Как выяснил разработчик Bart, проблема связана с особенностями работы сортировки в компоненте:
1. При создании TFileListBox используется класс TExtendedStringList (наследник TStringList), который по умолчанию не учитывает регистр (CaseSensitive := False).
2. После отрисовки компонента (когда выделен дескриптор окна), список заменяется на TGtkListStoreStringList, который учитывает регистр (CaseSensitive := True).
3. В Linux (с учётом регистра в именах файлов) это приводит к дублированию записей при сортировке, если файлы имеют одинаковые имена в разном регистре (например, File.txt и file.txt).
Таким образом, при активации Sorted через Object Inspector происходила потеря данных из-за конфликта настроек чувствительности к регистру.
Официальное решение
Ошибка была исправлена в Lazarus (коммит 3cc3475c). Теперь при создании TFileListBox свойство CaseSensitive внутреннего TStringList явно устанавливается в True, что предотвращает дублирование элементов. Обновление можно получить через репозиторий Lazarus или дождаться включения фикса в стабильную версию.
Альтернативные решения
Если обновление Lazarus недоступно, воспользуйтесь следующими методами:
1. Установка CaseSensitive вручную
Перед назначением директории принудительно задайте CaseSensitive := True для Items:
procedure TForm1.FormCreate(Sender: TObject);
begin
flb.Directory := ''; // Сброс текущей директории
TStringList(flb.Items).CaseSensitive := True; // Важно: только если Handle не выделен!
flb.Directory := '/usr/share/fonts'; // Назначение целевой директории
ShowMessage(IntToStr(flb.Items.Count)); // Теперь отображает корректное количество
end;
Примечание: Если компонент уже отрисован (имеет дескриптор), приведение TStringList(flb.Items) вызовет исключение. Убедитесь, что настройка выполняется до создания Handle (например, в FormCreate).
2. Назначение Directory в коде вместо Object Inspector
Избегайте установки Directory через Object Inspector. Вместо этого задавайте путь программно:
// В Object Inspector: оставьте Directory пустым, Sorted := True
procedure TForm1.FormCreate(Sender: TObject);
begin
flb.Sorted := True;
flb.Directory := '/usr/share/fonts'; // Назначаем после установки Sorted
end;
3. Использование TStringList для фильтрации
Для полного контроля над списком файлов обрабатывайте их через TStringList:
Рекомендации
- Всегда проверяйте настройки CaseSensitive и Duplicates при работе с сортированными списками в кроссплатформенных приложениях. - Используйте обновлённые версии Lazarus для получения исправлений. - Тестируйте поведение компонентов под разными ОС (особенно в Linux и Windows).
Заключение
Ошибка с некорректным подсчётом элементов в TFileListBox при активации Sorted была успешно устранена. Если вы столкнулись с подобной проблемой, воспользуйтесь приведёнными решениями или обновите среду разработки. Помните, что работа с файлами в Linux требует внимания к регистру символов, а настройки компонентов Lazarus могут влиять на поведение приложения в разных ОС.
Проблема с некорректным подсчётом элементов в компоненте TFileListBox при активации свойства Sorted в Lazarus.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.