Просмотр полной версии : Считывание цифр в классе
package {
import ua.PlaneObj;
import flash.display.MovieClip;
public class AddButton extends MovieClip {
/*public var vx1 = Number(x1.text)
public var vy1 = Number(y1.text)
public var vz1 = Number(z1.text)
public var vx2 = Number(x2.text)
public var vy2 = Number(y2.text)
public var vz2 = Number(z2.text)*/
public var vector:PlaneObj
public function AddButton(){
var vectorD:PlaneObj = new PlaneObj
vectorD.AddVector()
addChild(vectorD)
}
}
}
В закомментированой части ошибки, помогите понять что не так
x1, y1, z1 и т.д. не существуют и ошибка, видимо, об этом говорит.
это названия текстовых полей, а код в КЛАССЕ! Не видит их
Akopalipsis
24.10.2013, 21:39
Так Вы сначала класс создайте, а потом обращайтесь.
И обязательно типизируйте переменные!
Это и есть отдельный класс в который я записываю переменные из тектовых полей, этот же когд(без паблик конечно) работает в кадрах.
Akopalipsis
24.10.2013, 22:27
В каком классе есть переменные с название x1.text, y1.text и так далее?
Это не переменные, это текстовые поля имеющие на сцене имена x1, y1 и тд
В конструкторе класса присваивайте значения, а не до.Потому что на этапе компиляции, компилятор и понятия не имеет какие там текстовые поля и какие у них имена, а тем более текст.
caseyryan
24.10.2013, 23:40
В конструкторе класса присваивайте значения, а не до.Потому что на этапе компиляции, компилятор и понятия не имеет какие там текстовые поля и какие у них имена, а тем более текст.
Так ведь инициализация все равно перенесется компилятором в конструктор, разве нет?
Автору:
1) каждую строку положено заканчивать точкой с запятой ;
ECMAScript это прощает, но другие языки не простят.
2) Вызывать конструкторы и другие методы принято с использованием скобок ()
3) чтобы конвертировать текстовое число в реальное, нужно использовать parseFloat() или parseInt(), а не Number(someString), это может привести к багам, которые потом трудно будет отследить
В закомментированой части ошибки, помогите понять что не так
Компилятор и так помогает понять что не так. Надо всегда выкладывать текст ошибки, чтобы просить помощи в ее решении. Без конкретного текста ошибки - это все гадание на кофейной гуще.
package {
import ua.PlaneObj;
import flash.display.MovieClip;
public class AddButton extends MovieClip {
public var vx1:Number;
public var vy1:Number;
public var vz1:Number;
public var vx2:Number;
public var vy2:Number:
public var vz2:Number;
public var vector:PlaneObj
public function AddButton(){
vx1 = Number(x1.text)
vy1 = Number(y1.text)
vz1 = Number(z1.text)
vx2 = Number(x2.text)
vy2 = Number(y2.text)
vz2 = Number(z2.text)
var vectorD:PlaneObj = new PlaneObj
vectorD.AddVector()
addChild(vectorD)
}
}
}
Пробуй
MikroAcse
25.10.2013, 01:17
belv, Вы меня пугаете о_О
Вы пробовали так сделать?
Не бойтесь.
попробовал, не помогло, хотя и не могло помочь..
Добавлено через 4 минуты
C:\Users\Администратор\Desktop\Новая папка (4)\kwal\ua\PlaneObj.as, строка 25 1120: Обращение несуществующего свойства vx1.
Но свойство то существующее! Не помогает компилятор...
public var vx1:Number
public function AddButton(){
vx1 = Number((getChildByName("x1") as TextField).text);
}
Как-то так..
а лучше
var tf:TextField = getChildByName("x1") as TextField ;
if (tf) {
vx1 = Number(tf.text);// но vx1 может быть NaN
}
Но свойство то существующее! Не помогает компилятор...
У вас очень правильно отключена галочка во FlashIDE, не помню как зовётся. Она внедряет именованных детей как свойства в итоговый класс в swf.
На самом деле - это хорошо, что она отключена и я не помню как она зовётся. Включать её не надо )
MikroAcse
29.10.2013, 01:39
Вы пробовали так сделать?
Не бойтесь.
Я не боюсь. Вы просто переписали код ТопикСтартера, ничего не изменив в итоге.
попробовал, не помогло, хотя и не могло помочь..
Добавлено через 4 минуты
C:\Users\Администратор\Desktop\Новая папка (4)\kwal\ua\PlaneObj.as, строка 25 1120: Обращение несуществующего свойства vx1.
Но свойство то существующее! Не помогает компилятор...
А почему пишет, что ошибка в классе PlaneObj, если в первом посте у вас класс AddButton? Или вы просто уже переименовали класс в процессе?
Уважаемый MikroAcse , изменение кода заключается в том, что переменные объявляются до конструктора, а значения им присваиваются в конструкторе, то есть там где компилятор уже знает, что есть текстовое поле с именем x1 и берет значение его текста.
Digital задумайтесь над словами samana, может нужно искать причину ошибки в другом классе?
caseyryan
29.10.2013, 13:21
belv, вы не правы. Ваш код в принципе ничем не отличается от кода автора. Инициализация переменных все равно будет перенесена в конструктор при компиляции. Так что можно смело инициализировать их вне конструктора для удобства.
Специально для этого даже написал простой тест.
есть код:
package {
import flash.display.Sprite;
public class SomeClass extends Sprite {
private var _someClass:SomeClass2 = new SomeClass2();
public function SomeClass() {
}
}
}
Собираем. Декомпилируем. Получаем это:
package {
import flash.display.*;
public class SomeClass extends Sprite {
private var _someClass:SomeClass2;
public function SomeClass() {
this._someClass = new SomeClass2();
super(); }
}
}
} // package
Вы немного не то делаете.Вы создаете новый экземпляр класса SomeClass2(), а у ТС уже созданы на сцене текстовые поля и заданы им имена в инспекторе свойств(они инициализируются как переменные ссылающиеся на объект TextField) .Которые он пытается считывать до конструктора, что приводит к ошибке.
MikroAcse
29.10.2013, 13:44
belv, а с чего Вы взяли, что эти текстовые поля не будут доступны вне конструктора?
Они ведь УЖЕ инициализированы, а значит доступ к ним есть.
Вы попробуйте, о результатах отпишитесь.
Да немного не прав в том, что присвоить переменной ссылку на объект можно до конструктора, а использовать свойства этого объекта нельзя.
package {
import flash.display.Sprite
public class Main extends Sprite
{
private var _text = myText;
//private var _text = myText.text; Вызовет ошибку
public function Main()
{
var textInfo = _text.text;
trace(textInfo);
}
}
}
MikroAcse
29.10.2013, 14:19
belv, действительно, Вы правы.
Прошу прощения, буду в следующий раз по-внимательнее.
Мало работал во Flash IDE, почти сразу перешел на FlashDevelop, где все более логично.
Я честно говоря тоже не совсем понимаю, почему ссылку на объект видит, а к свойствам можно обратится только в конструкторе.Может кто объяснит эту тонкость?
AlexLucas
29.10.2013, 14:53
Я честно говоря тоже не совсем понимаю, почему ссылку на объект видит, а к свойствам можно обратится только в конструкторе.Может кто объяснит эту тонкость?
Потому что объект инициализируется в конструкторе, а до конструктора ссылка показывает на null. Ваш кэп :)
caseyryan
29.10.2013, 15:03
Видимо кэп не читал, что писали выше )
Речь то идет об уже созданных ранее объектах
AlexLucas
29.10.2013, 15:09
Об объектах созданных до конструктора мэйн класса ? Это как ?
MikroAcse
29.10.2013, 15:37
Об объектах созданных до конструктора мэйн класса ? Это как ?
Объекты, созданные в ИДЕ, доступны до конструктора, но нельзя трогать их переменные/функции.
AlexLucas
29.10.2013, 15:41
С чего вы взяли что эти объекты доступны до конструктора ?
Читайте с самого начала. По кругу писать не интересно.
MikroAcse
29.10.2013, 19:49
С чего вы взяли что эти объекты доступны до конструктора ?
Потому что откройте Adobe Flash и попробуйте.
А почему пишет, что ошибка в классе PlaneObj, если в первом посте у вас класс AddButton? Или вы просто уже переименовали класс в процессе?
Дело в том, что в объявлении ошибок нет(в классе AddButton, а вот в работе с этими переменными в классе PlaneObj - появляются ошибки
Скинте свою поделку сюда. Во вложение.
Только удалите всё лишнее - оставьте только минимальный кусок вызывающий проблемы.
Дело в том, что PlaneObj и не знает о переменных класса AddButton.Вы можете передать их как параметры в класс PlaneObj(vx1,...), а в классе PlaneObj создать переменные и в конструкторе присвоить значения из принятых параметров конструктора.
Я могу ошибаться, но я думаю не совсем правильно строить логику работы приложения отталкиваясь от текста в текстовых полях.
Скинте свою поделку сюда. Во вложение.
Только удалите всё лишнее - оставьте только минимальный кусок вызывающий проблемы.
Выпилил почти всё, кое что оставил для примера
Дело в том, что PlaneObj и не знает о переменных класса AddButton.Вы можете передать их как параметры в класс PlaneObj(vx1,...), а в классе PlaneObj создать переменные и в конструкторе присвоить значения из принятых параметров конструктора.
Я могу ошибаться, но я думаю не совсем правильно строить логику работы приложения отталкиваясь от текста в текстовых полях.
Это будет конструктор векторов, строящихся по координатам
Еще класс BasicView
А понял это из papervision3d
Вот как то так, не знаю конечно такой результат Вы ожидали.
Вот как то так, не знаю конечно такой результат Вы ожидали.
Но ведь не строит)
Проблема ошибок решена?
А как строить,это уже Вы думайте. И стоит ли вообще браться за papervision
Проблема ошибок решена?
А как строить,это уже Вы думайте. И стоит ли вообще браться за papervision
Если значения считывает - значит должно строить, тоесть ваш код неверен, считывает нули, попробуйте потрейсить их :-) И для примера я там просто оси координат строю, что бы те, кто не знают как работает ПВ3Д могли разобраться. Но ваш код, увы, считает 0
Добавлено через 4 минуты
И ещё, попробуйте заменить координаты z1 на (50, 50, 50) и увидете, что z0 = (0, 0, 0) даже при измененных координатах в текстареа, так что я пока не знаю как заставить это работать
Так это не я создавал на сцене объекты TextArea, откуда я знаю почему z2.text при любом значении у тебя возвращает пустую строку.Читай про TextArea.
Или замени на ImputText
Так это не я создавал на сцене объекты TextArea, откуда я знаю почему z2.text при любом значении у тебя возвращает пустую строку.Читай про TextArea.
Или замени на ImputText
Я как раз считываю верно, попробуйте мой код не в классе, а в кадре и всё будет работать! Вы, скорее всего, неправильно обращаетесь к данным...
Akopalipsis
30.10.2013, 21:00
Digital а когда Вы свои поля в кадрах обрабатываете, Вы случаем не не в каждом кадре к ним обращаетесь? А то Вы создали поле со значением ноль, а потом что то написали и наверное эти поля даже на события изменения не подписали и хотите, чтобы программа как то сама узнавала введённые значения?
И стоит ли вообще браться за papervision
Однозначно - нет.
Однозначно - нет.
Этот ответ мне тут не поможет, и то что весь форум не может считать переменную из текстареа - никак не относится к устаревшему движку :)
Akopalipsis
30.10.2013, 23:53
Дайте проект, чтобы не требовал классы, а то как можно помочь, если классов нет...?
Akopalipsis
31.10.2013, 00:05
В текстовом поле номер один вводите цифры и на панели Вы их увидите.
И дальше, поняв принцип, делайте с этими данными что хотите.
Если обновления значений будет слишком часто, то спрашивайте в отдельной теме, как это решить,
но предварительно посмотрите хелп адоб по событиям и текстовым полям. И забывайте кадры! Переходите на нормальные программы.
MikroAcse
31.10.2013, 00:19
Этот ответ мне тут не поможет, и то что весь форум не может считать переменную из текстареа - никак не относится к устаревшему движку
Мы то можем, но если Вам помощь не нужна, то Вы и не спрашиваете. Логично?
Форум - это не моментальный ответ; это обсуждения, доводы и споры.
В этом и есть вся прелесть форумов.
В текстовом поле номер один вводите цифры и на панели Вы их увидите.
И дальше, поняв принцип, делайте с этими данными что хотите.
Если обновления значений будет слишком часто, то спрашивайте в отдельной теме, как это решить,
но предварительно посмотрите хелп адоб по событиям и текстовым полям. И забывайте кадры! Переходите на нормальные программы.
Спасибо, сейчас попробую, но объявив локально в функции, разве буду иметь к ним доступ в другом классе?
package
{
import ua.PlaneObj;
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class AddButton extends MovieClip
{
public var vx1:Number;
public var vy1:Number;
public var vz1:Number;
public var vx2:Number;
public var vy2:Number;
public var vz2:Number;
private var _timer:Timer;
public function AddButton()
{
_timer = new Timer(100,1);
_timer.addEventListener(TimerEvent.TIMER_COMPLETE, _handlerTimerEvent);
_timer.start();
}
private function _handlerTimerEvent(e:TimerEvent):void
{
vx1 = Number(x1.text);
vy1 = Number(y1.text);
vz1 = Number(z1.text);
vx2 = Number(x2.text);
vy2 = Number(y2.text);
vz2 = Number(z2.text);
var vectorD:PlaneObj = new PlaneObj(this) ;
vectorD.AddVector();
addChild(vectorD);
}
}
}
Пользуйся.Кроме как умничать ни на что не способен.
Akopalipsis
31.10.2013, 01:03
Спасибо, сейчас попробую, но объявив локально в функции, разве буду иметь к ним доступ в другом классе?
я не знаю как в кадрах, но Вы можете удалить то, что я там написал и в главном классе сделать примерно так -
и вот куда надо, в какой угодно класс, Вы можете передавать значение.
package
{
import ua.PlaneObj;
import flash.display.MovieClip;
import flash.events.Event;
public class AddButton extends MovieClip
{
/* public var vx1 = x1.text;
public var vy1 = Number(y1.text);
public var vz1 = Number(z1.text);
public var vx2 = Number(x2.text);
public var vy2 = Number(y2.text);
public var vz2 = Number(z2.text);*/
public function AddButton()
{
this.addListeners([x1,x2,y1,y2,z1,z2]);
}
private function addListeners(array:Array):void
{
var length = array.length;
for(var i:int = 0;i<length;i++)
{
array[i].addEventListener(Event.CHANGE,onChangeHandler);
}
}
private function onChangeHandler(event:Event):void
{
var name:String = event.target.name;
var value:Number = parseFloat(event.target.text);
switch(name)
{
case 'x1':
trace(value);
break;
case 'x2':
//
break;
case 'y1':
//
break;
case 'y2':
//
break;
case 'z1':
//
break;
case 'z2':
//
break;
}
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.