Читаем Delphi. Трюки и эффекты полностью

На использование сообщения налагаются следующие ограничения:

• данные, которые будут приняты, должны быть только для чтения, так как изменение структуры с данными может привести к непредсказуемым последствиям;

• если приложению, получающему данные, требуется использовать их после возврата из обработчика WMCOPYDATA, оно должно скопировать их в локальный буфер.

Итак, приступим к созданию приложения, демонстрирующего работу WM_COPYDATA Для создания хорошего примера потребуется создать два приложения. Первое будет отправлять данные (например, строку текста), другое приложение будет их получать. На главной форме первого приложения помещаем элемент управления TextBox, в который будет записываться передаваемая строка, и кнопку, нажатие которой инициирует передачу данных. Для второго приложения достаточно элемента для отображения текстовой информации типа Label. Перейдем к рассмотрению исходных текстов созданных приложений.

Мы будет посылать сообщение окну, и сообщений может быть различное количество, поэтому для уникальной идентификации операции введем специальную константу:

...

const

CMD_SETLABELTEXT = 1; // Задаем ID команды

На форме находится кнопка отправки данных другому приложению, ее обработчик выглядит следующим образом (листинг 8.1).

...

Листинг 8.1.

Отправка данных другому приложению

procedure TDataSender.bnSendClick(Sender: TObject);

var

CDS: TCopyDataStruct;

begin

//Устанавливаем тип команды

CDS.dwData := CMD_SETLABELTEXT;

//Устанавливаем длину передаваемых данных

CDS.cbData := Length(StringEdit.Text) + 1;

//Выделяем память буфера для передачи данных

GetMem(CDS.lpData, CDS.cbData);

try

//Копируем данные в буфер

StrPCopy(CDS.lpData, StringEdit.Text);

// Отсылаем сообщение в окно с заголовком StringReciever

SendMessage(FindWindow(NIL, \'StringReciever\'),

WM_COPYDATA, Handle, Integer(@CDS));

Finally

//Высвобождаем буфер

FreeMem(CDS.lpData, CDS.cbData);

end;

end;

Подробного комментария данный листинг не требует. Обратите лишь внимание на вызов функции SendMessage, которая использует FindWindow для задания одного из своих параметров. Процедура FindWindow в случае успешного выполнения возвращает HWND окна, заголовок которого задается в параметре этой функции (строка StringReciever из предыдущего примера). Синхронная отправка сообщения WM_COPYDATA с набором данных, которые помещены в структуру CDS, осуществляется вызовом SendMessage.

Рассмотрим второе приложение, которое принимает строку и отображает ее в надписи ( Label). Для начала в блок объявления помещаем обработчик сообщения и объявляем само сообщение WM_COPYDATA:

...

type

TStringReciever = class(TForm)

LabelStr: TLabel;

private

//Обработчик сообщения WM_COPYDATA

procedure WMCopyData(var MessageData: TWMCopyData);

message WM_COPYDATA;

Как и в случае первого приложения, нам необходима константа, которая будет идентифицировать тип операции:

...

const

CMD_SETLABELTEXT = 1;

Далее рассмотрим тело функции обработчика сообщения WM_COPYDATA (листинг 8.2).

...

Листинг 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;

Перейти на страницу:

Похожие книги

102 способа хищения электроэнергии
102 способа хищения электроэнергии

Рассмотрена проблема хищений электроэнергии и снижения коммерческих потерь в электрических сетях потребителей. Приведены законодательно–правовые основы для привлечения к ответственности виновных в хищении электроэнергии. Изложены вопросы определения расчетных параметров средств учета электроэнергии, показаны схемы подключения счетчиков электрической энергии. Описаны расчетные и технологические способы хищения электроэнергии. Обсуждаются организационные и технические мероприятия по обнаружению, предотвращению и устранению хищений.Для работников энергоснабжающих организаций и инспекторского состава органов Ростехнадзора. Материалы книги могут быть использованы руководителями и специалистами энергослужб предприятий (организаций) для правильного определения расчетных параметров средств учета и потерь электроэнергии в электрических сетях.Если потенциальные расхитители электроэнергии надеются найти в книге «полезные советы», они должны отдавать себе отчет, что контролирующие структуры информированы в не меньшей степени и, следовательно, вооружены для эффективной борьбы с противоправной деятельностью.Настоящая книга является переработанным и дополненным изданием выпущенной в 2005 г. книги «101 способ хищения электроэнергии».

Валентин Викторович Красник

Технические науки / Образование и наука
100 великих чудес инженерной мысли
100 великих чудес инженерной мысли

За два последних столетия научно-технический прогресс совершил ошеломляющий рывок. На что ранее человечество затрачивало века, теперь уходят десятилетия или всего лишь годы. При таких темпах развития науки и техники сегодня удивить мир чем-то особенным очень трудно. Но в прежние времена появление нового творения инженерной мысли зачастую означало преодоление очередного рубежа, решение той или иной крайне актуальной задачи. Человечество «брало очередную высоту», и эта «высота» служила отправной точкой для новых свершений. Довольно много сооружений и изделий, даже утративших утилитарное значение, тем не менее остались в памяти людей как чудеса науки и техники. Новая книга серии «Популярная коллекция «100 великих» рассказывает о чудесах инженерной мысли разных стран и эпох: от изобретений и построек Древнего Востока и Античности до небоскребов в сегодняшних странах Юго-Восточной и Восточной Азии.

Андрей Юрьевич Низовский

История / Технические науки / Образование и наука
Электроника для начинающих (2-е издание)
Электроника для начинающих (2-е издание)

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

Чарльз Платт

Радиоэлектроника / Технические науки