Добавить событие в динамически объявленный элемент управления - PullRequest
3 голосов
/ 24 сентября 2010

Это вопрос PowerBuilder. Я использую PowerBuilder 12 Classic.

У меня есть окно, в котором большинство элементов управления динамически объявляются в коде с использованием OpenUserObject. При щелчке по одному из этих элементов управления в окне контейнера должна открыться панель. Однако я не уверен, как вызвать событие из динамически объявленного элемента управления. Тип элемента управления является пользовательским (пользовательский код в стандартном визуальном объекте, singleLineEdit), и у меня есть собственный код, объявленный в событии getfocus элемента управления. Но как мне ссылаться на окно контейнера?

Я знаю, что могу ссылаться на окно контейнера по имени, но это очень самоограниченно. Есть ли другой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2010

Если вам не нужно передавать аргументы, вы можете использовать parent.triggerEvent("event_name") для запуска событий в окне.Если события или функции определены в предке окна (например, как PFC), вы можете привести parent к типу предка и вызвать напрямую.Пример использования PFC:

w_master w_container

w_container = parent
w_container.of_SetUpdateObjects({this})
1 голос
/ 01 октября 2010

Другой метод, который мне нравится использовать, - это добавить метод к вашему пользовательскому объекту для установки ссылки на родительское окно и затем сохранить эту ссылку в переменной экземпляра пользовательского объекта. Вы все еще можете использовать ключевое слово dynamic и сделать ваши аргументы и переменную экземпляра родовыми для типа 'window'

Этот метод полезен, если у вас есть сложные пользовательские визуальные элементы управления с более чем одним уровнем визуальных элементов управления (например, tab -> datawindow), и родительский элемент не обязательно должен быть родительским окном, и вам нужно всплыть события назад , Это не обязательно лучше, чем в предыдущем примере, но что-то полезное, чтобы добавить в свой арсенал методов программирования.

Сразу же после того, как вы СОЗДАЕТЕ свой пользовательский объект, выполните вызов функции, например:

Окно LW

LW = это iuo_customcontrol.uf_setparent (ЛМ)

В пользовательском элементе управления добавьте переменную экземпляра и функцию / событие: защищенный: window iw_parentwindow

Новая функция: uf_setparent (окно as_window): iw_parentwindow = as_window

Затем в любом элементе управления вашего пользовательского объекта используйте переменную экземпляра для динамического вызова функции в родительском окне

iw_parentwindow.EVENT dynamic ue_retrieve () или же iw_parentwindow.dynamic wf_retrieve ()

1 голос
/ 27 сентября 2010

Используйте parent.dynamic из события GetFocus пользовательского объекта. Ключевое слово parent ссылается на контейнер элемента управления, а использование динамического ключевого слова позволит вам вызывать любую пользовательскую функцию или событие в контейнере. Например:

parent.dynamic uf_OpenPanel(ls_SomeArg)
...