Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> Полезный код
Использование глобального объекта 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
Материал прочитан: 14614 раз(а)
[ Назад ]



Продвижение сайтов
Биржа ссылок

Copyright©2005 phpMS. Все права защищены.
hosted on pets-tree