Avatar billede rthuls Nybegynder
04. februar 2004 - 14:46 Der er 16 kommentarer og
2 løsninger

Strict data typing

Jeg har lidt problemer med at finde ud af Strict data typing i AS2. Hvis jeg vil oprette et nyt XML objekt skriver jeg f.eks:

var minXML:XML = new XML();


, men hvad hvis jeg vil oprette et nyt style sheet objekt, hvad skal jeg så skrive som data type?

var minCSS:??? = new TextField.StyleSheet();


og hvad hvis jeg vil oprette et nyt tekstfelt? Det her virker i hvert fald ikke:

var mitTxt:TextField = new TextField();
mitTxt = createTextField("mitTxt", this.getNextHighestDepth(), 0, 0, 100, 100);
Avatar billede jakwag Nybegynder
04. februar 2004 - 14:55 #1
hej

og hvad hvis jeg vil oprette et nyt tekstfelt?

mitTxt = createTextField("mitTxt", this.getNextHighestDepth(), 0, 0, 100, 100);
var mitTxt:TextField;
Avatar billede barklund Nybegynder
04. februar 2004 - 14:55 #2
Rart at du spørger - så fik jeg lige testet det:

var minCSS:TextField.StyleSheet = new TextField.StyleSheet();
var min_txt:TextField = this.createTextField("foo", 1, 1, 1, 100, 100);

TextField har ingen constructor - så du kan ikke skrive new TextField() :)
Avatar billede jakwag Nybegynder
04. februar 2004 - 14:56 #3
jeg tror at et stylesheet er:

var minCSS:TextField.StyleSheet = new TextField.StyleSheet();


: ) Jakob
Avatar billede barklund Nybegynder
04. februar 2004 - 14:59 #4
Næ, sådan her bliver det (createTextField returnerer ikke noget):

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var min_txt:TextField = foo_txt;
min_txt.border = true;
min_txt.text = "hey";
min_txt.backgroundColor = 0xFF0000;
trace(typeof min_txt);
Avatar billede jakwag Nybegynder
04. februar 2004 - 15:13 #5
hvorfor ikke bare:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var foo_txt:TextField;

??
Avatar billede barklund Nybegynder
04. februar 2004 - 15:41 #6
Når du skriver:

var noget;

Så er det fuldstændigt det samme som:

delete noget;
var noget;

Du sletter alle tidligere referencer som variabler før måtte have indeholdt og sætte den til at indeholde noget nyt - og det er så undefined indtil videre...
Avatar billede jakwag Nybegynder
04. februar 2004 - 15:51 #7
Jeg kan se hvad du mener, men sådan funger det da ikke helt.

man kan jo sagtens sige:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var foo_txt:TextField;
foo_txt.text = "hej";

så foo_txt er ikke blevet undefined.

Til gengæld synes jeg at det er underligt at skrive:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var min_txt:TextField = foo_txt;

Hvad får man så? et object med to forskellige referencer?

prøv f.eks. at skrive

trace(min_txt); //output: foo_txt

så man har et obejct som hedder foo_txt men som man så også kan kalde med min_txt. Er det godt?
Avatar billede jakwag Nybegynder
04. februar 2004 - 15:52 #8
man kan jo også godt datatype et object(f.eks. mc) som er lavet på stage'en med:

var mitMC:MovieClip;

Det må da være lidt det samme.
Avatar billede rthuls Nybegynder
04. februar 2004 - 21:17 #9
Tak for jeres indlæg. Kan jeg ikke få jer begge til at smide et svar?

Jakwag >> Jeg er enig med dig i at det virker mærkeligt først at oprette tekstfelt og derefter lave en reference til et variabelnavn. Det virker som den omvendte måde at gøre det på:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var min_txt:TextField = foo_txt;
Avatar billede barklund Nybegynder
04. februar 2004 - 21:30 #10
Strict Data Typing (fasttypning) er KUN syntaks i udviklingen. Det er kun ment som en hjælp til at skrive actionscript - det findes ikke i en SWF og her kan man sagtens have andre typer end de fasttypede...

