Мы можем присоединять объекты скрипта DM к событиям изображений и событиям imageDisplay через ImageAddEventListener() и ImageDisplayAddEventListener(). Есть ли сообщение карты событий для поддержки события «закрыть изображение»? Я пробовал как «image_about_to_close», так и «imagedisplay_about_to_close», и они, похоже, не работают.
Как разрешить объекту скрипта DigitalMicrograph получать уведомления при закрытии изображения
Ответы (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 не обязательно означает, что вы также выпустили изображение. Пока какой-либо скрипт или другой код содержит ссылку на изображение, оно останется в памяти! Не делайте этого, иначе вы можете увидеть утечки памяти в своих скриптах. Обычно в таком случае лучше «сохранять» идентификаторы изображений в качестве переменных-членов, чем объекты изображений, поскольку они не «блокируют» изображение.