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/alexmor FREQ FILES from 2:5020/433 or mail me to get hacked
version of TP Lex/Yacc which works under Delphi 2.0+.
}interfaceuses
Classes, Windows;
type
TClipboardStream = class(TStream)
private
FMemory: pointer;
FSize: longint;
FPosition: longint;
FFormat: word;
publicconstructor Create(fmt: word);
destructor Destroy; override;
functionread(var Buffer; Count: Longint): Longint; override;
functionwrite(const Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
end;
implementationuses
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;
beginif 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;
begincase Origin of
0 : FPosition := Offset;
1 : Inc(FPosition, Offset);
2 : FPosition := FSize + Offset;
end;
Result := FPosition;
end;
end.
Программный модуль Delphi под именем ClipStrm предлагает класс TClipboardStream, который позволяет работать с буфером Windows clipboard как потоком байтов. Класс обеспечивает чтение и запись данных в буфер, перемещение к конкретным позициям и обновление содержимого буфера.
Некоторые наблюдения и предложения:
Конструктор Create открывает буфер, получает handle для указанного формата (например, CF_TEXT для текста), выделяет память для данных, блокирует handle, копирует данные в память, разблокирует handle и закрывает буфер.
Деструктор Destroy освобождает выделенную память.
Метод Read читает указанное количество байтов из текущей позиции потока и перемещает позицию вперед на это количество. Если запрошенное количество байтов превышает оставшийся размер потока, метод возвращает оставшийся размер.
Метод Write записывает указанное количество байтов в текущую позицию потока, обновляет позицию и обновляет содержимое буфера. Он также реаллокирует память, если это необходимо.
Метод Seek позволяет переместить позицию в потоке к конкретной оффсет на основе начала (0-основанного, 1-основанного или конечного).
Некоторые предложения:
Рассмотрите добавление обработки ошибок для случаев, когда операция с буфером fails.
Возможно, вам хотелось бы добавить методы для обработки других операций, таких как получение текущего размера потока или проверка, является ли поток пустым.
Было бы полезно иметь метод, который позволяет сбросить позицию к началу потока (например, Seek(0, 0)).
Класс может выиграть от более описательных имен переменных и комментариев, объясняющих, что каждый участок делает.
В целом, это модуль предоставляет интерфейс для работы с буфером как последовательностью байтов. Вы можете использовать его для обработки двоичных данных или для избежания конвертации текстовых данных в строки и обратно.
В статье описывается создание утилиты для работы с буфером обмена как с последовательностью байт в Delphi, которая позволяет удобно работать с данными в формате текста и двоичного кода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.