Вход

Просмотр полной версии : Траблы с диалогами



ВладОвен
09.10.2024, 12:48
Привет.
Перенёс тему сюда. А то в предыдущей ветке она быстро уезжает взад.
Итак:

Подскажите, какая последовательно выполнения действий?
1, потом 2? (показано красным)
Что-то складывается ощущение, что наоборот...
https://owen.ru/forum/attachment.php?attachmentid=79230&d=1728395969&thumb=1 (https://owen.ru/forum/attachment.php?attachmentid=79230&d=1728395969)

Метод, который запускается во вкладке "Выполнить СТ-код", получает нулевые значения.
Стало быть: диалог закрылся, а значения еще не записались?

П.С. Все переменные - глобальные Retain.

ВладОвен
09.10.2024, 12:49
Я перенес все переменные из Retain в обычные переменные, но проблема все таже.

Я попробовал на другом железе и проблема осталась.

Что я делаю не так?

Евгений Кислов
09.10.2024, 13:01
Стало быть: диалог закрылся, а значения еще не записались?

Диалог закрылся, и вместе с ним исчез контекст для выполнения действия.
Поэтому размещать какие-то действия следом за Закрыть диалог - бессмысленно.

ВладОвен
09.10.2024, 13:18
Ок. Понятно.

А как можно реализовать пост-действие после закрытие диалога?

Простой пример:
Ввели два числа в диалоговом окне.
После закрытия диалога нужно посчитать сумму введенных чисел.

Евгений Кислов
09.10.2024, 13:37
А как можно реализовать пост-действие после закрытие диалога?

Простой пример:
Ввели два числа в диалоговом окне.
После закрытия диалога нужно посчитать сумму введенных чисел.


Нужно при закрытии диалога передать эти числа в переменные программы.
Далее в программе детектировать момент закрытия диалога и выполнить нужный код.

В нашей библиотеке OwenVisuDialogs для детектирования используется глобальная переменная OVD.DialogsSettings.g_stClosedDialogInfo

Также есть универсальный механизм CODESYS (IDialogCloseListener), реализованный в рамках ФБ FbOpenDialogExtended из библиотеки Visu Utils.
Подробнее см. здесь в п. 1.4.4:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysVisuIecCode.pdf

ВладОвен
09.10.2024, 16:03
OVD.DialogsSettings.g_stClosedDialogInfo
Эта глобальная структура видит закрытие стандартного диалога ОВЕН.
А она видит закрытие частного (кастомного) диалога? (Вроде нет)

Это важно, потому-что я сначала вызываю частный (кастомный) диалог, а уже в нем - вызываю стандартный диалог ОВЕН.

Евгений Кислов
09.10.2024, 16:20
А она видит закрытие частного (кастомного) диалога?

Эта структура используется только диалогами ОВЕН, входящими в состав библиотеки OwenVisuDialogs.

ВладОвен
09.10.2024, 16:47
Ну вот.

Итак:
1. Оператор попал на кастомный диалог. Увидел все поля с данными.
2. Он решил править данные.
3. Нажал на желаемое поле. Перешел на ОВЕН-диалог.
4. Исправил данные. Закрыл ОВЕН-диалог. Я это увидел через вашу гл.структуру. Я сделал спец.действие.
5. Но потом оператор передумал и не стал сохраняться в кастомном диалоге. Он нажал "отмена". Я это не увижу и спец.дейсвие не могу отменить!

Ок.
Сейчас попробую через "универсальный механизм CODESYS".

Цель: спец.действие по закрытию кастомного (!) диалога.

ВладОвен
09.10.2024, 17:26
Эх...


Если у вас возникнут ошибки компиляции – то допишите к типам переменных itfDialog и pClientData пространство имен VisuElems.VisuElemsBase (так называется библиотека, в состав которой входят эти типы).

79275

Что я делаю не так?

Евгений Кислов
09.10.2024, 19:55
Эх...


79275

Что я делаю не так?

VisuElems.VisuElemsBase

Выделенная буква не нужна. Опечатку в документе завтра поправлю.

ВладОвен
11.10.2024, 14:00
У меня вроде получилось это запустить.

Но! Метод, который вызывается при закрытии диалога (callback) запускается только если открываешь диалог через вызов функционального блока, а не через обычную кнопку на дисплее.

Евгений Кислов
11.10.2024, 14:01
У меня вроде получилось это запустить.

Но! Метод, который вызывается при закрытии диалога (callback) запускается только если открываешь диалог через вызов функционального блока, а не через обычную кнопку на дисплее.

Это ожидаемое поведение. Можно по нажатию на кнопку вызвать экземпляр данного ФБ с фильтром CurrentClient.

ВладОвен
11.10.2024, 14:21
Евгений, это НЕ ожидаемое поведение!

Для вас оно ожидаемо!
А для людей, у которых постоянно разряжается Айкос, которые записывают кружки в Телеге, делают фото с фильтрами - это ПИПЕЦ!

И это всего лишь пост.действие при закрытии кастомного диалога!

П.С.: Кстати, нужно еще сбросить флаг - fbOpenFeedbackDialog.xExecute. Кнопка его только взводит.

ПП.С.: Ах, да... Мы сделаем это в самом методе закрытия диалога - DialogClosedWithTag!

Огонь!

ВладОвен
11.10.2024, 15:54
А вот еще вопрос "на засыпку":

Вызывая кастомный диалог через ФБ fbOpenFeedbackDialog, я хотел бы чтобы поля диалога заполнились некими динамическими данными. Например, в диалоге я правлю строку из таблицы и хочу, что-бы данные из этой строки уже были вставлены в поля диалога.

Т.е. мы говорим о пред.действии. При том, что данные в полях всегда разные: мы можем править любую строку в таблице.

Как это реализовать?
Наверное, через ф.блок VisuCallbackOpenDialog и его методы ActionDone и DialogOpened ? Мы ведь не просто так его создавали в проекте ?

Евгений Кислов
11.10.2024, 18:15
Как это реализовать?
Наверное, через ф.блок VisuCallbackOpenDialog и его методы ActionDone и DialogOpened ? Мы ведь не просто так его создавали в проекте ?

Можно так. Можно через вход pbyDialogInterfaceData самого ФБ. Как удобнее.

ВладОвен
12.10.2024, 13:45
Можно так.

Увы, нет. Через ФБ VisuCallbackOpenDialog и его методы ActionDone и DialogOpened не получается.

Я вставил в эти два метода "свой спец.метод", который делает это пред.действие.
Но походу эти два метода отрабатываются сразу же после (!) открытия диалога, а не до (!) его открытия.

Как это проверить?
1. Заполнить любые две строки в таблице (достаточно заполнить только первую колонку). Сохраняться, нажимая "ОК".
2. Попробовать повторно редактировать эти строки. Не сохраняться, нажимая "Отмена".
3. Будет видно, что данные предварительно вставляются в поля неправильно.

Кнопка "R" вверху справа перезапускает ПЛК в исходное состояние (не сразу, а через 10 секунд).

https://codesys.chu.by




Можно через вход pbyDialogInterfaceData самого ФБ. Как удобнее.

Исследую этот способ.