|
|
|||||
Регистрация: Aug 2009
Сообщений: 40
|
Обратится к тестовому полю
Есть текстовое поле с Instance name did_field
В AS2 обращался Как изменить текст внутри него в AS3 Так не работает Цитата:
|
|
|||||
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Не работает, потому что в классе MovieClip не определено свойство did_field, о чём вам и говорит компилятор.
Как быть? Отключить автоматическое объявление stage instances. Написать Document Class, в котором определить публичную переменную с тем же именем, что вы задали полю (пусть будет txt). Обращаться (root as ИмяВашегоDocumentClass).txt.text = 'текст'. Сразу оговорюсь, это не лучший вариант. Во-первых, чуть лучше будет определить в Document Class метод, изменяющий содержимое поля. А, во-вторых, ещё лучше будет уйти от привязки к root, т.к. в рельных проектах она только мешает (да и в тестовых тоже не советовал бы её использовать). Добавлено через 54 секунды Тоже можно, но это ещё хуже |
|
|||||
Регистрация: May 2009
Сообщений: 134
|
ИМХО (я спец еще тот):
Если Вы все пишете в кадрах, то я думаю root вообще не нужен. Подключите библитеку: Хотя.... если из кадра пишете, то вроде вообще не надо ничего подключать - просто: 0 нельзя присвоить текстовому полю, нужно преобразование к строке: А лучше заведите основной класс (подключать его умеете?) имеется в виду что текстовое поле уже существует на основной сцене: Последний раз редактировалось kaetano; 24.11.2009 в 02:33. |
|
|||||
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Цитата:
|
|
|||||
Регистрация: May 2009
Сообщений: 134
|
Цитата:
|
|
|||||
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
А почему тут должна быть ошибка компиляции?)
Я, наверное, был неправ, не упомянув тот факт, что пример в своём предыдущем посте я привёл исходя из того, что текстовое поле будет создано динамически (в конструкторе, например). Если оставить поле на рабочем столе, то будет ошибка исполнения. Цитата:
Сеттер никому и ничего не должен, даже вам Во-вторых, здесь значение присваивается не текстовому полю, а его свойству text. К тому же, чем вам did_field не переменная?) Ну, и в третьих, сеттер, как и геттер – по сути те же методы, и доступ к закрытым переменным своего класса имеют не менее, чем методы. |
|
|||||
Регистрация: Aug 2009
Сообщений: 40
|
import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.*; import flash.net.*; import flash.text.*; Классы подключать не умею. А если подключить класс то код в кадрах писать нельзя? А как обращаться к классу из клиппа |
|
|||||
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Код в кадрах писать можно, но нежелательно, если вы хотите делать что-нибудь более-менее серъёзное.
Классы подключать очень просто. Попробуйте: package { import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.text.TextField; import flash.display.MovieClip; /** * Основной класс документа (Document Class). * Является потомком MovieClip. Это значит, что любой объект этого класса будет иметь * те же свойства и методы, что и MovieClip, плюс те, которые определите вы. Также это * значит, что с любым объектом этого класса можно обращаться, как с объектом MovieClip. */ public class MainClass extends MovieClip { /** * Закрытое свойство. Доступ к нему будет возможен только изнутри этого класса. */ private var did_field:TextField; /** * Конструктор класса. Вызывается при создании экземпляра класса (в нашем случае – * при запуске флешки). */ public function MainClass() { //создаём текстовое поле did_field = new TextField(); did_field.defaultTextFormat = new TextFormat('_sans', 14); did_field.selectable = false; did_field.autoSize = TextFieldAutoSize.LEFT; did_field.x = did_field.y = 20; //добавляем его в контейнер (аналогично помещению на рабочую область в Flash IDE) addChild(did_field); //пользуемся методом-сеттером для установки текста поля. fieldText = 'Текст поля did_field'; } /** * Метод-геттер. Позволяет получить текст поля. * Ключевое слово public означает, что доступ к свойству fieldText для чтения * можно будет получить извне. */ public function get fieldText():String{ return did_field.text; } /** * Метод-геттер. Позволяет установить текст поля. * Ключевое слово public означает, что доступ к свойству fieldText для записи * можно будет получить извне. */ public function set fieldText(value:String):void { did_field.text = value; } } } К экземпляру класса обращаться можно, как к любой другой переменной (точнее, любая переменная во флеше на самом деле хранит ссылку на экземпляр какого-то класса, будь то String, MovieClip или TextField). Однако важно помнить, что для доступа к членам класса (свойствам и методам) переменная, хранящая ссылку на экземпляр, должна быть нужного типа. Например, определим класс ColorRect: package { import flash.display.Sprite; /** * Закрашенный прямоугольник. */ public class ColorRect extends Sprite { /** * Конструктор. */ public function ColorRect() { super(); } /** * Закрашивает заданным цветом прямоугольник 50x50. * * @param newColor:uint Цвет заполнения. */ public function fillBy(newColor:uint = 0xA2A2A2):void{ with(graphics){ clear(); lineStyle(0, newColor); beginFill(newColor); drawRect(0, 0, 50, 50); endFill(); } } } } package { import flash.display.MovieClip; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; /** * Основной класс документа (Document Class). */ public class MainClass extends MovieClip { /** * Закрытое свойство. Доступ к нему будет возможен только из этого класса. */ private var did_field:TextField; /** * Конструктор класса. Вызывается при создании экземпляра класса (в нашем случае – * при запуске флешки). */ public function MainClass() { //создаём текстовое поле did_field = new TextField(); did_field.defaultTextFormat = new TextFormat('_sans', 14); did_field.selectable = false; did_field.autoSize = TextFieldAutoSize.LEFT; did_field.x = did_field.y = 20; //добавляем его в контейнер (аналогично помещению на рабочую область в Flash IDE) addChild(did_field); //пользуемся методом-сеттером для установки текста поля. fieldText = 'Текст поля did_field'; var colorRect:ColorRect; //var colorRect:Sprite; //создаём экземпляр ColorRect colorRect = new ColorRect(); colorRect.x = did_field.x - 5; colorRect.y = did_field.y - 5; colorRect.width = did_field.width + 10; colorRect.height = did_field.height + 10; //добавляем его в контейнер. addChildAt(colorRect, 0); //вызываем метод класса ColorRect. colorRect.fillBy(0x9EACE0); } /** * Метод-геттер. Позволяет получить текст поля. */ public function get fieldText():String{ return did_field.text; } /** * Метод-геттер. Позволяет установить текст поля. */ public function set fieldText(value:String):void { did_field.text = value; } } } Если же мы теперь вместо var colorRect:ColorRect напишем var colorRect:Sprite, то возникнет ошибка в строчке colorRect.fillBy(0x7285D1). Почему именно там? До этого всё будет нормально, так как ColorRect является потомком Sprite, и мы можем присвоить его переменной типа Sprite. Также можно пользоваться свойствами x, y, width и height, которые класс Sprite унаследовал от DisplayObject. А вот метод fillBy() в классе Sprite не определён, мы ведь его определили только в ColorRect. Поэтому, если объявить переменную как Sprite, то этот метод вызвать не удастся, несмотря на то, что он публичный. Однако можно в этом случае привести тип переменной: (colorRect as ColorRect).fillBy(0x7285D1), и всё пройдёт удачно, так как переменная colorRect на самом деле хранит экземпляр класса ColorRect. Именно поэтому у вас и возникала ошибка с текстовым полем. Флеш при компиляции создаст класс, являющийся наследником DisplayObject, в котором будет свойство did_field типа TextField, так как вы добавили текстовое поле с этим именем на сцену. Экземпляром этого класса и будет являться объект root. Но к объекту в памяти мы можем обратиться только через переменную. А переменная (свойство) DisplayObject.root имеет тип DisplayObject, в котором свойство did_field не определено. Отсюда ошибка. Последний раз редактировалось SamFR; 24.11.2009 в 16:43. |
|
|||||
Регистрация: Aug 2009
Сообщений: 40
|
Смотрю на все это дело и голова оху..........
Гора кода для того что бы просто вывести текст на экран Ладно сейчас поробуем |
Часовой пояс GMT +4, время: 05:41. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|