Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.11.2009, 01:29
donphp вне форума Посмотреть профиль Отправить личное сообщение для donphp Найти все сообщения от donphp
  № 1  
Ответить с цитированием
donphp

Регистрация: Aug 2009
Сообщений: 40
The bomb! Обратится к тестовому полю

Есть текстовое поле с Instance name did_field

В AS2 обращался
Код AS1/AS2:
_root.did_field.text = 0;
Как изменить текст внутри него в AS3
Так не работает
Код AS3:
import flash.display.DisplayObject;
import flash.display.Sprite;
root.did_field.text = 0;
Цитата:
1119: Обращение возможного неопределенного свойства did_field через ссылку со статическим типом flash.displayisplayObject .

Старый 24.11.2009, 02:08
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 2  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
getChildByName("name")
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 24.11.2009, 02:13
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 3  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Не работает, потому что в классе MovieClip не определено свойство did_field, о чём вам и говорит компилятор.

Как быть? Отключить автоматическое объявление stage instances. Написать Document Class, в котором определить публичную переменную с тем же именем, что вы задали полю (пусть будет txt). Обращаться (root as ИмяВашегоDocumentClass).txt.text = 'текст'.

Сразу оговорюсь, это не лучший вариант. Во-первых, чуть лучше будет определить в Document Class метод, изменяющий содержимое поля. А, во-вторых, ещё лучше будет уйти от привязки к root, т.к. в рельных проектах она только мешает (да и в тестовых тоже не советовал бы её использовать).

Добавлено через 54 секунды
Цитата:
Сообщение от TanaTiX Посмотреть сообщение
getChildByName("name")
Тоже можно, но это ещё хуже

Старый 24.11.2009, 02:23
kaetano вне форума Посмотреть профиль Отправить личное сообщение для kaetano Найти все сообщения от kaetano
  № 4  
Ответить с цитированием
kaetano
 
Аватар для kaetano

Регистрация: May 2009
Сообщений: 134
ИМХО (я спец еще тот):

Если Вы все пишете в кадрах, то я думаю root вообще не нужен.
Подключите библитеку:
Код AS3:
import flash.text.*;
Хотя.... если из кадра пишете, то вроде вообще не надо ничего подключать - просто:
Код AS3:
did_field.text = String(0);
0 нельзя присвоить текстовому полю, нужно преобразование к строке:
Код AS3:
=String(0);
А лучше заведите основной класс (подключать его умеете?) имеется в виду что текстовое поле уже существует на основной сцене:
Код AS3:
import flash.display.Sprite;
import flash.text.*;
 
public class Main extends Sprite{
   public var did_field:TextField;
   public function Main(){
      did_field.text = String(0);
   }
}


Последний раз редактировалось kaetano; 24.11.2009 в 02:33.
Старый 24.11.2009, 02:29
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 5  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Цитата:
Сообщение от kaetano Посмотреть сообщение
А лучше заведите основной класс :
Код AS3:
import flash.display.Sprite;
import flash.text.*;
 
public class Main extends Sprite{
   public var did_field:TextField;
   public function Main(){
      did_field.text = String(0);
   }
}
Об этом я и говорил, но всё же лучше хотя бы метод-сеттер сделать:

Код AS3:
import flash.display.Sprite;
import flash.text.TextField;
 
public class Main extends Sprite{
   private var did_field:TextField;
 
   //...
 
   public function set fieldText(value:String):void{
      did_field.text = value;
   }
}

Старый 24.11.2009, 02:37
kaetano вне форума Посмотреть профиль Отправить личное сообщение для kaetano Найти все сообщения от kaetano
  № 6  
Ответить с цитированием
kaetano
 
Аватар для kaetano

Регистрация: May 2009
Сообщений: 134
Цитата:
Сообщение от SamFR Посмотреть сообщение
Об этом я и говорил, но всё же лучше хотя бы метод-сеттер сделать:

Код AS3:
import flash.display.Sprite;
import flash.text.TextField;
 
public class Main extends Sprite{
   private var did_field:TextField;
 
   //...
 
   public function set fieldText(value:String):void{
      did_field.text = value;
   }
}
Что-то у меня сомнения насчет сеттера. Он же должен присваивать значение переменной, а не текстовому полю, да и еще объявленному как private. У Вас нет ошибки при компиляции?

Старый 24.11.2009, 03:33
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 7  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
А почему тут должна быть ошибка компиляции?)

Я, наверное, был неправ, не упомянув тот факт, что пример в своём предыдущем посте я привёл исходя из того, что текстовое поле будет создано динамически (в конструкторе, например). Если оставить поле на рабочем столе, то будет ошибка исполнения.

Цитата:
Сообщение от kaetano Посмотреть сообщение
Что-то у меня сомнения насчет сеттера. Он же должен присваивать значение переменной, а не текстовому полю, да и еще объявленному как private.
Господи, кто вам такое сказал? O_o
Сеттер никому и ничего не должен, даже вам
Во-вторых, здесь значение присваивается не текстовому полю, а его свойству text. К тому же, чем вам did_field не переменная?) Ну, и в третьих, сеттер, как и геттер – по сути те же методы, и доступ к закрытым переменным своего класса имеют не менее, чем методы.

Старый 24.11.2009, 15:32
donphp вне форума Посмотреть профиль Отправить личное сообщение для donphp Найти все сообщения от donphp
  № 8  
Ответить с цитированием
donphp

Регистрация: Aug 2009
Сообщений: 40
Код AS3:
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.*;
import flash.net.*;
import flash.text.*;
Пробовал
Код AS3:
root.getChildByName("did_field").text = String(0);
Код AS3:
root.getChildByName("did_field").text = String(0);
Классы подключать не умею.
А если подключить класс то код в кадрах писать нельзя?
А как обращаться к классу из клиппа

Старый 24.11.2009, 16:38
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 9  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Код в кадрах писать можно, но нежелательно, если вы хотите делать что-нибудь более-менее серъёзное.

Классы подключать очень просто. Попробуйте:

Код AS3:
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;
		}
 
	}
}
Этот текст задаёт Document Class – основной класс документа. Его нужно сохранить в файл "MainClass.as". Далее создайте в той же папке .fla - файл, и пропишите в поле "Class" имя основного класса – MainClass. После запуска флешки будет создано текстовое поле, и ему будет установлен текст.

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

Например, определим класс ColorRect:

Код AS3:
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();
			}
		}
 
	}
}
Данный класс имеет публичный метод fillRect(). Сохраним этот класс в файле ColorRect.as в той же папке, что и MainClass.as. Изменим MainClass.as следующим образом:

Код AS3:
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;
		}
 
	}
}
В конструкторе мы объявляем переменную типа ColorRect и присваиваем ей новый экземпляр класса ColorRect. Далее задаём его положение и добавляем в контейнер, а затем вызываем публичный метод, определённый в классе ColorRect.

Если же мы теперь вместо 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.
Старый 24.11.2009, 18:12
donphp вне форума Посмотреть профиль Отправить личное сообщение для donphp Найти все сообщения от donphp
  № 10  
Ответить с цитированием
donphp

Регистрация: Aug 2009
Сообщений: 40
Смотрю на все это дело и голова оху..........
Гора кода для того что бы просто вывести текст на экран

Ладно сейчас поробуем

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:37.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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