Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.210.12] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
Возникла, казалось бы, элементарная задача, но решений в интеренете нашёл только 2, и те не рабочие (( Нужно скопировать файл в буфер обмена, чтобы потом можно было его вставить в любую папку иксплорера, и всего-то .. имя файла имеется . вот то что нашёл в сети : 1 Копируем файл в буфер обмена 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) then raise 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. а вот 2й Копирование большого файла в буфер обмена Вот общее решение, которое будет работать, даже если у вас размер файла превышает 64Кб: function _hread(FileHandle: word; BufPtr: pointer; ByteCount: longint): longint; far; external 'KERNEL' index 349; procedure CopyFileToClipboard(const fname: string); var hmem, hFile: THandle; size: LongInt; p: Pointer; begin hFile := FileOpen(fname, fmOpenRead); try size := FileSeek(hFile, 0, 2); FileSeek(hfile, 0, 0); if size > 0 then begin hmem := GlobalAlloc(GHND, size); if hMem <> 0 then begin p := GlobalLock(hMem); if p <> nil then begin _hread(hFile, p, size); GlobalUnlock(hMem); Clipboard.SetAsHandle(CF_TEXT, hMem); end else GlobalFree(hMem); end; end; finally FileClose(hFile); end; end; procedure TForm1.SpeedButton2Click(Sender: TObject); var fname: string[128]; begin if OpenDialog1.Execute then begin fname := OpenDialog1.Filename; CopyFileToClipboard(fname); end; end; на первый пример прграмма ругается при выполнении, 2й даже не запускается (просит библиотеку KERNEL.DLL). Подскажите, кто делал подобное. ПС: файлы офисных типов (.doc, .xls, .pdf etc) Заранее спасибо! Заранее спасибо! |
Сообщ.
#2
,
|
|
|
1-й вариант у меня работает, если имена файлов указаны правильно:
CopyFilesToClipboard('C:\Bootlog.Txt'#0'C:\AutoExec.Bat'); 2-й вариант - вообще не то, что тебе нужно. |