[Problem] Adresowanie pol tekstowych tworzonych skryptowo

Technologia Flash, czyli animacja na potrzeby stron WWW to świat daleko odbiegły od zwykłego programowania i kodu. Zapytaj o pomoc i podziel się z nami Twoimi problemami z zakresu Flasha.
parachutist
Posty: 11
Rejestracja: czw gru 08, 2005 1:55 pm
Kontakt:

[Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: parachutist »

mam taki kod ktory wszystko ladnie dziala ale nie potrafie jednej rzeczy zaadresowac tak aby dzialała poprawnie a mianowicie jest widziany tylko jeden ostatni adres pol tekstowych i wszystkie akcje przyciskow dzialaja na niego
oto kod

to wszystko dziala bez zazutu nie tu problem

Kod: Zaznacz cały

a=0;    
for(j=0;j<linie;j++)
{
	//pola tekstowe z indexem komorki pamieci
	nowy0 = "noweJ" + j;
	this.createTextField(nowy0, this.getNextHighestDepth(), 0,0+20*j, 50, 20);
	this[nowy0].border = true;
    this[nowy0].borderColor = "0x000000";
    this[nowy0].background = true;
    this[nowy0].backgroundColor = "0xffffff";
	this[nowy0].selectable = false;
    this[nowy0].text = szestnastkowy(j);
	this[nowy0].setTextFormat(myt0);

	[b]//chodzi o ta petle[/b]
najpierw tworze tutaj puste clipy aby potem przypisac do nich akcje i wykorzystac jako
przyciski umieszczjac w nich pojedynczo pola tekstowe jeden clip jedno pole tekstowe i to wszystko dziala

Kod: Zaznacz cały

	for(i=0;i<8;i++)
	{		
		a++;

		this.createEmptyMovieClip("txtButton"+a, this.getNextHighestDepth());
		//pola tekstowe zaierajace wartosc komorki pamieci 0 lub 1
		var aa = this["txtButton"+a];
        aa.createTextField("nowe" + a,this.getNextHighestDepth(),50+15*i,0+20*j, 15, 20);
		var plt = aa["nowe" + a];
		plt.border = true;
        plt.borderColor = "0xff0000";
        plt.background = true;
        plt.backgroundColor = "0xffffff";
		plt.text=wartoscKomorki[a];
		plt.selectable = false;
		plt.setTextFormat(myt);
		plt.type = "dynamic";
a do tej pory wszystko dziala i sie rysuje bez problemu problem tkwi w
poinzszym kodzie przypisuje on do kazdego clipa akcje i ta czesc jest
wykonywana dobrze jednak wszystkie te clipy przyciski dzialaja na jedno tylko
pole tekstowe o adresie z wartosciami z ostatniego przebiegu petli a chce
zeby kazdy clip dzialal na pole tekstowe ktore sie w nim znajduje

Kod: Zaznacz cały

		
        aa.onPress = function()
        {
	       if(plt.text == "0")
	       {
		      plt.text = "1";
		      plt.setTextFormat(myt);
	       }
	       else if(plt.text == "1")
	       {
		      plt.text = "0";
		      plt.setTextFormat(myt);
	       }
        }
		
    }
}
te własnie PLT ktore mnie interesuja jest widziane z nich tylko ostatni
Ostatnio zmieniony pn sty 16, 2006 5:36 pm przez parachutist, łącznie zmieniany 1 raz.
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: Marek_bf »

Nie jestem pewien gdyż nie przedstawiłeś wielu części kodu, ale z tego, co widzę to powinno pomóc:

Kod: Zaznacz cały

//.....
for (j = 0; j < linie; j++) {
	//pola tekstowe z indexem komorki pamieci 
	nowy0 = "noweJ" + j;
	this.createTextField(nowy0, this.getNextHighestDepth(), 0, 0 + 20 * j, 50, 20);
	nowy0.border = true;
	nowy0.borderColor = "0x000000";
	nowy0.background = true;
	nowy0.backgroundColor = "0xffffff";
//.....
parachutist
Posty: 11
Rejestracja: czw gru 08, 2005 1:55 pm
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: parachutist »

niestety nie pomaga wrecz odwrotnie ale nie o to mi chodzilo i juz wyjasniam i precyzuje jaki jest problem zrobie to w samym kodzie u gory a jesli chodzi o reszte kodu to naprawde nie jest istotna bo sa to tylko funkcje ktore pobieraja i formatuja tekst do tych pol tekstowych
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: Marek_bf »

Ja widzę, jakie funkcje są wywoływane, ale nie widzę, co w nich jest, jeżeli usunąć w Twoim kodzie przypisanie formatowania to wszystko działa. Dlatego podejrzewam ze błędy mogą, choć nie muszą, znajdować się we fragmentach kodu, których nie pokazałeś.

Więc dla mnie każda część kodu jest istotna, jeżeli nie chcesz jej pokazać to musisz działać sam. Najlepiej pokaz plik *.fla.
parachutist
Posty: 11
Rejestracja: czw gru 08, 2005 1:55 pm
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: parachutist »

oto plik fla jednak naprawde nie ma reszta znaczeniaplik fla

EDIT: podalem link do pliku zrodlowego jest on we flashu 8 ale skrypt jest w zewnetrznym pliku a w samym fla jest tylko kod ladujacy plik txt no i plik as

1. Gdy chcesz coś dodać do swojego uprzednio napisanego post'a korzystaj z opcji "zmień" [poprawione]
2. Nigdy, w szczególności w taki sposób, nie poganiaj użytkowników do pomocy Tobie [usunięte]
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: Marek_bf »

Kod: Zaznacz cały

function szestnastkowy(liczba) {
	var sz:Number = new Number(liczba);
	//zamiana liczb dziesietnych na szestnastkowe i dodanie odpowiednich przedrostkow uzupelniajacych
	if (liczba < 16) {
		return szestnastka = "0x000" + sz.toString(16);
	} else if (liczba >= 16 && liczba < 256) {
		return szestnastka = "0x00" + sz.toString(16);
	} else if (liczba >= 256) {
		return szestnastka = "0x0" + sz.toString(16);
	}
}
//ilosc znakow w wprowadzonych danych ktore beda umieszczone w komorkach pamieci
ile = length(dane);
wartoscKomorki = new Array();
for (i = 0; i < ile; i++) {
	wartoscKomorki[i] = substring(dane, i, 1);
}
//obliczenie ile ma byc wierszy komorek pamieci
wiersz = Math.floor(ile / 8);
//format pol tekstowych komorek pamieci zawierajacych 0 lub 1
var myt:TextFormat = new TextFormat();
myt.bold = true;
myt.color = 0x00ccff;
myt.size = 14;
myt.font = "Arial";
myt.align = "Center";
//format pol tekstowych z indexem komrki pammieci
var myt0:TextFormat = new TextFormat();
myt0.bold = false;
myt0.color = 0x000000;
myt0.size = 12;
myt0.font = "Arial";
myt0.align = "Center";
a = 0;
for (j = 0; j < wiersz; j++) {
	//pola tekstowe z indexem komorki pamieci
	nowy0 = "noweJ" + j;
	this.createTextField(nowy0, this.getNextHighestDepth(), 0, 0 + 20 * j, 50, 20);
	this[nowy0].border = true;
	this[nowy0].borderColor = "0x000000";
	this[nowy0].background = true;
	this[nowy0].backgroundColor = "0xffffff";
	this[nowy0].selectable = false;
	this[nowy0].text = szestnastkowy(j);
	this[nowy0].setTextFormat(myt0);
	for (i = 0; i < 8; i++) {
		a++;
		aa = this.createEmptyMovieClip("txtButton" + a, this.getNextHighestDepth());
		//pola tekstowe zaierajace wartosc komorki pamieci 0 lub 1
		plt = aa.createTextField("nowe", this.getNextHighestDepth(), 50 + 15 * i, 0 + 20 * j, 15, 20);
		plt.border = true;
		plt.borderColor = "0xff0000";
		plt.background = true;
		plt.backgroundColor = "0xffffff";
		plt.text = wartoscKomorki[a];
		plt.selectable = false;
		plt.setTextFormat(myt);
		plt.type = "dynamic";
		aa.onPress = function() {
			if (this.nowe.text == "0") {
				this.nowe.text = "1";
			} else if (this.nowe.text == "1") {
				this.nowe.text = "0";
			}
			this.nowe.setTextFormat(myt);
		};
	}
}
stop();
P.S. Popracuj trochę nad kodem jest fatalny, tworzysz niepotrzebne pętle, zmienne, używasz deprecjowanych metod w połączeniu z nowymi metodami, ogólnie nieładnie :)
parachutist
Posty: 11
Rejestracja: czw gru 08, 2005 1:55 pm
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: parachutist »

ok dzieki dziala teraz ale czy mozesz uscislic ktore metody sa deprecjonowane a ktore nie, i gdzie sa niepotrzebnie petle i zmienne ? i jakby ci sie chcialo wytlumaczyc czemu teraz dziala czemu trzeba bylo sie odwolac w ten sposob chcialbym to zrozumiec bo inaczej to co dziala ale to mi nic nie da na przyszlosc tylko rozwiaze biezacy problem
Marek_bf
Administrator
Posty: 4419
Rejestracja: czw lut 24, 2005 2:14 am
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: Marek_bf »

Jak pisałem wcześniej, tworzysz dużo niepotrzebnego kodu.

Referencje do dynamicznie tworzonych MC chcesz przechowywać w zmiennej aa i robisz to w ten sposób:

Kod: Zaznacz cały

this.createEmptyMovieClip("txtButton" + a, this.getNextHighestDepth());
var aa = this["txtButton" + a];
Można tak:

Kod: Zaznacz cały

var aa = this.createEmptyMovieClip("txtButton" + a, this.getNextHighestDepth());
Niepotrzebnie obliczasz niektóre rzeczy:

Kod: Zaznacz cały

this.createTextField("nowy" + j, this.getNextHighestDepth(), 0, 0 + 20 * j, 50, 20);
Poprawnie:

Kod: Zaznacz cały

this.createTextField("nowy" + j, this.getNextHighestDepth(), 0, 20 * j, 50, 20);
Niepotrzebne dodawanie do zera (0 + 20 * j)

Funkcja:

Kod: Zaznacz cały

function szestnastkowy(liczba) {
	var sz:Number = new Number(liczba);
	if (liczba < 16) {
		return szestnastka = "0x000" + sz.toString(16);
	} else if (liczba >= 16 && liczba < 256) {
		return szestnastka = "0x00" + sz.toString(16);
	} else if (liczba >= 256) {
		return szestnastka = "0x0" + sz.toString(16);
	}
}
Może wyglądać tak:

Kod: Zaznacz cały

function szestnastkowy(liczba) {
	if (liczba < 16) {
		return "0x000" + liczba.toString(16);
	} else if (liczba >= 16 && liczba < 256) {
		return "0x00" + liczba.toString(16);
	} else if (liczba >= 256) {
		return "0x0" + liczba.toString(16);
	}
}
Tworzyłeś w niej dwie niepotrzebne zmienne.

Tworzenie w Twoim kodzie tablicy z łańcucha:

Kod: Zaznacz cały

ile = length(dane);
wartoscKomorki = new Array();
for (i = 0; i < ile; i++) {
	wartoscKomorki[i] = substring(dane, i, 1);
}
Wystarczy być:

Kod: Zaznacz cały

var wartoscKomorki = dane.split("");
Niepotrzebna pętla

Użycie

Kod: Zaznacz cały

length(string); 
jako funkcji też jest niepoprawne (dopuszczalne w playerze Flash Lite dla urządzeń przenośnych) poprawnie powinno być:

Kod: Zaznacz cały

string.length; 
Czyli użyte jako właściwość nie funkcja.

Nazwy zmiennych iterujących w zagnieżdżonych pętlach powinno się zaczynać od i, u Ciebie jest odwrotnie.

Twoje pętle:

Kod: Zaznacz cały

for (var j = 0; j < 10; j++) {
	for (var i = 0; i < 10; i++) {
	}
}
Poprawnie:

Kod: Zaznacz cały

for (var i = 0; i < 10; i++) {
	for (var j = 0; j < 10; j++) {
	}
}
Jest to zabieg kosmetyczny, ale bardzo ważny. Takie przyzwyczajenie pisania kodu pozwala łatwiej go zrozumieć innym osobom oraz Tobie po jakimś czasie.

Zamiast:

Kod: Zaznacz cały

aa.onPress = function() {
	if (this.nowe.text == "0") {
		this.nowe.text = "1";
		this.nowe.setTextFormat(myt);
	} else if (this.nowe.text == "1") {
		this.nowe.text = "0";
		this.nowe.setTextFormat(myt);
	}
};
Wystarczy:

Kod: Zaznacz cały

aa.onPress = function() {
	this.nowe.text = this.nowe.text == "0" ? this.nowe.text = "1" : this.nowe.text = "0";
	this.nowe.setTextFormat(myt);
};
Prawda, że przejrzyściej i ładniej? ;)

Jest jeszcze kilka innych drobnych rzeczy, takich jak np. nazewnictwo zmiennych, dzisiaj jeszcze wiesz, co przechowuje zmienna aa, ale za pół roku jak otworzysz ten projekt do edycji będziesz długo drapał się w głowę :)
parachutist
Posty: 11
Rejestracja: czw gru 08, 2005 1:55 pm
Kontakt:

Re: [Problem] Adresowanie pol tekstowych tworzonych skryptowo

Post autor: parachutist »

ok wielkie dzieki mistrzu jeszcze kiedys pewnie bede potrzebowal pomocy, a narazie wdroze wskazowki w zycie, raz jeszcze dzieki
ODPOWIEDZ