Форум: "WinAPI";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
ВнизКак скопировать файлы в буфер ( Найти похожие ветки
← →
Fomin Albert (2002-04-14 00:43) [0]Хочу узнать как копируютя файлы в Clipboard
← →
Anatoly Podgoretsky (2002-04-14 09:58) [1]Узнать весьма тяжело, исходники виндов закрыты, но по секрету скажу, что файлы туда не копируются, а копируются только имена.
← →
arbiter (2002-04-16 20:48) [2]Ничего не закрыто.
Но сама процедура не очень проста необходимо реализовывать кое какие интерфейсы винды, в частности IDataSource (в общем случае).
Но есть уже готовые библиотеки которые позволяют делать это. Например Drag and Drop Component Suite.
И вообще в Shell перетаскивание и работа с Clipboard во многом пересекаются.
← →
Derr (2002-04-17 15:53) [3]Это если строку.
procedure CopyStringToClipboard(s: string);
var hg: THandle;
P: PChar;
begin
hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
P:=GlobalLock(hg);
StrPCopy(P, s);
GlobalUnlock(hg);
OpenClipboard(Application.Handle);
SetClipboardData(CF_TEXT, hg);
CloseClipboard;
GlobalFree(hg);
end;
Но можно и файл открыть и построчно закачать, если его к тебе перетащили
← →
arbiter (2002-04-17 18:53) [4]> Derr
Вопрос насколько я понимаю относился к копированию имён файлов в Clipboard, а не содержимого. А в таком случае там совсем другой подход.
← →
Derr (2002-04-18 10:42) [5]Не надо выдумывать, а используя потоки это сделал еще Махоткин
-----------------------
unit ClipStrm;
{
This unit is Copyright (c) Alexey Mahotkin 1997-1998
and may be used freely for any purpose. Please mail
your comments to
E-Mail: alexm@hsys.msk.ru
FidoNet: Alexey Mahotkin, 2:5020/433
This unit was developed during incorporating of TP Lex/Yacc
into my project. Please visit ftp://ftp.nf.ru/pub/alexm
or FREQ FILES from 2:5020/433 or mail me to get hacked
version of TP Lex/Yacc which works under Delphi 2.0+.
}
interface uses Classes, Windows;
type
TClipboardStream = class(TStream)
private
FMemory : pointer;
FSize : longint;
FPosition : longint;
FFormat : word;
public
constructor Create(fmt : word);
destructor Destroy; override;
function Read(var Buffer; Count : Longint) : Longint; override;
function Write(const Buffer; Count : Longint) : Longint; override;
function Seek(Offset : Longint; Origin : Word) : Longint; override;
end;
implementation uses SysUtils;
constructor TClipboardStream.Create(fmt : word);
var
tmp : pointer;
FHandle : THandle;
begin
FFormat := fmt;
OpenClipboard(0);
FHandle := GetClipboardData(FFormat);
FSize := GlobalSize(FHandle);
FMemory := AllocMem(FSize);
tmp := GlobalLock(FHandle);
MoveMemory(FMemory, tmp, FSize);
GlobalUnlock(FHandle);
FPosition := 0;
CloseClipboard;
end;
destructor TClipboardStream.Destroy;
begin
FreeMem(FMemory);
end;
function TClipboardStream.Read(var Buffer; Count : longint) : longint;
begin
if FPosition + Count > FSize then
Result := FSize - FPosition
else
Result := Count;
MoveMemory(@Buffer, PChar(FMemory) + FPosition, Result);
Inc(FPosition, Result);
end;
function TClipboardStream.Write(const Buffer; Count : longint) : longint;
var
FHandle : HGlobal;
tmp : pointer;
begin
ReallocMem(FMemory, FPosition + Count);
MoveMemory(PChar(FMemory) + FPosition, @Buffer, Count);
FPosition := FPosition + Count;
FSize := FPosition;
FHandle := GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT, FSize);
try
tmp := GlobalLock(FHandle);
try
MoveMemory(tmp, FMemory, FSize);
OpenClipboard(0);
SetClipboardData(FFormat, FHandle);
finally
GlobalUnlock(FHandle);
end;
CloseClipboard;
except
GlobalFree(FHandle);
end;
Result := Count;
end;
function TClipboardStream.Seek(Offset : Longint; Origin : Word) : Longint;
begin
case Origin of
0 : FPosition := Offset;
1 : Inc(FPosition, Offset);
2 : FPosition := FSize + Offset;
end;
Result := FPosition;
end;
end.
=== Cut ===
Author>:
Alexey Mahotkin
alexm@hsys.msk.ru
(2:5020/433)
.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c