PDA

Просмотр полной версии : Заполнение Dinamic TextField посторочно из Текстового файла через промежуток времни


yarik_tv
13.05.2008, 15:23
Здравствуйте уважаемые! Есть такая проблема.

есть мувик, в котором есть текстовые поля: hdr,sub,txt и текстовый файл следующего содержания.
hdr=Заголовок1&sub=Подзаголовок1&txt=Первая строка.
hdr=Заголовок2&sub=Подзаголовок2&txt=Вторая строка.
hdr=Заголовок3&sub=Подзаголовок3&txt=Третья строка.

Задача организовать отображение каждой из строк в текстовых полях с интервалом в 30 сек.

пробовал следующий вариант:

System.useCodepage = true;
n=0;
astr = new LoadVars();
astr.load("scroll.txt");
astr.onLoad = function()
{
var str:Array = astr.split("\r\n");
}

function ChangeString(n) {
for (var i = n; i < str.length; i++) {
hdr.text = str[i].hdr;
sub.text = str[i].sub;
txt.text = str[i].txt
}
}

{
setInterval(ChangeString(n),750);
n++
}
Результат = 0. Может кто подскажет в вариант реализации? По поиску подобного не смог найти к сожалению.

alexcon314
13.05.2008, 15:27
yaric_tv, для оформления кода используйте теги
уберите System.useCodepage = true; сохраните ваш файл в кодировке utf-8.
переменная str - локальная, ее нет за пределами фигурных скобок, где она объявлена.
у класса LoadVars нет метода split().
файл с данными оформлен неверно, надо все писать в одну строку.
иначе, надо использовать для загрузки класс XML.
var lv:LoadVars = new LoadVars();
lv.onLoad = function(success:Boolean):Void {
if (success == true) {
for( var i=0; i<=3; i++){
trace(lv['hdr'+i]);
trace(lv['sub'+i]);
trace(lv['txt'+i]);
}
} else {
txt.text = "unable to load";
trace("unable to load");
}
};
// в файле tdata.txt одна строка
//hdr1=Заголовок1&sub1=Подзаголовок1&txt1=Первая строка.&hdr2=Заголовок2&sub2=Подзаголовок2&txt2=Вторая строка.&hdr3=Заголовок3&sub3=Подзаголовок3&txt3=Третья строка.&

lv.load("tdata.txt");

yarik_tv
13.05.2008, 16:21
файл динамически создается из MSSQL базы и выкладывается в каталог. Кол-во строк различается от 5 до 1000, поэтому в одну строку вариант не подходит. Вот сейчас пробовал таким методом:

var a:Array = new Array();
var lv:LoadVars = new LoadVars();

lv.onData = function(src) {
if (src != undefined) {
a = src.split("/n/r");
trace(a);
}
};
lv.load("scroll.txt",lv);

в "а" - отображается нужная строка:
hdr=Заголовок1&sub=Подзаголовок1&txt=Первая строка. А вот как из нее получить значения для текстовых полей по таймеру!!!?
вот если бы можно было loadVariables(a, _target);

amesqit
13.05.2008, 16:25
я бы предложил использовать xml файл, это более простой способ получения данных из файла, т.к. если использовать класс LoadVars() не избежать различного рода изврата.
с классом LoadVars() и вашим текстовым файлом код будет выглядеть примерно так:

var res_lv:LoadVars = new LoadVars();
var ar = new Array();
res_lv.onData = function(src) {
ar = src.split("\r\n");
for (var i = 0; i<ar.length; i++) {
lv = new LoadVars();
lv.decode(ar[i]);
ar[i] = lv;
}
for (var i in ar[0]) {
trace("ar[0]."+i+" = "+ar[0][i]);
}
};

res_lv.load("1.txt");


с классом XML() и xml-файлом:

