uses
ShlObj, ClipBrd;
procedure CopyFilesToClipboard(FileList: string);
var
DropFiles: PDropFiles;
hGlobal: THandle;
iLen: Integer;
begin
iLen := Length(FileList) + 2;
FileList := FileList + #0#0;
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT,
SizeOf(TDropFiles) + iLen);
if (hGlobal = 0) thenraise Exception.Create('Could not allocate memory.');
begin
DropFiles := GlobalLock(hGlobal);
DropFiles^.pFiles := SizeOf(TDropFiles);
Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
GlobalUnlock(hGlobal);
Clipboard.SetAsHandle(CF_HDROP, hGlobal);
end;
end;
// Example, Beispiel: procedure TForm1.Button1Click(Sender: TObject);
begin
CopyFilesToClipboard('C:\Bootlog.Txt'#0'C:\AutoExec.Bat');
end;
//Separate the files with a #0.
Перевод контента на русский язык:
Это программное обеспечение Delphi, которое копирует список путей к файлам в буфер обмена с помощью единиц ShlObj и ClipBrd. Вот разбивка кода:
Главная процедура: CopyFilesToClipboard
Эта процедура принимает строковый параметр FileList, содержащий список путей к файлам, разделенных символом #0.
Она выделяет память для структуры TDropFiles и инициализирует ее длиной списка путей к файлам плюс 2 (для терминатора #0#0).
Затем процедура копирует список путей к файлам в выделенную память, за которым следует терминатор #0#0.
Наконец, она устанавливает handle буфера обмена с помощью метода Clipboard.SetAsHandle.
Пример кода: Button1Click
Это обработчик события клика кнопки на форме (TForm1).
Когда кнопка кликается, она вызывает процедуру CopyFilesToClipboard с двумя путями к файлам в виде строки: 'C:\Bootlog.Txt' и 'C:\AutoExec.Bat', разделенными символом #0.
Альтернативное решение
Если вы хотите копировать несколько файлов в буфер обмена без конкатенации их с помощью #0, можно использовать массив путей к файлам вместо. Вот обновленная версия процедуры:
procedureCopyFilesToClipboard(FileList:TArray<string>);varDropFiles:PDropFiles;hGlobal:THandle;iLen:Integer;beginiLen:=Length(FileList)*(SizeOf(UTF8Char)+1);hGlobal:=GlobalAlloc(GMEM_SHAREorGMEM_MOVEABLEorGMEM_ZEROINIT,SizeOf(TDropFiles)+iLen);if(hGlobal=0)thenraiseException.Create('Could not allocate memory.');DropFiles:=GlobalLock(hGlobal);DropFiles^.pFiles:=SizeOf(TDropFiles);fori:=0toHigh(FileList)doMove(PChar(FileList[i]),(PChar(DropFiles)+SizeOf(TDropFiles))^,Length(FileList[i])*SizeOf(UTF8Char));GlobalUnlock(hGlobal);Clipboard.SetAsHandle(CF_HDROP,hGlobal);end;
В этой версии процедура принимает массив путей к файлам (TArray<string>) и перебирает его для копирования каждого пути к файлу в выделенную память. Это позволяет копировать несколько файлов без конкатенации их с помощью #0.
Примечание: код предполагает, что пути к файлам закодированы в UTF-8. Если ваши пути к файлам используют другой формат кодировки, вам может потребоваться изменение кода соответствующим образом.
В статье описывается программный код на Delphi, который позволяет копировать файлы в буфер обмена для последующего пастирования в любое приложение, поддерживающее обмен данными.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.