Текущий архив: 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.46 MB
Время: 0.008 c