DM 中的任何对话框 window 都不会阻止整个程序?

Any dialog window in DM that will not block the whole program?

我想知道有没有一种不会阻塞整个程序的弹窗。在下面的简化示例中,计算测试图像的标准差,然后在确定对话框中弹出 window.

image Img := RealImage("",4,1024,1)
Img = Random()
Img.ShowImage()

number SDev = sqrt(Img.Variance())
OKDialog("Standard deviation =" + SDev)

number Factor
if(!GetNumber("Input the factor that I want:", 5, Factor))
exit(0)

是否可以将此 window 移到一边(因为需要其中的信息)以便我仍然可以放大或缩小我的图像以进行进一步评估?

OkDialog()、ShowAlert()、OkCancelDialog() 都不符合我的要求。同样,我知道在结果 window 中打印此值可能是一种替代方法,但我只想在更可见的对话框中显示此信息 window.

提前致谢。

您是否尝试过使用 FloatingModelessDialog( String prompt, String buttonName, Number semaphore ) 或 ModelessDialog( String prompt, String buttonName, Number semaphore )?

http://digitalmicrograph-scripting.tavernmaker.de/other%20resources/Old-DMHelp/AllFunctions.html

也许 DLG 函数也能解决问题?

http://digitalmicrograph-scripting.tavernmaker.de/other%20resources/Old-DMHelp/CoreDialogLibrary.htm

任何派生自 UIFrame 并使用 Display() 方法而不是 Pose() 方法显示的对话框都将执行此操作。

然而,当显示这样一个无模式对话框时,您的其他代码将继续 运行。该对话框位于单独的线程上。

这与模态对话框相反,模态对话框会在代码执行恢复之前等待它关闭。

因此,如果您想要一个显示对话框的脚本,允许“执行操作”但在对话框关闭时继续,那么做起来就有点复杂了。 只有当脚本在后台线程上时才能执行此操作。

示例:

简单、阻塞、模态对话框:

    clearResults()
    Result("I do stuff \n")
    OKDialog("Wait for me!")
    Result("I continue to do stuff \n")

简单的无模式对话框。仅适用于后台线程上的脚本:

    // $BACKGROUND$
    
    number ModelessTwoButtonDialog(string prompt, string but1, string but2)
    {
          number sem = NewSemaphore()
          ModelessDialog(prompt,but1,but2,sem)
          Try{GrabSemaphore(sem);}
          Catch{return 0;}
          return 1
    }
    
    clearResults()
    Result("I do stuff \n")
    number res = ModelessTwoButtonDialog("Wait for me!","OK","CANCEL")
    Result("I continue to do stuff. You pressed:" + res)

不会阻止脚本执行的简单、无模式对话框。 (但对话框按钮可能会做一些事情)。

    class myDlg:UIframe{
          void OnButtonDoStuff(object self) { result("\n Action!"); }
          myDlg(object self)
          {
               taggroup dlg = DLGCreateDialog("My Dialog")
                dlg.DLGAddElement(DLGCreateLabel("just text in this dialog"))
               dlg.DLGAddElement(DLGCreatePushButton("DO stuff", "OnButtonDoStuff"))
               self.Init( dlg )
          }
    }
    
    clearResults()
    Result("I do stuff \n")
    Alloc(myDlg).display("Title")
    Result("I continue to do stuff.")

将阻止脚本执行的简单模式对话框。 (但对话框按钮可能会做一些事情)。

    class myDlg:UIframe{
          void OnButtonDoStuff(object self) { result("\n Action!"); }
          myDlg(object self)
          {
               taggroup dlg = DLGCreateDialog("My Dialog")
                dlg.DLGAddElement(DLGCreateLabel("just text in this dialog"))
               dlg.DLGAddElement(DLGCreatePushButton("DO stuff", "OnButtonDoStuff"))
               self.Init( dlg )
          }
    }
    
    clearResults()
    Result("I do stuff \n")
    Alloc(myDlg).pose()
    Result("I continue to do stuff.")

简单、无模式的对话框将阻止您的脚本执行,直到关闭。 (但是对话框按钮可能会做一些事情)。 (只要 window 打开,main-thread 上的脚本就会不断告诉 DM 做其他事情。有点难看。)

class myDlg:UIframe{
      void OnButtonDoStuff(object self) { result("\n Action!"); }
      myDlg(object self)
      {
           taggroup dlg = DLGCreateDialog("")
            dlg.DLGAddElement(DLGCreateLabel("just text in this dialog"))
           dlg.DLGAddElement(DLGCreatePushButton("DO stuff", "OnButtonDoStuff"))
           self.Init( dlg )
      }
      ~myDlg(object self){Result("\n Dialog actually removed from memory.");}
}

clearResults()
Result("I do stuff \n")
documentwindow win = Alloc(myDlg).display("Title")
while (win.WindowIsOpen()) doEvents()
Result("I continue to do stuff.")
win = NULL