Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-65281
anacronix
2002-04-20 18:23
2002.06.20
Ввод текста в Edit1 в любом регистре


3-64956
victo73
2002-05-28 01:23
2002.06.20
Как упаковать после удаления Dbase IV Доступными ресурсами


3-64991
rashit
2002-05-28 18:17
2002.06.20
поиск в БД


3-64903
jaric
2002-05-24 18:48
2002.06.20
Какое ограничение на длину текста запроса в TADOQuery


1-65091
Валет
2002-06-06 20:03
2002.06.20
Как юзать эту функцию ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский