Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как обратиться к свойству объекта TextField из класса кнопки (http://www.flasher.ru/forum/showthread.php?t=145524)

peromax 11.10.2010 13:24

Как обратиться к свойству объекта TextField из класса кнопки
 
Вложений: 1
На объекте главной формы(mainForm.as) лежит объект кнопка (myButton.as) и экземпляр динамического текста (txt)

Вложение 25311

Как из класса myButton.as(при событии клик по кнопке) изменить свойство text
экземпляра txt???
txt - в свою очередь создается в mainForm.as, оператором new




В Actionscript 2.0 я обращался через _рут.. В делфи подключается в uses и все свойства становятся доступными..
ну подскажите, пожалуйста, как обращаться к сторонним объектам в АС 3.0
всю документацию перерыл нету ничего, помогите господа.

iCluster 11.10.2010 19:28

Я бы сделал так:
Код AS3:

package  
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
 
    /**
    * @author Roman
    */

    public class TestButton extends Sprite
    {
        private var _button: MyButton = null;
        private var _textField: TextField = null;
 
        public function TestButton()
        {
            _textField = new TextField();
            addChild(_textField);
            _textField.text = 'someText';
 
            _button = new MyButton();
            addChild(_button);
            _button.addEventListener(MouseEvent.CLICK, onButtonClick);
        }
 
        private function onButtonClick(event: MouseEvent):void
        {
            _textField.text = 'otherText';
        }
    }
}


peromax 12.10.2010 00:30

Спасибо за ответ, но это не совсем то. В одном файле обращаться у меня получается, а вот когда в разных... У меня есть класс кнопки(отдельный файл *.ас) в котором определены функции и листерны и отдельный файл мэйнФорм.ас в котором вызывается конструктор этой кнопки, и конструктор тхт. Можно ли в такой ситуации обратиться из класса кнопки к свойству текста? Или нужно именно что бы кнопка обрабатывала листерны для текста в одном файле ?

iCluster 12.10.2010 00:57

Я, конечно, могу ошибаться, но если вы не преследуете какой-то определенной цели данным требованием, то лучше все-таки назначать обработчик действий на месте. По вашему вопросу - можно в кнопку передавать ссылку на текстовое поле и в кнопке изменять текст, можно при нажатии на кнопку высылать кастомное событие, в котором передавать необходимый текст, ловить его в вашей форме и в ней менять текст, можно передавать функцию главной формы в кнопку, которая будет вызываться при нажатии на нее... можно придумать еще 100 и один способ, но зачем? :) listeners в классе вашей кнопки нужны скорее для того, чтобы менять графическое ее состояние при нажатии, или обрабатывать какие-то специфические функции, присущие этой кнопке. Если вы тесно свяжете кнопку с текстовым полем - то будет весьма проблематично использовать ее повторно для других целей.

peromax 12.10.2010 01:30

Спасибо огромное, я просто новичок в АС 3.0 наверное вы правы.

Wolsh 12.10.2010 02:10

Советую почитать что-нибудь про ООП. Некоторые вещи сложны при первом знакомстве, но есть очень полезные концепции, помогающие связно думать и строить проект, прежде всего взаимодействия. Кратко так - у каждого объекта должна быть своя простая миссия. Кнопка просто нажимается, поле просто выводит текст, в основном классе - логика. Когда кнопка инкапсулирована, ей не надо ничего вообще знать о том, что происходит вовне. Она просто нажимается и посылает событие что ее нажали, всё. Такую кнопку Вы можете использовать где угодно и как угодно, а проект превращается в подобие конструктора, собираясь из отдельных деталек. Основному классу не обязательно знать об оверСтейте кнопки, ему нужны только события кнопки. Кнопке не надо знать, что произойдет когда ее кликнут, а тем более - что где-то есть какое-то поле, в которое надо передать какой-то текст... Это же просто кнопка! Зачем пихать в нее логику самого приложения?)))

KiL33 12.10.2010 14:20

Вложений: 1
Вдохновившись сообщением от Wolsh, сваял вот такой примерчик

Main
Код AS3:

package {
 
    import components.ManagerObjects;
 
    import flash.display.Sprite;
 
    [SWF(backgroundColor="0xFFFFFF", width="800", height="600", frameRate="30")]
 
    public class Main extends Sprite {
 
        private const PAD:uint = 10;
 
        //CONSTRUCTOR
        public function Main() {
            init();
        }
 
        private function init():void {
 
 
            //                сообщение по дифолту | высота текстФилда | имя кнопок | кол.во | сдвиг
            var managerObject:ManagerObjects = new ManagerObjects("ТЫЦ", 100, "Button", 5, PAD);
            addChild(managerObject);
            managerObject.y = PAD
            managerObject.x = PAD
 
        }
 
    }//class
}//package

ManagerObjects, здесь тусят все объекты, которые у нас есть(кнопки, текстФиелд)
Код AS3:

package components {
 
        import components.ManagerButton;
        import components.ManagerText;
 
        import events.CommonEvent;
 
        import flash.display.Sprite;
 
        public class ManagerObjects extends Sprite {
 
                //VARIABLES
                private var mButton:ManagerButton;
                private var mText:ManagerText;
 
                //CONSTRUCTOR
                public function ManagerObjects(name:String, heightText:uint, nameButton:String, numButton:uint, PAD:uint){
 
                        init(name, heightText, nameButton, numButton, PAD)
 
                }
 
                private function init(name:String, heightText:uint, nameButton:String, numButton:uint, PAD:uint):void {
 
                        mText = new ManagerText("ТЫЦ", 100)//дали первоначальное сообщение текст фиелду, задали высоту текст фиелду
                        addChild(mText);
 
                        //добавили кнопки
                        mButton = new ManagerButton("Button", 5, PAD);// имя кнопок | кол.во | сдвиг
                        addChild(mButton);
                        mButton.y = mText.height+PAD; // выровняли кнопки по высоте с текст филдом
                        mText.width = mButton.width; // выровняли текст фиелд по соотношению с кол.вом кнопок
 
                        mButton.addEventListener(CommonEvent.MESSAGES, setupMes); // получаем события при нажатии на кнопки
                }
 
                private function setupMes(e:CommonEvent):void{
 
                        mText.sendMessage(e.txtMessage); //отправили данные манагерТексту
 
                }
        }
}

