powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / доступ к instance-переменным объекта-родителя
19 сообщений из 19, страница 1 из 1
доступ к instance-переменным объекта-родителя
    #32983708
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть окно 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
доступ к instance-переменным объекта-родителя
    #32983862
Mykola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
string s1
s1 = Parent.is_something
если скрипт пишем в uo_1 который размещен в уже окне и
is_something is Public
...
Рейтинг: 0 / 0
доступ к instance-переменным объекта-родителя
    #32984040
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyи 2. много ли памяти занимает объявление в скрипте
Код: plaintext
 w_one w1
? (т.е. создаётся ли объект w_one?) или это аналог работы с указателем в языке СИ++?

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


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

IMHO, когда есть два класса и оба содержат ссылки друг на друга - это плохой стиль.
...
Рейтинг: 0 / 0
доступ к instance-переменным объекта-родителя
    #32987105
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, речь идёт о программировании общего 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
доступ к instance-переменным объекта-родителя
    #32987113
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код?
...
Рейтинг: 0 / 0
доступ к instance-переменным объекта-родителя
    #32987213
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergeyошибся я. речь идёт не программирвании общего user object, а не datawindow control. конечно, на dw-control тоже можно вызов календаря обрабатывать.. но зачем дублировать код?
То есть вообще всё неправильно :-))
Неужели так трудно посмотреть, как в PFC календарный сервис сделан?
...
Рейтинг: 0 / 0
доступ к instance-переменным объекта-родителя
    #32987542
psh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psh
Гость
Есть окно типа 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
доступ к instance-переменным объекта-родителя
    #32988993
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
доступ к instance-переменным объекта-родителя
    #32989739
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп Неужели так трудно посмотреть, как в PFC календарный сервис сделан?
...
Рейтинг: 0 / 0
доступ к instance-переменным объекта-родителя
    #32989923
psh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
psh
Гость
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
доступ к instance-переменным объекта-родителя
    #32990544
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно. в общем нет в power script'е приведения типов -- от базового класса, к одному из наследников, его роль играет посылка/приём сообщений. ответ прост, нечего усложнять. вообще, многие вещи просты -- в программировании, в математике, в физике -- просты по своим принципам. сложности наступают в реализации

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

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

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

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


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