Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-10-2004, 21:37   #1 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Dynamische Position von dyn. Textfeldern innerhalb eines MC

Hallo zusammen,

ich hab ein wenig hier im Forum gesucht, aber nicht das passende für mein Problem gefunden.

Ich habe einen MovieClip, der 3 dynamische Textfelder enthält.

Überschrift, einzeilig.
News DE, mehrzeilig.
News EN, mehrzeilig.

Sind nun 3 Überschriften vorhanden, wird diese MC 3 mal instanziert, immer direkt untereinander mit 20px Abstand. Anschließend wird das ganze in eine Scrollpane gezogen.
Funktioniert auch alles wunderbar.

Nun mein Problem. Bleiben wir bei dem Beispiel mit den 3 Überschriften und den dazugehörigen Inhalten.
Layoutbeispiel:

Überschrift 1
TextEN
TextEN
TextEN
TextEN
TextEN
TextEN

TextDE
TextDE
TextDE
TextDE

Überschrift 2
TextEN
TextEN





TextDE



Überschrift 3
TextEN
TextEN
TextEN
TextEN



TextDE
TextDE
TextDE
TextDE


Das Problem was nun auftaucht, ist folgendes.
Die 3 Texte, sowohl englisch auch auch deutsch sind unterschiedlich lang.
Wenn nun stur die einzelnen MC untereinander gesetzt werden, entsteht zb. eine große Lücke zwischen Überschrift 3 und dem darüberliegenden englischen Text von Überschrift 2, da diese kürzer ist.
Auch innerhalb des MC gibt es Probleme. Die Textfelder sind standardmäßig 200Px hoch und liegen untereinander. Sind nun bei einer Überschrift (hier zb 2) die mehrzeiligen Texte extrem kurz, dann klaffen zwischen diesen beiden ebenfalls große Abstände.
textfield.autosize=true; hilft hier nicht weiter, da es ja um die Position geht.

Ich habe leider keine Erfahrungen mit Textfield.prototypes… ist es denn nicht möglich, jeweils die im MovieClip befindlichen Textfelder dynamisch zu vergrößern (sollte mit autosize gehen) und dann aber auch noch ihre Höhe auszulesen, um kurz darunter dann das neue Textfeld zu schieben bzw. zu instanzieren? Also immer 5px unter dem ersten Textfeld das neue anlegen, egal wie hoch das erste ist?

Und dann die Gesamtgröße des MovieClips auszulesen, um dann abhängig von seiner Höhe wieder relativ dazu 20px darunter den nächsten Mc dort zu instanzieren?

Quasi so skizziert…

PHP-Code:
Actionscript 1.0
überschrift
.text='topic1';
newsEn._y=this._y-10// 10px unter der Mc Oberkannte
newsEN.autoSize=true;
newsEn.text='ichbin5zeilig';

newsDe._y=this._y-10-newsEn._height-5//10px Oberkante MC, Höhe des darüber befindlichen Textfeldes, 5px Abstand
newsDe.text='ichbin3zeilig';
newsDe.autoSize=true;

//Dann neuer MC

newsMC2._y=newsMC1._y-newsMC1._height-20// Position des ersten MC, die Höhe dessen + 20px Abstand darunter… 

Und erst dann alles in die Pane!

Ich möchte das nicht als einzelnes Textfeld mit HTML Formatierung realiseren… ist auch gar nicht möglich hier, da noch Features eingebaut werden, die das nicht zulassen.


Hier ist mein derzeitiges Script

PHP-Code:

var scrollpaneWidth=300;
var 
scrollpaneHeight=150;
var 
scrollpaneXPos=30;
var 
scrollpaneYPos=30;

