SWiSH Forum
Forum użytkowników programów SWiSH

SWiSH Max - Dziwne NIEdziałanie 'variable()' POMOCY

Johanson - Wto 10 Kwi, 2012 22:54
Temat postu: Dziwne NIEdziałanie 'variable()' POMOCY
Dlaczego sekwencja "variable(nazwa)=...'
działa na poziomie ROOT, a już z poziomu funkcji - nie.

Kod:

onSelfEvent (load)
 {var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1';     // działa
  nazwa='output.Zmienna_2';
  variable(nazwa)='To jest zmienna nr 2';      // działa
  trace('_root 1:  '+output.Zmienna_1);
  trace('_root 2:  '+output.Zmienna_2);
     
  Funkcja();
 }

function Funkcja()
 {var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1';   // działa
  nazwa='output.Zmienna_2';
  variable(nazwa)='To jest zmienna nr 2';    // NIE działa
  trace('');
  trace('Fun 1:  '+output.Zmienna_1);
  trace('Fun 2:  '+output.Zmienna_2);
 }


Skutkiem tego nie można wysłać zmiennych

output.send("send.php", "_blank", "POST");

W poprzednich wersjach Swish'a to DZIAŁAŁO, ale ...
no właśnie.
:-(

espe1 - Sro 11 Kwi, 2012 00:27

Kod:

onSelfEvent (load) {
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1';
nazwa='output.Zmienna_2';
variable(nazwa)='To jest zmienna nr 2';
trace('_root 1: '+output.Zmienna_1);
trace('_root 2: '+output.Zmienna_2);

Funkcja();
}

function Funkcja() {
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1';
output.Zmienna_2=nazwa;
variable(nazwa)='To jest zmienna nr 2';
trace('Fun 1: '+output.Zmienna_1);
trace('Fun 2: '+output.Zmienna_2);
}   

Johanson - Sro 11 Kwi, 2012 05:26

no i ?
espe1 - Sro 11 Kwi, 2012 09:23

no i działa jakbyś nie zauważył. Zamiast zmiennej 2 wyświetlało undefined, teraz się wyświetla normalnie: Fun 2:To jest Znienna nr 2.

Coś jeszcze?

Johanson - Sro 11 Kwi, 2012 12:25

Dla niezorientowanych wyjaśniam:

Sekwencja 'variable(..)' służy (akurat w SwishMax4 przestała działać)
do ustalania wartości zmiennej o nazwie, której JESZCZE NIE ZNAMY
podczas pisania programu.

Dlatego nie interesuje mnie jawne podstawienie
(patrz globalny zasięg zmiennej 'nazwa')
Kod:
output.Zmienna_2=nazwa;

tylko konstrukcja
Kod:
variable(nazwa)='To jest zmienna nr 2';

które NIE działa.

Do tej pory w SwishMax3 można było użyć:
Kod:
output.eval (nazwa)='cokolwiek'

espe1 - Sro 11 Kwi, 2012 15:14

Johanson napisał/a:

tylko konstrukcja
Kod:
variable(nazwa)='To jest zmienna nr 2';

które NIE działa.


Udowodniłem wyżej, że działa.
Ale skoro masz żal do wszystkich, że nie działa tak jak ty chcesz, to twoja sprawa.
Jak nie pasuje SM4 to proponuję przejść na SM3.
Dodam tylko, że w SM3 twój kod też nie działa, więc nie opowiadaj bzdur.

Johanson - Sro 11 Kwi, 2012 21:37

A mógłbym grzecznie poprosić o ten 'dowód' ?

Nie mam ochoty na kłótnie, po prostu zależy mi na tym, żeby działało.

Z mojej strony należy się wyjaśnienie:
---------------------------------------------
W wersji '3' (20091130) działała poniższa sekwencja:
Kod:
574  licznik++;
575  zmienna='ED_b'+licznik;
576  output.eval (zmienna+'n'  )=variable('b'+i+'n');

Powyższy kod jest wyjęty wprost z DZIAŁAJĄCEGO programu,
który przekazuje do PHP metodą POST
za każdym razem inne zmienne, o różnych wartościach.
Nie mogę przewidzieć podczas pisania programu
jaka będzie nazwa zmiennej, więc muszę to robić dynamicznie.

Po wgraniu wersji '4' (20110318 , 20110620 , 20110919) pojawił się błąd:
Cytat:
Oczekiwano zapisywalna zmienna ale znalezion "output.eval (zmienna+'n' )" przed "=" w skrypcie:
Scena_::function sendOrder(h:Number, w:Number)
Scena_, linia 576: output.eval (zmienna+'n' )=variable('b'+i+'n'); // nazwa

Dlatego zacząłem kombinować, aby zaczęło działać przykładowo:
Kod:
output.eval (zmienna)='cokolwiek';
  lub
variable('output.+nazwa)='cokolwiek';

Żaden z nich nie działa (fakt, że skopiowałem do netu tylko drugą wersję
i twierdziłem, że ona działała w wersji '3' - za co przepraszam).
Prawidłowo chodziła pierwsza wersja (ta z VAL), co sytuacji nie zmienia.


Jeśli "Espe1" twierdzi, że
Kod:
variable(nazwa)='To jest zmienna nr 2';

działa, to niech zakomentarzuje wcześniejszą linię kodu, tzn.
Kod:
// output.Zmienna_2=nazwa;
variable(nazwa)='To jest zmienna nr 2';

i ... sprawdzi efekt - NIE DZIAŁA.

Pytanie ostateczne:
Może istnieje jednak metoda wysyłania zmiennych do PHP
z wykorzystaniem makrorozwinięcia (jak zwał, tak zwał);
w każdym razie nie w postaci jawnej.

espe1 - Sro 11 Kwi, 2012 23:43

Twoja wersja:
Kod:

onSelfEvent (load)
 {var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1';     // działa
  nazwa='output.Zmienna_2';
  variable(nazwa)='To jest zmienna nr 2';      // działa
  trace('_root 1:  '+output.Zmienna_1);
  trace('_root 2:  '+output.Zmienna_2);
     
  Funkcja();
 }

function Funkcja()
 {var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1';   // działa
  nazwa='output.Zmienna_2';
  variable(nazwa)='To jest zmienna nr 2';    // NIE działa
  trace('');
  trace('Fun 1:  '+output.Zmienna_1);
  trace('Fun 2:  '+output.Zmienna_2);
 }

/*
debug:
_root 1:  To jest zmienna nr 1
_root 2:  To jest zmienna nr 2

Fun 1:  To jest zmienna nr 1
Fun 2:  undefined                     <== nie działa, wywala undefined
*/


Moja wersja:

Kod:

onSelfEvent (load) {
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1';  // działa
nazwa='output.Zmienna_2';
variable(nazwa)='To jest zmienna nr 2';    // działa
trace('_root 1: '+output.Zmienna_1);
trace('_root 2: '+output.Zmienna_2);

Funkcja();
}

function Funkcja(){
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1';   // działa
output.Zmienna_2=nazwa;
variable(nazwa)='To jest zmienna nr 2';    // działa
trace('Fun 1: '+output.Zmienna_1);
trace('Fun 2: '+output.Zmienna_2);


/*
debug:
_root 1: To jest zmienna nr 1
_root 2: To jest zmienna nr 2
Fun 1: To jest zmienna nr 1
Fun 2: To jest zmienna nr 2     <== działa
*/


co do wysyłania zmiennych do php:
Kod:

output.sendAndLoad("plik.php", output, "POST");


Wstawiłeś kod z bykiem i pytasz dlaczego nie działa, poprawiłem kod, a ty dalej swoje.
Jeszcze wprowadzasz ludzi w błąd, że w swish 3 działało. Sprawdziłem, też wywala undefined. Masz więc do wyboru: mój kod, albo "niedziałanie".

Johanson - Sro 11 Kwi, 2012 23:54

Czy mógłybyś zakomentarzować linię, o której mówiłem i zobaczyć efekt?

Proszę czytać ze zrozumieniem!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

espe1 - Czw 12 Kwi, 2012 00:03

Johanson napisał/a:
Czy mógłybyś zakomentarzować linię, o której mówiłem i zobaczyć efekt?

Proszę czytać ze zrozumieniem!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


a niby dlaczego chcesz wywalić to co poprawiłem??? Przecież po to poprawiłem żeby działo.

Człowieku, skąd ty się urwałeś?

Najlepiej zakomentarzuj sobie całość

Johanson - Czw 12 Kwi, 2012 00:13

Ok
Urwałem sie ?? ?
W taki razie: nie komentarzuj.
Sprawdź poniższe:
Kod:

onSelfEvent (load) {
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1  w ROOT';
nazwa='output.Zmienna_2';
variable(nazwa)='To jest zmienna nr 2  w ROOT';
trace('_root 1: '+output.Zmienna_1);
trace('_root 2: '+output.Zmienna_2);

Funkcja();
}

function Funkcja(){
var output:LoadVars=new LoadVars();
output.Zmienna_1='To jest zmienna nr 1  w FUN';
output.Zmienna_2=nazwa;
variable(nazwa)='To jest zmienna nr 2  w FUN';
trace('Fun 1: '+output.Zmienna_1);
trace('Fun 2: '+output.Zmienna_2);
}


Dla jasności:
Do Twojej wersji kodu dodałem tylko 'w ROOT', oraz 'w FUN',
co ma unaocznić Twoje niezrozumienie!!

To, że w funkcji jes widoczna 'Zmienna_2' wynika
z wcześniejszego JAWNEGO podstawienia zmiennej w ROOT.
Kwestia zasięgu!!!!!!!!!!!!!!!!!!!!!!!!!!!!

espe1 - Czw 12 Kwi, 2012 00:23

No i wyświetla prawidłowo w debug (trace):

Kod:


_root 1: To jest zmienna nr 1  w ROOT
_root 2: To jest zmienna nr 2  w ROOT
Fun 1: To jest zmienna nr 1  w FUN
Fun 2: To jest zmienna nr 2  w FUN

Johanson - Czw 12 Kwi, 2012 00:48

Coś mi się wydaje, że moje (a być może i Twoje) nerwy
niepotrzebnie są szarpane przez producenta SwishMax'a.

Otóż sprawa powoli zaczyna się wyjaśniać:
W poziomie ROOT można dowolnie wykorzystywać 'variable(..)',
zaś na poziomie funkcji trzeba NAJPIERW daną (konkretną) zmienną ZAINICJOWAĆ
w postaci jawnej.

Wystarczy sprawdzić:
Kod:

function Funkcja(){
  var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1  w FUN';
  output.Zmienna_2='dupa';    // <---------------------------------------
  variable(nazwa)='To jest zmienna nr 2  w FUN';
  trace('Fun 1: '+output.Zmienna_1);
  trace('Fun 2: '+output.Zmienna_2);
}

lub
Kod:

function Funkcja(){
  var output:LoadVars=new LoadVars();
  output.Zmienna_1='To jest zmienna nr 1  w FUN';
  output.Zmienna_2='';   // < ------------------------------------------
  variable(nazwa)='To jest zmienna nr 2  w FUN';
  trace('Fun 1: '+output.Zmienna_1);
  trace('Fun 2: '+output.Zmienna_2);
}

Tyle, że ... co mi z tego, że muszę jawnie podstawiać,
skoro mi właśnie zależy na uniwersalności.

Ostatecznie chodzi o stworzenie funkcji:
Wyslij(zmiennaNazwa,zmiennaWartosc),
która przecież nie może wiedzieć w momencie jej tworzenia
jaka będzie nazwa zmiennej, więc nie może jej zainicjować.

espe1 - Czw 12 Kwi, 2012 10:38

o wysyłaniu danych do php było całkiem niedawno,

tutorial i pliki źródłowe:

http://flashblog.swish.pl...unikacja-z-php/

Johanson - Czw 12 Kwi, 2012 11:16

OK
Poddaje się.
Nic nie poradzę na Twoje niezrozumienie tematu.

espe1 - Czw 12 Kwi, 2012 12:28

opisz dokładnie co chcesz wysłać, wrzuć plik swi i php, bo coś mi się wydaje, że do niczego ci to nie jest potrzebne
Johanson - Pią 13 Kwi, 2012 17:37

Chcę, żeby z programu SwishMax były przesyłane zmienne z ich wartościami
do PHP via POST:

Swish
Kod:
  . . .
  Wyslij('parametrA','czerwony');
  . . .
  Wyslij('upust',25);
  . . .
  Wyslij('Nazwisko','Abacki');
  . . .
  Wyslij('cecha_623','BGP-34/34');
  . . .


a w PHP można było wydrukować
Kod:
  . . .
  print_r(POST);
  . . .


Podreślam:
NIE JESTEM W STANIE PODAĆ ANI ILOŚCI ZMIENNYCH,
ANI ICH NAZW !! !

Do czego to jest potrzebne?
Bez komentarza

espe1 - Pią 13 Kwi, 2012 17:41

http://flashblog.swish.pl...unikacja-z-php/

lub:
http://www.swish-designs.co.uk/index.php?pageid=48

Johanson - Pią 13 Kwi, 2012 17:44

Proponujesz w pierwszym wariancie wysyłkę 'myVars',
w którym są konkretne zmienne: 'Name', 'Email', 'Message',
zaś wariant drugi wysyła wszystko z ROOT'a.

Otóż przyjmij do wiadomości, że program obsługujący zamówienia
działa od przeszło dwu lat (moduł główny w wersji '3')
i radzi sobie zupełnie nieźle na gruncie SWISH-PHP-mySQL

Do tej pory to działa !!
Tyle, że w wersji '3'

Przyszła wersja '4' i zmieniła się obsługa
funkcji 'E V A L' oraz 'V A R I A B L E',
której to zmiany nie przyjmujesz do wiadomości.


Powered by phpBB modified by Przemo © 2003 phpBB Group