ManagerButton, здесь тусят только кнопки
Код AS3:

package components {
        import controls.SingleButton;
 
        import events.CommonEvent;
 
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class ManagerButton extends Sprite {
                //VARIABLES
                private var button:SingleButton;
 
                //CONSTRUCTOR       
                public function ManagerButton(name:String, num:uint, PAD:uint) {
 
                        init(name, num, PAD);
                }
 
                private function init(name:String, num:uint, PAD:uint):void {
 
                        for(var i:uint = 0; i < num; i++){
                        button = new SingleButton(name+ " - "+i);
                        button.x = Number(button.width+PAD)*i;
                        button.name = name+i;       
                        button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
                        addChild(button);
 
                        }
                }
                private function mouseDown(e:MouseEvent):void{
 
                        var txtMessage:String = e.currentTarget.name;
 
                        dispatchEvent(new CommonEvent(CommonEvent.MESSAGES, txtMessage));
                        //trace(e.currentTarget.name+"")
 
                }
 
        }//class
}//package

ManagerText, здесь основная цель манагера заключается в получении и отправке обновленных данных самому текстФиелду, но по сути в данном примере, можно было и без него обойтись, и отправлять данные на прямую.
Код AS3:

package components {
        import events.TextFieldEvent;
 
        import flash.display.Sprite;
 
        public class ManagerText extends Sprite {
 
                //VARIABLES
                private var textInput:TextInput;
 
                //CONSTRUCTOR
                public function ManagerText(message:String, heightNum:uint){
 
                        init(message, heightNum);
 
                }
 
                private function init(message:String, heightNum:uint):void{
 
                        textInput =        new TextInput(message, heightNum);
                        addChild(textInput);
 
                }
                public function sendMessage(txt:String):void {
 
                        textInput.replaceMessage(txt);
 
                }
 
        }//class
}//package

TextInput, собственно сам текстФиелд.
Код AS3:

package components {
 
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFieldType;
 
 
        public class TextInput  extends Sprite {
 
                //VARIABLES
                private var txt:TextField;
 
 
                //CONSTRUCTOR
                public function TextInput(message:String, heightNum:uint){
 
                        init(message, heightNum);
 
                }
 
                private function init(message:String, heightNum:uint):void{
 
                        txt = new TextField();
                        txt.type = TextFieldType.INPUT;
                        txt.height = heightNum;
                        txt.width = 400;
                        txt.border = true;
                        txt.multiline = true;
                        txt.wordWrap = true;
                        txt.text = message;
                        addChild(txt);       
                }
 
                public function replaceMessage(_txt:String):void {
 
                        txt.text = _txt;
 
                }
 
        }//class
}//package

SingleButton, класс реализует кнопку с текстфилдом.
Код AS3:

package controls {
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.text.TextFieldAutoSize;
 
        public class SingleButton extends Sprite {
 
                private var txt:TextField;
                private var label:String;
                private const WIDTH:uint = 50;
                public const HEIGHT:uint = 30;
                private var        sprite:Sprite;
                private var format:TextFormat;
 
                //CONSTRUCTOR
                public function SingleButton(name:String) {
 
                        label = name;
                        init(label);
                }
 
                private function init(label:String):void {
 
                        format = new TextFormat();
                        txt = new TextField;
                        addChild(txt);
                        txt.text = label
                        txt.autoSize = TextFieldAutoSize.LEFT;
                        //format
                        format.font = "Verdana";
                        format.color = 0x000000;
                        format.size = 20;
 
                        txt.height = HEIGHT;
 
                        txt.setTextFormat(format);                         
                        txt.defaultTextFormat = format;
                        txt.selectable = false;
 
                        addEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        addEventListener(MouseEvent.ROLL_OUT, onRollOut);
 
                        sprite = new Sprite();
                        sprite.graphics.beginFill(0xFFFFFF);
                        sprite.graphics.drawRoundRect(0, 0, txt.width, HEIGHT, 10, 10);
                        sprite.graphics.endFill();
                        addChild(sprite);
                        sprite.addChild(txt);
                }
 
                private function onRollOver(event:MouseEvent):void {
                        updateGraphics(0x000000);
                }
 
                private function onRollOut(event:MouseEvent):void {
                        updateGraphics(0xFFFFFF);
                        format.color = 0x000000;
                        txt.setTextFormat(format); 
                }
                private function updateGraphics(color:uint):void {
                        graphics.clear();
 
                        sprite.graphics.beginFill(color);
                        sprite.graphics.drawRoundRect(0, 0, txt.width, HEIGHT, 10, 10);
                        sprite.graphics.endFill();
                        format.color = 0xFFFFFF;
                        txt.setTextFormat(format);                         
                }
 
 
        }//class
}//package

В проектировании приложений очень помогает создание схем классов, их взаимодействие. Не ленитесь чертить схемки. Даже если вы один задействованы в проекте. В последствии, если придется вернуться к проекту, вспомнить, как в нем всё устроено, благодаря схемам, будет на много проще.
..и конечно же
Почаще слушайте человека с ником Wolsh, плохого никогда не посоветует :)


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

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