PDA

Просмотр полной версии : Считывание цифр в классе


Digital
24.10.2013, 20:59
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)


}

}

}

В закомментированой части ошибки, помогите понять что не так

GBee
24.10.2013, 21:13
x1, y1, z1 и т.д. не существуют и ошибка, видимо, об этом говорит.

Digital
24.10.2013, 21:14
это названия текстовых полей, а код в КЛАССЕ! Не видит их

Akopalipsis
24.10.2013, 21:39
Так Вы сначала класс создайте, а потом обращайтесь.
И обязательно типизируйте переменные!

Digital
24.10.2013, 22:14
Это и есть отдельный класс в который я записываю переменные из тектовых полей, этот же когд(без паблик конечно) работает в кадрах.

Akopalipsis
24.10.2013, 22:27
В каком классе есть переменные с название x1.text, y1.text и так далее?

Digital
24.10.2013, 23:00
Это не переменные, это текстовые поля имеющие на сцене имена x1, y1 и тд

belv
24.10.2013, 23:07
В конструкторе класса присваивайте значения, а не до.Потому что на этапе компиляции, компилятор и понятия не имеет какие там текстовые поля и какие у них имена, а тем более текст.

caseyryan
24.10.2013, 23:40
В конструкторе класса присваивайте значения, а не до.Потому что на этапе компиляции, компилятор и понятия не имеет какие там текстовые поля и какие у них имена, а тем более текст.
Так ведь инициализация все равно перенесется компилятором в конструктор, разве нет?

Автору:
1) каждую строку положено заканчивать точкой с запятой ;
ECMAScript это прощает, но другие языки не простят.
2) Вызывать конструкторы и другие методы принято с использованием скобок ()
3) чтобы конвертировать текстовое число в реальное, нужно использовать parseFloat() или parseInt(), а не Number(someString), это может привести к багам, которые потом трудно будет отследить
В закомментированой части ошибки, помогите понять что не так
Компилятор и так помогает понять что не так. Надо всегда выкладывать текст ошибки, чтобы просить помощи в ее решении. Без конкретного текста ошибки - это все гадание на кофейной гуще.

belv
25.10.2013, 00:30
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, Вы меня пугаете о_О

belv
25.10.2013, 01:20
Вы пробовали так сделать?
Не бойтесь.

Digital
28.10.2013, 17:53
попробовал, не помогло, хотя и не могло помочь..

Добавлено через 4 минуты
C:\Users\Администратор\Desktop\Новая папка (4)\kwal\ua\PlaneObj.as, строка 25 1120: Обращение несуществующего свойства vx1.
Но свойство то существующее! Не помогает компилятор...

Котяра
29.10.2013, 00:40
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
Вы пробовали так сделать?
Не бойтесь.
Я не боюсь. Вы просто переписали код ТопикСтартера, ничего не изменив в итоге.

samana
29.10.2013, 03:00
попробовал, не помогло, хотя и не могло помочь..

Добавлено через 4 минуты
C:\Users\Администратор\Desktop\Новая папка (4)\kwal\ua\PlaneObj.as, строка 25 1120: Обращение несуществующего свойства vx1.
Но свойство то существующее! Не помогает компилятор...
А почему пишет, что ошибка в классе PlaneObj, если в первом посте у вас класс AddButton? Или вы просто уже переименовали класс в процессе?

belv
29.10.2013, 10:59
Уважаемый 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

belv
29.10.2013, 13:27
Вы немного не то делаете.Вы создаете новый экземпляр класса SomeClass2(), а у ТС уже созданы на сцене текстовые поля и заданы им имена в инспекторе свойств(они инициализируются как переменные ссылающиеся на объект TextField) .Которые он пытается считывать до конструктора, что приводит к ошибке.

MikroAcse
29.10.2013, 13:44
belv, а с чего Вы взяли, что эти текстовые поля не будут доступны вне конструктора?
Они ведь УЖЕ инициализированы, а значит доступ к ним есть.

belv
29.10.2013, 13:50
Вы попробуйте, о результатах отпишитесь.
Да немного не прав в том, что присвоить переменной ссылку на объект можно до конструктора, а использовать свойства этого объекта нельзя.

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, где все более логично.

belv
29.10.2013, 14:24
Я честно говоря тоже не совсем понимаю, почему ссылку на объект видит, а к свойствам можно обратится только в конструкторе.Может кто объяснит эту тонкость?

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
С чего вы взяли что эти объекты доступны до конструктора ?

belv
29.10.2013, 15:58
Читайте с самого начала. По кругу писать не интересно.

MikroAcse
29.10.2013, 19:49
С чего вы взяли что эти объекты доступны до конструктора ?
Потому что откройте Adobe Flash и попробуйте.