Og selvfølgelig kan man have flere referencer til et objekt. I en tom film er _root det samme som this eller _level0 - det har du jo altid vidst, så ja, du kan også lave endnu flere referencer til samme objekt. Komplekse datatyper er jo pass by reference, mens de simple (string, number, boolean, null, undefined) er pass by value og derfor kun kan have én reference.

Jeg har mit første kapitel klar - netop om variabler og datatyper og herunder også lidt om fasttypning - kan sende det over hvis det har interesse ;)
Avatar billede barklund Nybegynder
04. februar 2004 - 21:43 #11
Hm, overraskende nok kan du ikke helt fjerne referencen til foo_txt:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
trace("forsøger at slette: "+delete foo_txt); // giver false - den kan ikke slettes
trace("foo_txt efter delete: "+(foo_txt instanceof TextField)); // yup, stadig TextField
foo_txt.text = "foo";

Det er faktisk lidt syret... Jeg har også prøvet at sætte "kan slettes" flag med ASSetPropFlags... Hmm... det er faktisk lidt mærkeligt...

Men ja, så kan du fasttype dit tekstfelts-reference med:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
var foo_txt:TextField;

Og herefter vil den typechecke som et tekstfelt - det ville den ikke ellers.

Årsagen til at det kan lade sig gøre er, at variablen/referencen "låses" på en eller anden vis. Man kan heller ikke overskrive den:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
delete foo_txt;
var foo_txt:TextField;
var foo_txt:String;
foo_txt.text = "hej";

Hm, jeg oplever nogle mærkværdigheder ved typecheckeren lige nu... Skal lige forske en hel masse i det - meget interessant - se for eksempel:

var test:XML = new XML();
delete text;
var test:Array = new Array();
test.length = 2;

4. linje giver fejl - den siger at xml ikke har nogen 'length'-egenskab. Men den er jo også redefineret som et array(?)... Det virker ikke så gennemtænkt :(

// Barklund
Avatar billede rthuls Nybegynder
05. februar 2004 - 08:44 #12
"Jeg har mit første kapitel klar - netop om variabler og datatyper og herunder også lidt om fasttypning - kan sende det over hvis det har interesse ;)"

Fedt, er du ved at skrive en AS bog? Under alle omstændigheder må du meget gerne sende dit kapitel til mig. Du kan skrive til rthuls@hotmail.com
Avatar billede nikolajdu Nybegynder
05. februar 2004 - 09:22 #13
Barky - Jeg vil da også gerne kigge på det :)
Avatar billede jakwag Nybegynder
05. februar 2004 - 10:42 #14
barklund > Ja, det er lidt mystisk, det giver jeg dig ret i.

det gælder osse for de simple datatyper. f.eks.

var test:String = "hejsa";
var test:Number;
trace(test)//output "hejsa"

så uanset hvad sletter var altså ikke som du siger den burde. (det vælger jeg så at tro på :) )

med hensyn til:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
trace("forsøger at slette: "+delete foo_txt); // giver false - den kan ikke slettes
trace("foo_txt efter delete: "+(foo_txt instanceof TextField)); // yup, stadig TextField
foo_txt.text = "foo";

Så kan du ikke fjerne et TextField delete men kun med removeTextField:

_root.createTextField("foo_txt", 1, 1, 1, 100, 100);
trace("forsøger at slette: "+foo_txt.removeTextField()); // giver undefined
trace("foo_txt efter delete: "+(foo_txt instanceof TextField)); // false, den er væk
foo_txt.text = "foo";

Når du er færdig med dit kapitel vil jeg også meget gerne læse det igennem.

: ) Jakob
Avatar billede barklund Nybegynder
14. juni 2004 - 14:41 #15
Et svar - jakwag skal vist også lige droppe et her :)
Avatar billede jakwag Nybegynder
14. juni 2004 - 16:03 #16
ja, mindsandten! Gammel gæld der skal betales ;)... eller osse er det bare os der er lidt langsomme...
Avatar billede rthuls Nybegynder
16. juni 2004 - 14:16 #17
Tak!
Avatar billede barklund Nybegynder
16. juni 2004 - 14:24 #18
Og tark for points :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester