Private

{ Private declarations }

FClipboardOwner:HWnd;

procedure WMDrawClipboard(var Msg: TWMDrawClipboard);

message WM_DRAWCLIPBOARD;

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

Здесь так же объявлена процедура WMDrawClipboard с одним лишь параметром типа TWMDrawClipboard. Это процедура обработчик события WM_DRAWCLIPBOARD. Об этом говорит соответствующая надпись после объявления процедуры и точки с запятой. Там у нас стоит ключевое слово messageи имя сообщение, на которое должна откликаться процедура. Вот таким нехитрым способом мы вручную описали обработчик системного сообщения, которого нет в Delphi. Имена всех сообщений Windows ты можешь найти в директории Delphi, поддиректории Source/Rtl/Win, в файле Messages.pas. Такие имена всегда начинаются с приставки WM_ (Windows Message – сообщение Windows).

Итак, описанная нами процедура будет вызываться каждый раз, когда изменилось содержимое буфера обмена. Теперь нажимаем Ctrl+Shift+C и Delphi создаёт для нас пустую заготовку описанной процедуры. В ней пишем следующее:

procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);

begin SendMessage(FClipboardOwner, WM_DRAWCLIPBOARD, 0, 0); Msg.Result := 0; ClipboardChanged; end;

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