Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Определить в скрипте класс объекта / 18 сообщений из 18, страница 1 из 1
12.10.2007, 19:00
    #34866175
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Ситуация: на окне лежит объект (экземпляр) класса (например, класса u_dw). Имя этому объекту было дано в window painter-е (например, dw_1).

Задача: определить в скрипте класс объекта. Функция ClassName() нагло врёт - возваращает имя не класса (u_dw), а экземпляра (dw_1) - такое впечатление, что создатели PowerBuilder-а не были знакомы с элементарной объектно-ориентированной терминологией (все программисты создают классы, из которых позже создаются объекты (или экземпляры класса), и лишь мы, пауэрбилдерщики, создаюм сразу объекты - немногим это дано! Мало того, эти объекты именуются user objects, будто их создают не девелоперы, а юзеры - это ж сколько надо было выпить... Ну да ладно, вернёмся к задачке. Короче, нужно извлечь в коде то самое имя, которое в режиме Edit Source идёт сразу за словом from при описании объекта (как dw_1 from u_dw).

Спасибо!
...
Рейтинг: 0 / 0
12.10.2007, 19:12
    #34866196
urvas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
.Typeof() ?
...
Рейтинг: 0 / 0
12.10.2007, 20:06
    #34866247
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Нет, TypeOf() вообще из другой оперы - возвращает переменную перечислимого типа Object (например DataWindow! и т.п)...
...
Рейтинг: 0 / 0
12.10.2007, 20:24
    #34866264
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
classdefinition - твой друг. Посмотри внимательно приложенный объект (модифицированный мной вырванный из PFC n_cst_metaclass)
...
Рейтинг: 0 / 0
13.10.2007, 00:22
    #34866430
Ursego
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Если я правильно понял, classdefinition существует только у классов, сохранённых под собственным именем (т.е. являющимися типами данных). Например, если создать и сохранить окно, то classdefinition у него будет. Но если на окне лежит объект (например, datawindow), то этого объекта нет classdefinition-а, а именно он-то мне и нужен был бы (он есть у класса, от которого объект унаследован, например в данном случае у u_dw, что никак не помогает мне).

В любом случае спасибо!
...
Рейтинг: 0 / 0
13.10.2007, 10:47
    #34866546
ZhV
ZhV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Когда-то тоже озадачился subj.
1) в КАЖДОМ визуальном обьекте есть event - getname()
Можно просто не полениться и на всех своих uo проставить в этом обьекте
Код: plaintext
 Return "uo_youwish" 
Это работает очень быстро и удобно для опознания конкретного uo-обьекта и не требует
специальных функций.
При желании и не ленивости - можно там же записать код
Код: plaintext
 Return 'uo_youwish`'+super::event Getname()
И тогда можно получить всю цепочку ancestor-ов. Только для получения текущего имени
придется пользоваться какой-нибудь token-функцией по разделителю [`]



2) ну и classdefinition конечно тоже работает. Но не в лоб. В массиве контролов
найти первый визуальный обьект (массив control[]) и в его определении будет
примерно такая ссылка
'uo_youwish`st_1'
- нужно взять token по тому же разделителю

3) во вложении - библиотека с nv-обьектом - там пара функций
( это zip - файл. Поскольку иногда корпоративные файрволлы рубят zip - изменено расширение )

Код: plaintext
1.
2.
3.
4.
 //int of_collect_contols(powerobject a_ob, ref s_control_objectsast_objs[] )
//  Собрать все контролы на обьекте

//string of_collect_contols(a_ob)
//  Собрать все контролы на обьекте и - вывести в строку описания 
У последней функции - только одно применение :
В root-меню определяется невидимый пункт с hot-вызовом , например Alt+Ctrl+O
По этой комбинации вызывается указанная функция
ls_ret = ????.of_collect_contols(<window_on_focus>)

И эту строку - либо в clipboard либо в специальное окно диагностики.
Выглядит примерно так

