Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   UIComponent не ловит keyDown? (http://www.flasher.ru/forum/showthread.php?t=91493)

firelord 01.02.2007 00:34

UIComponent не ловит keyDown?
 
не знаю, насколько это интересно для общественности - я и сам решил уже делать в обход - но все-таки!

сделал свою компоненту 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

Цитата:

Сообщение от 7thsky™
addEventListener (eventName, listener)

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

Сообщение от 7thsky™
и вообще RTFM!

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

firelord 01.02.2007 02:17

Цитата:

Сообщение от silin
нормальные герои всегда идут в обход..
может она и "будет рюхать ряд заявленных событий", но не таким же образом..

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

Цитата:

Сообщение от silin
или у тебя on(keyDown) { trace() } на родных компонентах работает?

да :) на Textbox пробовал...

etc 01.02.2007 02:27

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

firelord 01.02.2007 02:27

Цитата:

Сообщение от __etc
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

Цитата:

Сообщение от __etc
firelord, по F1 тебе полный мануал откроется. Если бесполезные — купи книгу тогда.

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

firelord 01.02.2007 02:33

Цитата:

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

вот в это мне легко верится...

etc 01.02.2007 02:36

Цитата:

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

Я бы вообще написал бы свой фреймворк для компонентов, если бы стояла такая задача. Стандартные компоненты не идеальны, но вполне себе работают в стандартных ситуациях. А писать же свои компоненты надо по типу тех, что уже существуют, т.е. также криво.

firelord 01.02.2007 02:41

Цитата:

Сообщение от __etc
Я бы вообще написал бы свой фреймворк для компонентов, если бы стояла такая задача. Стандартные компоненты не идеальны, но вполне себе работают в стандартных ситуациях. А писать же свои компоненты надо по типу тех, что уже существуют, т.е. также криво.

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

7thsky™ 01.02.2007 08:57

Цитата:

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

Что самое интересное - работает. рабочий пример (было впадлу писать в отдельном файле свой класс, так что сделал класс на ас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

Цитата:

Сообщение от firelord
то, что открывается по F1 я бы на месте разработчиков постыдился бы по F1 открывать ;) включая 10 книжек, которые я успел скачать - и библии, и Using Components, и ActionScript reference и пр. нормального мануала по созданию компонент - близко нет. возможно, я пока не нашел ;)

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

Цитата:

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

firelord 01.02.2007 15:32

Цитата:

Сообщение от 7thsky™
Что самое интересное - работает. рабочий пример (было впадлу писать в отдельном файле свой класс, так что сделал класс на ас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

Цитата:

Сообщение от firelord
я все-таки осмелюсь задать еще вопрос :) вот в Вашем, уважаемый 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

Вложений: 1
Вот вообще пример как компоненты работают простой

silin 01.02.2007 18:16

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

7thsky™ 01.02.2007 18:20

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


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

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