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

Вниз

Как сохранить ClipBoard в файл ?   Найти похожие ветки 

 
Mr. Smit   (2003-08-04 00:51) [0]

Подскажите плиз., как мне сохранить _все_ содержимое буффера обмена в файл, включая нестандартные форматы (типа CF_TEXT и т.п.) ?

Мои попытки закончились странным непонятным глюком, когда после

Data := GetClipboardData(Clipboard.Formats[I]);
DataPtr := GlobalLock(Data);

DataPtr почему-то оказывается nil для некоторых форматов, и мне, соответственно, просто нечего сохранять в файл. Потом, после очистки буффера обмена и загрузки его из файла данные теряются...


 
MBo ©   (2003-08-04 06:47) [1]

1) CF_TEXT - стандартный формат.
2) есть такое понятие - отложенное копирование - rendering - в таком случае данные не скопируются (nil будет)
3) нестандартные форматы регистрируются в системе программами - если в момент вставки назад формат будет неизвестен- финиш.


var FS:TFileStream;

procedure TForm1.bClearClick(Sender: TObject);
begin
OpenClipBoard(0);
EmptyClipboard;
CloseClipBoard;
end;

procedure TForm1.BSaveClick(Sender: TObject);
var CBF:Cardinal;
CBFList:TList;
i:Integer;
h:THandle;
p:Pointer;
CBBlockLength,Temp:Cardinal;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
CBFList:=TList.Create;
CBF:=0;
repeat
CBF:=EnumClipboardFormats(CBF);
if CBF<>0 then
CBFList.Add(pointer(CBF));
until CBF=0;
edit1.text:=IntToStr(CBFList.Count);
if CBFList.Count>0 then begin
FS:=TFileStream.Create("e:\cp.dat",fmCreate);
Temp:=CBFList.Count;
FS.Write(Temp,SizeOf(Integer));
for i:=0 to CBFList.Count-1 do begin
h:=GetClipboardData(Cardinal(CBFList[i]));
if h>0 then begin
CBBlockLength:=GlobalSize(h);
if h>0 then begin
p:=GlobalLock(h);
if p <> nil then begin
Temp:=Cardinal(CBFList[i]);
FS.Write(Temp,SizeOf(Cardinal));
FS.Write(CBBlockLength,SizeOf(Cardinal));
FS.Write(p^,CBBlockLength);
end;
GlobalUnlock(h);
end;
end;
end;
FS.Free;
end;
CBFList.Free;
CloseClipBoard;
end;
end;

procedure TForm1.bLoadClick(Sender: TObject);
var h:THandle;
p:Pointer;
CBF:Cardinal;
CBBlockLength:Cardinal;
i,CBCount:Integer;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
FS:=TFileStream.Create("e:\cp.dat",fmOpenRead);
if FS.Size=0 then Exit;
FS.Read(CBCount,sizeOf(Integer));
if CBCount=0 then Exit;
for i:=1 to CBCount do begin
FS.Read(CBF,SizeOf(Cardinal));
FS.Read(CBBlockLength,SizeOf(Cardinal));
h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT,CBBlockLength);
if h>0 then begin
p:=GlobalLock(h);
if p=nil then
GlobalFree(h)
else begin
FS.Read(p^,CBBlockLength);
GlobalUnlock(h);
( CBF,h)
1) CF_TEXT - стандартный формат.
2) есть такое понятие - отложенное копирование - rendering - в таком случае данные не скопируются (nil будет)
3) нестандартные форматы регистрируются в системе программами - если в момент вставки назад формат будет неизвестен- финиш.


var FS:TFileStream;

procedure TForm1.bClearClick(Sender: TObject);
begin
OpenClipBoard(0);
EmptyClipboard;
CloseClipBoard;
end;

procedure TForm1.BSaveClick(Sender: TObject);
var CBF:Cardinal;
CBFList:TList;
i:Integer;
h:THandle;
p:Pointer;
CBBlockLength,Temp:Cardinal;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
CBFList:=TList.Create;
CBF:=0;
repeat
CBF:=EnumClipboardFormats(CBF);
if CBF<>0 then
CBFList.Add(pointer(CBF));
until CBF=0;
edit1.text:=IntToStr(CBFList.Count);
if CBFList.Count>0 then begin
FS:=TFileStream.Create("e:\cp.dat",fmCreate);
Temp:=CBFList.Count;
FS.Write(Temp,SizeOf(Integer));
for i:=0 to CBFList.Count-1 do begin
h:=GetClipboardData(Cardinal(CBFList[i]));
if h>0 then begin
CBBlockLength:=GlobalSize(h);
if h>0 then begin
p:=GlobalLock(h);
if p <> nil then begin
Temp:=Cardinal(CBFList[i]);
FS.Write(Temp,SizeOf(Cardinal));
FS.Write(CBBlockLength,SizeOf(Cardinal));
FS.Write(p^,CBBlockLength);
end;
GlobalUnlock(h);
end;
end;
end;
FS.Free;
end;
CBFList.Free;
CloseClipBoard;
end;
end;

procedure TForm1.bLoadClick(Sender: TObject);
var h:THandle;
p:Pointer;
CBF:Cardinal;
CBBlockLength:Cardinal;
i,CBCount:Integer;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
FS:=TFileStream.Create("e:\cp.dat",fmOpenRead);
if FS.Size=0 then Exit;
FS.Read(CBCount,sizeOf(Integer));
if CBCount=0 then Exit;
for i:=1 to CBCount do begin
FS.Read(CBF,SizeOf(Cardinal));
FS.Read(CBBlockLength,SizeOf(Cardinal));
h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT,CBBlockLength);
if h>0 then begin
p:=GlobalLock(h);
if p=nil then
GlobalFree(h)
else begin
FS.Read(p^,CBBlockLength);
GlobalUnlock(h);
SetClipboardData(CBF,h);
end;
end;
end;
FS.Free;
CloseClipBoard;
end;
end;


 
Mr. Smit   (2003-08-04 17:58) [2]

Спасибо !

Насчет CF_TEXT я неправильно напечатал "нестандартные" - надо было написать раздельно (; или еще как-нить, но думаю меня поняли... (:

Хотел уточнить насчет этого rendering - что значит "отложенное" ?

У меня постоянно происходит глюк (и на приведенных Вами ф-ях) со стандартным форматом CF_BITMAP (=2, если не ошибаюсь). Я так понимаю, что это как раз тот "отложенный" ? В любом случае при сохранении и последующей загрузке файла битмап не загружается ! Что делать ?


 
MBo ©   (2003-08-05 04:56) [3]

>rendering - что значит "отложенное" ?
В WinSDK Help прочитай
Кратко - копирование по требованию - обычно для больших объемов, часто для битмапов как раз - при Copy не происходит реального копирования, лишь при запросе Paste-ящей программы.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.014 c
11-65403
_Vadim
2003-02-05 14:28
2003.10.20
Значения по умолчанию


6-65570
oduvan
2003-08-24 17:01
2003.10.20
ClientSocket!!!!!


3-65395
snake
2003-09-26 15:08
2003.10.20
TRDSConnection & Active Server Object


14-65593
andre
2003-10-02 01:18
2003.10.20
Что посоветуете?


3-65321
uu
2003-09-30 11:08
2003.10.20
SelectedRows