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:String, depth: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", 1, 0, 0, this._width, this._height);
var tmp_txt = mc.tmp_txt;
tmp_txt.setNewTextFormat (this.getTextFormat ());
var param = new Array ('multiline', 'wordWrap', 'embedFonts', 'type');
for (var i = 0; i < param.length; i++) {
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 i = 0; i < textParts.length; i++) {
tmp_txt.text += textParts[i] + ((i < textParts.length - 1) ? ' ' : str);
if (bottom == tmp_txt._height - offset) {
// Abbrechen, damit i den richtigen Wert behält
break;
}
}
tmp_txt.text = '';
for (i; i < textParts.length; i++) {
tmp_txt.text += textParts[i] + ((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 a = 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",1, 30, 30, 300, 100);
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(width, 0);
lineTo(width, height);
lineTo(0, height);
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)!