Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как удобнее работать с буфером обмена как с последовательностью байт

Delphi , ОС и Железо , Буфер обмена

Как удобнее работать с буфером обмена как с последовательностью байт

Автор: Alexey Mahotkin
WEB-сайт: ftp://ftp.nf.ru/pub/alexm


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/alexm
or FREQ FILES from 2:5020/433 or mail me to get hacked
version of TP Lex/Yacc which works under Delphi 2.0+.
}

interface

uses
  Classes, Windows;

type
  TClipboardStream = class(TStream)
  private
    FMemory: pointer;
    FSize: longint;
    FPosition: longint;
    FFormat: word;
  public
    constructor Create(fmt: word);
    destructor Destroy; override;

    function read(var Buffer; Count: Longint): Longint; override;
    function write(const Buffer; Count: Longint): Longint; override;
    function Seek(Offset: Longint; Origin: Word): Longint; override;
end;

implementation

uses
  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;
begin
  if 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;
begin
  case Origin of
    0 : FPosition := Offset;
    1 : Inc(FPosition, Offset);
    2 : FPosition := FSize + Offset;
  end;
  Result := FPosition;
end;

end.

Программный модуль Delphi под именем ClipStrm предлагает класс TClipboardStream, который позволяет работать с буфером Windows clipboard как потоком байтов. Класс обеспечивает чтение и запись данных в буфер, перемещение к конкретным позициям и обновление содержимого буфера.

Некоторые наблюдения и предложения:

  1. Конструктор Create открывает буфер, получает handle для указанного формата (например, CF_TEXT для текста), выделяет память для данных, блокирует handle, копирует данные в память, разблокирует handle и закрывает буфер.
  2. Деструктор Destroy освобождает выделенную память.
  3. Метод Read читает указанное количество байтов из текущей позиции потока и перемещает позицию вперед на это количество. Если запрошенное количество байтов превышает оставшийся размер потока, метод возвращает оставшийся размер.
  4. Метод Write записывает указанное количество байтов в текущую позицию потока, обновляет позицию и обновляет содержимое буфера. Он также реаллокирует память, если это необходимо.
  5. Метод Seek позволяет переместить позицию в потоке к конкретной оффсет на основе начала (0-основанного, 1-основанного или конечного).

Некоторые предложения:

  • Рассмотрите добавление обработки ошибок для случаев, когда операция с буфером fails.
  • Возможно, вам хотелось бы добавить методы для обработки других операций, таких как получение текущего размера потока или проверка, является ли поток пустым.
  • Было бы полезно иметь метод, который позволяет сбросить позицию к началу потока (например, Seek(0, 0)).
  • Класс может выиграть от более описательных имен переменных и комментариев, объясняющих, что каждый участок делает.

В целом, это модуль предоставляет интерфейс для работы с буфером как последовательностью байтов. Вы можете использовать его для обработки двоичных данных или для избежания конвертации текстовых данных в строки и обратно.

В статье описывается создание утилиты для работы с буфером обмена как с последовательностью байт в Delphi, которая позволяет удобно работать с данными в формате текста и двоичного кода.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Буфер обмена ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-26 17:55:02/0.0038349628448486/0