При работе с буфером обмена в операционных системах семейства Windows часто возникает необходимость копирования пути к файлам или папкам. Существует несколько способов выполнения этой задачи, в том числе использование форматов CF_HDROP и CF_SHELLIDLIST. В данной статье мы рассмотрим, как реализовать копирование в буфер обмена с использованием этих форматов, а также обсудим альтернативные подходы.
Использование формата CF_HDROP
Формат CF_HDROP позволяет хранить в буфере обмена пути к файлам и папкам. Для работы с этим форматом можно использовать следующие функции из Windows API:
SHCreateDataObject для создания объекта IDataObject.
OleSetClipboard для установки созданного объекта в буфер обмена.
Пример кода на Object Pascal для копирования пути к файлам в буфер обмена:
uses
ShellAPI;
procedure CopyFilesToClipboard(const FilePaths: TArray<string>);
var
DataObj: IDataObject;
HDrop: HDROP;
i: Integer;
Paths: array of string;
begin
SetLength(Paths, Length(FilePaths));
for i := Low(FilePaths) to High(FilePaths) do
Paths[i] := PChar(FilePaths[i]);
HDrop := CreateHDrop;
try
for i := Low(Paths) to High(Paths) do
if DragQueryFile(HDrop, i, nil, 0) <> 0 then
DragAddFiles(HDrop, PChar(Paths[i]), 0, TRUE, FILE_ATTRIBUTE_NORMAL);
SHCreateDataObjectFromHDrop(HDrop, IID_IDataObject, DataObj);
OleSetClipboard(DataObj);
finally
OleDragLeave(0);
OleRelease(DataObj);
GlobalDeleteAtom(DragFinish(HDrop, TRUE));
end;
end;
Использование формата CF_SHELLIDLIST
Формат CF_SHELLIDLIST используется для хранения ITEMIDLIST в буфере обмена, что также может быть полезно при работе с файлами и папками. Для преобразования путей в ITEMIDLIST можно использовать функции SHParseDisplayName, ILCreateFromPath или аналогичные.
Альтернативный подход
Существует библиотека для Delphi, которая поддерживает операции с буфером обмена и может быть использована для копирования файлов и папок. Пример использования этой библиотеки для копирования файлов в буфер обмена представлен в коде:
procedure TForm1.ActionFileCopyExecute(Sender: TObject);
begin
DropFileSource1.CopyToClipboard;
end;
Этот код предполагает, что компонент DropFileSource1 уже настроен и готов к использованию.
Заключение
В статье были рассмотрены два способа копирования путей к файлам и папкам в буфер обмена: использование форматов CF_HDROP и CF_SHELLIDLIST и применение сторонней библиотеки для Delphi. Выбор метода зависит от конкретных требований проекта и предпочтений разработчика.
В статье рассматриваются способы копирования путей к файлам и папкам в буфер обмена Windows для использования в проектах на Delphi и Pascal с применением форматов `CF_HDROP` и `CF_SHELLIDLIST`, а также обсуждается использование сторонни
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.