Как разрешить объекту скрипта DigitalMicrograph получать уведомления при закрытии изображения

Мы можем присоединять объекты скрипта DM к событиям изображений и событиям imageDisplay через ImageAddEventListener() и ImageDisplayAddEventListener(). Есть ли сообщение карты событий для поддержки события «закрыть изображение»? Я пробовал как «image_about_to_close», так и «imagedisplay_about_to_close», и они, похоже, не работают.


person KEVIVI    schedule 03.01.2015    source источник


Ответы (1)


DigitalMicrograph различает Images (объект данных), ImageDisplays (объект, отображающий данные), ImageDocuments (объект, который представлен сохраненным файл) и DocumentWindows (объект окна, в котором отображается ImageDisplay).

Событие, которое вы запрашиваете, принадлежит DocumentWindows, а не изображениям или изображениям. Соответственно, вам нужно зарегистрировать его с помощью объекта DocumentWindow. Делается это командой WindowAddWindowListener.

Кстати, есть два похожих события, которые вы можете зафиксировать, одно — window_closed, а другое — window_about_to_close. Последний запускается до, когда пользователю будет предложено сохранить несохраненные данные, другой после такого запроса, но - непоследовательно - до окна фактически удалено из памяти. (В то время на него все еще есть указатель.)

Следующий сценарий связывает два события. Я поместил его в фоновую ветку для облегчения тестирования.

// $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 не обязательно означает, что вы также выпустили изображение. Пока какой-либо скрипт или другой код содержит ссылку на изображение, оно останется в памяти! Не делайте этого, иначе вы можете увидеть утечки памяти в своих скриптах. Обычно в таком случае лучше «сохранять» идентификаторы изображений в качестве переменных-членов, чем объекты изображений, поскольку они не «блокируют» изображение.

person BmyGuest    schedule 03.01.2015
comment
Спасибо. В прошлом мы могли добавить прослушиватель ключей в ImageDisplay с помощью ImageDisplayAddKeyListener(), поэтому я предполагаю, что ImageDisplay в объекте для отображения. Дополнительный вопрос: как нам перехватить событие изменения среза (т.е. отображаемых слоев) для 3D-изображения? Карта сообщений slice_changed:‹Handle› функции ImageAddEventListener() раньше работала в GMS 1.8, но больше не работает в GMS 2.3. - person KEVIVI; 04.01.2015
comment
Да, было изменение. Событие теперь отображается на дисплее изображения, а сообщение о событии — «slice_property_changed». В [книге](dmscript.tavernmaker.de/) есть пример этого в учебнике Как отобразить ROI для конкретных слоев в 3D-изображении. Если вам нужна дополнительная помощь. пожалуйста, опубликуйте как отдельный вопрос. - person BmyGuest; 04.01.2015