|
|
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
есть окно w_one, в нём определена переменная s_something. На этом окне лежит user object, например, uo_forone, в скрипте которого мне надо обратиться в instance-переменной родительского окна w_one. делаю так: Код: plaintext 1. 2. 3. 1. есть ли ещё варианты работы с переменной-членом объекта? например, как в СИ++, с помощью приведения типов: Код: plaintext 1. и 2. много ли памяти занимает объявление в скрипте Код: plaintext заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2005, 13:13 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
string s1 s1 = Parent.is_something если скрипт пишем в uo_1 который размещен в уже окне и is_something is Public ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2005, 14:09 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyи 2. много ли памяти занимает объявление в скрипте Код: plaintext Зависит от типа объекта: - структуры и nonvisual autoinstatiated - при объявлении переменной создается экземпляр (также при передаче в метод по значению создается копия) - остальные типы - просто указатель, которому надо присвоить либо другой указатель, либо OpenUserobject (для визуальных), либо Create (для невизуальных) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2005, 14:55 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
2 Mycola: parent. не пойдёт, так как скрипт пишу в событиях отдельного user object, который ещё нигде не лежит. например, пользовательский объект, унаследованный от datawindow -- и мне надо из его события обратится к свойству окна, на кот. этот объект положат. parentwindow тоже не работает повторю проблему: dw_other унаследованная от datawindow w_other унаследованное от window. На это окно кладётся user object = dw_other требуется: в событии или функции (принадлежащем не экземпляру dw_other, а его классу ) объекта dw_other обратиться к public instance-переменной окна w_other. думаю остановиться на Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2005, 17:01 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
savosin_sergey думаю остановиться на Код: plaintext 1. 2. Должно быть понятно, что ^ - плохой стиль... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2005, 20:02 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
2 Филипп: чё? где? где плохой стиль? именно это меня и интересует! где именно плохой стиль и как с ним предложишь бороться? другого способа обратиться к переменной класса из объекта, включённого в этот класс, я (пока?) не вижу. хотя можно сделать функцию/событие этого класса, которая возращает требуемую переменную.. но ведь я обращаюсь не откуда попало -- не из произвольного внешнего объекта, а из встроенного (связанного соотношением "is a") -------------- повторяю, в си++ я бы написал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. --------------- извиняюсь за код с++ на форуме powerBuilder'а. Можно ли чё-то похожее провернуть в powerBuilder? или есть другие варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 11:57 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyчё? где? где плохой стиль? именно это меня и интересует! где именно плохой стиль и как с ним предложишь бороться? другого способа обратиться к переменной класса из объекта, включённого в этот класс, я (пока?) не вижу. хотя можно сделать функцию/событие этого класса, которая возращает требуемую переменную.. но ведь я обращаюсь не откуда попало -- не из произвольного внешнего объекта, а из встроенного (связанного соотношением "is a") Я бы сделал так: Надо разделить событие и его обработку при помощи наследования (в PB есть удобный механизм для этого - user events). В данном случае у нас есть событие в предполагаемом вложенном объекте, назовем событие "process". Базовый класс вложенного объекта генерирует данное событие (но не обрабатывает) [PB: создаем user event ue_process в классе uo_forone]. Создаем наследника и встраиваем его в класс контейнер [PB: размещаем uo_forone в окне w_one ] В наследнике обрабатываем событие обращаясь к любой части объекта-контейнера [PB: в w_one в обработчике события uo_forone.ue_process пишем код обработки обращаясь к parent.s_sonething ] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 13:06 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
Забыл про плохой стиль добавить :)) IMHO, когда есть два класса и оба содержат ссылки друг на друга - это плохой стиль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 13:13 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
не, речь идёт о программировании общего user object'а, а не наследника -- чтобы скрипт этот потом не дублировать. а именно: на событие doubleclicked user object, кот. является наследником datawindow, надо обратиться к instance-переменной окна, на кот. лежит этот user object. Окно не обычное, а специальное (как и user object). Технология такая. Несколько этих наследников datawindow кладутся на наследника window, связываются там.. (master-detail, blank-grid). Так вот решил я повесить календарь (и повесил) на событие datawindow doubleclicked. а календарь -- это instance-переменная window, на кот. лежат указанные наследники datawindow. Вот мне и потребовалось из события datawindow обратиться к переменной window.. по поводу взаимных ссылок: лень было вводить общий класс Object у этих классов, вот и ввёл второй указатель. Как ещё к родителю обратиться? в powerBuilder -- это parent/parentwindow/getParent(), тут понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 18:31 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
ошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 18:33 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
savosin_sergeyошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код? То есть вообще всё неправильно :-)) Неужели так трудно посмотреть, как в PFC календарный сервис сделан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2005, 19:19 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
Есть окно типа W_GRID Есть обьект типа UO_vobj В uo_vobj определяеш instans переменную типа W_GRID w_parent В обьекте определяеш функцию UO_vobj.of_setparent( a_wnd window ref) и текст if IsValid(a_wnd) then w_parent=a_wnd return True end if return False после вызова конструктроа обьекта (для AUTOINST конструктор не вызывается) в конструкторе окна вызываеш эту функцию UO_vobj.of_setparent( this). This - указатель на окно типа W_GRID. После этого к instans переменным окна обращайся через w_parent.is_string='любая строка'. Не забывай с каким квалификатором доступа обьявлены эти переменные private или protect и на количество уровней наследования, так как privat переменные в наследниках не видны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 01:57 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
2 Филипп: "ну вот, пришёл поручик Ржевский и всё опошлил" Ошибся -- в смысле фразу в сообщении яне, речь идёт о программировании общего user object'а, а не наследника надо понимать как тоже яречь идёт о программирвании общего user object'а, а не user control 2 psh: так это и есть тот способ, который я предлагал на общее рассмотрение, а про который ФилиппДолжно быть понятно, что ^ - плохой стиль... повторю "тот" способ доступа к instance-переменным окна-родителя: Код: plaintext 1. 2. 3. второй способ (доступа к instance-переменной окна-родителя) -- ввести в это окно специальные функции типа get_special_string(), set_special_string() с уважением ко всем отозвавшимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 15:37 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
Филипп Неужели так трудно посмотреть, как в PFC календарный сервис сделан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 19:55 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
2 psh: так это и есть тот способ, который я предлагал на общее рассмотрение, а про который ФилиппДолжно быть понятно, что ^ - плохой стиль... повторю "тот" способ доступа к instance-переменным окна-родителя: Код: plaintext 1. 2. 3. второй способ (доступа к instance-переменной окна-родителя) -- ввести в это окно специальные функции типа get_special_string(), set_special_string() с уважением ко всем отозвавшимся. Свой пример я привел на основании аналогии PFC -сервисов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 00:07 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
понятно. в общем нет в power script'е приведения типов -- от базового класса, к одному из наследников, его роль играет посылка/приём сообщений. ответ прост, нечего усложнять. вообще, многие вещи просты -- в программировании, в математике, в физике -- просты по своим принципам. сложности наступают в реализации 2 Psh: ну, кстати, поковырялся я в PFC, pfc_u_calendar, pfc_u_dw -- нету в нём (в pfc_u_dw) instance-переменной с конкретным типом окна-родителя (как у тебя w_grid) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 11:52 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
Сложности возникают, когда предъявляются противоречивые требования. Вы хотите написать универсальный класс, который бы работал с любым окном, и тут же требуете чтобы он знал про конкретное окно и мог обратиться к его свойствам. Противоречие устраняется просто: Вводится базовый класс окон BaseRequestor с неким интерфейсом, допустим String GetServiceArg(), необходимым для работы Вашего универсального компонента Service. В Service создается свойство BaseRequestor Requestor или метод SetRequestor(BaseRequestor r) А конкретное окно наследуется от BaseRequestor и реализует GetServiceArg. При создании Service окно вызывает service.SetRequestor(this). Это и реализовано в PFC PS. Насчет приведения типов: имхо, в хорошо спроектированной структуре классов явное приведение типов базового класса к наследнику не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 13:08 |
|
||
|
доступ к instance-переменным объекта-родителя
|
|||
|---|---|---|---|
|
#18+
спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 18:58 |
|
||
|
|

start [/forum/topic.php?fid=15&msg=32984931&tid=1338446]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
88ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 465ms |

| 0 / 0 |
