Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Тебеуется помощь опытных билдеристов / 11 сообщений из 11, страница 1 из 1
24.12.2004, 07:01
    #32842952
E-doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
Забыл как это правильно называется, вертится в голове что-то вроде reflections в Java. :) Существует ли стандартный способ получить описание пользовательского класса с всеми его атрибутами для конкретного объекта в окне? Смысл в следующем:

Есть набор пользовательских объектов, унаследованных друг от друга. При обработке в окне массива Control[] требуется узнать, имеется ли у текущего объекта указываемая функция или свойство и в зависимости от результата выполнить некоторые действия. Как пример - обработка нажатия Enter у каждого из объектов может быть своя, а может и не быть вовсе и определяться свойством наподобие ProcessEnter.

Первое, что приходит в голову - описать в каждом объекте событие ue_hasprocessor, в котором возвращать значение ProcessEnter и вызов этого события делать динамически с проверкой возвращаемого значения по принципу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
any la_any

la_any = object.EVENT DYNAMIC ue_hasprocessor()

if IsNull(la_any) then
...
else
...
end if

но этот подход не очень удобен.
...
Рейтинг: 0 / 0
24.12.2004, 07:46
    #32842966
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
Как у Java такого нет. Рекомендую вообще с этим не заморачиваться. Кто Вам мешает динамически вызывать события - если они есть у обьектов, то выполнятся, если нет, то не выполнятся. Тогда и отпадает надобность в флаге ProcessEnter.
...
Рейтинг: 0 / 0
24.12.2004, 08:52
    #32843002
Mykola
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
View FindClassDefinition(...)
...
Рейтинг: 0 / 0
24.12.2004, 08:58
    #32843008
E-doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
Обработка Enter - это частный случай и приведен только для примера. Ситуация гораздо хуже, если требуется узнать, есть у объекта интересующее свойство или нет.

Есть функция FindClassDefinition, которая возвращает описание класса и в свойстве VariableList[] содержится описание всех переменных. Это могло бы помочь. Но! Как получить тип объекта в окне? Функция TypeOf возвращает базовый тип, то есть например datawindow! вместо uo_dw .
...
Рейтинг: 0 / 0
24.12.2004, 09:30
    #32843056
Я
Я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
а что не воспользоваться ClassName()
...
Рейтинг: 0 / 0
24.12.2004, 10:27
    #32843176
E-doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
Я

А вы сами пробовали? В данном случае ClassName() вернет то имя, под которым объект известен в окне, т.е. если у меня есть в окне экземпляр uo_dw под именем dw_1, то я и получу "dw_1".
...
Рейтинг: 0 / 0
24.12.2004, 10:54
    #32843232
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
По-моему, это называется интроспекция :-)
RTFM на предмет вот этих функций:
FindClassDefinition
FindMatchingFunction
FindFunctionDefinition
FindTypeDefinition


Скорее всего, вас устроит нечто, похожее на вот этот пример из PowerBuilder Help.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string ls_args[]
ScriptDefinition sd

ls_args[ 1 ] = "ref dragobject"
ls_args[ 2 ] = "double"
ls_args[ 3 ] = "integer"
ls_args[ 4 ] = "integer"

sd = c_obj.FindMatchingFunction( &
		"OpenUserObjectWithParm", ls_args)
IF NOT IsValid(sd) THEN
  mle_1.Text = "No matching script"
ELSE
 mle_1.Text = uf_scriptinfo(sd)
END IF
...
Рейтинг: 0 / 0
24.12.2004, 10:55
    #32843233
Kukuruku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
к E-Doc
Боюсь вас учить но может быть стоит взглянуть на задачу с другой стороны?
Реализация обхода (в цикле) массива всех Control-ов не очень удачна....
Может быть попробовать как-то иначе решить проблему....
...
Рейтинг: 0 / 0
24.12.2004, 11:06
    #32843272
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
И еще две копейки...
PowerBuilder Help Properties for ClassDefinition object
Ancestor ClassDefinition An object that represents the ancestor class. Ancestor is NULL when the ClassDefinition is describing PowerObject.Перебирая в цикле предков вашего объекта вы приходите, в конце концов, к тому, который вас интересует, например u_dw :-)

А вот такой код вообще никаких знаний об объекте от вас не требует:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
integer li_Rc, li_i, li_Cnt
li_Cnt = upperbound (control[])
for li_i =  1  to li_cnt
 li_Rc = control[li_i].TriggerEvent ("my_Event")
 if li_Rc <  0  then 
 // стандартная обработка
 end if
next
...
Рейтинг: 0 / 0
24.12.2004, 11:15
    #32843314
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
E-doc
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
any la_any

la_any = object.EVENT DYNAMIC ue_hasprocessor()

if IsNull(la_any) then
...
else
...
end if

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try
  your_obj.FUNCTION DYNAMIC uf_WhateverYouWant()
catch (RuntimeError rte)
  if rte.number <>  65  THEN
    throw rte
  end if
  ::WeNeedWorkAroundHere(your_obj)
end try  

Interfaces in PowerBuilder
...
Рейтинг: 0 / 0
24.12.2004, 12:07
    #32843496
E-doc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тебеуется помощь опытных билдеристов
Всем большое спасибо за советы.

PL99И еще две копейки...
PowerBuilder Help Properties for ClassDefinition object
Ancestor ClassDefinition An object that represents the ancestor class. Ancestor is NULL when the ClassDefinition is describing PowerObject.Перебирая в цикле предков вашего объекта вы приходите, в конце концов, к тому, который вас интересует, например u_dw :-)

А вот такой код вообще никаких знаний об объекте от вас не требует:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
integer li_Rc, li_i, li_Cnt
li_Cnt = upperbound (control[])
for li_i =  1  to li_cnt
 li_Rc = control[li_i].TriggerEvent ("my_Event")
 if li_Rc <  0  then 
 // стандартная обработка
 end if
next

Реализацию первого варианта я нашел через Google, кому интересно, вот ссылка
Но второй вариант мне кажется более простым и удобным. Отдельное спасибо PL99 :)
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Тебеуется помощь опытных билдеристов / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]