PDA

Просмотр полной версии : UIComponent не ловит keyDown?


firelord
01.02.2007, 00:34
не знаю, насколько это интересно для общественности - я и сам решил уже делать в обход - но все-таки!

сделал свою компоненту extends UIComponent, наивно рассчитывал, что она сама будет рюхать ряд заявленных событий, типа keyDown.

соотв. на экземпляре компоненты делаю on(keyDown) { trace() } - фиг! хотя и setFocus делаю вроде - и focusIn приходит - вроде клавиатура должна в компоненту идти - а событие не файрит!

надо как-то специально подтвердить желание ловить клавиатуру для UIComponent - или я вообще что-то не так себе представляю?

7thsky™
01.02.2007, 00:43
addEventListener (eventName, listener)

и вообще RTFM!

silin
01.02.2007, 00:57
нормальные герои всегда идут в обход..
может она и "будет рюхать ряд заявленных событий", но не таким же образом..
или у тебя on(keyDown) { trace() } на родных компонентах работает?

etc
01.02.2007, 01:13
firelord, а заглянуть в класс UIComponent нельзя? И посмотреть, что тебе нахаляву подарят.

firelord
01.02.2007, 02:15
addEventListener (eventName, listener)

обидно, когда тебя совсем за идиота принимают :) так тоже не работает - естественно ;)

и вообще RTFM!
я бы с радостью - да где эти FM взять? или вот эта груда бесполезных PDF у флеша называется мануалами? ;)

firelord
01.02.2007, 02:17
нормальные герои всегда идут в обход..
может она и "будет рюхать ряд заявленных событий", но не таким же образом..

я уже выяснил, что не таким - вопрос остался - каким ;) ну, ладно, я не гордый - буду делать через Key.onKeyDown - но это же коряво...


или у тебя on(keyDown) { trace() } на родных компонентах работает?
да :) на Textbox пробовал...

etc
01.02.2007, 02:27
firelord, по F1 тебе полный мануал откроется. Если бесполезные — купи книгу тогда.

firelord
01.02.2007, 02:27
firelord, а заглянуть в класс UIComponent нельзя? И посмотреть, что тебе нахаляву подарят.
вообще, строго говоря, лазить в исходники базовых компонент - это занятие для людей, не обделенных свободным временем. у класса существует ИНТЕРФЕЙС, интерфейс должен быть ОПИСАН.
в "мануалах" (т.н. FM) упоминается, что класс UIComponent предназначен как базовый для компонент, которым требуется обработка событий клавиатуры. точка, конец абзаца ;) а, нет! вот в другом "мануале" - "UIComponent.keyDown - Broadcast when a key is pressed". я не поленился - в качестве эксперимента - переопределил функцию keyDown - засунул в нее dispatchEvent - вдруг, думаю, так имеется в виду? нет ;)
ладно, я уже готов залезть в исходники - с толкача правда не нашел, где можно описание UIComponent найти - не подскажите? просто уже из любопытства... а то ведь и дальше буду на грабли наступать, не понимая столь своеобразной модели классов флеша...

etc
01.02.2007, 02:32
Эти компоненты изнутри вообще жуть и то, что они не работают, ничего удивительного :)

firelord
01.02.2007, 02:33
firelord, по F1 тебе полный мануал откроется. Если бесполезные — купи книгу тогда.
то, что открывается по F1 я бы на месте разработчиков постыдился бы по F1 открывать ;) включая 10 книжек, которые я успел скачать - и библии, и Using Components, и ActionScript reference и пр. нормального мануала по созданию компонент - близко нет. возможно, я пока не нашел ;)
видимо моя ошибка была в самом начале - что я решил вообще делать компоненты - флеш, видать, исповедует собственную идеологию (в этом уже убедился на runtime sharing)... придется забыть все, о чем знал - и учиться программить "по-флешовски" ;)

firelord
01.02.2007, 02:33
Эти компоненты изнутри вообще жуть и то, что они не работают, ничего удивительного :)
вот в это мне легко верится...

etc
01.02.2007, 02:36
видимо моя ошибка была в самом начале - что я решил вообще делать компоненты - флеш, видать, исповедует собственную идеологию (в этом уже убедился на runtime sharing)... придется забыть все, о чем знал - и учиться программить "по-флешовски" ;)
Я бы вообще написал бы свой фреймворк для компонентов, если бы стояла такая задача. Стандартные компоненты не идеальны, но вполне себе работают в стандартных ситуациях. А писать же свои компоненты надо по типу тех, что уже существуют, т.е. также криво.