==== Список Controls на вызывающем окне ====
Window = W_DEMO_SHEET
1 w_demo_sheet window lvl=0 visible x=0 y=0 w=4667 h=2854 hnd=1424
2 tab_1 tab lvl=0 visible x=0 y=0 w=4630 h=2746 hnd=2456
3 cb_close commandbutton lvl=0 visible x=4341 y=13 w=289 h=80 hnd=2736
4 cbx_can_edit checkbox lvl=0 x=1510 y=19 w=1057 h=77 hnd=4076
5 tabpage_1 userobject lvl=1 tab_1 visible x=15 y=90 w=4601 h=2643 hnd=3064
6 tabpage_2 userobject lvl=1 tab_1 visible x=15 y=90 w=4601 h=2643 hnd=3416
7 dw_master1 datawindow lvl=2 tabpage_1 visible x=4 y=3 w=4590 h=2634 hnd=2732 uo_type=u_dwstandard_grid
8 st_ask_list statictext lvl=2 tabpage_2 visible x=172 y=1104 w=1009 h=64 hnd=676
....
16 cb_progress commandbutton lvl=2 tabpage_2 visible x=37 y=573 w=113 h=77 hnd=2472
17 uo_mspr userobject lvl=2 tabpage_2 visible x=179 y=573 w=1313 h=67 hnd=1664 uo_type=uo_message_progress
...
Рейтинг: 0 / 0
13.10.2007, 11:56
    #34866585
ZhV
ZhV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Кстати, нас вот этой функции :
Код: plaintext
1.
//int of_collect_contols(powerobject a_ob, ref s_control_objects ast_objs[] )
//  Собрать все контролы на обьекте
Рекомендую

Есть и другие применения. Например собрать на This окне или userobject - в instance массив.
В составе структуры есть хранитель tag-ов для каждого -control-а.

А в этих тагах можно "прямым текстом" задать некие опции-условия - пройдясь по всем тагам определить по заданным соглашениям усовия видимости/доступности соответствующих control_ов - в зависимости от контекста. То есть не надо прыгать по именованным элементам ( особенно противно на tab-ах) - какая экономия кода :) Просто пройтись по массиву и для control-ов c непустыми тагами сделать нужный выбор visible/enabled что-то типа
Код: plaintext
  ast_objs[i].visible =  Match(ast_objs[i].tag,'do_edit')  
Аналогично - по содержанию тагов - тюнинг при resize...
...
Рейтинг: 0 / 0
13.10.2007, 14:23
    #34866680
ИвановНН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Любой объект, имеющий конечного предка PowerObject, имеет свойство ClassDefinition.
...
Рейтинг: 0 / 0
14.10.2007, 01:07
    #34867057
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
UrsegoФункция ClassName() нагло врёт - возваращает имя не класса (u_dw), а экземпляра (dw_1)

Это ошибочное мнение.

На самом деле все происходит так:
Допустим есть окно w_1 с помещенным в него u_dw с именем dw_1. Так это вглядит извне.

Внутри PB это выглядит по-другому:
Внутри класса w_1 объявлен вложенный класс w_1`dw_1 унаследованный от u_dw. А также объявлена переменная dw_1 этого же типа (w_1`dw_1)

Поэтому dw_1.ClassName() возвращает dw_1 - это краткое имя класса. Полное имя (w_1`dw_1) можно узнать через dw_1.ClassDefinition.Name, а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name

PS. Когда я пишу
Код: plaintext
dw_1.ClassDefinition.Name
то это естественно следует читать так:
Код: plaintext
1.
2.
ClassDefinition lcd
lcd = dw_1.ClassDefinition
lcd.Name
...
Рейтинг: 0 / 0
14.10.2007, 06:59
    #34867108
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
И абсолютно всё это есть в объекте который я постнул...
...
Рейтинг: 0 / 0
14.10.2007, 11:02
    #34867155
ZhV
ZhV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name

Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора
...
Рейтинг: 0 / 0
14.10.2007, 11:51
    #34867171
Riska
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
ZhV 18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name

Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора
Код: plaintext
1.
2.
3.
string ls
ClassDefinition lcd
lcd = dw_1.ClassDefinition
ls = lcd.Ancestor.Name
...
Рейтинг: 0 / 0
14.10.2007, 15:13
    #34867315
ZhV
ZhV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
Код: plaintext
ls = lcd.Ancestor.Name
Не работает. В общем случае.

Если UserObject , родовое имя которого вам требуется знать, "лежит" не на текущем окне, а на одном из его ancestor-ов. В таком случае ваш код вернет строку типа
"w_sheet_one_datawindow`dw_one"
И это правильно - это и есть ancestor 1-го порядка для заданного обьекта.
Чтобы увидеть все уровни наследования - откройте какой-нибудь event на datawindow.
Над полем редактора - три выпадающих списка - посмотрите самый крайний справа.

Чобы добраться до original - Нужен цикл
Код: plaintext
1.
2.
3.
4.
5.
 
Do While lcd.name<>''
  lcd = lcd.ancestor
  If IsNull(lcd)) Then ; Exit ; End If
  If POS(lcd.name,'`')< 1  Then ; ls=lcd.name ; Exit;  End If
