Avatar billede kdtac Nybegynder
13. november 2004 - 22:55 Der 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 ;-)
Avatar billede pyroman Nybegynder
14. november 2004 - 00:08 #1
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.
Avatar billede kdtac Nybegynder
14. november 2004 - 00:49 #2
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.

-KD
Avatar billede kdtac Nybegynder
14. november 2004 - 00:55 #3
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... :-/

MVH

-KD

...Der værdsætter hjælpen enormt meget :-)
Avatar billede pyroman Nybegynder
14. november 2004 - 11:47 #4
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"...

SÅ burde du være kørende
Avatar billede kdtac Nybegynder
14. november 2004 - 15:22 #5
Hereuka! Det virker!

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.

Tak!

-KD

Eh, sender du ikke lige et svar? :-)
Avatar billede pyroman Nybegynder
14. november 2004 - 15:39 #6
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 :)
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