Модель диалога скриптов в DM-скриптинге очень ограничена, и не поддерживает добавление или удаление элементов во время отображения (по состоянию на GMS 3.4).
Возможно, можно обойти эту проблему с большими усилиями, но в целом тратить слишком много времени на то, чтобы сделать диалоги сценариев "красивыми", чаще всего не стоит.
лучшее, что вы можете сделать быстро, это использовать атрибут показанный существующих элементов для отображения или скрытия их.
См. пример:
class CElementHideTest : UIframe
{
TagGroup BuildDialog(object self)
{
TagGroup dlg,dlgItems
dlg = DLGCreateDialog("test",dlgitems)
TagGroup group = DLGCreateGroup().DLGIdentifier("group")
dlgitems.DLGAddElement(group)
TagGroup label = DLGCreateLabel("Toggle tests")
group.DLGAddElement(label)
TagGroup toggleEnabledButton = DLGCreatePushButton("Toggle Enabled", "toggleEnabled")
group.DLGAddElement(toggleEnabledButton)
TagGroup toggleShownButton = DLGCreatePushButton("Toggle Shown", "toggleShown")
group.DLGAddElement(toggleShownButton)
TagGroup field1 = DLGCreateIntegerField(5,5).DLGIdentifier("field")
dlgitems.DLGAddElement(field1)
return dlg
}
void toggleEnabled(object self)
{
number is = self.GetElementIsEnabled("field")
self.SetElementIsEnabled("field",!is)
}
void toggleShown(object self)
{
number is = self.GetElementIsShown("field")
self.SetElementIsShown("field",!is)
}
object Init(object self)
{
return self.Init(self.BuildDialog())
}
}
Alloc(CElementHideTest).init().Pose()
Хотя можно изменить размер диалогового окна при отображении, это не очень полезно для модального диалога, потому что позиция OK | Кнопки отмены фиксируются при запуске. Следовательно, вы можете только создать «уродливый» диалог с большим количеством пустого пространства, где будут появляться элементы.
Однако, если ваш скрипт выполняется в фоновом потоке, вы можете создать свой собственный модальный диалог, как в пример ниже. Это позволит вам использовать окно изменения размера и сжатия / расширения диалогового окна при отображении элементов.
Обратите внимание, что это не может работать на сценарии в основном потоке, как код отображения диалогового окна также работает в основном потоке. Следовательно, ожидание диалогового окна не позволит правильно отображать диалоговое окно.
Class CScriptModalDialog : UIFrame
{
object contSignal
TagGroup BuildDialog(object self)
{
TagGroup dlg,dlgItems
dlg = DLGCreateDialog("test",dlgitems)
TagGroup group = DLGCreateGroup().DLGIdentifier("group")
dlgitems.DLGAddElement(group)
TagGroup label = DLGCreateLabel("Display as modal dialog")
group.DLGAddElement(label)
TagGroup toggleEnabledButton = DLGCreatePushButton("Continue", "ContinuePressed")
group.DLGAddElement(toggleEnabledButton)
contSignal = NewSignal(0)
return dlg
}
void ContinuePressed(object self)
{
contSignal.SetSignal()
}
number PoseScriptDlg(object self, number timeOutSec )
{
self.Init(self.BuildDialog())
self.Display("Script dialog")
object cancelSignal = NewCancelSignal()
number success = contSignal.WaitOnSignal(timeOutSec,cancelSignal) // Could also use Infinity() as timeout
self.Close()
return success
}
number WaitOnOK(object self)
{
object cancelSignal = NewCancelSignal()
return contSignal.WaitOnSignal(1,cancelSignal)
}
}
class CMain
{
object continueDlg
CMain(object self) { continueDlg=Alloc(CScriptModalDialog); }
void RunMethod(object self)
{
ClearResults()
Result("Waiting on user for 3 sec...\n")
if ( continueDlg.PoseScriptDlg(3) )
Result("Continue\n")
else
Result("TimeOut\n")
}
}
Alloc(CMain).StartThread("RunMethod")