Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / доступ к instance-переменным объекта-родителя / 19 сообщений из 19, страница 1 из 1
28.03.2005, 13:13
    #32983708
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
есть окно w_one, в нём определена переменная s_something. На этом окне лежит user object, например, uo_forone, в скрипте которого мне надо обратиться в instance-переменной родительского окна w_one.
делаю так:
Код: plaintext
1.
2.
3.
//событие объекта uo_forone
w_one w1
w1 = getParent()
w1.s_sonething = "довольно простая строка"

1. есть ли ещё варианты работы с переменной-членом объекта? например, как в СИ++, с помощью приведения типов:
Код: plaintext
1.
((w_one)getParent()).s_something="не фурычит"

и 2. много ли памяти занимает объявление в скрипте
Код: plaintext
 w_one w1
? (т.е. создаётся ли объект w_one?) или это аналог работы с указателем в языке СИ++?

заранее спасибо!
...
Рейтинг: 0 / 0
28.03.2005, 14:09
    #32983862
Mykola
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
string s1
s1 = Parent.is_something
если скрипт пишем в uo_1 который размещен в уже окне и
is_something is Public
...
Рейтинг: 0 / 0
28.03.2005, 14:55
    #32984040
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
savosin_sergeyи 2. много ли памяти занимает объявление в скрипте
Код: plaintext
 w_one w1
? (т.е. создаётся ли объект w_one?) или это аналог работы с указателем в языке СИ++?

Зависит от типа объекта:
- структуры и nonvisual autoinstatiated - при объявлении переменной создается экземпляр (также при передаче в метод по значению создается копия)
- остальные типы - просто указатель, которому надо присвоить либо другой указатель, либо OpenUserobject (для визуальных), либо Create (для невизуальных)
...
Рейтинг: 0 / 0
28.03.2005, 17:01
    #32984537
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
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.
w_other w1
w1 = getParent()
w1.s_something = "Зовите меня Измаил."
...
Рейтинг: 0 / 0
28.03.2005, 20:02
    #32984931
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
savosin_sergey
думаю остановиться на
Код: plaintext
1.
2.
w_other w1
w1 = getParent()
w1.s_something = "Зовите меня Измаил."


Должно быть понятно, что ^ - плохой стиль...
...
Рейтинг: 0 / 0
29.03.2005, 11:57
    #32985820
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
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.
//постановка проблемы:

//класс окна
class w_other: window{
 uo_other *uo1; //тот самый user object, кот. "встроен" в окно (определён ниже)
 string s_string; //некоторая instance-переменная

 w_other(): uo1(this){}; //конструктор
...
}

//user object, содержащийся в окне w_other
class uo_other: datawindow{
 window *parent; //указатель на родителя (для getParent())
 window* getParent(){return parent};
public:
 uo_other(window* w): parent(w){}; //простой конструкор
 void anyFunction();
...
}

//проблема: из uo_other::anyFunction() обратиться
// к элементу s_string родителя

//реализация функции anyFunction(): моё решение этой проблемы
void uo_other::anyFunction(){
 window *w1; //общий базовый класс окна
 w1 = this.getParent();
 ((w_other*)w1)->s_string = "Tommy Bolin, Energy"; //приведение типа от 
 //------------------------------------------- базового класса к потомку
}

---------------
извиняюсь за код с++ на форуме powerBuilder'а. Можно ли чё-то похожее провернуть в powerBuilder? или есть другие варианты?
...
Рейтинг: 0 / 0
29.03.2005, 13:06
    #32986038
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
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 ]
...
Рейтинг: 0 / 0
29.03.2005, 13:13
    #32986063
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
Забыл про плохой стиль добавить :))

IMHO, когда есть два класса и оба содержат ссылки друг на друга - это плохой стиль.
...
Рейтинг: 0 / 0
29.03.2005, 18:31
    #32987105
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
не, речь идёт о программировании общего 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(), тут понятно
...
Рейтинг: 0 / 0
29.03.2005, 18:33
    #32987113
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
ошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код?
...
Рейтинг: 0 / 0
29.03.2005, 19:19
    #32987213
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
savosin_sergeyошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код?
То есть вообще всё неправильно :-))
Неужели так трудно посмотреть, как в PFC календарный сервис сделан?
...
Рейтинг: 0 / 0
30.03.2005, 01:57
    #32987542