firelord
01.02.2007, 02:41
Я бы вообще написал бы свой фреймворк для компонентов, если бы стояла такая задача. Стандартные компоненты не идеальны, но вполне себе работают в стандартных ситуациях. А писать же свои компоненты надо по типу тех, что уже существуют, т.е. также криво.
нет, уж, увольте :) соблазн "переписать Windows" посещает многих - но практического смысла в этом немного, а меня лично интересует исключительно практический смысл ;) ну, что - в Delphi компоненты тоже, мягко говоря, криво написаны - практически неприспособлены для наследования - так там, если нужно добавить в базовый класс вполне логичное расширение - берутся исходники базового класса - и на базе них создается новый класс ;) вот что бывает, когда люди в школе не изучают SmallTalk...

7thsky™
01.02.2007, 08:57
обидно, когда тебя совсем за идиота принимают :) так тоже не работает - естественно ;)


Что самое интересное - работает. рабочий пример (было впадлу писать в отдельном файле свой класс, так что сделал класс на ас1, но сути не меняет), открываете пустой фла, копируете код и запускаете.


import mx.core.UIComponent;

// нужно для всех прибамбасов
// макромедийного фрэймворка
mx.core.ext.UIComponentExtensions;
mx.core.ext.UIObjectExtensions;

var MyClass:Function = function () {super ();};
var mc:MovieClip = this.createEmptyMovieClip ('t', 1);

MyClass.prototype = new UIComponent ();
MyClass.prototype.size = function () {
super.size ();

var mc:MovieClip = this;
mc.clear ();
mc.beginFill(this.getStyle ('backgroundColor'), 50);
mc.drawRect (0, 0, this.width, this.height);
mc.endFill ();
};

mc.__proto__ = MyClass.prototype;
mc.__constructor__ = MyClass;
mc.constructor = MyClass;
MyClass.apply (mc);


var uic:UIComponent = UIComponent (mc);
uic.addEventListener ('keyDown', this);
uic.addEventListener ('focusIn', this);
uic.addEventListener ('focusOut', this);
uic.addEventListener ('resize', this);
uic.setStyle ('backgroundColor', 0x000000);
uic.setSize (300, 400);
uic.setFocus ();

function handleEvent (event:Object):Void {
trace ('[Event type="' + event.type + '", target="' + event.target + '"]');
}



я бы с радостью - да где эти FM взять? или вот эта груда бесполезных PDF у флеша называется мануалами? ;)
Эти FM, очень просто найти -
F1 -> 'Using Components' -> 'Creating Components' - в этом разделе достаточно инфы, о том как построен их фрэймворк и как создавать свои компоненты, какие методы нужно переписывать и т.д.

з.ы. Вообще любой нормальный программер, сначала читает доки, а если бы вы их и читали, то не стали бы использовать конструкции типа on ('keyDown') {}

з.ы.ы. естественно можно предположить что все проблемы в вашем классе, так как у фрэймворка есть архитектура (пусть и дебильная, главное чтобы Костя нас не слышал :) ), и расширяя компоненты надо это учитывать.

7thsky™
01.02.2007, 09:13
то, что открывается по F1 я бы на месте разработчиков постыдился бы по F1 открывать ;) включая 10 книжек, которые я успел скачать - и библии, и Using Components, и ActionScript reference и пр. нормального мануала по созданию компонент - близко нет. возможно, я пока не нашел ;)


Возможно плохо искали, в Using Components достаточно всего, для создания всего чего нужно.


видимо моя ошибка была в самом начале - что я решил вообще делать компоненты - флеш, видать, исповедует собственную идеологию (в этом уже убедился на runtime sharing)... придется забыть все, о чем знал - и учиться программить "по-флешовски" ;)
Либо вы не правильно выбрали технологию, делайте все на AJAX (хотя с ней вам будет еще трудней, там тот же прототипный язык, куча визуальных фрэймворков, без нормального описания, куча разных моделей DOM'ов которые тоже нормально негде не описаны), либо вам придется почитать чуть чуть и понять особенности (они есть) флэша.

firelord
01.02.2007, 15:32
Что самое интересное - работает. рабочий пример (было впадлу писать в отдельном файле свой класс, так что сделал класс на ас1, но сути не меняет), открываете пустой фла, копируете код и запускаете.

вот за пример спасибо! посижу, разберусь, в каком месте у меня руки кривые ;) видимо, я неправильно применял addEventListener.

firelord
01.02.2007, 15:46
я все-таки осмелюсь задать еще вопрос :) вот в Вашем, уважаемый 7thsky™, примере у меня работало - а в моей компоненте не удается повесить внешний листенер ;)

