Буфер обмена и TMemoryStream

Советы » Буфер обмена » Буфер обмена и TMemoryStream

Обычно, это нужно для того, чтобы запихнуть в буфер обмена данные собственного формата. Сначала необходимо зарегистрировать этот формат при помощи функции RegisterClipboardFormat():
CF_MYFORMAT := RegisterClipboardFormat('My Format Description');
Затем необходимо проделать следующие шаги:
Создать поток (stream) и записать в него данные. Создать в памяти глобальный буфер и скопировать в него поток (stream). При помощи Clipboard.SetAsHandle() поместить глобальный буфер в буфер обмена.
Пример:

var
hbuf: THandle;
bufptr: Pointer;
mstream: TMemoryStream;
begin
mstream := TMemoryStream.Create; try
{-- Записываем данные в mstream. --} hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size); try
bufptr := GlobalLock(hbuf); try
Move(mstream.Memory^, bufptr^, mstream.size); Clipboard.SetAsHandle(CF_MYFORMAT, hbuf); finally
GlobalUnlock(hbuf);
end;
except
GlobalFree(hbuf);
raise;
end;
finally
mstream.Free;
end;
end;
ВАЖНО: Не удаляйте буфер после GlobalAlloc(). Как только Вы поместите его в буфер обмена, то буфер обмена будет пользоваться им.
Для получения данных из потока, можно воспользоваться следующим кодом:
var
hbuf: THandle;
bufptr: Pointer;
mstream: TMemoryStream;
begin
hbuf := Clipboard.GetAsHandle(CF_MYFORMAT); if hbuf <> 0 then
begin
bufptr := GlobalLock(hbuf); if bufptr <> nil then begin
try
mstream := TMemoryStream.Create; try
mstream.WriteBuffer(bufptr^, GlobalSize(hbuf)); mstream.Position := 0;
{-- Читаем данные из mstream. --} finally
mstream.Free;
end;
finally
GlobalUnlock(hbuf);
end;
end;
end;
end;
 

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com