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

Вниз

Помогите разобраться с буфером обмена.   Найти похожие ветки 

 
mike ilin   (2006-04-13 09:24) [0]

Крик о помощи. Помогите разобраться с буфером обмена.
Надо записать в буфер обмена, и в последствии считать динамический массив.
Type
 DecSimD = record
   g,b: Byte;
   x,y,r: Double;
 end;
 GrSimD = array of DecSimD;
Var
 CF_PERSONDATA: word;

implementation

Пробовал два варианта.
 //=== вариант №1
procedure TLineClipboard.CopyToClipboard(GSD: GrSimD);
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
begin //CopyToClipboard
l := Length(GSD);
 Data:=GlobalAlloc(GMEM_MOVEABLE, SizeOf(l)+SizeOf(DecSimD)*l);
 try
   DataPtr:=GlobalLock(Data);
   Move(l, DataPtr^, SizeOf(l));
   for i := 0 to l-1 do Move(GSD[i], DataPtr^, SizeOf(DecSimD));
   Clipboard.Open;
   Clipboard.SetAsHandle(CF_PERSONDATA, Data);
   Clipboard.Close;
   GlobalUnlock(Data);
 except
   GlobalFree(Data);
 end;
end;  //CopyToClipboard

function TLineClipboard.PasteFromClipboard(var GSD: GrSimD): boolean;
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
begin //PasteFromClipboard
 Data := ClipBoard.GetAsHandle(CF_PERSONDATA);
 if Data = 0 then    result := false
 else
 begin
   result := true;
   DataPtr:=GlobalLock(Data);
   Move(DataPtr^, l, SizeOf(l));
   SetLength(GSD,l);
   for i := 0 to l-1 do Move(DataPtr^, GSD[i], SizeOf(DecSimD));
   GlobalUnlock(Data);
 end;
end;  //PasteFromClipboard

 //=== вариант №2 с использованием потока
procedure TLineClipboard.CopyToClipboard(GSD: GrSimD);
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
 fs: TMemoryStream;
begin //CopyToClipboard
 l := Length(GSD);
 fs := TMemoryStream.Create;
 fs.WriteBuffer(l,SizeOf(l));
 for i := 0 to l-1 do fs.WriteBuffer(GSD[i],SizeOf(DecSimD));
 l := fs.Seek(0,soFromEnd);
 Data:=GlobalAlloc(GMEM_MOVEABLE, l);
 try
   DataPtr:=GlobalLock(Data);
   fs.Seek(0,soFromBeginning);
   fs.ReadBuffer(DataPtr^,l);
   Clipboard.Open;
   Clipboard.SetAsHandle(CF_PERSONDATA, Data);
   Clipboard.Close;
   GlobalUnlock(Data);
 except
   GlobalFree(Data);
 end;
 fs.Free;
end;  //CopyToClipboard

function TLineClipboard.PasteFromClipboard(var GSD: GrSimD): boolean;
var
 l,i: word;
 Data:THandle;
 DataPtr:Pointer;
 fs: TMemoryStream;
begin //PasteFromClipboard
 Data := ClipBoard.GetAsHandle(CF_PERSONDATA);
 if Data = 0 then result := false;
 else
 begin
   result := true;
   DataPtr:=GlobalLock(Data);
   fs := TMemoryStream.Create;
   fs.WriteBuffer(DataPtr^,SizeOf(DataPtr^));
   fs.Seek(0,soFromBeginning);
   fs.Read(l,SizeOf(l));
   SetLength(GSD,l);
   for i := 0 to l-1 do fs.ReadBuffer(GSD[i],SizeOf(DecSimD));
   fs.Free;
   GlobalUnlock(Data);
 end;
end;  //PasteFromClipboard

Дело в том, что я не совсем представляю, как работает Move и поэтому попробовал потоки, но всё равно оба варианта не дали результата.
За любую помощь буду очень благодарен.
Андрей.


 
Альф   (2006-04-13 09:41) [1]

Самый простой способ - переводить при copy/paste ваши данные в текстовый вид и пользоваться стандартными средствами.
В случае с динамическим массивом записей - простой текст с разделителем #9.

Этот способ, к тому же, даст возможность брать из буффера обмена ваши данные другим программам - а не только вашей.


 
balepa ©   (2006-04-13 10:22) [2]

Веди его щас мы с ним разберемся :)
Вроде вчера был подобный вопрос, поищи в форумах


 
GrayFace ©   (2006-04-13 11:14) [3]

> Альф
> В случае с динамическим массивом записей - простой текст
> с разделителем #9.

Нет, лучше просто память скопировать. Как буду дома, приведу пример.


 
GrayFace ©   (2006-04-14 15:48) [4]

Копирование - TClipboard.SetBuffer (uses Clipbrd)

Вставка:

function LoadClipboard(Format:DWord):TRSByteArray;
var h:THandle; DataPtr:pointer; Size:DWord;
begin
 if not IsClipboardFormatAvailable(Format) then
   exit;

 DataPtr:=nil;
 h:=0; // Чтоб компиллятор не ругался
 Clipboard.Open;
 try
   h:=Clipboard.GetAsHandle(Format);
   if h=0 then RaiseLastOSError;
   DataPtr:=GlobalLock(h);
   if DataPtr=nil then RaiseLastOSError;
   Size:=GlobalSize(h);
   SetLength(Result, Size);
   CopyMemory(ptr(Result), DataPtr, Size);
 finally
   if DataPtr<>nil then
     GlobalUnlock(h);
   Clipboard.Close;
 end;
end;


где TRSByteArray = array of byte;



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

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

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1140564295
TheEd
2006-02-22 02:24
2006.04.30
Как при вставке задать полям знач-я по умолч., те что в БД заданы


15-1144321685
Der Nechk@ssoff
2006-04-06 15:08
2006.04.30
Мошенникам-тюрьма!


1-1143183057
Iton
2006-03-24 09:50
2006.04.30
Текст в HTML


2-1145175156
Golik
2006-04-16 12:12
2006.04.30
SQL Запрос ???


15-1144635217
Карелин Артем
2006-04-10 06:13
2006.04.30
Учите русский чтобы писать описание!