Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  101

•  TDictionary Custom Sort  3 298

•  Fast Watermark Sources  3 048

•  3D Designer  4 803

•  Sik Screen Capture  3 297

•  Patch Maker  3 517

•  Айболит (remote control)  3 615

•  ListBox Drag & Drop  2 973

•  Доска для игры Реверси  81 428

•  Графические эффекты  3 901

•  Рисование по маске  3 213

•  Перетаскивание изображений  2 597

•  Canvas Drawing  2 717

•  Рисование Луны  2 543

•  Поворот изображения  2 150

•  Рисование стержней  2 153

•  Paint on Shape  1 558

•  Генератор кроссвордов  2 215

•  Головоломка Paletto  1 757

•  Теорема Монжа об окружностях  2 196

•  Пазл Numbrix  1 676

•  Заборы и коммивояжеры  2 047

•  Игра HIP  1 271

•  Игра Go (Го)  1 219

•  Симулятор лифта  1 463

•  Программа укладки плитки  1 206

•  Генератор лабиринта  1 535

•  Проверка числового ввода  1 341

•  HEX View  1 481

•  Физический маятник  1 348

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

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


Автор: 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.





Похожие по теме исходники

Clipboard (буфер обмена)




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте