13. november 2004 - 22:55Der er
5 kommentarer og 1 løsning
Problem med dynamiske tekstfelter
Hej Alle!
Jeg har et problem med ActionScript, som jeg ville blive meget, meget glad hvis der var nogen, der ville hjælpe mig med. Jeg har en anelse om at det ikke er helt nemt, så spørg endelig hvis, der mangler nogle oplysninger i det nedenstående.
For det første: Jeg bruger Flash MX (ikke 2004), og jeg har ikke penge nok til at opgradere. Hvis i vil tage hensyn til dette i evt. kodeeksempler ville det være rart. Og i øvrigt: Jeg kan kode. Men ikke så fandens meget.
Projektet: At lave et stykke eBook-Reader-agtigt software, der kan vise en bog på skærmen.
Udfordingen: Jeg har to tekstfelter. Det ene hedder left_page og det andet hedder right_page. Jeg har også en temmelig stor tekstfil, der hedder book.txt. Hele bogen er importeret til variablen _root.full_text Jeg vil meget gerne være i stand til at at loade bogen ind i de to tekstfelter side for side, og at kunne bladre frem og tilbage. Det er et must at font-størrelsen kan ændres dynamisk.
Problemet: Hvordan får jeg AS til først at fylde left_page tekstfeltet med den rette mængde tekst (der jo er afhængig af font-størrelse), og derefter fortsætte med at fylde right_page tekstfeltet?
Udover de 60 point er der en status som "God of All" i mit univers på spil ;-)
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Oki - nu har jeg lige smedet et stykke kode sammen, der burde kunne gøre det stads:
var pagesNum; var currentNum; function createPages(txt){ pagesNum = 0; currentNum = 1; tmpTextArr = txt.split(" "); createNewPage(); this.page1._visible = true; } function createNewPage(){ pagesNum++; var end = true; var mc = this.attachMovie("page", "page"+pagesNum, pagesNum); for(i=0;i<tmpTextArr.length;i++){ mc.left_page.text += tmpTextArr[i]+" "; if(mc.left.maxscroll > 1){ mc.left_page.text = tmpTextArr.splice(0, i-1).join(" "); end = false; break; } } if(!end){ for(i=0;i<tmpTextArr.length;i++){ mc.right_page.text += tmpTextArr[i]+" "; if(mc.right.maxscroll > 1){ mc.right_page.text = tmpTextArr.splice(0, i-1).join(" "); createNewPage(); break; } } } mc._visible = false; } function nextPage(){ if(currentNum < pagesNum){ this["page"+currentNum]._visible = false; this["page"+(++currentNum)]._visible = true; } } function prevPage(){ if(currentNum > 1){ this["page"+currentNum]._visible = false; this["page"+(--currentNum)]._visible = true; } } createPages(_root.full_text);
For at få skidtet til at virke, skal du smide det i et tomt mc (ligemeget, men nok smartest) og så skal du lave et mc, der indeholder dine to tekstfelter: left_page og right_page, og give dette linkagenavnet i library'et "page".
Så smider du bare dit mc, med koden der hvor du vil have det og vupti, du skulle kunne se side 1. Du kan så bladre frem og tilbage med funktionerne:
nextPage(); og prevPage();
Det kan godt være, at hvis der er tale om meget tekst, at det så kan tage lidt tid før der sker noget eller at det giver andre problemer, men det må vi se på. Og det er desuden ret enkelt at sætte sidenumre på eller lign.
Jeg har prøvet at gøre som du sagde så præcist som det var muligt for mig. Det giver nogle lidt okkulte problemer. Den viser ikke teksten, men laver to tekstfelter. Eh, jeg tror tingene bliver lidt nemmere af at jeg lige uploader testfilen. Hvilket hermed er gjort til www.skodpotten.dk/flash/flashbog.zip. Der ligger også et par tekstfiler til at teste med.
Hovsa: og hvis man lige husker i den af tekstfilerne, der hedder tine.txt at omdøbe variabelnavnet fra left_page til full_text så er man bedre kørende hvis man tester den store fil... :-/
Det er fordi din tekst ikke er hentet før du kalder "createPages()" Og fjern desuden variabelnavnene på dine page_left og page_right, og fjern instansen af "sider" fra hovedscenen. Giv så din instans af "kode" instancenavnet "book" og skriv denne kode i stedet for din loadVariables():
var bogVars = new LoadVars(); bogVars.onLoad = function(ok){ if(ok){ kode.createPages(this.full_text); } } bogVars.load("tinetester.txt");
og slet desuden sidste linje: createPages(_root.full_text); i "kode"...
Der var lige et par enkelte typos der skulle rettes, men det var nemt at finde med lidt tracing. Så kører det også derudaf nu.
if(mc.left.maxscroll > 1){ ... } skulle være left_page istedet for left, og det samme for den anden if-statement med right.
Den ruller rundt og ligger død når jeg prøver at køre hele den store tekstfil igennem, men det gør mindre. Den kan fint klare sig til præsentationsformål.
ja det er rigtigt - det var fordi mine egen tekstfelter hed "left" og "right", men jeg ville for pædagogiens skyld lige ændre det til dem du havde, men var vist lidt træt ;)
Og et svar :)
Synes godt om
Ny brugerNybegynder
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.