Loop  


Проверка POS(lcd.name,'`')<1 нужна - иначе цикл пойдет уже по ancestor-ам самого UserObject-а
а не окна/userobjecta на котором он лежит.

В принципе для этого и нужна отдельная функция.
Но все таки не проще ли ?
Код: plaintext
1.
2.
 
If dw_1.event GetName()='dw_standard_crosstab' Then
....
...
Рейтинг: 0 / 0
14.10.2007, 20:50
    #34867555
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
ZhVНо все таки не проще ли ?
Код: plaintext
1.
2.
 
If dw_1.event GetName()='dw_standard_crosstab' Then
....

Нет, не проще - для этого и были добавлены в Powerscript metaclass функции, чтоб не надо было глупости писать в каждом классе и объекте...
...
Рейтинг: 0 / 0
15.10.2007, 11:02
    #34868179
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
ФилиппИ абсолютно всё это есть в объекте который я постнул...
Я и не спорил. Просто в добавление к Вашему объекту я пояснил автору, что его картина мира в части устройства объектов в PB не соответствует реальности :)
...
Рейтинг: 0 / 0
15.10.2007, 11:03
    #34868185
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
ZhV 18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name

Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора
А надо было дочитать до конца сообщения - там написано как откомпилировать.
...
Рейтинг: 0 / 0
15.10.2007, 11:06
    #34868205
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
ZhV
Код: plaintext
ls = lcd.Ancestor.Name
Не работает. В общем случае.

Если UserObject , родовое имя которого вам требуется знать, "лежит" не на текущем окне, а на одном из его ancestor-ов.
Так общий случай и не требовался. Автор четко описал условия - там не было никакого наследования.
В общем случае же действительно нужен цикл пока в качестве предка не встретится невложенный класс.
...
Рейтинг: 0 / 0
15.10.2007, 11:09
    #34868224
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить в скрипте класс объекта
а вот есть по образу и подобию других языков ф-ции:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
$PBExportHeader$f_instanceof.srf
global type f_instanceof from function_object
end type

forward prototypes
global function boolean f_instanceof (readonly powerobject apo, readonly string as_ancestor)
end prototypes

global function boolean f_instanceof (readonly powerobject apo, readonly string as_ancestor);
/** returns true if apo is instance of as_ancestor class */
ClassDefinition lcd
if isnull(apo) then return false
if not isvalid(apo) then return false
lcd=apo.ClassDefinition
if not isnull(lcd) and isvalid(lcd) then
	Do while not isNull(lcd.Ancestor)
		lcd = lcd.Ancestor
		if lcd.Name=as_ancestor then return true
	Loop
end if
return false
end function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
$PBExportHeader$f_classof.srf
global type f_classof from function_object
end type

forward prototypes
global function boolean f_classof (readonly string as_child, readonly string as_ancestor)
end prototypes

global function boolean f_classof (readonly string as_child, readonly string as_ancestor);
/** returns true if class named as_child is descendant of as_ancestor */
ClassDefinition lcd
lcd=FindClassDefinition(as_child) 
if not isnull(lcd) and isvalid(lcd) then
	Do while not isNull(lcd.Ancestor)
		lcd = lcd.Ancestor
		if lcd.Name=as_ancestor then return true
	Loop
end if
return false
end function
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Определить в скрипте класс объекта / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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