Программирование на Delphi
0);
End;
Важнейшим свойством компонента TDdeServerConv является название темы,
содержащееся в свойстве Name. Клиент должен знать это имя при установлении
контакта, за исключением случая, когда он подключается к данным контакта,
скопированным в буфер обмена.
В моменты открытия и закрытия контакта возникают события:
Property OnOpen: tNotifyEvent;
Property OnClose: tNotifyEvent;
Объект TDdeServerItem связывается с TDdeServerConv посредством свойства
Property ServerConv:tDDEServerConv,
и определяет, что, собственно, будет пересылаться по DDE. В принципе,
потокол DDE подразумевает обмен любыми данными, формат которых
зарегистрирован в системе для передачи через буфер обмена. Однако для
рассматриваемых компонентов эти возможности ограничиваются только
текстовыми данными. Для этого у компонента TDdeServerItem есть свойства
Text и Lines (Text имеет то же значение, что и Lines[0]).
Property Text:string;
Property Lines:tStrings;
При изменении значения этих свойств автоматически происходит пересылка
обновленных данных во все приложения-клиенты, установившие связь с
сервером.
Данный компонент позволяет также осуществлять установление связи через
буфер обмена (Clipboard). Для этого служит метод CopyToClipboard.
Необходимая информации помещается в через буфер обмена и может быть вызвана
из приложения-клиента при установлении связи. Обычно, в DDE-серверах для
этого есть специальный пункт меню Paste Special или Paste Link.
DDE-клиенты
Для построения DDE-клиента в Delphi используются два компонента
TDDEClientConv и TDDEClientItem. Аналогично серверу, в программе обычно
используется один объект TDDEClientConv и один и более связанных с ним
TDDEClientItem.
TDDEClientConv служит для установления связи с сервером и общим управлением
DDE-связью. Установить связь с DDE-сервером можно как во время разработки,
так и во время выполнения программы, причем двумя способами. Первый способ
- заполнить вручную необходимые свойства компонента. Это DdeService,
DdeTopic и ServiceApplication. Если во время разработки дважды щелкнуть на
одном из первых двух свойств в Инспекторе Объектов - появится диалог для
определения DDE-связи. Для установления связи через Clipboard в диалоге
есть специальная кнопка Past Link. Ей можно воспользоваться, если Вы
запустили DDE-сервер, сохранили каким-то образом информацию о связи и вошли
в этот диалог. Например, если DDE-сервером является DataBase Desktop, то
нужно загрузить в него какую-нибудь таблицу Paradox, выбрать любое поле и
выбрать пункт меню Edit|Copy. Свойство ServiceApplication заполняется в том
случае, если в поле DDEService содержится имя, отличное от имени программы,
либо если эта программа не находится в текущей директории. В этом поле
указывается полный путь и имя программы без расширения (.EXE). Данная
информация нужна для автоматического запуска сервера при установлении связи
по DDE, если тот еще не был запущен.
Имена сервера DDE и темы содержатся в свойствах:
Property DDEService:string;
Property DDETopic:string;
Способ вхождения в контакт определяется свойством
Property ConnectMode:tDataMode;
Type tDataMode = (DDEAutomatic,DDEManual);
Метод
Function SetLinc(const Service: string; const Topic: string):Boolean;
Присваивает свойствам DDEService и DDETopic соответствующие значения, а в
случае, если задан режим DDEAutomatic, и устанавливает контакт. В режиме
DDEManual для установления контакта необходимо дополнительно вызвать метод
Function OpenLink: Boolean;
Этот метод сначала закрывает предыдущий контакт, затем пытается связаться с
сервером DDEService на тему DDETopic. Если это не удается сразу,
предпринимается попытка загрузить приложение с именем, определенным в
свойстве:
Property ServiceApplication: string;
Можно связаться с сервером, поместившим данные в буфер обмена с помощью
метода
Function PasteLink: boolean;
Ниже приведен пример процедуры, осуществляющей связь с сервером.
procedure TMainForm.doNewLink(Sender: TObject);
begin
DdeClient.SetLink(AppName.Text, TopicNameEdit.Text);
DdeClientItem.DdeConv := DdeClient;
DdeClientItem.DdeItem := ItemName.Text;
end;
procedure TMainForm.doPasteLink(Sender: TObject);
var
Service, Topic, Item : String;
begin
if GetPasteLinkInfo (Service, Topic, Item) then begin
AppName.Text := Service;
TopicName.Text := Topic;
ItemName.Text := Item;
DdeClient.SetLink (Service, Topic);
DdeClientItem.DdeConv := DdeClient;
DdeClientItem.DdeItem := ItemName.Text;
end;
end;
После того, как установлена связь, нужно позаботиться о поступающих по DDE
данных, это делается в обработчике события OnChange объекта TDdeClietItem:
procedure TFormD.DdeClientItemChange(Sender: TObject);
begin
DdeDat.Lines := DdeClientItem.Lines;
end;
Это единственная задача объекта TDdeClientItem.
Свойство
Property DDEConv: TddeClientConv
Этого компонента предназначено для связи с соответствующим объектом
DdeClientConv. А свойство
Property DDEItem:string;
Должно содержать имя элемента данных.
Свойства
Property Text: string;
Property Lines: tStrings;
Аналогичны соответствующим свойствам tDDEServerItem и содержат данные.
На объект TDdeClientConv возлагаются еще две задачи: пересылка данных на
сервер и выполнение макросов. Для этого у данного объекта есть
соответствующие методы.
Function ExecuteMacroLines(Cmd:tStrings, WaitFlg:Boolean):Boolean;
Function PokeDataLines(const Item:string,Data:tStrings):Boolean;
Обмен сообщениями
Как уже упоминалось ранее, операционная система Windows® основана на
сообщениях, возникающих в результате действий пользователя, аппаратуры
компьютера или других программ. Поведение каждого окна полностью
определяется тем, какие оно принимает сообщения и как их обрабатывает. В
большинстве случаев, обработка сообщений в Delphi выполняется через
события. Однако, бывают ситуации, когда может потребоваться послать и/или
обработать сообщение самостоятельно. Существуют два типа сообщений, которые
могут потребовать обработки в обход обычной системы сообщений Delphi:
Сообщения Windows®, не обрабатываемые VCL
Сообщения, определяемые пользователем
В принципе, сообщения делятся на две категории:
Командные сообщения
Уведомляющие сообщения
Командные сообщения используются как программистами, тек и Windows®. Они
управляют элементам операционной системы и прикладным программам.
Уведомляющие сообщения содержат информацию об изменении состояния окон
Windows®, их отдельных элементов и устройств системы. Они посылаются только
самой средой окон Windows®.
Каждое сообщение имеет два параметра: WPARAM и LPARAM. В 32-х битной среде
оба эти параметра имеют размер 32 бита (longword). В 16-битной Windows
WPARAM - это 16 битное число (word), а LPARAM - 32-битное (longint).
Для отправки сообщений API Windows® содержит две функции:
function PostMessage( HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
):BOOLEAN;
function SendMessage( HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
): LRESULT;
Первая из них отправляет сообщение в очередь сообщений Windows® и
немедленно возвращает управление. PostMessage возвращает TRUE, если вызов
функции прошел успешно и FALSE в противном случае.
Функция SendMessage отличается от PostMessage тем, что, послав сообщение,
она не возвратит управление до тех пор, пока сообщение не будет доведено до
получателя.
Обе функции имеют одинаковые параметры: HWND - дескриптор окна, которому
предназначается сообщение, UINT - сообщение, которое должно быть послано,
WPARAM и LPARAM - параметры сообщения.
В следующем примере главной форме проекта посылается сообщение о закрытии
приложения:
PostMessage(Handle,WM_QUIT,0,0);
В дополнение к функциям API Windows® VCL содержит метод Perform, который
можно использовать для посылки сообщений любому окну VCL.
function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
Perform обходит систему передачи сообщений Windows® и направляет сообщение
непосредственно механизму обработки данного окна. С использованием
предыдущий пример будет выглядеть следующим образом:
Perform(WM_QUIT,0,0);
VCL имеет события примерно лишь для 20% наиболее часто используемых
сообщений Windows®. У программиста может возникнуть необходимость
обработать сообщения, для которых в VCL события не предусмотрены. Для
обработки сообщений ОС, не имеющих соответствующих событий в Delphi есть
ключевое слово message. С его помощью конкретный метод в коде программы
может быть связан с любым сообщением Windows®. Когда окно приложения
получает это сообщение вызывается соответствующий метод. Для реализации
обработки сообщения на этом уровне необходимо:
1. Включить объявление метода для обработки сообщения в объявление класса,
указав ключевое слово message и название сообщения, для обработки которого
данный метод редназначен.
2. Включить определение метода в раздел implementation.
Приведем пример определения метода, обрабатывающего сообщение
WM_ERASEBKGND:
Procedure WmEraseBkgnd(var Msg:tWMEraseBkgnd); message WM_ERASEBKGND;
Ключевое слово message указывает на то, что данный метод используется для
обработки сообщения ОС, имя которого указано после этого ключевого слова:
WM_ERASEBK
| | скачать работу |
Программирование на Delphi |