Получаем имена файлов, скопированных в буфер обмена
procedure TForm1.Button1Click(Sender: TObject);
var
f: THandle;
buffer: array [0..MAX_PATH] of Char;
i, numFiles: Integer;
beginifnot Clipboard.HasFormat(CF_HDROP) then Exit;
Clipboard.Open;
try
f := Clipboard.GetAsHandle(CF_HDROP);
if f <> 0 thenbegin
numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
memo1.Clear;
for i := 0 to numfiles - 1 dobegin
buffer[0] := #0;
DragQueryFile(f, i, buffer, SizeOf(buffer));
memo1.Lines.Add(buffer);
end;
end;
finally
Clipboard.Close;
end;
end;
Here is the translation of the text into Russian:
Код - часть проекта Delphi, который извлекает имена файлов, скопированных в системный буфер обмена, и отображает их в контроле Memo.
Разбивка кода:
Процедура Button1Click вызывается при клике кнопки на форме.
Она проверяет, содержит ли буфер обмена имена файлов в формате CF_HDROP с помощью метода HasFormat. Если нет, процедура выходит из цикла.
Она открывает буфер обмена с помощью метода Open и вводит блок try-finally для обеспечения закрытия буфера, независимо от возникновения исключения или не.
Внутри блока try она получает handle файлов в буфере обмена с помощью метода GetAsHandle и присваивает его переменной f.
Затем она вызывает функцию DragQueryFile, чтобы получить количество файлов в буфере, и хранит это значение в переменной numFiles.
Если есть файлы, она очищает контрол Memo и проходит по каждому файлу с помощью цикла for.
Для каждого файла она вызывает функцию DragQueryFile снова с handle f, текущим индексом i, пустым буфером (nil) и размером буфера (SizeOf(buffer)). Это пополняет буфер именем файла.
Затем она добавляет содержимое буфера в контрол Memo с помощью метода Lines.Add.
Код можно улучшить:
Добавление обработки ошибок для случаев, когда функция DragQueryFile fails или возвращает неожиданное значение.
Использование более эффективного способа хранения и отображения имен файлов, например, с помощью TStringList вместо контрола Memo.
Добавление функциональности для обработки различных типов файлов (например, изображений, текстовых документов и т.д.).
Улучшение пользовательского интерфейса, предоставляя обратную связь во время процесса и обрабатывая случаи, когда не копируются файлы.
Альтернативное решение, использующее TStringList вместо контрола Memo:
procedure TForm1.Button1Click(Sender: TObject);
var
f: THandle;
buffer: array [0..MAX_PATH] of Char;
i, numFiles: Integer;
begin
if not Clipboard.HasFormat(CF_HDROP) then Exit;
Clipboard.Open;
try
f := Clipboard.GetAsHandle(CF_HDROP);
if f <> 0 then
begin
numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
TStringList1.Clear;
for i := 0 to numFiles - 1 do
begin
buffer[0] := #0;
DragQueryFile(f, i, buffer, SizeOf(buffer));
TStringList1.Add(buffer);
end;
end;
finally
Clipboard.Close;
end;
end;
В этом альтернативном решении мы создаем компонент TStringList с именем TStringList1 и добавляем имена файлов в него с помощью метода Add. Это позволяет легко доступаться и манипулировать списком имен файлов.
Статья описывает процедуру в Delphi, которая позволяет получать имена файлов, скопированных в буфер обмена.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.