psh
psh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
Есть окно типа 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 переменные в наследниках не видны.
...
Рейтинг: 0 / 0
30.03.2005, 15:37
    #32988993
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
2 Филипп: "ну вот, пришёл поручик Ржевский и всё опошлил"

Ошибся -- в смысле фразу в сообщении
яне, речь идёт о программировании общего user object'а, а не наследника
надо понимать как
тоже яречь идёт о программирвании общего user object'а, а не user control

2 psh: так это и есть тот способ, который я предлагал на общее рассмотрение, а про который
ФилиппДолжно быть понятно, что ^ - плохой стиль...

повторю "тот" способ доступа к instance-переменным окна-родителя:
Код: plaintext
1.
2.
3.
w_grid a_wnd
a_wnd = getParent()
a_wnd.instance_string="days may come and days may go (d.p.)"

второй способ (доступа к instance-переменной окна-родителя) -- ввести в это окно специальные функции типа get_special_string(), set_special_string()

с уважением ко всем отозвавшимся.
...
Рейтинг: 0 / 0
30.03.2005, 19:55
    #32989739
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
Филипп Неужели так трудно посмотреть, как в PFC календарный сервис сделан?
...
Рейтинг: 0 / 0
31.03.2005, 00:07
    #32989923
psh
psh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
2 psh: так это и есть тот способ, который я предлагал на общее рассмотрение, а про который
ФилиппДолжно быть понятно, что ^ - плохой стиль...

повторю "тот" способ доступа к instance-переменным окна-родителя:
Код: plaintext
1.
2.
3.
w_grid a_wnd
a_wnd = getParent()
a_wnd.instance_string="days may come and days may go (d.p.)"

второй способ (доступа к instance-переменной окна-родителя) -- ввести в это окно специальные функции типа get_special_string(), set_special_string()

с уважением ко всем отозвавшимся.

Свой пример я привел на основании аналогии PFC -сервисов.
...
Рейтинг: 0 / 0
31.03.2005, 11:52
    #32990544
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
понятно. в общем нет в power script'е приведения типов -- от базового класса, к одному из наследников, его роль играет посылка/приём сообщений. ответ прост, нечего усложнять. вообще, многие вещи просты -- в программировании, в математике, в физике -- просты по своим принципам. сложности наступают в реализации

2 Psh: ну, кстати, поковырялся я в PFC, pfc_u_calendar, pfc_u_dw -- нету в нём (в pfc_u_dw) instance-переменной с конкретным типом окна-родителя (как у тебя w_grid)
...
Рейтинг: 0 / 0
31.03.2005, 13:08
    #32990803
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
Сложности возникают, когда предъявляются противоречивые требования.
Вы хотите написать универсальный класс, который бы работал с любым окном, и тут же требуете чтобы он знал про конкретное окно и мог обратиться к его свойствам.
Противоречие устраняется просто:
Вводится базовый класс окон BaseRequestor с неким интерфейсом, допустим String GetServiceArg(), необходимым для работы Вашего универсального компонента Service. В Service создается свойство BaseRequestor Requestor или метод SetRequestor(BaseRequestor r)
А конкретное окно наследуется от BaseRequestor и реализует GetServiceArg. При создании Service окно вызывает service.SetRequestor(this).

Это и реализовано в PFC

PS. Насчет приведения типов: имхо, в хорошо спроектированной структуре классов явное приведение типов базового класса к наследнику не требуется.
...
Рейтинг: 0 / 0
31.03.2005, 18:58
    #32992021
savosin_sergey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
спасибо!
...
Рейтинг: 0 / 0
31.03.2005, 21:14
    #32992158
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
доступ к instance-переменным объекта-родителя
savosin_sergeyпонятно. в общем нет в power script'е приведения типов -- от базового класса, к одному из наследников

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


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