powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Тебеуется помощь опытных билдеристов
11 сообщений из 11, страница 1 из 1
Тебеуется помощь опытных билдеристов
    #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
Тебеуется помощь опытных билдеристов
    #32842966
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как у Java такого нет. Рекомендую вообще с этим не заморачиваться. Кто Вам мешает динамически вызывать события - если они есть у обьектов, то выполнятся, если нет, то не выполнятся. Тогда и отпадает надобность в флаге ProcessEnter.
...
Рейтинг: 0 / 0
Тебеуется помощь опытных билдеристов
    #32843002
Mykola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
View FindClassDefinition(...)
...
Рейтинг: 0 / 0
Тебеуется помощь опытных билдеристов
    #32843008
E-doc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обработка Enter - это частный случай и приведен только для примера. Ситуация гораздо хуже, если требуется узнать, есть у объекта интересующее свойство или нет.

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

А вы сами пробовали? В данном случае ClassName() вернет то имя, под которым объект известен в окне, т.е. если у меня есть в окне экземпляр uo_dw под именем dw_1, то я и получу "dw_1".
...
Рейтинг: 0 / 0
Тебеуется помощь опытных билдеристов
    #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
Тебеуется помощь опытных билдеристов
    #32843233
Kukuruku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к E-Doc
Боюсь вас учить но может быть стоит взглянуть на задачу с другой стороны?
Реализация обхода (в цикле) массива всех Control-ов не очень удачна....
Может быть попробовать как-то иначе решить проблему....
...
Рейтинг: 0 / 0
Тебеуется помощь опытных билдеристов
    #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
Тебеуется помощь опытных билдеристов
    #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
Тебеуется помощь опытных билдеристов
    #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
11 сообщений из 11, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Тебеуется помощь опытных билдеристов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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