Digital
29.10.2013, 19:57
А почему пишет, что ошибка в классе PlaneObj, если в первом посте у вас класс AddButton? Или вы просто уже переименовали класс в процессе?
Дело в том, что в объявлении ошибок нет(в классе AddButton, а вот в работе с этими переменными в классе PlaneObj - появляются ошибки

Котяра
30.10.2013, 00:13
Скинте свою поделку сюда. Во вложение.
Только удалите всё лишнее - оставьте только минимальный кусок вызывающий проблемы.

belv
30.10.2013, 00:17
Дело в том, что PlaneObj и не знает о переменных класса AddButton.Вы можете передать их как параметры в класс PlaneObj(vx1,...), а в классе PlaneObj создать переменные и в конструкторе присвоить значения из принятых параметров конструктора.
Я могу ошибаться, но я думаю не совсем правильно строить логику работы приложения отталкиваясь от текста в текстовых полях.

Digital
30.10.2013, 00:33
Скинте свою поделку сюда. Во вложение.
Только удалите всё лишнее - оставьте только минимальный кусок вызывающий проблемы.
Выпилил почти всё, кое что оставил для примера

Digital
30.10.2013, 00:34
Дело в том, что PlaneObj и не знает о переменных класса AddButton.Вы можете передать их как параметры в класс PlaneObj(vx1,...), а в классе PlaneObj создать переменные и в конструкторе присвоить значения из принятых параметров конструктора.
Я могу ошибаться, но я думаю не совсем правильно строить логику работы приложения отталкиваясь от текста в текстовых полях.

Это будет конструктор векторов, строящихся по координатам

belv
30.10.2013, 01:02
Еще класс BasicView
А понял это из papervision3d

belv
30.10.2013, 01:22
Вот как то так, не знаю конечно такой результат Вы ожидали.

Digital
30.10.2013, 01:41
Вот как то так, не знаю конечно такой результат Вы ожидали.

Но ведь не строит)

belv
30.10.2013, 01:45
Проблема ошибок решена?
А как строить,это уже Вы думайте. И стоит ли вообще браться за papervision

Digital
30.10.2013, 01:48
Проблема ошибок решена?
А как строить,это уже Вы думайте. И стоит ли вообще браться за papervision

Если значения считывает - значит должно строить, тоесть ваш код неверен, считывает нули, попробуйте потрейсить их :-) И для примера я там просто оси координат строю, что бы те, кто не знают как работает ПВ3Д могли разобраться. Но ваш код, увы, считает 0

Добавлено через 4 минуты
И ещё, попробуйте заменить координаты z1 на (50, 50, 50) и увидете, что z0 = (0, 0, 0) даже при измененных координатах в текстареа, так что я пока не знаю как заставить это работать

belv
30.10.2013, 02:11
Так это не я создавал на сцене объекты TextArea, откуда я знаю почему z2.text при любом значении у тебя возвращает пустую строку.Читай про TextArea.
Или замени на ImputText

Digital
30.10.2013, 20:43
Так это не я создавал на сцене объекты TextArea, откуда я знаю почему z2.text при любом значении у тебя возвращает пустую строку.Читай про TextArea.
Или замени на ImputText

Я как раз считываю верно, попробуйте мой код не в классе, а в кадре и всё будет работать! Вы, скорее всего, неправильно обращаетесь к данным...

Akopalipsis
30.10.2013, 21:00
Digital а когда Вы свои поля в кадрах обрабатываете, Вы случаем не не в каждом кадре к ним обращаетесь? А то Вы создали поле со значением ноль, а потом что то написали и наверное эти поля даже на события изменения не подписали и хотите, чтобы программа как то сама узнавала введённые значения?

Котяра
30.10.2013, 22:45
И стоит ли вообще браться за papervision
Однозначно - нет.

Digital
30.10.2013, 23:30
Однозначно - нет.

Этот ответ мне тут не поможет, и то что весь форум не может считать переменную из текстареа - никак не относится к устаревшему движку :)

Akopalipsis
30.10.2013, 23:53
Дайте проект, чтобы не требовал классы, а то как можно помочь, если классов нет...?

Akopalipsis
31.10.2013, 00:05
В текстовом поле номер один вводите цифры и на панели Вы их увидите.
И дальше, поняв принцип, делайте с этими данными что хотите.
Если обновления значений будет слишком часто, то спрашивайте в отдельной теме, как это решить,
но предварительно посмотрите хелп адоб по событиям и текстовым полям. И забывайте кадры! Переходите на нормальные программы.

MikroAcse
31.10.2013, 00:19
Этот ответ мне тут не поможет, и то что весь форум не может считать переменную из текстареа - никак не относится к устаревшему движку
Мы то можем, но если Вам помощь не нужна, то Вы и не спрашиваете. Логично?
Форум - это не моментальный ответ; это обсуждения, доводы и споры.
В этом и есть вся прелесть форумов.

Digital
31.10.2013, 00:45
В текстовом поле номер один вводите цифры и на панели Вы их увидите.
И дальше, поняв принцип, делайте с этими данными что хотите.
Если обновления значений будет слишком часто, то спрашивайте в отдельной теме, как это решить,
но предварительно посмотрите хелп адоб по событиям и текстовым полям. И забывайте кадры! Переходите на нормальные программы.

Спасибо, сейчас попробую, но объявив локально в функции, разве буду иметь к ним доступ в другом классе?

belv
31.10.2013, 00:51
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;
}
}

}

}