Этот пример использует картинку, кнопку и компонент shape на форме. Когда пользователь кликает по кнопке, то изображение формы сохраняется в в переменной FormImage и копируется в буфер обмена (Clipboard). Затем изображение формы копируется обратно в компонент картинки, тем самым создавая интересный эффект, особенно, если кнопку понажимать несколько раз.

Code:

procedure CopyButtonClick(Sender: TObject);

begin

if ActiveControl is TMemo then

   TMemo(ActiveControl).CopyToClipboard;

if ActiveControl is TDBMemo then

   TDBMemo(ActiveControl).CopyToClipboard;

if ActiveControl is TEdit then

   TEdit(ActiveControl).CopyToClipboard;

if ActiveControl is TDBedit then

   TDBedit(ActiveControl).CopyToClipboard;

end;

 

procedure PasteButtonClick(Sender: TObject);

begin

if ActiveControl is TMemo then

   TMemo(ActiveControl).PasteFromClipboard;

if ActiveControl is TDBMemo then

   TDBMemo(ActiveControl).PasteFromClipboard;

if ActiveControl is TEdit then

   TEdit(ActiveControl).PasteFromClipboard;

if ActiveControl is TDBedit then

   TDBedit(ActiveControl).PasteFromClipboard;

end;

 

 

 Просмотр буфера обмена.

 Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.

Следущие операции производятся с активным контролом на форме:

Code:

procedure TForm1.Cut1Click(Sender: TObject);

begin

SendMessage (ActiveControl.Handle, WM_Cut, 0, 0);

end;

 

 

procedure TForm1.Copy1Click(Sender: TObject);

begin

SendMessage (ActiveControl.Handle, WM_Copy, 0, 0);

end;

 

procedure TForm1.Paste1Click(Sender: TObject);

begin

SendMessage (ActiveControl.Handle, WM_Paste, 0, 0);

end;

 

 

Если Вы разрабатываете приложение MDI, то необходимо отправлять сообщение в активное дочернее окно, т.е. использовать: ActiveMDIChild.ActiveControl.Handle

 

*Просто создайте новую форму и назовите его ClipFormats.

*Поместите TButton и вызывай его btnUpdate.

*Поместите лист бокс и вызывай его lbFormats.

 

Затем просто добавьте приведенный ниже код и подключить все обработчики событий.

Все это делает дисплей в настоящее время все форматы в буфере обмена и

обновления как только изменения буфера обмена.

Code:

unit ClipStrm;

   

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.

  

Alexey Mahotkin Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. (2:5020/433)

Взято из FAQ: Delphi and Windows API Tips'n'Tricks

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Code:

//Ctrl+C, Strg+C:

 

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);

keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0);

keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0);

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)

 

 

 

//Ctrl+V, Strg+V:

 

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);

keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);

keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)

 

Приложение может быть уведомлено об изменениях в данных, хранящихся в

 Буфер обмена Windows, зарегистрировавшись как средство просмотра буфера обмена.

 

Если вы когда-нибудь пробовали вставлять html в буфер обмена, используя обычный CF_TEXT

формате, то вы, возможно, были разочарованы, обнаружив, что визуальный HTML-код

редакторы вставляют ваше предложение, как если бы это был только текст,

вместо того, чтобы распознавать его как html. Для этого нужен формат CF_HTML.

 CF_HTML полностью текстовый формат и использует формат преобразования UTF-8.

Он включает в себя описание контекста, и в контексте фрагмента.

 

Использование интерфейса OLE

Значение, которое придается сегодня внедрению интерфейса OLE, трудно переоценить. Фирма Microsoft извещает о том, что на получение логотипа "Windows 95 Compatible" будут сертифицированы только те приложения, которые имеют средства работы с OLE.

Разъяснять суть механизмов OLE с точки зрения пользователя здесь не имеет смысла; кратко опишем их с точки зрения программиста.

Мне нужно использовать clipboard для сохранения данных в собственном формате и я хочу для этого написать набор процедур ввода/вывода с использованием потоков (streams). Возможно ли создать объект TMemoryStream, эаполнить его и поместить в Clipboard?

 

Hе только возможно, именно так поступают функции Clipboard.GetComponent и Clipboard.SetComponent. Сначала вы должны зарегистрировать свой собственный формат данных для Clipboard с помощью функции RegisterClipboardFormat: