ДВЕРИ DXL: не может работать с глобальной кнопкой // управление переключением активно / неактивно

#function #ibm-doors

#функция #ibm-doors

Вопрос:

Хорошо, итак, я нашел полезный ответ о том, как включить / отключить (активный / неактивный) элемент управления с помощью DXL, но теперь я чувствую, что у меня проблема, которую я не понимаю, каким-то образом связанная с порядком загрузки функций.

Проблема: когда я создаю диалоговое окно, у меня есть две кнопки, одна кнопка неактивна вскоре после создания. Когда я нажимаю кнопку 1, я хочу принудительно активировать кнопку 2, но вместо этого я получаю сообщение об ошибке, в котором говорится, что кнопка 2 не назначена, что странно, потому что она была объявлена глобально и настроена в основной функции. Итак, что я делаю не так??

Вот мой код…

 pragma runLim,10000

DB main_dialog = null
DBE main_button1 = null
DBE main_button2 = null

void toggle_visibility_other_button(DBE dbe)
{
    active(main_button2)
}

void do_something(DBE dbe)
{
    infoBox "UNDER CONSTRUCTION"
}

void main_function()
{   
    main_dialog = create("My GUI", styleCentered)
    main_button1 = button(main_dialog, "Button 1", toggle_visibility_other_button)
    main_button2 = button(main_dialog, "Button 2", do_something)

    inactive(main_button2)

    realize(main_dialog)
    setSize(main_dialog, 300, 150)
}

main_function
  

Комментарии:

1. Привет, @TheKirkwoods, если ты чувствуешь, что Russel ответил на вопрос, ты можешь пометить его как принятый. Это позволяет другим узнать, что устраняет проблему, также полезно знать, не работает ли это, чтобы мы могли попытаться помочь больше

Ответ №1:

Хорошо!

Это довольно простая проблема, но я собираюсь потратить секунду, чтобы объяснить, что происходит.

В DOORS есть 2 способа завершить работу над диалоговым окном и отобразить его пользователю:

 show(DB box)
  

или

 block(DB box)
  

Первая отображает диалоговое окно, но остальная часть интерфейса DOORS все еще «активна». Никакой код после ‘show’ выполняться не будет — все должно быть в обратных вызовах, встроенных в диалоговое окно.

Вторая отображает диалоговое окно, но замораживает остальную часть интерфейса DOORS до тех пор, пока диалоговое окно не будет закрыто или не будет вызвана функция разблокировки. Как только вы закроете диалоговое окно, программа DXL продолжится.

Теперь в вашей программе вы использовали команду ‘реализовать’. Это используется в основном для настройки визуальных элементов диалогового окна, но на самом деле кнопки и вспомогательные функции не настраиваются должным образом. Затем появился ваш setSize и настроил диалоговое окно на отображение, но вам все еще нужно показать — смотрите Следующее.

 //Show example
pragma runLim,10000

DB main_dialog = null
DBE main_button1 = null
DBE main_button2 = null

void toggle_visibility_other_button(DBE dbe)
{
    active(main_button2)
}

void do_something(DBE dbe)
{
    infoBox "UNDER CONSTRUCTION"
}

void main_function()
{   
    main_dialog = create("My GUI", styleCentered)
    main_button1 = button(main_dialog, "Button 1", toggle_visibility_other_button)
    main_button2 = button(main_dialog, "Button 2", do_something)

    inactive(main_button2)

    realize(main_dialog)
    setSize(main_dialog, 300, 150)
    // Added This
    show(main_dialog)
    print "Ran it!"
}

main_function
  

И пример блока:

 //block example
pragma runLim,10000

DB main_dialog = null
DBE main_button1 = null
DBE main_button2 = null

void toggle_visibility_other_button(DBE dbe)
{
    active(main_button2)
}

void do_something(DBE dbe)
{
    infoBox "UNDER CONSTRUCTION"
}

void main_function()
{   
    main_dialog = create("My GUI", styleCentered)
    main_button1 = button(main_dialog, "Button 1", toggle_visibility_other_button)
    main_button2 = button(main_dialog, "Button 2", do_something)

    inactive(main_button2)

    realize(main_dialog)
    setSize(main_dialog, 300, 150)
    // Added This
    block(main_dialog)
    print "Ran it!"
}

main_function
  

Для настройки элементов диалогового окна (до вызова show() или block()) вам потребуется выполнить некоторые функции DOORS, которые потребуют от вас выполнения функции realize() — примером может быть добавление столбцов в DBE listview. Я не уверен, что когда-либо где-либо видел полный список этих ситуаций.

Дайте мне знать, если это поможет!