|
|
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Ситуация: на окне лежит объект (экземпляр) класса (например, класса u_dw). Имя этому объекту было дано в window painter-е (например, dw_1). Задача: определить в скрипте класс объекта. Функция ClassName() нагло врёт - возваращает имя не класса (u_dw), а экземпляра (dw_1) - такое впечатление, что создатели PowerBuilder-а не были знакомы с элементарной объектно-ориентированной терминологией (все программисты создают классы, из которых позже создаются объекты (или экземпляры класса), и лишь мы, пауэрбилдерщики, создаюм сразу объекты - немногим это дано! Мало того, эти объекты именуются user objects, будто их создают не девелоперы, а юзеры - это ж сколько надо было выпить... Ну да ладно, вернёмся к задачке. Короче, нужно извлечь в коде то самое имя, которое в режиме Edit Source идёт сразу за словом from при описании объекта (как dw_1 from u_dw). Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2007, 19:00 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
.Typeof() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2007, 19:12 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Нет, TypeOf() вообще из другой оперы - возвращает переменную перечислимого типа Object (например DataWindow! и т.п)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2007, 20:06 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
classdefinition - твой друг. Посмотри внимательно приложенный объект (модифицированный мной вырванный из PFC n_cst_metaclass) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2007, 20:24 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, classdefinition существует только у классов, сохранённых под собственным именем (т.е. являющимися типами данных). Например, если создать и сохранить окно, то classdefinition у него будет. Но если на окне лежит объект (например, datawindow), то этого объекта нет classdefinition-а, а именно он-то мне и нужен был бы (он есть у класса, от которого объект унаследован, например в данном случае у u_dw, что никак не помогает мне). В любом случае спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2007, 00:22 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Когда-то тоже озадачился subj. 1) в КАЖДОМ визуальном обьекте есть event - getname() Можно просто не полениться и на всех своих uo проставить в этом обьекте Код: plaintext специальных функций. При желании и не ленивости - можно там же записать код Код: plaintext придется пользоваться какой-нибудь token-функцией по разделителю [`] 2) ну и classdefinition конечно тоже работает. Но не в лоб. В массиве контролов найти первый визуальный обьект (массив control[]) и в его определении будет примерно такая ссылка 'uo_youwish`st_1' - нужно взять token по тому же разделителю 3) во вложении - библиотека с nv-обьектом - там пара функций ( это zip - файл. Поскольку иногда корпоративные файрволлы рубят zip - изменено расширение ) Код: plaintext 1. 2. 3. 4. В 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2007, 10:47 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Кстати, нас вот этой функции : Код: plaintext 1. Есть и другие применения. Например собрать на This окне или userobject - в instance массив. В составе структуры есть хранитель tag-ов для каждого -control-а. А в этих тагах можно "прямым текстом" задать некие опции-условия - пройдясь по всем тагам определить по заданным соглашениям усовия видимости/доступности соответствующих control_ов - в зависимости от контекста. То есть не надо прыгать по именованным элементам ( особенно противно на tab-ах) - какая экономия кода :) Просто пройтись по массиву и для control-ов c непустыми тагами сделать нужный выбор visible/enabled что-то типа Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2007, 11:56 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Любой объект, имеющий конечного предка PowerObject, имеет свойство ClassDefinition. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2007, 14:23 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#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 Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 01:07 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
И абсолютно всё это есть в объекте который я постнул... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 06:59 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 11:02 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
ZhV 18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 11:51 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Если UserObject , родовое имя которого вам требуется знать, "лежит" не на текущем окне, а на одном из его ancestor-ов. В таком случае ваш код вернет строку типа "w_sheet_one_datawindow`dw_one" И это правильно - это и есть ancestor 1-го порядка для заданного обьекта. Чтобы увидеть все уровни наследования - откройте какой-нибудь event на datawindow. Над полем редактора - три выпадающих списка - посмотрите самый крайний справа. Чобы добраться до original - Нужен цикл Код: plaintext 1. 2. 3. 4. 5. Проверка POS(lcd.name,'`')<1 нужна - иначе цикл пойдет уже по ancestor-ам самого UserObject-а а не окна/userobjecta на котором он лежит. В принципе для этого и нужна отдельная функция. Но все таки не проще ли ? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 15:13 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
ZhVНо все таки не проще ли ? Код: plaintext 1. 2. Нет, не проще - для этого и были добавлены в Powerscript metaclass функции, чтоб не надо было глупости писать в каждом классе и объекте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2007, 20:50 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
ФилиппИ абсолютно всё это есть в объекте который я постнул... Я и не спорил. Просто в добавление к Вашему объекту я пояснил автору, что его картина мира в части устройства объектов в PB не соответствует реальности :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 11:02 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
ZhV 18-я весна ... а то имя класса которое Вам нужно (u_dw) можно узнать из dw_1.ClassDefinition.Ancestor.Name Было бы красиво. Но у меня PB9 на такую конструкцию выдал ошибку компилятора А надо было дочитать до конца сообщения - там написано как откомпилировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 11:03 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
ZhV Код: plaintext Если UserObject , родовое имя которого вам требуется знать, "лежит" не на текущем окне, а на одном из его ancestor-ов. Так общий случай и не требовался. Автор четко описал условия - там не было никакого наследования. В общем случае же действительно нужен цикл пока в качестве предка не встретится невложенный класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 11:06 |
|
||
|
Определить в скрипте класс объекта
|
|||
|---|---|---|---|
|
#18+
а вот есть по образу и подобию других языков ф-ции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=15&gotonew=1&tid=1336951]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
10ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 394ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...