РАБОТА С БУФЕРОМ ОБМЕНА

БУФЕР ОБМЕНА С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ

Буфер Обмена — это специальное средство Windows для переноса текста, графики и других данных из окна одного приложения в окно другого. Перенос данных выполняется по инициативе пользователя, поэтому окна, в которых поддерживается работа с Буфером Обмена, имеют в своей строке меню пункт Edit (Правка) со стандартным набором команд:

• Cut (Вырезать) — удаляет выделенный пользователем блок данных в Буфер Обмена;

• Copy (Копировать) — копирует выделенный пользователем блок данных в Буфер Обмена;

• Paste (Вставить) — извлекает блок данных из Буфера Обмена.

Работа с Буфером Обмена происходит по следующей схеме. Сначала пользователь активизирует первое окно, выделяет в нем блок данных (текст или графический образ) и выбирает в меню команду Copy. При этом в Буфере Обмена создается полная копия данных (предыдущие данные из Буфера Обмена удаляются). Затем пользователь акта визирует второе окно и выбирает в меню команду Paste. В результате данные из Буфера Обмена копируются в выбранное место.

 

МЕТОДЫ КОМПОНЕНТОВ ДЛЯ РАБОТЫ С БУФЕРОМ ОБМЕНА

Некоторые визуальные компоненты Delphi (а именно Edit, Memo, MaskEdit, DBEdit DBMemo, DBImage) имеют специальные методы для работы с Буфером Обмена:

• CutToClipboard — удаляет данные из компонента и помещает их в Буфер Обмена;

• CopyToClipboard — копирует данные в Буфер Обмена;

• PasteFromClipboard — переносит данные из Буфера Обмена в компонент.

Если вы используете один из упомянутых компонентов и перед вами стоит задаче обеспечить работу с Буфером Обмена, то решение состоит в том, чтобы по командам меню Cut, Copy, Paste вызывать соответствующие методы компонента. Поясним сказанное на примере.

Шаг 1. Начните в Delphi новый проект (команда меню File | New Application).

Шаг 2. Поместите на форму компонент Memo (находится в Палитре Компонентов на странице Standard). Установите в компоненте свойство Align в значение alClient.

Шаг 3. Поместите на форму компонент MainMenu (находится в Палитре Компонентов на странице Standard). Вызовите у нового компонента Дизайнер Меню и создайте выпадающее меню Edit с пунктами Cut, Copy, и Paste (рис. 8. 17).

Шаг 4. Определите для команд меню следующие обработчики событий OnClick:

procedure TForml. CutlClick ( Sender: TObject);

begin

Memol. CutToClipboard;

end; 

procedure TFormI. CopylClick (Sender: TObject);

begin

Memol. CopyToClipboard;

end;

procedure TForml. PastelClick (Sender: TObject);

begin

Memol. PasteFromClipboard;

end;

Шаг 5. Сохраните проект. Главному модулю дайте имя Main. pas, а файлу проекта — Clip. dpr.

Шаг 6. Выполните компиляцию проекта и запустите приложение. Наберите какой-нибудь текст, выделите его и скопируйте в Буфер Обмена. Затем загрузите стандартное приложение Notepad и вставьте текст из Буфера Обмена в позицию курсора. Проделайте то же самое, но с передачей данных из приложения Notepad в свое приложение.

 

ОБЪЕКТ CLIPBOARD

При разработке приложения может оказаться, что компонент не умеет работать с Буфером Обмена. В этом случае вы должны организовать обмен данных сами с помощью объекта Clipboard. Объект Clipboard инкапсулирует Буфер Обмена в Delphi-приложении и объявлен в модуле Clipbrd. Подключив в своей программе модуль Clipbrd,

uses Clipbrd;

вы можете использовать свойства и методы объекта Clipboard для обмена данных.

Если вы хотите копировать и вставлять текст, используйте свойство AsText. Например, чтобы скопировать строку текста из компонента Edit1 в Буфер Обмена, запишите:

Clipboard. AsText: = Edit1. Text;

Чтобы извлечь данные, поменяйте местами левую и правую части в операторе присваивания:

Edit1. Text: = Clipboard. AsText;

Если вы хотите копировать и вставлять картинки или данные объектов, вызывайте метод Assign. Например, чтобы скопировать картинку из компонента Imagel в Буфер Обмена, запишите:

Clipboard. Assign (Imagel. Picture);

Чтобы извлечь данные из Буфера Обмена, просто вызовите тот же метод у объекта:

Imagel. Picture. Assign (Clipboard);

Если в Буфере Обмена находятся данные не того формата, на который вы рассчитываете, то при доступе к ним произойдет исключительная ситуация. Чтобы от нее застраховаться, перед извлечением данных проверьте формат с помощью метода HasFormat. Метод HasFormat принимает код формата в виде положительного целого числа типа Word и возвращает True, если данные с таким форматом существуют в Буфере Обмена. Таким образом, последний оператор правильнее будет записать так::

if Clipboard. HasFormat (CF_PICTURE) then

Imagel. Picture. Assign (Clipboard);

Идентификатор CF_PICTURE — это код формата. Наиболее часто используемые форматы данных имеют зарезервированные коды, описанные в справочнике по Delphi. При необходимости вы можете регистрировать в Windows свои собственные форматы данных с помощью API-функции RegisterClipboardFormat. Функция принимает название формата в виде нуль-терминированной строки и возвращает число типа Word, которое может использоваться в процедурах работы с Буфером Обмена.

Важно понимать, что в Буфере Обмена может находиться несколько блоков данных разного формата. Фактически это одни и те же данные, но представленные в разной форме. Многие приложения, в частности Microsoft Word, помещают данные в Буфер Обмена сразу в нескольких форматах для того, чтобы обеспечить максимальное удобство приложениям, принимающим данные, ведь заранее не известно, какие форматы они поддерживают.

Каждый раз, когда вы помещаете данные в Буфер Обмена, предыдущее содержимое буфера теряется. Когда вы помещаете данные в нескольких форматах, вы должны вызвать метод Open для предотвращения доступа к Буферу Обмена других приложений. Когда операция помещения данных завершена, вы должны вызвать метод Close для того, чтобы другие приложения могли извлечь данные из Буфера Обмена.

Давайте поупражняемся с объектом Clipboard и заменим в предыдущем примере компонент Memo на компонент Image.

Шаг 1. Откройте предыдущий проект и удалите с формы компонент Memo1.

Шаг 2. Поместите на форму компонент Image (находится в Палитре Компонентов на странице Additional). Переведите в компоненте свойство AutoSize в Тше и установите в свойстве Picture какую-нибудь картинку из каталога Delphi 2. 0\Images\Splash\16color (рис. 8. 18).

Шаг 3. Перейдите в Редактор Кода и подключите в секции implementation модуль Clipbrd:

uses Clipbrd;

Шаг 4. Перепишите обработчики команд меню:

procedure TFormI. CutlClick (Sender: TObject);

begin

Copyl. Click;

Image1. Picture. Graphic: =nil;

Image1. Height: = 0;

Imagel. Width: = 0;

end;

procedure TFormI. CopylClick (Sender: TObject);

begin

if Imagel.Picture.Graphic <> nil then

Clipboard. Assign (Imagel. Picture);

end;

procedure TFormI. PastelClick ( Sender: TObject);

begin

if Clipboard. HasFormat (CF_PICTURE) then

Imagel. Picture. Assign (Clipboard);

end;

Шаг 5. Выполните компиляцию проекта и запустите приложение. Скопируйте картинку в Буфер Обмена. Затем загрузите графический редактор Paint (стандартное приложение Windows) и вставьте картинку из Буфера Обмена в редактор. Подредактируйте картинку и верните ее в свое приложение через Буфер Обмена.