_global.newsdBase=function()
    {
    var 
newsRead=new LoadVars();
    
newsRead.object=this;
    
newsRead.root_id=1;
    
newsRead.sendAndLoad('query.php',newsRead,'POST');
    
newsRead.onload=function(success)
        {
        if(
success)
            {
            var 
container=_root.createEmptyMovieClip('container',2);
            var 
base_x=0;
            var 
base_y=0;
            for(var 
i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('newsElement','newsElement_'+i,i+1);
                
element.date=this['date_'+i];
                
element.headline=this['news_headline_'+i].split('\r\n').join('\r');
                
element.de=this['news_de_'+i].split('\r\n').join('\r');
                
element.en=this['news_en_'+i].split('\r\n').join('\r');
                
element._x=base_x;
                
element._y=base_y+(i*element._height)+20;
                
delete this.object['newsRead']; 
                }
            var 
scrollpane=_root.attachMovie('FScrollPaneSymbol','FScrollPaneSymbol',1);            
            
scrollpane.width=scrollpaneWidth;
            
scrollpane.height=scrollpaneHeight;
            
scrollpane._x=scrollpaneXPos;
            
scrollpane._y=scrollpaneYPos;
            
scrollpane.setHScroll(false);
            
scrollpane.setVScroll(true); 
            
scrollpane.setScrollContent(container);
            }
        };    
    };
    
_global.gigdBase=function()
    {
    var 
gigRead=new LoadVars();
    
gigRead.object=this;
    
gigRead.root_id=2;
    
gigRead.sendAndLoad('query.php',gigRead,'POST');
    
gigRead.onload=function(success)
        {
        if(
success)
            {
            var 
container=_root.createEmptyMovieClip('container',2);
            var 
base_x=0;
            var 
base_y=0;
            for(var 
i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('gigElement','gigElement'+i,i+1);
                
element.date=this['gig_date_'+i].split('\r\n').join('\r');
                
element.time=this['gig_time_'+i].split('\r\n').join('\r');
                
element.event=this['gig_event_'+i].split('\r\n').join('\r');
                
element.town=this['gig_town_'+i].split('\r\n').join('\r');
                
element._x=base_x;
                
element._y=base_y+(i*element._height)+20;
                
delete this.object['gigRead']; 
                }
            var 
scrollpane=_root.attachMovie('FScrollPaneSymbol','FScrollPaneSymbol',1);            
            
scrollpane.width=scrollpaneWidth;
            
scrollpane.height=scrollpaneHeight;
            
scrollpane._x=scrollpaneXPos;
            
scrollpane._y=scrollpaneYPos;
            
scrollpane.setHScroll(false);
            
scrollpane.setVScroll(true); 
            
scrollpane.setScrollContent(container); 
            }
        };
    };
    
_global.lyricsdBase=function()
    {
    var 
lyricsRead=new LoadVars();
    
lyricsRead.object=this;
    
lyricsRead.root_id=3;
    
lyricsRead.sendAndLoad('query.php',lyricsRead,'POST');
    
lyricsRead.onload=function(success)
        {
        if(
success)
            {
            var 
container=_root.createEmptyMovieClip('container',2);
            var 
base_x=0;
            var 
base_y=0;
            for(var 
i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('lyricsElement','lyricsElement'+i,i+1);
                
element.title=this['lyrics_title_'+i].split('\r\n').join('\r');
                
element.content=this['lyrics_content_'+i].split('\r\n').join('\r');
                
element._x=base_x;
                
element._y=base_y+(i*element._height)+20;
                
delete this.object['lyricsRead']; 
                }
            var 
scrollpane=_root.attachMovie('FScrollPaneSymbol','FScrollPaneSymbol',1);            
            
scrollpane.width=scrollpaneWidth;
            
scrollpane.height=scrollpaneHeight;
            
scrollpane._x=scrollpaneXPos;
            
scrollpane._y=scrollpaneYPos;
            
scrollpane.setHScroll(false);
            
scrollpane.setVScroll(true); 
            
scrollpane.setScrollContent(container);
            }
        };
    };
    
_global.pressdBase=function()
    {
    var 
pressRead=new LoadVars();
    
pressRead.object=this;
    
pressRead.root_id=4;
    
pressRead.sendAndLoad('query.php',pressRead,'POST');
    
pressRead.onload=function(success)
        {
        if(
success)
            {
            var 
container=_root.createEmptyMovieClip('container',2);
            var 
base_x=0;
            var 
base_y=0;
            for(var 
i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('pressElement','pressElement'+i,i+1);
                
element.author=this['press_author_'+i].split('\r\n').join('\r');
                
element.body=this['press_text_'+i].split('\r\n').join('\r');
                
element._x=base_x;
                
element._y=base_y+(i*element._height)+20;
                
delete this.object['pressRead']; 
                }
            var 
scrollpane=_root.attachMovie('FScrollPaneSymbol','FScrollPaneSymbol',1);            
            
scrollpane.width=scrollpaneWidth;
            
scrollpane.height=scrollpaneHeight;
            
scrollpane._x=scrollpaneXPos;
            
scrollpane._y=scrollpaneYPos;
            
scrollpane.setHScroll(false);
            
scrollpane.setVScroll(true); 
            
scrollpane.setScrollContent(container); 
            }
        };
    };
    
