Карта сайта 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 и FreePascal.


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


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




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



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


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
24.04.2024 11:58:10/0.00087213516235352/0