РАБОТА С БУФЕРОМ ОБМЕНА
БУФЕР ОБМЕНА С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ
Буфер Обмена — это специальное средство 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) и вставьте картинку из Буфера Обмена в редактор. Подредактируйте картинку и верните ее в свое приложение через Буфер Обмена.