如何在关闭图像时通知DigitalMicrograph脚本对象

时间:2015-01-03 00:32:56

标签: dm-script

我们可以通过ImageAddEventListener()和ImageDisplayAddEventListener()将DM脚本对象附加到图像事件和imageDisplay事件。是否有支持“图像关闭”事件的事件地图消息?我尝试了“image_about_to_close”和“imagedisplay_about_to_close”,它们似乎无法正常工作。

1 个答案:

答案 0 :(得分:1)

DigitalMicrograph区分图像(数据对象), ImageDisplays (一个呈现数据的对象), ImageDocuments (表示的对象)由保存的文件)和 DocumentWindows (显示 ImageDisplay 的窗口对象)。

您要求的事件属于 DocumentWindows ,而不属于Images或ImageDisplays。因此,您需要使用DocumentWindow对象注册它。这是通过命令WindowAddWindowListener完成的。

顺便说一下,您可以捕获两个类似的事件,一个是window_closed,另一个是window_about_to_close。后来在之前被激活提示用户保存未保存的数据,另一个这样的提示之后但是 - 不一致 - 之前窗口是actuallay从内存中删除。 (当时还有指向它的指针。)

以下脚本附加了这两个事件。我已将其放入后台线程中以便于测试。

// $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 的引用,它就会保留在内存中!请确保不要这样做,否则您可能会在脚本中看到内存泄漏。一般来说,存储'存储'在这种情况下,ImageID作为成员变量而不是图像对象,因为它们不会锁定"图片。