Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправлена ошибка сортировки FileListBox при использовании Sorted в Object Inspector.

Delphi , Базы данных , Сортировка и Фильтр

 

Введение
Компонент 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:

var
  Files: TStringList;
begin
  Files := TStringList.Create;
  try
    Files.CaseSensitive := True; // Учитываем регистр
    Files.Sorted := True; // Сортируем
    FindAllFiles(Files, '/usr/share/fonts', '*', False); // Собираем файлы
    flb.Items.Assign(Files); // Назначаем список
  finally
    Files.Free;
  end;
end;

Рекомендации
- Всегда проверяйте настройки CaseSensitive и Duplicates при работе с сортированными списками в кроссплатформенных приложениях. - Используйте обновлённые версии Lazarus для получения исправлений. - Тестируйте поведение компонентов под разными ОС (особенно в Linux и Windows).


Заключение
Ошибка с некорректным подсчётом элементов в TFileListBox при активации Sorted была успешно устранена. Если вы столкнулись с подобной проблемой, воспользуйтесь приведёнными решениями или обновите среду разработки. Помните, что работа с файлами в Linux требует внимания к регистру символов, а настройки компонентов Lazarus могут влиять на поведение приложения в разных ОС.

Создано по материалам из источника по ссылке.

Проблема с некорректным подсчётом элементов в компоненте TFileListBox при активации свойства Sorted в Lazarus.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-23 04:19:03/0.0035719871520996/0