class clScrollArea extends mx.core.UIComponent {
...
}
var scrollArea=new clScrollArea();
var listener = new Object();
listener.keyDown = function () {
trace("keyDown");
}
listener.focusIn = function() {
trace("focused");
}
scrollArea.addEventListener("keyDown",listener);
scrollArea.addEventListener("focusIn",listener);
scrollArea.setFocus();

пример, конечно, условный - но должен, мне кажется, передавать общую схему. так вот - focusIn тут ловится, а keyDown - нет.
не подскажите еще разочек (надеюсь, последний) - в каком месте ДНК у меня ошибка? ;)

firelord
01.02.2007, 15:49
да, и раз уж я все равно спросил - самый общий вопрос: что нужно, чтобы еще и мышку компонентой ловить?

7thsky™
01.02.2007, 16:47
я все-таки осмелюсь задать еще вопрос :) вот в Вашем, уважаемый 7thsky™, примере у меня работало - а в моей компоненте не удается повесить внешний листенер ;)

пример, конечно, условный - но должен, мне кажется, передавать общую схему. так вот - focusIn тут ловится, а keyDown - нет.
не подскажите еще разочек (надеюсь, последний) - в каком месте ДНК у меня ошибка? ;)

Опять таки все очень просто:
F1 > Using Components > Creating Components > Creating a component movie clip


class clScrollArea extends mx.core.UIComponent {
public static var symbolName:String = 'тут надо записать linkageID';
public static var symbolOwner:Function = clScrollArea;
...
}
var scrollArea:clScrollArea =
clScrollArea (createClassObject (clScrollArea, 'scrollAreaInstance', 1));

var listener = new Object();
listener.keyDown = function () {
trace("keyDown");
}
listener.focusIn = function() {
trace("focused");
}
scrollArea.addEventListener("keyDown",listener);
scrollArea.addEventListener("focusIn",listener);
scrollArea.setFocus();


Думаю так будет работать.
Опять таки отсылаю вас на RTFM, так как если бы вы читали то бы прочитали что все компоненты по архитектуре макромедийных компонент - визуальные, то есть в конечном счете наследуются от MovieClip и что единственный способ создать визуальный объект воспользовать фабричным методом класса MovieClip или createClassObject (расширенние компонент).

firelord
01.02.2007, 17:20
ну, на самом-то деле я его создаю в редакторе - как обычную компоненту - тащу на stage. т.е. я полагаю - механизм создания в данном случае не важен - важнее, что keyDown в этом случае не отрабатывается

firelord
01.02.2007, 17:27
а вообще где можно иерархию классов флеша посмотреть с описаниями интерфейсов классов? не так, как в "документации" - а нормальную иерархию - что от чего наследуется, какие свойства, какие методы. или это вообще излишний вопрос? поиск пока ничего не дал :(

silin
01.02.2007, 17:34
мне казалось, что все проще, теперь вот в сомнениях..
хотя работает:
import mx.core.UIComponent;
mx.core.ext.UIComponentExtensions;
mx.core.ext.UIObjectExtensions;
var scrollArea=new clScrollArea();
scrollArea.addEventListener("keyDown",listener);
scrollArea.addEventListener("focusIn",listener);
scrollArea.addEventListener("mouseDown",listener);
function listener(e){
trace(e.type);
}
class clScrollArea extends mx.core.UIComponent {
function clScrollArea(){
super();
Mouse.addListener(this);
}
function onMouseDown(){
dispatchEvent({ type:"mouseDown"});
}
}
подписка на Mouse не нужна, канеш, если речь о мувике в библиотеке: он и так подписан

firelord
01.02.2007, 17:47
ладно, буду еще много читать и разбираться... спасибо за помощь!

7thsky™
01.02.2007, 17:52
тогда не работающий пример в студии, то что вы показали не может работать, а гадать что там у вас действительно не хочется

7thsky™
01.02.2007, 17:54
Silin - этож нето, если создавать через new, то нафиг наследовать от UIComponent - для понтов?

7thsky™
01.02.2007, 18:02
Вот вообще пример как компоненты работают простой

silin
01.02.2007, 18:16
дада, new здесь не при делах..тока чтоб посмотреть что наследует..
но если мувик с этим классом положить на сцену, он что же не унаследует от от UIComponent ?, вроде наследует..

7thsky™
01.02.2007, 18:20
если положить, и если символ в библиотеке прописан данный класс, никто и не спорит :) но просто тому примеру что тут был выложен я был не уверен что именно так и обстоит дело, поэтому и попросил исходник в студию :)