Drop down menu Digitalmicrograph DM脚本-更新其他对话框中的下拉项

Drop down menu Digitalmicrograph DM脚本-更新其他对话框中的下拉项,drop-down-menu,dialog,refresh,items,dm-script,Drop Down Menu,Dialog,Refresh,Items,Dm Script,我正在编写一个DM脚本,它创建了一种包含一些对话框的技术。 在这个脚本中,我试图从另一个对话框中更新一个对话框中的下拉菜单项 我现在在对话框中有一个按钮,下拉菜单名为“update”,它调用对话框类中的一个函数,这个函数名为“updateDialog”。 此函数用于删除所有下拉菜单项,然后插入标记列表中存储的所有项。 它还会更改该对话框中几个按钮的状态 此更新按钮工作正常 现在,如果我在另一个对话框中调用这个updateDialog函数,按钮状态会发生变化,但下拉菜单不会更新 有人知道为什么会发

我正在编写一个DM脚本,它创建了一种包含一些对话框的技术。 在这个脚本中,我试图从另一个对话框中更新一个对话框中的下拉菜单项

我现在在对话框中有一个按钮,下拉菜单名为“update”,它调用对话框类中的一个函数,这个函数名为“updateDialog”。 此函数用于删除所有下拉菜单项,然后插入标记列表中存储的所有项。 它还会更改该对话框中几个按钮的状态

此更新按钮工作正常

现在,如果我在另一个对话框中调用这个updateDialog函数,按钮状态会发生变化,但下拉菜单不会更新

有人知道为什么会发生这种情况和/或是否有办法做到这一点吗

谢谢

示例代码:

taggroup menuitems = newtaglist()
object firstdialog, seconddialog

interface I_seconddialog{
    void updatedropdowndialog(object self);
}

class firstdialog : uiframe{
    void additemresponse (object self){
        number items = menuitems.taggroupcounttags()+1
        menuitems.taggroupinserttagasstring(infinity(), "Created item #"+items)
        menuitems.taggroupopenbrowserwindow(0)
        seconddialog.updatedropdowndialog()
    }

    taggroup createdialog (object self){
        taggroup dialog, dialogitems, additembutton
        dialog = DLGCreateDialog("first_dialog", dialogItems)
        additembutton = DLGCreatePushButton("Add pulldown item", "additemresponse")
        
        dialogitems.dlgaddelement(additembutton)
        return dialog
    }   

    object init (object self){
        return self.super.init( self.createdialog() )
    }
}

class seconddialog : uiframe{
    number isbuttonenabled
    void updatedropdowndialog (object self){
        // Change the state of the state button to show that that does work
        isbuttonenabled = abs(isbuttonenabled-1)
        self.Setelementisenabled("statebutton",isbuttonenabled);
    
        // Empty the dropdown as the menuitems list might be completely different
        taggroup dropdown = self.lookupelement("dropdown")
        taggroup dropdown_items
        dropdown.taggroupgettagastaggroup("Items",dropdown_items)
        dropdown_items.taggroupdeletealltags()  

        // Add the current tags in menuitems to the dropdown
        for(number i=0;i<menuitems.taggroupcounttags();i++){
            string item_name
            menuitems.taggroupgetindexedtagasstring(i,item_name)
            dropdown.dlgaddchoiceitementry(item_name)   
        }
    }

    taggroup createdialog (object self){
        taggroup dialog, dialogitems, dropdown, updatebutton, statebutton
        dialog = DLGCreateDialog("second_dialog", dialogItems)
        taggroup initial_items
        dropdown = DLGCreateChoice(initial_items,0,"dropdownchange").dlgidentifier("dropdown")
        dropdown.dlgaddchoiceitementry("Initial item")
        updatebutton = DLGCreatePushButton("Update dropdown", "updatedropdowndialog")
        statebutton = DLGCreatePushButton("state changes", "stateresponse").dlgidentifier("statebutton")
        
        dialogitems.dlgaddelement(dropdown)
        dialogitems.dlgaddelement(updatebutton)
        dialogitems.dlgaddelement(statebutton)
        return dialog
    }   

    object init (object self){
        isbuttonenabled = 1
        return self.super.init( self.createdialog() )
    }
}

