|
Sybase
|
|
|
|
|
Продукты
|
|
|
|
|
Сообщества
|
|
|
|
|
Меню
|
|
|
|
|
Вход
|
|
|
|
|
Рассылка
|
|
|
|
|
Статистика
|
|
|
|
|
Использование глобального объекта Message для передачи параметров между формами приложения
|
Использование глобального объекта Message для передачи параметров между формами приложения Многие начинающие разработчики для передачи параметров между окнами используют глобальные переменные. Я сам начина точно так же. Ни к чему хорошему это не приводит. Кстати, так же поступают разработчики, работавшие ранее с Visual Basic, MS Access, и т.д. А вся проблема в том, что некому рассказать им об объекте Message. Вот это я и хочу сделать…
Что это такое и с чем его едят
Итак, Message – это глобальный объект, создающийся при старте приложения. Он служит для управления событиями и содержит для этого 6 параметров:
Integer Handle – Дескриптор окна (хендл)
Integer Number – Идентификатор события Windows
UnsignedInt WordParm – Параметр word сообщения Windows
Long LongParm – Параметр long сообщения Windows
Boolean Processed – Флаг обработки события
Long ReturnValue – Значение для возврата Windows
Благодаря этим параметрам мы имеем возможность перехватывать и самостоятельно обрабатывать сообщения и события ОС Windows. Но интерес для нас представляют 4 другие параметра, предназначенные для передачи дополнительных параметров в обработчик:
PowerObject ClassDefinition – Объект типа PowerObject, содержащего информацию об определении класса объекта или управления.
Double DoubleParm – Число или числовая переменная типа Double
String StringParm – Строка или строковая переменная типа String
PowerObject PowerObjectParm – Любой объект PowerBuilder
Вот как раз через эти четыре поля мы и можем передавать все необходимые нам параметры!
Как это делается
А делается это очень просто. Есть два пути.
- Путь первый: записать в поля Message передаваемые параметры, открыть окно, на открытии окна считать параметры. Этот способ имеет уязвимость (теоретически, ибо я еще не разу не слышал, чтобы кто-то это воспроизвел) в том, что между записью параметров и их считыванием на открытии окна есть некоторое количество времени, когда Windows в ответ на какое либо событие может перезаписать наши данные своими.
- Путь второй: в PowerScript есть несколько функций, отвечающих за открытие и закрытие окна или пользовательского объекта. Это функции OpenWithParm(), OpenSheetWithParm(), OpenUserObjectWithParm() и CloseWithReturn(). Все эти функции объединяет то, что в синтаксисе их вызова, то, что Вы передаете вторым параметром, автоматически распознается по типу данных и помещается в соответствующее поле объекта Message.
Примеры
Передаем строку.
В событии вызова окна some_window из окна parent_window:
String ls_message
ls_message = some_sle.text
OpenWithParm(some_window, ls_message, parent_window)
На событии open окна some_window:
String ls_mssage
if not IsValid(Message.StringParm) then return -1
ls_message = Message.StringParm
Принимаем параметр от закрывшегося окна.
В событии вызова окна some_window из окна parent_window:
Long ll_value
Open(some_window) // для правильной отработки этого кода,
//some_window должно иметь тип response
if not IsValid(Message.DoubleParm) then return -1
ll_value = Long(Message.DoubleParm)
На событии clicked кнопки «Закрыть» окна some_window:
CloseWithReturn(some_window, 124)
Маловато будет
Предвижу Ваш следующий вопрос. Да, рассмотренные выше примеры весьма удобны для передачи одного параметра. А что делать для передачи нескольких? А если еще и типы параметров различаются? Ответ прост – нужно использовать структуры!
Что такое структура
Структура – это, фактически, коллекция, состоящая из одной или нескольких связанных переменных одного или разных типов. Структуры в PowerBuilder создаются как глобальный или объектный класс, и используются как экземпляры класса.
Для создания глобальной структуры вызовите через меню File-New-PB Object-Structure. Для создания оконной структуры, находясь в режиме редактирования окна, вызовите через меню Insert-Structure.
Как это работает
Предположим, нам нужно передать в открываемое окно три переменных: Long Id, String Name и Double Salary, а за тем, по закрытию окна получить эти переменные обратно, в измененном виде. Создаем глобальную структуру s_Man, состоящую из этих переменных. Далее прописываем следующие сценарии.
В событии вызова окна some_window из окна parent_window:
s_Man ws_Man // создаем структурный объект типа s_Man
// наполняем структуру
ws_Man.Id = Id
ws_Man.Name = Name
ws_Man.Salary = Salary
// вызываем some_window передавая ему структуру с параметрами
OpenWithParm(some_window, ws_Man) // для того, чтобы здесь получить структуру
// с измененными значениями, окно some_window
// должно иметь тип response
if not IsValid(Message.PowerObjectParm) then return -1
ws_Man = Message.PowerObjectParm
На событии open окна some_window:
s_Man ws_NewMan // создаем структурный объект типа s_Man
// получаем структуру
if not IsValid(Message.PowerObjectParm) then return -1
ws_NewMan = Message.PowerObjectParm
// обработка …
На событии clicked кнопки «Закрыть» окна some_window:
ws_NewMan.Id = ll_Id
ws_NewMan.Name = ls_Name
ws_NewMan.Salary = ld_Salary
CloseWithReturn(some_window, ws_NewMan)
Вот и все. Видите, как просто и удобно?
|
Дата публикации: Tuesday 28 March 2006 14:10:55 Материал прочитан: 15382 раз(а) [ Назад ] |
|
|
|
|
|
|
Copyright©2005 . Все права защищены.
|