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