<r>
<item hdr='Заголовок1' sub='Подзаголовок1' txt='Первая строка.'/>
<item hdr='Заголовок2' sub='Подзаголовок2' txt='Вторая строка.'/>
<item hdr='Заголовок3' sub='Подзаголовок3' txt='Третья строка.'/>
</r>

код будет выглядеть вот так:

var res_xml:XML = new XML();
res_xml.ignoreWhite = true;
var ar = new Array();
res_xml.onLoad = function(src) {
var node = this.firstChild.childNodes;
for (var i = 0; i<node.length; i++) {
ar[i] = node[i].attributes;
}
for (var i in ar[0]) {
trace("ar[0]."+i+" = "+ar[0][i]);
}
};

res_xml.load("1.xml");

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

iNils
13.05.2008, 16:29
Интервал задается функций setInterval ()

yarik_tv
13.05.2008, 16:54
спасибо за оба варианта, но я наверное в "танке", как все же отобразить данные в DinamicTextField-ах по интервалу. в Trace отображается только первая строка, понятно, чтоб отобразить вторую нужно задать trace("ar[1]."+i+" = "+ar[1][i]);
но вот как это сделать динамически и отображать в текстовых полях?

amesqit
13.05.2008, 17:41
вот вам самый примитивный пример работы с интервалами, если внимательно почитаетете хелп во всем сможите разобраться, но вам, по сути, остается объеденить 2 куска кода, с небольшими дополнениями

var count:Number = 0;
var id:Number = setInterval(interval, 1000);
function interval() {
trace(count);
if (count == 10) {
clearInterval(id);
}
count++;
}

yarik_tv
13.05.2008, 18:36
var n:Number = 0;

var res_xml:XML = new XML();
res_xml.ignoreWhite = true;
var ar = new Array();
res_xml.onLoad = function(src) {
var node = this.firstChild.childNodes;

setInterval(interval, 1000, n);
function interval() {
for (var i = 0; i<node.length; i++) {
ar[i] = node[i].attributes;
}
trace(n);
for (var i in ar[n]) {
hdr.text = ar[n]["hdr"];
sub.text = ar[n]["sub"];
txt.text = ar[n]["txt"];
}
n++;
}


};
res_xml.load("1.xml");

Отображает данные только из первой строки, хотя trace(n) - обновляется. Помогите плз.

amesqit
13.05.2008, 19:46
вы вообще пытались разобраться, что к чему в коде?

yarik_tv
13.05.2008, 21:09
пытался, но особых успехов не достигнуто даже с хелпом, к сожалению. Все гуд если менять n - вручную, а програмно результат не изменяется.

amesqit
14.05.2008, 00:00
Нужно сделать следущее:
- вынести фунцийю interval из onLoad;
- анализировать и записывать данные в массив onLoad, а не в функции interval.
плюс ко всему у вас:
- бездумное использование цикла for in;
- непонятно почему вы не воспользовались функцией clearInterval.

yarik_tv
14.05.2008, 12:03
var res_xml:XML = new XML();
res_xml.ignoreWhite = true;
var ar = new Array();
res_xml.onLoad = function(src) {
var node = this.firstChild.childNodes;
for (var i = 0; i<node.length; i++) {
ar[i] = node[i].attributes;
}
};
res_xml.load("scroll.xml");

var count:Number = 0;
var id:Number = setInterval(interval, 2000);
function interval() {

hdr.text = ar[count]["hdr"];
sub.text = ar[count]["sub"];
txt.text = ar[count]["txt"];
trace(ar[count]["hdr"]);
trace(ar[count]["sub"]);
trace(ar[count]["txt"]);

if (count == ar.length-1) {
clearInterval(id);
}
count++;
}

спасибо - amesqit, вот соорудил код.
в trace - данные обновляются, а текстовые поля меняются только один раз при первом вызове, в чем может быть причина?

yarik_tv
14.05.2008, 12:21
все разобрался, нужно убрать .text и все заработало. Всем спасибо!!!