void main(){
    String techniqueName = "Example"
    Image techniqueIcon := RGBImage( "Test icon", 4, 75, 75 )
    techniqueIcon = RGB( icol, irow, iradius )
    object technique = CreateTechnique( techniqueName, techniqueIcon )
    firstdialog = Alloc( firstdialog ).Init()

    String taskName = "First dialog"
    Number taskID = RegisterWorkflowTask( firstdialog, taskName )
    Number bOpenByDefault = 1
    Number bEssential = 0                
    AddWorkflowTask( technique, taskID, bEssential, bOpenByDefault )
    seconddialog = Alloc( seconddialog ).Init()
    
    taskName = "Second dialog"
    taskID = RegisterWorkflowTask( seconddialog, taskName )
    bOpenByDefault = 1
    bEssential = 0                
    AddWorkflowTask( technique, taskID, bEssential, bOpenByDefault )

    AddCustomTechnique( technique )
}

main()
taggroup menuitems=newtaglist()
对象第一个对话框,第二个对话框
接口I_第二个对话框{
void updatedropdowndialog(对象自身);
}
类firstdialog:uiframe{
void additemresponse(对象自身){
number items=menuitems.taggroupcounttags()+1
menuitems.tagGroupInsertTagaString(无穷大(),“已创建项#”+项)
menuitems.taggroupopenbrowserwindow(0)
seconddialog.updatedropdowndialog()
}
标记组创建对话框(对象自身){
标记组对话框、dialogitems、additembutton
dialog=DLGCreateDialog(“第一个对话”,dialogItems)
additembutton=DLGCreateButton(“添加下拉项”、“additemresponse”)
dialogitems.dlgaddelement(additembutton)
返回对话框
}   
对象初始化(对象自身){
返回self.super.init(self.createdialog())
}
}
类第二个对话框:uiframe{
数字按钮已启用
void updatedropdowndialog(对象自身){
//更改“状态”按钮的状态以显示该按钮是否有效
isbuttonenabled=abs(isbuttonenabled-1)
self.Setelementisenabled(“statebutton”,isbuttonenabled);
//清空下拉列表,因为菜单项列表可能完全不同
标记组下拉列表=self.lookupelement(“下拉列表”)
标记组下拉列表\u项
TagGroupGetTagStagGroup(“项目”,下拉菜单项)
下拉菜单\u items.taggroupdeletealltags()
//将菜单项中的当前标记添加到下拉列表中
对于(数字i=0;i不是答案(尚未),而是更长的澄清注释

我正在GMS 3.4.2上测试您的脚本代码,这是我看到的行为,在GMS启动后立即运行脚本(一次):

  • 添加了自定义技术:

  • 它最初显示两个对话框:

  • 按第二个对话框上的“更新下拉列表”切换“状态” 更改“按钮启用/禁用:

  • 按第一个对话框上的“添加下拉项”按钮 时间添加到下拉列表中,并在中切换“状态更改”按钮 第二个对话框(并显示条目标记列表):


  • 这不正是你想要的行为吗?

    请在你的问题中提供一个精简的代码,显示你所描述的内容,并可以作为回答文章的基础。理想情况下,这是一个独立的代码部分,你可以直接添加到你的问题文章中(使用编辑).Hi Bmyguest,我很快编写了一些代码来说明这个问题。如果单击“添加”下拉列表项,它将触发updatedropdowndialog函数。它应该更新下拉列表并切换按钮的状态,但它只切换状态。如果在第二个对话框中单击“更新”下拉列表按钮,它将触发相同的函数,但我t正常工作。我可以确认这个问题。在文档中,它是针对
    DLGInvalid
    方法的:“为修改的元素设置'Invalid'属性。用于对话框显示的运行时更新”。我与
    UIFrame::validateView()一起尝试了它
    但它不起作用。请注意,所有的
    UIFrame
    方法在直接处理对话框对象时都起作用。我记得我也遇到过这个问题,但我找不到解决问题的地方和方法。哦,这可能只是一个bug,目前已经修复。我已经在GMS 3.4.0上测试了你的脚本,一个d下拉列表没有更新。@Merijn如果这不是在线系统(安装有硬件),我绝对建议更新到3.4版本-它有很多新功能。3.4.2是当前可用的最新版本,但您也可以选择限量版3.4.1“Covid”如果您对访问量化等非免费功能感兴趣。