Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Zinс 3: обработчик событий мыши в дочерней форме срабатывает в главной (http://www.flasher.ru/forum/showthread.php?t=122377)

starserfer 10.03.2009 01:05

Zinс 3: обработчик событий мыши в дочерней форме срабатывает в главной
 
Имеем две формы: главную и дочернюю. При открытии приложения видна главная форма, а дочерняя скрыта. Она становится видимой по нажатию на специальную кнопку. Главная, соответственно, скрывается. В дочерней форме назначен такой обработчик событий мыши:
Код AS1/AS2:

var if_cursor:Boolean = true;
carrier.useHandCursor = false;//carrier - просто клип
var mouse_move:Number = Null;
 
var obj:Object = {};
Mouse.addListener(obj);
 
mouse_move = getTimer();
carrier.onEnterFrame = carrierOnEnterFrame;
 
obj.onMouseDown = function():Void
{
        Mouse.show();
        mouse_move = getTimer();
        carrier.onEnterFrame = carrierOnEnterFrame;
};
 
function carrierOnEnterFrame():Void
{
 
 
        if (getTimer() >= mouse_move + 20000)
        {
                delete carrier.onEnterFrame;
                Mouse.hide();
                if_cursor = false;
        }
}
 
obj.onMouseMove = function():Void
{
        if (!if_cursor)
        {
                Mouse.show();
                if_cursor = true;
        }
        else if (if_cursor)
        {
                mouse_move = getTimer();
                carrier.onEnterFrame = carrierOnEnterFrame;
 
        }
};

То есть предусматривается, что, когда открывается дочерняя форма, курсор должен исчезнуть через 20 сек. Так же он исчезает, если в течение 20 сек. мышь остается неподвижной. Проблемы или странности здесь две. Одна - это та, что абсолютно игнорируется команда mdm.Forms.SomeForm.setFocus(), то есть, невозможно установить фокус на любую из форм. Я уже поднимал когда-то эту тему, но ответа так и не нашел. Эта странность, в общем-то, не имеет к событиям мыши отношения, но, возможно именно из нее вытекает вторая странность. Она проявляется в том, что каждый раз, когда становится видимой главная форма, начинает срабатывать обработчик мыши для скрытой дочерней формы. Но происходит это только один раз. То есть, через 20 сек. курсор исчезает. Щелкаем или двигаем мышь - курсор появляется. И все. Мышь больше не исчезает. Делаем видимой-прячем дочернюю форму и в главной все повторяется снова. Для дочерней формы обработчик событий мыши может, в свою очередь, срабатывать неправильно, в зависимости от того, срабатывал он уже в главной форме или нет. Было предположение, что, возможно, все это происходит потому, что дочерняя форма, хоть и скрыта, но фактически находится под главной, и мышь реагирует на нее. Но задание координаты mdm.Forms.SubForm1.x=-50000 ни к чему не привело. Как же добиться того, чтобы в главной форме мышь не вела себя по сценарию дочерней?

alexcon314 10.03.2009 17:39

Занятный глюк. Жаль нет времени заниматься его воспроизведением у себя.
А как вы показываете дочернюю форму? Она у вас модальная или нет?
И еще такой момент: вы ведь зашили в дочернюю форму отдельный свф, так? Так вот, лучше будет, если все действия в клипе-дочерней-форме вы будете вызывать принудительно с помощью метода
Код:

mdm.Forms.formName.callFunction(functionName:String, parametersString:String, delimiter:String)
а не пускать все на "самотек" в этом дочернем свф-е. Дело в том, что клип начинает пригрываться сразу после загрузки формы, а может и еще как - не выяснял, но тут глючное место, точно.
Я делал так: "показывал" дочернюю форму сразу при старте приложения где-то в сторонке, типа x=-50000. При этом в нее загружался ее свф, но НЕ ПРОИГРЫВАЛСЯ, там не было ничего, кроме набора функций, вызовов их не производилось. Перед показом дочерней формы из главной делал callFunction в дочерней, указывая что надо приграть конкретно, т.е. какую функцию отработать. И показвал ее модально. При этом в главной форме все замирает. На финише отработки скриптов в дочерней форме, перед ее закрытием делал
Код:

mdm.Forms.MainForm.callFunction()
вызывая таким образом каллбэк в главной форме, передавая результаты отработки скриптов в дочерней форме. И так каждый раз, когда надо было показать дочернюю форму.
Насчет сокрытия курсора - можно, как вариант, использовать
Код:

mdm.Input.Mouse.hide(formName)

starserfer 10.03.2009 19:42

Дочерняя форма не модальная. И, честно говоря, как-то не совсем я разобрался с модальными формами в цинке. Но, тем не менее, некоторые ваши, alexcon314, рекомендации, оказались плодотворными. Сделал я следующее: весь свой вышеприведенный мышиный обработчик поместил в тело новой функции mouseEventInit(), которая вызывается теперь
Код AS1/AS2:

mdm.Forms.SubForm1.callFunction("mouseEventInit","","")

в главной форме каждый раз, когда нажимается кнопка, визуализирующая дочернюю форму. А в дочерней форме, в функции, скрывающей форму, добавил две строчки
Код AS1/AS2:

Mouse.removeListener(obj);
delete carrier.onEnterFrame;

Сейчас проверяю и так и сяк, как-будто все работает нормально. Может здесь глюка никакого и нет, а именно так и надо поступать в подобных случаях? Как бы-то ни было, спасибо.

Кстати, раз уж зашла речь о модальных формах, нельзя ли привести для общего развития пару строчек кода корректного создания (показа-сокрытия) модальной формы? Пытался открывать дочернюю форму из главной командой mdm.Forms.SubForm1.showModal(), но потом при закрытии ее не хотела показываться (mdm.Forms.MainForm.show()) главная. А если и главную визуализировать как модальную, она показывается, но не реагирует ни на мышь, ни на клавиатуру. И потом, что это за конструкция из мануала
Код AS1/AS2:

var exitResult = mdm.Forms.MainForm.showModal();

О какой результирующей переменной идет речь и зачем нужна Application.exitWithModalResult()? В общем, были бы весьма полезны некоторые пояснения.

alexcon314 11.03.2009 17:37

Показывать главную форму модально не имеет смысла, можно, конечно, придумать ситуацию, когда именно главная форма должна висеть поверх всех других окон и лочить инпут только на себя, но это уж.. как-то слишком.
Что касается кода, то вот:
Код:

// MainForm code
var exitCode = mdm.Forms.subForm.showModal();
if (exitCode == "cancel") {
        // start process "cancel"
}
if (exitCode == "ok") {
        // start process "ok"
}
// another if's


// SubForm code
mdm.Application.exitWithModalResult("ok");
// Valid modalResult values are:
// none,ok,cancel,abort,retry,ignore,yes,no,all,notoall,yestoall

Т.е. exitCode - переменная, содержащая результат отработки модальной формы.
Возможно, будет работать и в том случае, если вместо "ok" или других валидных строк в
mdm.Application.exitWithModalResult() подставлять произвольную строку. Не проверял или забыл уже.

starserfer 11.03.2009 20:28

Ну, теперь я вижу, что в моем случае применение модальных форм не является необходимостью. Спасибо, alexcon314. Ваши пояснения действительно оказались весьма полезны.


Часовой пояс GMT +4, время: 19:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.