Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Обработчик double-click ??? (http://www.flasher.ru/forum/showthread.php?t=33565)

Urson 25.06.2002 13:49

Обработчик double-click ???
 
Здравствуйте, уважаемые флэшеры!

А не подскажет ли кто, как в ListBox-е прикрутить обработчик дабл-клика по строке ListBox-а ????

Очень нужно, срочно... :(

Заранее огромное спасибо,
С уважением,
Юрий Ибрагимов.

DeliMIter 25.06.2002 21:19

Не для листбокса, а вообще
Код:

_clicken = false;
_timeout = 0;

function onMouseDown() {
 if (_clicken) {
  onEnterFrame = null;
  _clicken = false;
// вот он, момент торжества!
  onDblClick();
 } else {
  _clicken = true;
  _timeout = 10;
  onenterFrame = onTimer;
 }
}

function onTimer() {
 if (--_timeout == 0) {
  onEnterFrame = null;
  _clicken = false;
 }
}

// для строгого даблклика "не дернув мышью"
function onMouseMove() {
  onEnterFrame = null;
 _clicken = false;
}

function onDblClick() {
}

К листбоксу сам прикрепишь...

Nox Noctis 26.06.2002 01:35

а можно так:
Код:

this.doubleClick = function() {
        trace("And He said: 'Let there be light'");
        trace("...and there was light !");
};
this.onMouseDown = function() {
        if (!this.ready) {
                this.ready = this.doubleClick;
                this.suicide = function() {
                        clearInterval(this.memo);
                        this.ready = null;
                        delete this.suicide;
                        delete this.memo;
                };
                this.memo = setInterval(this, "suicide", 500);
        } else {
                this.ready();
                this.suicide();
        }
};

всего две функции, и никаких лишних флажков :)

Nox Noctis 26.06.2002 03:42

а вот в уже прикрученном виде:
Код:

// собственно даблклик
doubleClick = function () {
        trace((lst.getItemAt(lst.memo[1])).label);
        trace("And He said: 'Let there be light'");
        trace("...and there was light !");
};
// запускаем ожидание второго клика по строке
waitDouble = function () {
        cancel();
        // время ожидания второго клика
        var clickTime = 500;
        var item = lst.getSelectedIndex();
        lst.ready = doubleClick;
        // запоминаем ID интервала и строку, по которой кликнули
        lst.memo = [setInterval(cancel, clickTime), item];
};
// убиваем ожидание второго клика
cancel = function () {
        if (lst.memo) {
                clearInterval(lst.memo[0]);
                lst.ready = null;
                delete lst.memo;
        }
};
// кличем :)
this.onMouseDown = function() {
        // если кликнули по листбоксу
        var right = lst.hitTest(_root._xmouse, _root._ymouse);
        // если кликнули по скроллбару листбокса
        var wrong = lst.container.scrollBar_mc.hitTest(_root._xmouse, _root._ymouse);
        if (right && !wrong) {
                if (lst.ready) {
                        lst.ready();
                        cancel();
                }
        }
};
lst.setChangeHandler("waitDouble");
lst.onMouseMove = cancel;

'lst' - это имя инстанса листбокса

Urson 26.06.2002 14:42

Спасибо огромное!
Вы меня просто спасли... начальство тоже счастливо :)
Это последняя мелочь их не устраивала. Все. Завтра сдаю проект! :)

Nox Noctis 26.06.2002 15:26

мда... в три часа ночи я начинаю городить огород :p

вот универсальный способ:
Код:

// ----- Global DoubleClick Event -----
Mouse.isDouble = function() {
        if (!Mouse.clickFlag) {
                if (!Mouse.clickTimeout) {
                        Mouse.clickTimeout = 300;
                }
                Mouse.clickFlag = setInterval(Mouse.cancelDouble, Mouse.clickTimeout);
        } else {
                Mouse.broadcastMessage("onDoubleClick");
                Mouse.cancelDouble();
        }
};
Mouse.cancelDouble = function() {
        if (Mouse.clickFlag) {
                clearInterval(Mouse.clickFlag);
                delete Mouse.clickFlag;
        }
};
ASBroadcaster.initialize(Mouse);
Mouse.doubleListener = {onMouseMove:Mouse.cancelDouble, onMouseDown:Mouse.isDouble};
Mouse.addListener(Mouse.doubleListener);
// -------------------------------------
//
// method for registering doubleclick-on-item event of Listbox
FListBoxClass.prototype.setItemDblClick = function(action) {
        this.onDoubleClick = function() {
                var right = this.hitTest(_root._xmouse, _root._ymouse);
                var wrong = this.container.scrollBar_mc.hitTest(_root._xmouse, _root._ymouse);
                if (right && !wrong) {
                        action(arguments);
                }
        };
        Mouse.addListener(this);
};
// -------------------------------------
//
// example:
// setting time threshold between two successive clicks
Mouse.clickTimeout = 200;
// some function - just for example
doubleClick = function () {
        trace((lst.getSelectedItem()).label);
        trace("And He said: 'Let there be light'");
        trace("...and there was light !");
};
// registering dblclick action
lst.setItemDblClick(doubleClick);

© :)

скрипт огороженный комментарием "Global DoubleClick Event" регистрирует новое событие мышки: onDoubleClick.
добавляем этот код в начало мувика, а потом в любом месте пишем:
любой_объект.onDoubleClick = function () {.......};
Mouse.addListener(любой_объект);

– и это будет действовать как любое из стандартных событий.

дальше добавляем в класс ФЛистбоксКласс метод, который регистрирует для данного листбокса событие онДаблКлик

пишем:
имя_любого_листбокса.setItemDblClick(любая_функция);
...и любая_функция будет срабатывать по даблклику на строке листбокса :)

такие пироги :cool:

DeliMIter 26.06.2002 20:22

2Nox

Респект.
Но у тебя если мышой дернуть то это не отслеживается, а без отслеживания мыши у меня короче :-Р

Nox Noctis 26.06.2002 20:27

ну да, согласен...
только в первом варианте кода движение мышки не отслеживалось :)
но все равно, нужно-то добавить всеголишь функцию онМаусМув, которая будет убивать ссылку ready :)
так что будет три функции :)

catilina 21.01.2004 20:03

поднимаю :)
а твой скрипт(предпоследний) точно работает под List флеша MX2004?
я сделал простой copy/pastle, создал лист с нужным инстансом, все это в одном и единственном фрейме мувика, и вроде как не пашет...

последний твой скрипт дает 14 ерроров... :)

Nox Noctis 21.01.2004 20:24

все работает, гарантировано :)

но только для АС1.0 (надо указать в паблиш сеттингах).. если необходимо исправить под АС2.0 - надо подумать :)


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

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