Листинг 8.2.
Обработка сообщения WM_COPYDATA
procedure TStringReciever.WMCopyData(var MessageData: TWMCopyData);
begin
//Устанавливаем свойства метки, если заданная команда совпа-
дает
if MessageData.CopyDataStruct.dwData = CMD_SETLABELTEXT then
begin
//Устанавливаем текст из полученных данных
LabelStr.Caption := PChar(MessageData.CopyDataStruct.lpData);
MessageData.Result := 1;
end else
MessageData.Result := 0;
end;
Если окну второго приложения, которое носит название StringReciver (получатель строки), приходит сообщение WM_COPYDATA, то происходит вызов WMCopyData. В качестве параметра эта процедура получает структуру данныхМеБ sage Data типа TWMCopyData, содержащую идентификатор операции и данные (передаваемую строку). После проверки типа операции в случае совпадения его с константой CMD_SETLABELTEXT полученные данные преобразуются в строку. Преобразование происходит при помощи функции PChar. Полученная строка устанавливается в качестве заголовка для метки с именем LabelStr. Затем полю Result структуры MessageData присваивается значение 1 или 0, в зависимости от успеха операции.
Таким образом, для передачи данных (строки) записываем передаваемую строку в текстовое поле первой формы и нажимаем кнопку Отправить. Результат работы приложений можно увидеть на рис. 8.1.
Рис. 8.1. Вид приложений посылки и получения строки
Необходимо добавить, что передача данных посредством сообщения WM_COPYDATA является удобным и простым способом. Но WMCOPYDATA можно передавать только функцией SendMessage, и это является существенным недостатком такого метода. SendMessage «замораживает» работу приложения-отправителя, поэтому такой способ применяется для передачи небольших объемов данных, которые не требуют сложной обработки на стороне программы-приемника. К тому же на использование WMCOPYDATA налагаются некоторые существенные ограничения, о которых говорилось выше.
8.2. Использование буфера обмена
Буфер обмена представляет собой область оперативной памяти, которая используется операционной системой для временного хранения данных. Он выступает в роли общего хранилища данных для всех приложений системы, фактически любая программа может записывать данные в буфер обмена и считывать их оттуда. Он способен хранить данные различных типов и, кроме данных, содержит сведения о типе хранимой информации. Буфер обмена является неотъемлемым компонентом операционной системы типа Windows.
Буфер обеспечивает простейший обмен данными между приложениями. Одно приложение помещает туда данные, другое – считывает данные из буфера. Как правило, эти действия (чтение и запись) выполняются при непосредственном участии пользователя. В использовании буфера может участвовать и одно приложение, в этом случае проходит обмен данными внутри его.
Для выполнения операции обмена данными через буфер в Delphi предназначен специальный класс TClipboard. В Delphi также имеется глобальный объект Clipboard, который является экземпляром класса TClipboard и представляет буфер обмена Windows.
При помощи свойств и методов объектаСЫрЬоа^ возможно осуществление различных операций обмена или анализа хранимых данных. Для доступа к объекту буфера в разделе uses модуля, в котором выполняются операции с объектом буфера обмена, указывается модуль Clipboard.
Общее количество форматов, поддерживаемых буфером обмена, содержится в свойстве FormatCount типа Integer. Для отображения количества форматов, которые распознает буфер, можно использовать следующий листинг:
//В разделе uses указываем модуль Clipboard
InformationClipLabel.Caption := IntToString(Clipboard.FormatCount);
Буфер обмена поддерживает самые разнообразные типы данных. Приведем список поименованных констант некоторых форматов.
• CF_TEXT – обычный текст (коды ANSI). Символ окончания строки – #1С и #13, окончание текста – #0.
• CF_BITMAP – рисунок ВМР-формата.
• CF_MetaFilePic – рисунок WMF-формата.
• CF_TIFF – рисунок TIFF-формата.
• CF_OEMTEXT – текст.
• CF_DIB – рисунок DIB-формата.
• CF_Wave – звук.
• CF_UniCodeText – текст (коды Unicode).
• CF_Picture – объект типа TPicture.
При необходимости можно создать и зарегистрировать свои форматы данных в дополнение к имеющимся базовым.
При использовании нестандартных форматов данных, помещаемых в буфер обмена и извлекаемых оттуда, программы должны соблюдать устанавливаемые разработчиками соглашения об обмене такими данными.