PDA

Просмотр полной версии : Обработчик double-click ???


Urson
25.06.2002, 13:49
Здравствуйте, уважаемые флэшеры!

А не подскажет ли кто, как в 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 - надо подумать :)

Nox Noctis
21.01.2004, 20:36
запусти это дело из шестерки - увидишь как работает..

catilina
22.01.2004, 10:34
а в АС1.0 компоненты 7-ого ведь не работают...
плз, подправь для АС2.0, заранее признателен