Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Программное создание переменных. (http://www.flasher.ru/forum/showthread.php?t=137998)

MrYeti 27.03.2010 18:11

Программное создание переменных.
 
Требуется создать n-ое количество переменных программно, количество которых заранее неизвестно. Необходимы для создания текстовых полей, для ввода значений в матрицу (массив). Как создать n-ое кол-во переменных (с разными названиями) или как создать вводимое текстовое поле, для ввода значений (а не "значение") массива?

wvxvw 27.03.2010 18:31

AS3 != Lisp :D
Не создавайте переменные динамически. Это возможно, но очень сложно. Можно динамически создать поля (свойства или методы) у динамических объектов, как правило, проще для этого использовать типы объектов специально задуманые как коллекции - Object, Array, Dictionary, Vector, XML / XMLList.

MrYeti 27.03.2010 19:03

А можно как-нибудь создать текстовое поле, чтобы элемент массива являлся идентификатором?
Просто к примеру есть алгоритм, для рассчета системы уравнений методом Гаусса, пользователь вводит базис 6, и создаются 36 + 6 текстовых полей для введения коэффициентов в виде матрицы. Создать саму матрицу не сложно вроде как:
Код AS3:

var matrix:Array=[];
var i:int;
var n:int=6;
for(var i=0;i<n;i++){
  matrix[i]=[];
  for(var j=0;j<n;j++){
      matrix[i][j]=0;
  }
}

А вот как прописать в нее значения - help...

Obi 27.03.2010 20:07

matrix[2][8] = 'myValue'; Не?

MrYeti 27.03.2010 20:17

А как сделать так, чтобы matrix[2][8] был идентификатором текстового поля? как из компиллятора написать это то ясно :).

wvxvw 27.03.2010 20:20

А что мешает текстовому полю быть элементом массива?

MrYeti 27.03.2010 21:01

А если будет, то будут возможны математические преобразования? Покажите как?

wvxvw 27.03.2010 21:05

Математические преобразования чего?

MrYeti 27.03.2010 21:42

Элементов матрицы. Деление и вычитание соответствующих элементов массивов, если введены численные значения разумеется.
Код AS3:

for(i:int=0; i<n; i++){
line[i]=line2[i]-line1[i];
}

где line1 и line2 массивы - строки матрицы.

etc 27.03.2010 21:43

Собирайте двумерку после того, как пользователь нажал на кнопку выполнения.

MrYeti 27.03.2010 22:17

Это понятно.
Пользователь вводит базис - к примеру 5.
Создается нулевая матрица 6x5;
Как сделать так, чтобы пользователь мог ввести значения в матрицу, если мы не знаем заранее сколько переменных будет всего, а узнаем это только после того, как пользователь определил сколько их? ведь нельзя сделать matrix[1][3]:TextField=new TextField; =). а как надо?

wvxvw 27.03.2010 22:59

Если чесно, я где-то перестал понимать, что вы хотите сделать. Пользователь может ввести значение только в текстовое поле, в матрицу он его никак ввести не может - это может сделать только код написаный вами.

steelcut 27.03.2010 23:56

MrYeti, я бы сделал так:
Массивов должно быть два - в одном хранятся элементы матрицы, числа, в другом ссылки на текстовые поля.
1. Получаем от пользователя базис.
2. Соответственно, понимаем какое количество переменных нужно создать и становится понятной размерность матрицы. Я не знаю как принимается это решение, но, вероятно, вы знаете как.
3. Создаете в цикле нужное количество текстовых полей (например для 6х5 = 30 полей.)
Позиционируете их, добавляете в дисплейлист, затем ссылки на текстовые поля кладете в массив для текстовых полей.
4. Создайте какую-нибудь кнопку "Ок". Пользователь должен заполнить все поля, а потом нажать "Ок".
5. Когда все поля заполнены и пользователь нажал "Ок" - в цикле перебираем массив с текстовыми полями и читаем из них данные и кладем в ваш массив содержащий элементы матрицы myMatrix.push = Number (myTextFields[i].text). Желательно проверять по ходу дела, что вы читаете, чтобы не было незаполненных полей и т.п.
Массив данных матрицы получается одномерный, но зная размерность матрицы вполне можно вынуть оттуда данные в том порядке как вам надо.
6. Удаляете все текстовые поля воспользовавшись массивом в котором вы сохранили на них ссылки removeChild(myTextFields[i]);
7. Считаете то, что вам надо используя массив с полученными данными myMatrix.
8. Если надо считать снова - повторяете процесс сначала.

MrYeti 28.03.2010 00:25

В теории то я тоже так думал, но вот 2 и 3-ий пункты не знаю как реализовать...
Именно как, только что узнав суммарное количество переменных, создать столько же текстовых полей, которые будут ссылками этих переменных?
Кстати можно сделать текстовое поле, в котором можно через запятую можно было бы перечислить элементы массива? Чтобы массив считал введенное значениями, а не текстовой строкой?

Ex:
пользователь введет значение n=3;
появятся 3 строки, характеризующие строки массива.
и в каждую введет что-то вроде:
1, 2, 3, 4
1, 4, 2, 1
2, 4, 2, 2

А в программе такой запрос воспроизвел бы:
matrix[0][0]=1;
matrix[0][1]=2;
matrix[0][2]=3;
matrix[0][3]=4;
matrix[1][0]=1;
matrix[1][1]=4;
...
matrix[m][n]=что-нибудь;

Obi 28.03.2010 00:47

Цитата:

появятся 3 строки, характеризующие строки массива.
и в каждую введет что-то вроде:
Код AS3:

var srt:String // тут наша строка, которую вы задали с переносами строк и всякое такое
 
var rows:Array = str.split('\n'); // разделили строку по символу переноса
while(rows.length) {
  var columnValues:String = rows.shift();
  var columns:Array = columnValues.split(',') // разделили на кусочки по запятой
  while(columns.length) {
      trace('row #'+rows.length+' column #'+columns.length+' value='+columns.shift());
  }
}

И да, я выпил многоь пива, суббота и все такое.

steelcut 28.03.2010 01:10

по п.2 Мне кажется что зависимость такая:
Код AS3:

n // сюда вы кладете то что ввел пользователь
var xnum:int = n+1;//число элементов по горизонтали
var ynum:int = n;//число элементов по вертикали
var totalNum:int = xnum * ynum; //общее число переменных

т.е. при n = 3 -> 4 *3 = 12
n = 5 -> 6 * 5 = 30
Оно?

по п.3:
Код AS3:

for (var i:int=0; i < totalNum; i++){
var tf:TextField = new TextField();
tf.type = TextFieldType.INPUT;
tf.x = 10 + 70 * (i - Math.floor(i/xnum) * xnum);
tf.y = 50 + 40 * Math.floor(i/xnum);
addChild(tf);
myTFields.push(tf);
}


MrYeti 28.03.2010 18:48

Так можно создать текстовые поля, но их идентификатор будет 1 tf, так что не получится.
Сейчас пробую как Obi предложил. Вродь должно получиться...

Crenth 28.03.2010 19:04

Цитата:

Сообщение от MrYeti (Сообщение 896264)
В теории то я тоже так думал, но вот 2 и 3-ий пункты не знаю как реализовать...
Именно как, только что узнав суммарное количество переменных, создать столько же текстовых полей, которые будут ссылками этих переменных?

а кто мешает создавать переменные программно ?
вопрос, на сколько я понял, не в том, как их создавать, а в том, как к ним потом обращаться. предлагаю способ, когда каждый элемент вашей матрицы будет помещен в объект Object, который мы снабдим парой свойств i и j - координатами (для случая двумерной матрицы) и текстовым полем для ввода значения

Код AS3:

var matrix : array = new Array(); // массив будет содержать все элементы матрицы вне зависимости от размерности
 
 
var singleElement : Object = new Object(); // объект элемента матрицы
var elementInput : TextField = new TextField(); // текстовое поле для ввода значения элемента
 
singleElement.i = ... // присваиваем горизонтальный индекс элементу матрицы (например, равный счетчику соответствующего цикла
singleElement.j = ... // вертикальный идекс
singleElement.input = elementInmput; //
singleElement.input.x = ... // позиционируем текстовое поле
singleElement.input.y = ... // позиционируем текстовое поле
addChild(singleElement.input) // вводим его в список отображения
 
matrix.push(singleElement); // "складируем" элемент матрицы в линейный массив

дальше обращайтесь к любому элементу по его координатам в матрице, предварительно отыскав его в линейном массиве по условию singleElement.i = that_i && singleElement.j = that_j, где that_ - искомые индексы элемента.

линейный массив будет удобен, поскольку изначально размерность вашей матрицы неизвестна. каждый элемент линейного массива хранит в себе его координаты в вашей матрице (i,j) и текстовое поле для ввода значения


вообще, как мне кажется, лучше использовать универсальную схему, которой пофигу размерность. для ввода значений использовать одно текстовое поле и несколько полей для ввода координаты элемента матрицы. целевой Object в который мы будем складывать все, будем хранить координату элемента. А все объекты будем складывать в линейный массив, чтобы потом иметь возможность работать с любым из элементов матрицы. такая схема будет эластичной :), хотя и не очень быстрой при больших размерностях. зато универсальной

Elser 31.03.2010 00:57

Код AS3:

var matrix:Array = new Array();
var columns:uint = 3;
var rows:uint = 3;
for(var i = 0; i<=rows+1; i++){
    matrix.push(new Array());
    for(var j = 0; j<=columns; j++){
        var tf:TextField = new TextField();
        tf.type = TextFieldType.INPUT;
        tf.width = 40;
        tf.height = 24;
        tf.x = (j==0) ? 15 : matrix[i][j-1].x + 40 + 5;
        // x всей матрицы если первый элемент или
        // x предыдущего поля + ширина предыдущего + интервал
        tf.y = (i==0) ? 15 : matrix[i-1][j].y + 24 + 5;
        //аналогично для y
        matrix[i].push(tf);
        addChild(matrix[i][j]);
    }
}
................
for(i in matrix){
    for(j in matrix[i]){
        trace(matrix[i][j].text);
    }
}



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

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