如何在图像关闭时通知 DigitalMicrograph 脚本对象
How to let a DigitalMicrograph script object be notified when an image is closed
我们可以通过 ImageAddEventListener() 和 ImageDisplayAddEventListener() 将 DM 脚本对象附加到图像事件和 imageDisplay 事件。是否有支持 "image close" 事件的事件映射消息?我尝试了 "image_about_to_close" 和 "imagedisplay_about_to_close",但它们似乎不起作用。
DigitalMicrograph 区分 Images(数据对象)、ImageDisplays(渲染数据的对象)、ImageDocuments (由保存的文件表示的对象),以及 DocumentWindows(window 对象,其中 ImageDisplay 所示)。
您请求的事件属于 DocumentWindows,而不属于 Images 或 ImageDisplays。因此,您需要使用 DocumentWindow 对象注册它。这是通过命令 WindowAddWindowListener
完成的。
顺便说一句,您可以捕获两个类似的事件,一个是window_closed
,另一个是window_about_to_close
。后者被触发 before 提示用户保存未保存的数据,另一个 after 这样的提示但是 - 不一致 - 在 之前 window 实际上已从内存中删除。 (当时还有指向它的指针。)
以下脚本附加了两个事件。我已将其放入后台线程以便于测试。
// $BACKGROUND$
Class MyWindowListenerClass
{
MyWindowListenerClass( object self ) Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" created.")
~MyWindowListenerClass( object self ) Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" destroyed.")
Void HandleAboutToClosedAction( object self, number e_fl, DocumentWindow Win )
{
Result(GetTime(1)+": Window about-to-closed message : 0x" + Hex(e_fl,8) + "\n" )
}
Void HandleClosedAction(object self, number e_fl, DocumentWindow Win)
{
Result(GetTime(1)+": Window closed message : 0x" + Hex(e_fl,8) + "\n" )
}
}
Void main()
{
Object objListener
Image img
DocumentWindow win
String messagemap
Number ListenerID
img:=RealImage("Test",4,100,100)
img.ShowImage()
win = img.imageGetOrCreateImageDocument().ImageDocumentGetWindow()
messagemap += "window_closed:HandleClosedAction;"
messagemap += "window_about_to_close:HandleAboutToClosedAction;"
objListener = Alloc(MyWindowListenerClass)
ListenerID = win.WindowAddWindowListener( objListener, messagemap)
While(!ShiftDown()) 1==2
win.WindowRemoveWindowListener(ListenerID)
}
main()
最后一点:关闭 DocumentWindow 并不一定意味着您也释放了 image。只要某些脚本或其他代码保留对 Image 的引用,它就会保留在内存中!请务必不要这样做,否则您可能会在脚本中看到内存泄漏。在这种情况下,将 'store' ImageID 作为成员变量通常比图像对象更节省,因为它们不是 "lock" 图像。
我们可以通过 ImageAddEventListener() 和 ImageDisplayAddEventListener() 将 DM 脚本对象附加到图像事件和 imageDisplay 事件。是否有支持 "image close" 事件的事件映射消息?我尝试了 "image_about_to_close" 和 "imagedisplay_about_to_close",但它们似乎不起作用。
DigitalMicrograph 区分 Images(数据对象)、ImageDisplays(渲染数据的对象)、ImageDocuments (由保存的文件表示的对象),以及 DocumentWindows(window 对象,其中 ImageDisplay 所示)。
您请求的事件属于 DocumentWindows,而不属于 Images 或 ImageDisplays。因此,您需要使用 DocumentWindow 对象注册它。这是通过命令 WindowAddWindowListener
完成的。
顺便说一句,您可以捕获两个类似的事件,一个是window_closed
,另一个是window_about_to_close
。后者被触发 before 提示用户保存未保存的数据,另一个 after 这样的提示但是 - 不一致 - 在 之前 window 实际上已从内存中删除。 (当时还有指向它的指针。)
以下脚本附加了两个事件。我已将其放入后台线程以便于测试。
// $BACKGROUND$
Class MyWindowListenerClass
{
MyWindowListenerClass( object self ) Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" created.")
~MyWindowListenerClass( object self ) Result("\n object 0x"+self.ScriptObjectGetID().Hex()+" destroyed.")
Void HandleAboutToClosedAction( object self, number e_fl, DocumentWindow Win )
{
Result(GetTime(1)+": Window about-to-closed message : 0x" + Hex(e_fl,8) + "\n" )
}
Void HandleClosedAction(object self, number e_fl, DocumentWindow Win)
{
Result(GetTime(1)+": Window closed message : 0x" + Hex(e_fl,8) + "\n" )
}
}
Void main()
{
Object objListener
Image img
DocumentWindow win
String messagemap
Number ListenerID
img:=RealImage("Test",4,100,100)
img.ShowImage()
win = img.imageGetOrCreateImageDocument().ImageDocumentGetWindow()
messagemap += "window_closed:HandleClosedAction;"
messagemap += "window_about_to_close:HandleAboutToClosedAction;"
objListener = Alloc(MyWindowListenerClass)
ListenerID = win.WindowAddWindowListener( objListener, messagemap)
While(!ShiftDown()) 1==2
win.WindowRemoveWindowListener(ListenerID)
}
main()
最后一点:关闭 DocumentWindow 并不一定意味着您也释放了 image。只要某些脚本或其他代码保留对 Image 的引用,它就会保留在内存中!请务必不要这样做,否则您可能会在脚本中看到内存泄漏。在这种情况下,将 'store' ImageID 作为成员变量通常比图像对象更节省,因为它们不是 "lock" 图像。