Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.20;
Скачать: CL | DM;

Вниз

Как скопировать файлы в буфер (   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2002.06.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
6-65204
Amdserg
2002-04-07 02:27
2002.06.20
Как настроить Web-сервер для трёхзвенки


1-65128
nitro
2002-06-07 11:42
2002.06.20
Сообщения на русском языке


3-64910
Alik Chu
2002-05-25 10:47
2002.06.20
MultiSelect в bgrid е


1-65120
Voldemar
2002-06-06 17:45
2002.06.20
TreeView и PopUpMenu


3-64940
Ptr
2002-05-27 13:34
2002.06.20
SQL запрос