_global.newsletterInsert=function()
    {
    var 
newsletterWrite=new LoadVars();
    
newsletterWrite.object=this;
    
newsletterWrite.operation='write';
    
newsletterWrite.email=_root.input.text;
    
newsletterWrite.sendAndLoad('newsletter.php',newsletterWrite,'POST');
    
newsletterWrite.onload=function(success)
        {
        if(
success)
            {
            if(
this.status=='noExistence')
                {
                
trace('ok');
                }
            if(
this.status=='existence')
                {
                
trace('exists');
                }
            
delete this.object['newsletterWrite']; 
            }
        };
    };
    
_root.c1.onRelease=function()
    {
    
_global.newsDbase();
    };
_root.c2.onRelease=function()
    {
    
_global.gigDbase();
    };
_root.c3.onRelease=function()
    {
    
_global.lyricsDbase();
    };
_root.c4.onRelease=function()
    {
    
_global.pressDbase();
    }; 

Und hier der Link zu der isolierten Funktionsweise… wichtig ist nur das was man da auf 1 Triggern kann… der Rest ist später analog dazu…

Die Höhe des immer darüberliegenden MC wird also schon berücksichtigt… um meine Frage nun noch konkret zu formulieren…

Wie variiere ich die Textfelder entsprechend des Inhalts in ihrer Höhe und lese dann deren Höhe zur Positionsbestimmtung des 2 Textfeldes aus.


Liebe Grüße

Yves
  Mit Zitat antworten
Alt 05-10-2004, 21:50   #2 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
hi,
hab dein script jetzt nicht genauer 'studiert',
wenn du aber die texte nacheinander lzuweist,
dann hast du die jeweilige höhe des
gerade erstellten textfeldes und kannst
damit weiter positionieren.
also die mc's rekursiv erstellen und die textfelder
in diesen mc's ebenfalls.

grz
warrantmaster ist offline   Mit Zitat antworten
Alt 05-10-2004, 22:02   #3 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Moin Jens…

Ja so dachte ich mir das ja auch…

Aber mein Ansatz scheint falsch zu sein… hier die bestimmende Stelle.

PHP-Code:
for(var i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('newsElement','newsElement_'+i,i+1);
                
element.date=this['date_'+i];
                
element.headline=this['news_headline_'+i].split('\r\n').join('\r');
                
element.de_field.autoSize=true;
                
element.en_field.autoSize=true;
                
element.de=this['news_de_'+i].split('\r\n').join('\r');
                
element.en=this['news_en_'+i].split('\r\n').join('\r');
                
element.en_field._y=element.de_field._height+5;
                
element._x=base_x;
                
element._y=base_y+(i*element._height)+20;
                
delete this.object['newsRead']; 
                } 
Ich nahm an, das ich zunächst das erste Feld autosized stelle und dann seine Höhe bekomme, um darunter mit dem Abstand der Höhe + 5px Freiraum das 2. Feld zu setzen. Und dann dachte ich, ergibt sich daraus die Gesamte Höhe.
Falsch gedacht.


Yves
  Mit Zitat antworten
Alt 05-10-2004, 22:18   #4 (permalink)
_//\\#//\\_
 
Benutzerbild von warrantmaster
 
Registriert seit: Jan 2003
Beiträge: 7.060
yo, laß dir in der schleife mal die höhe tracen.
ich glaube mal was ähnliches probiert zu haben,
der wert ist zu spät da (...muß mal kramen im kopp...)
warrantmaster ist offline   Mit Zitat antworten
Alt 05-10-2004, 23:14   #5 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
So, jetzt hab ich das Problem gelöst…

Die Höhenangaben der Textfelder sind nicht exakt, habe ich festgestellt… immer etwas geringer… also habe ich etwas Abweichung einkalkuliert…

