Einzelnen Beitrag anzeigen
Alt 07-06-2004, 11:59   #1 (permalink)
derRaab
Markus Raab
 
Benutzerbild von derRaab
 
Registriert seit: Aug 2001
Ort: Berlin Friedrichshain
Beiträge: 924
Lightbulb Prototyp zur Positionsermittlung innerhalb eines Textfeldes

Hallo Leute,

ich habe eine Funktion erstellt, mit der sich die Koordinaten eines bestimmten Strings innerhalb eines Textfeldes ermitteln lassen.

Leider funktioniert meine Lösung nicht mit HTML-Textfeldern, aber ich denke auch so ist sie sehr nützlich.

Ich habe schon etwas getestet, würde euch aber bitten noch mal auf eurem System verschiedene Test, mal mit eingeschlossenem Text, mal mit Systemschrift und in verschiedenen Größen und Variationen durchzuführen. Vor allem interessiert mich, was MAC-User sagen und Leute mit ranzigen Rechnern.

Ich habe das Ganze als Prototypen angelegt, da ich in dieser Projektumgebung leider nur auf Flash MX zurückgreifen kann. Umschreiben als AS2.0-Klasse ist ja kein Problem.

Hm, ich komme mit dem Forumsupdate noch nicht ganz klar. AS-Highlight scheint noch nicht möglich zu sein. Deshalb einfach als PHP-Highlight-Version:

Hier also erst mal der Prototyp:

PHP-Code:
TextField.prototype.getTextCoordinates = function (str:Stringdepth:Number) {
    
/*

    derRaab(); - [url]http://www.derRaab.com[/url]

        Liefert einen Array mit den Koordinaten des Strings
        innerhalb des Textfeldes zurück
    
        Arguments : str   ->  der zu suchende Teilstring
                    depth ->  eine freie Ebene, auf der gearbeitet werden kann
        */
        
    // Wenn depth nicht übergeben wurde, einen Standardwert verwenden
    
var depth = (depth == undefined) ? 9876 depth;
    
    
// Auf dieser Ebene einen temporären MovieClip
    // zur Ermittlung der Position erstellen    
    
var mc:MovieClip this._parent.createEmptyMovieClip ("RAAB_TEXTFIELD_POSITION_CHECK_TEMP_MC"depth);
    
    
// Darin eine Kopie dieses Textfeldes anlegen
    
mc.createTextField ("tmp_txt"100this._widththis._height);
    var 
tmp_txt mc.tmp_txt;
    
tmp_txt.setNewTextFormat (this.getTextFormat ());
    var 
param = new Array ('multiline''wordWrap''embedFonts''type');
    for (var 
0param.lengthi++) {
        
tmp_txt[param[i]] = this[param[i]];
    }
    
tmp_txt.autoSize 'left';
    
    
// Text bis einschließlich zum gesuchten String anzeigen
    
var previous_str this.text.split (str)[0];
    
tmp_txt.text previous_str str;
    
    
// Textfeldbedingter Versatz
    // (Text fängt nicht direkt in der linken oberen Ecke an)
    
var offset 2;
    
    
// Unterkante des Textes
    
var bottom tmp_txt._height offset;
    
    var 
singleLineHeight tmp_txt._height tmp_txt.bottomScroll;
    
    
// Oberkante des Textes
    
var top bottom singleLineHeight offset;
    
    
// letzte Zeile im Textfeld ermitteln
    
tmp_txt.text '';
    var 
textParts previous_str.split (' ');
    for (var 
0textParts.lengthi++) {
        
tmp_txt.text += textParts[i] + ((textParts.length 1) ? ' ' str);
        if (
bottom == tmp_txt._height offset) {
            
// Abbrechen, damit i den richtigen Wert behält
            
break;
        }
    }
    
tmp_txt.text '';
    for (
itextParts.lengthi++) {
        
tmp_txt.text += textParts[i] + ((textParts.length 1) ? ' ' '');
    }
    
    
// Linke Kante
    
var left tmp_txt.textWidth offset;
    
    
tmp_txt.text += str;
    
    
// Rechte Kante
    
var right tmp_txt.textWidth offset;
    
    
// temporären MovieClip wieder entfernen
    
mc.removeMovieClip ();
    
    
// Rückgabe der ermittelten Werte
    
var = new Array ();
        
a['bottom'] = this._y bottom;
        
a['top'] = this._y top;
        
a['left'] = this._x left;
        
a['right'] = this._x right;
    return 
a;
}; 
Und nun noch das Testscript. Bitte verändert einfach mal die Parameter und Textmenge.

PHP-Code:
//
// TextFormat
var tf = new TextFormat();
    
tf.font 'verdana';
    
tf.size 30;

//
// TextFeld
this.createTextField("my_txt",13030300100);
my_txt.wordWrap true;
my_txt.autoSize 'left';
my_txt.text "Das ist der Text, der durchsucht und weiterbearbeitet, geparst usw. werden soll nach 'Lücke' und deren x und y Position ermittelt.";
my_txt.setTextFormat(tf);

//
// Koordinaten ermitteln
var coords my_txt.getTextCoordinates('Lücke',2);

//
// gesuchten Text markieren
this.createEmptyMovieClip("mark_mc",3);
with (mark_mc){
    
_x coords['left'];
    
_y coords['top'];
    
width coords['right'] - coords['left'];
    
height coords['bottom'] - coords['top'];
    
lineStyle(0);
    
lineTo(width0);
    
lineTo(widthheight);
    
lineTo(0height);
    
lineTo(0,0);

So, nun bin ich mal auf eure Testberichte gespannt. Jetzt sollte eine Lückentextaufgabe kein großes Problem mehr darstellen. (Dafür brauche ich das zumindest)!

derRaab ist offline   Mit Zitat antworten