-
Привет всем!!В общем такая ситуация надо произвольный файл(типа мр3 или ещё что) засунуть в буфер обмена а потом вставить в нужную папку эксплорером. Кто может помочь в реализации???Желательно с комментариями. Спасибо заранее.
-
-
Спасибо, только нужна помощь чтоб разобрать по строкам что там делается
-
Цитируй непонятные строчки и спрашивай что конкретно тебе в каждой из них не понятно
-
Желательно всё. Я понял что заданный файл мы загоняем в какую то структуру и потом посредством handle переннаправляем её в буфер
-
procedure CopyFilesToClipboard(FileList: string);
var
DropFiles: PDropFiles;
hGlobal: THandle;
iLen: Integer;
begin
//длина строки, содержащей список имен файлов
//разделитель элементов списка - символ #0
//конец списка - два подряд следующих символа #0
iLen := Length(FileList) + 2;
FileList := FileList + #0#0;
//выделение глобально доступного блока памяти размером SizeOf(TDropFiles) + iLen
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT,
SizeOf(TDropFiles) + iLen);
if (hGlobal = 0) then raise Exception.Create('Could not allocate memory.');
begin
//получение вирт.адреса выделенного блока = адреса начала структуры TDropFiles
DropFiles := GlobalLock(hGlobal);
//заполнение структуры:
//указание смещения начала строки с именами файлов отн-но начала структуры
DropFiles^.pFiles := SizeOf(TDropFiles);
//копирование строки с именами файлов по указанному смещению
Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
//
//разблокировка выделенной памяти
GlobalUnlock(hGlobal);
//собственно "копирование" в буфер
Clipboard.SetAsHandle(CF_HDROP, hGlobal);
end;
end;
-
А ТИП dropfiles что представляет собой?
-
Это структура
{ format of CF_HDROP and CF_PRINTERS, in the HDROP case the data that follows
is a double null terinated list of file names, for printers they are printer
friendly names }
PDropFiles = ^TDropFiles;
{$EXTERNALSYM _DROPFILES}
_DROPFILES = record
pFiles: DWORD; { offset of file list }
pt: TPoint; { drop point (client coords) }
fNC: BOOL; { is it on NonClient area }
{ and pt is in screen coords }
fWide: BOOL; { WIDE character switch }
end;
TDropFiles = _DROPFILES;
{$EXTERNALSYM DROPFILES}
DROPFILES = _DROPFILES;