Und ich Stratege habe als Referenz immer die Größe des MCs, der ja Variabel ist, genommen und diesen als Konstante betrachtet und mit i multipliziert.
Richtig ist es, i wegzulassen, da das nur mit Konstanten funktioniert und sich dann immer auf die Größe des wachsenden, übergeordneten Container MCs zu beziehen!

Hier das Script.

PHP-Code:

//Actionscript 1.0

var container=_root.createEmptyMovieClip('container',2);
            var 
base_x=0;
            var 
base_y=0;
            for(var 
i=0;i<this.repeats;i++)
                {
                var 
element=container.attachMovie('newsElement','newsElement_'+i,i+1);
                
element.date=this['date_'+i];
                
element.headline=this['news_headline_'+i].split('\r\n').join('\r');
                
element.de_field.autoSize=true;
                
element.en_field.autoSize=true;
                
element.de=this['news_de_'+i].split('\r\n').join('\r');
                
element.en=this['news_en_'+i].split('\r\n').join('\r');                
                
element.en_field._y=element.de_field._height+40;
                
element._x=base_x;
                if(
i==0)
                    {
                    
element._y=base_y+container._height;
                    }
                else
                    {
                    
element._y=base_y+container._height+15;
                    }
                
delete this.object['newsRead']; 
                }
            var 
scrollpane=_root.attachMovie('FScrollPaneSymbol','FScrollPaneSymbol',1);            
            
scrollpane.width=scrollpaneWidth;
            
scrollpane.height=scrollpaneHeight;
            
scrollpane._x=scrollpaneXPos;
            
scrollpane._y=scrollpaneYPos;
            
scrollpane.setHScroll(false);
            
scrollpane.setVScroll(true); 
            
scrollpane.setScrollContent(container);
            } 

Danke und liebe Grüße

Yves

(…wie immer auf dem richtigen Weg… nur zu beschränkt in der Denkweise…)
  Mit Zitat antworten
Alt 05-10-2004, 23:22   #6 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Zitat:
Zitat von warrantmaster
ch glaube mal was ähnliches probiert zu haben,
der wert ist zu spät da (...muß mal kramen im kopp...)
Das war so bei dynamisch in Container geladenen Bildern… da ist die Höhe zu spät da… irgendwas wegen Header laden… hehe…
Auch Handler auf solche Container zu weisen, geht nicht direkt.

Als Workaround dafür mache ich immer das ganze mittels onEnterFrame Handler des Containers und frage die totale Größe und die geladenen Bytes ab (wichtig, das man nicht total==current abfragt, sondern noch dazu && total>4 hinzufügt… sonst läuft das ins Leere). Bei Erfüllung dessen hab ich die Position gesetzt, das ganze _visible=true gesetzt (vorher false, damit man die Bewegung nicht sieht beim Positionieren) und letztens Endes den onEnterFrame deleted.

Hab ich irgendwo hier auch in einem Tutorial von mir geschrieben… da ging es darum, dynamisch Bilder in einen Container zu laden, diesen dann mit einem dynamisch gezeichnetem Rahmen zu versehen und noch nebeneinander anzuordnen, sowie dem Ganzen einen onRelease Handler zuzuweisen.

Liebe Grüße

Yves
  Mit Zitat antworten
Alt 06-10-2004, 11:42   #7 (permalink)
backToThe._roots
 
Benutzerbild von Blax_ed
 
Registriert seit: Feb 2003
Ort: Ebnat-Kappel [CH]
Beiträge: 1.571
sehr nett! so das ganze hier... gut geschrieben der koot!
__________________
Cheers,
Flow!
Blax_ed ist offline   Mit Zitat antworten
Alt 06-10-2004, 12:06   #8 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Vielen Dank für die Blumen

Aber das hätte man sicherlich auch noch eleganter Lösen können… frag mich jetzt aber nicht wie… frag in 2 Jahren nochmal



Yves
  Mit Zitat antworten
Alt 06-10-2004, 22:18   #9 (permalink)
backToThe._roots
 
Benutzerbild von Blax_ed
 
Registriert seit: Feb 2003
Ort: Ebnat-Kappel [CH]
Beiträge: 1.571
hehe.. jau mach ich...
__________________
Cheers,
Flow!
Blax_ed ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele