{uses ShellApi}procedure TForm1.ListBox1DblClick(Sender: TObject);
var
s: string;
begin
s := listbox1.Items[SendMessage(ListBox1.Handle, lb_GetCurSel, 0, 0)];
if edit1.Text[length(edit1.text)] <> '\' then
edit1.text := concat(edit1.text + '\');
if (not FileExists(edit1.text + s)) and (s[1] = '[') and (s[length(s)] = ']')
then
DlgDirList(handle,
PChar(edit1.text + copy(s, 2, length(s) - 2)),
ListBox1.Handle,
Edit1.Handle,
faAnyFile
);
if edit1.Text[length(edit1.text)] <> '\' then
edit1.text := concat(edit1.text + '\');
if FileExists(edit1.text + s) thenbegin
caption := edit1.text + s;
ShellExecute(handle, 'open', PChar(edit1.text + s), '', 'c:\', sw_show);
endend;
procedure TForm1.FormShow(Sender: TObject);
begin
edit1.Width := 1024 * 8 - 1;
edit1.Visible := false;
DlgDirList(handle,
PChar('c:\'),
ListBox1.Handle,
Edit1.Handle,
faAnyFile
);
listbox1.Sorted := false;
listbox1.Sorted := true;
end;
Пример создания FileListBox в Delphi с использованием единицы ShellApi.
Обзор
Код состоит из двух процедур: ListBox1DblClick и FormShow. Первая процедура обрабатывает события двойного клика на FileListBox, а вторая процедура инициализирует форму при ее отображении.
Описание кода
Процедура ListBox1DblClick
Эта процедура вызывается при двойном клике пользователя на элементе в FileListBox. Она выполняет следующие действия:
1. Получает текущий выбранный элемент из FileListBox с помощью lb_GetCurSel.
2. Проверяет, начинается ли элемент с [ и заканчивается ли он ]. Если это так, она предполагает, что элемент - это путь к директории.
3. Вызывает DlgDirList, чтобы отобразить диалоговое окно списка директорий. Parameters:
* Handle: Обратный handle родительского окна (в этом случае, формы).
* Path: Путь к директории, с которого начать (состоит из concatenation edit1.Text + s, где s - выбранный элемент).
* ListBoxHandle: Handle FileListBox.
* EditHandle: Handle редактируемого контрола (используется для отображения пути к файлу/директории).
* faAnyFile: Флаг, указывающий, что в диалоговом окне должны быть отображены любые типы файлов.
4. После закрытия диалогового окна она проверяет, существует ли выбранный элемент как файл или директория. Если это так:
* Она устанавливает заголовок формы на путь к выбранному элементу.
* Использует ShellExecute для открытия выбранного элемента с помощью ассоциированной программы (например, открытия текстового файла в Notepad).
Процедура FormShow
Эта процедура вызывается при отображении формы. Она выполняет следующие действия:
1. Устанавливает ширину редактируемого контрола в конкретное значение.
2. Скрывает редактируемый контрольinitially.
3. Вызывает DlgDirList снова, но с другими параметрами:
* Path: корневой путь к директории ('c:\').
* ListBoxHandle: Handle FileListBox.
* EditHandle: Handle редактируемого контрола (теперь видимый).
* faAnyFile: Флаг, указывающий, что в диалоговом окне должны быть отображены любые типы файлов.
4. Устанавливает свойство Sorted FileListBox в false, а затем в true. Это, вероятно, сделано для обеспечения правильного сортировки списка после инициализации.
Альтернативное решение
Хотя этот код работает, есть несколько областей, где он мог бы быть улучшен:
Вместо использования жесткого пути к корневой директории ('c:\') рассмотрите более гибкий подход, например, позволяя пользователю вводить путь в редактируемом контроле.
Рассмотрите использование более описательных имен переменных и комментариев для улучшения понимания кода.
Если вы планируете использовать этот код в реальном приложении, рассмотрите реализацию обработки ошибок для случаев, когда выбранный элемент не существует или не может быть открыт.
В статье приводится пример создания компонента FileListBox с помощью языка программирования Delphi, включающего в себя использование ShellApi для работы с файловой системой и выполнения операций с файлами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.