Aide - Recherche - Membres - Calendrier
Version complète : Position y du curseur dans un TextField
Centre de Formation Flash - Forums Adobe Flash > Adobe Flash > Programmation Actionscript > Actionscript 3
AurelR
Bonjour, est-ce qu'il est possible de connaitre les coordonnées x y du curseur dans un textField ?
la pieuvre
salut, je ne sais pas si c'est accessible directement mais il suffit sinon d'obtenir l'index d'entrée du curseur et après tu récupère les limites du caractère à ce point...
genre :

Action Script

var carRect:Rectangle = monTxt.getCharBoundaries(monTxt.caretIndex);
var curseurX = carRect.x;
var curseurY = carRect.y;
var curseurH = carRect.height;


enfin comme ça à vue de nez!!
G.
ou alors

Action Script



var curseur:Point = new Point (0,0);
montexte.addEventListener (MouseEvent.MOUSE_MOVE, recupCurseur);

function recupCurseur (e:MouseEvent):void
{

curseur.x = e.localX;
curseur.y = e.localY;

}




ou alors avec des variables Number qui récupèrent localX et localY

enfin comme ça à vue de nez aussi
la pieuvre
Citation (G. @ Nov 30 2008, 03:37 PM) *
ou alors

Action Script



var curseur:Point = new Point (0,0);
montexte.addEventListener (MouseEvent.MOUSE_MOVE, recupCurseur);

function recupCurseur (e:MouseEvent):void
{

curseur.x = e.localX;
curseur.y = e.localY;

}


ou alors avec des variables Number qui récupèrent localX et localY

enfin comme ça à vue de nez aussi


je ne crois pas que l'on parle de la même chose!! je pense que AurelR souhaite récupérer la position du caret et non du pointeur de la souris...
G.
oups, j'avais cru qu'il voulait la position du curseur de la souris icon_mrgreen.gif

G.sort();
AurelR
Oui la pieuvre a raison je parle du caret.

La pieuvre, ta méthode ne marche pas getCharBoundaries renvoie null à chaque fois. Il faut faire

_text.getCharBoundaries(_text.caretIndex - 1);

mais le probleme c'est que ça ne prends pas en compte les sauts de lignes
la pieuvre
?

Action Script

var _txt:TextField = new TextField();
_txt.type=TextFieldType.INPUT;
_txt.width=250;
_txt.multiline=true;
_txt.wordWrap=true;
_txt.autoSize=TextFieldAutoSize.LEFT;
_txt.text="dividimus quidquid cognosci potest in propositiones simplices, et quaestiones. Ad propositiones simplices non alia praecepta tradimus, quam quae vim cognoscendi praeparant ad objecta quaevis distinctius intuenda et sagacius perscrutanda, quoniam hae sponte occurrere debent, nec quaeri possunt; quod in duodecim prioribus praeceptis complexi sumus, ac quibus nos ea omnia exhibuisse existimamus, quae rationis usum aliquomodo faciliorem reddere posse arbitramur. Ex quaestionibus autem aliae intelliguntur perfecte, etiamsi illarum solutio ignoretur, de quibus solis agemus in duodecim regulis proxime sequentibus; aliae denique non perfecte intelliguntur, quas ad duodecim posteriores regulas reservamus.";
_txt.x=100;
_txt.y=100;
this.addChild(_txt);

_txt.addEventListener(MouseEvent.CLICK, traceIn);

var selec_mc:MovieClip = new MovieClip();
selec_mc.graphics.lineStyle(2,0xff0000)
this.addChild(selec_mc);

function traceIn(e:MouseEvent):void {
var carRect:Rectangle=_txt.getCharBoundaries(_txt.caretIndex);
var curseurX=_txt.x+carRect.x;
var curseurY=_txt.y+carRect.y;
var curseurH=carRect.height;
trace(curseurX, curseurY, curseurH);


selec_mc.graphics.clear();
selec_mc.graphics.lineStyle(2,0xff0000)
selec_mc.graphics.moveTo(0,0);
selec_mc.graphics.lineTo(0, curseurH);

selec_mc.x=curseurX;
selec_mc.y= curseurY;
}
la pieuvre
et même pour être perfectionniste on peut rajouter

Action Script

_txt.addEventListener(KeyboardEvent.KEY_UP, traceIn);

après le premier addEventListener.

soit :

Action Script

var _txt:TextField = new TextField();
_txt.type=TextFieldType.INPUT;
_txt.width=250;
_txt.multiline=true;
_txt.wordWrap=true;
_txt.autoSize=TextFieldAutoSize.LEFT;
_txt.text="dividimus quidquid cognosci potest in propositiones simplices, et quaestiones. Ad propositiones simplices non alia praecepta tradimus, quam quae vim cognoscendi praeparant ad objecta quaevis distinctius intuenda et sagacius perscrutanda, quoniam hae sponte occurrere debent, nec quaeri possunt; quod in duodecim prioribus praeceptis complexi sumus, ac quibus nos ea omnia exhibuisse existimamus, quae rationis usum aliquomodo faciliorem reddere posse arbitramur. Ex quaestionibus autem aliae intelliguntur perfecte, etiamsi illarum solutio ignoretur, de quibus solis agemus in duodecim regulis proxime sequentibus; aliae denique non perfecte intelliguntur, quas ad duodecim posteriores regulas reservamus.";
_txt.x=100;
_txt.y=100;
this.addChild(_txt);

_txt.addEventListener(MouseEvent.CLICK, traceIn);
_txt.addEventListener(KeyboardEvent.KEY_UP, traceIn);

var selec_mc:MovieClip = new MovieClip();
selec_mc.graphics.lineStyle(2,0xff0000)
this.addChild(selec_mc);

function traceIn(e:Event):void {
var carRect:Rectangle=_txt.getCharBoundaries(_txt.caretIndex);
var curseurX=_txt.x+carRect.x;
var curseurY=_txt.y+carRect.y;
var curseurH=carRect.height;
trace(curseurX, curseurY, curseurH);


selec_mc.graphics.clear();
selec_mc.graphics.lineStyle(2,0xff0000)
selec_mc.graphics.moveTo(0,0);
selec_mc.graphics.lineTo(0, curseurH);

selec_mc.x=curseurX;
selec_mc.y= curseurY;
}
la pieuvre
bon allé cette fois c'est la bonne, avec la prise en compte du dernier caractère wink.gif

Action Script

var _txt:TextField = new TextField();
_txt.type=TextFieldType.INPUT;
_txt.width=250;
_txt.multiline=true;
_txt.wordWrap=true;
_txt.autoSize=TextFieldAutoSize.LEFT;
_txt.text="dividimus quidquid cognosci potest in propositiones simplices, et quaestiones. Ad propositiones simplices non alia praecepta tradimus, quam quae vim cognoscendi praeparant ad objecta quaevis distinctius intuenda et sagacius perscrutanda, quoniam hae sponte occurrere debent, nec quaeri possunt; quod in duodecim prioribus praeceptis complexi sumus, ac quibus nos ea omnia exhibuisse existimamus, quae rationis usum aliquomodo faciliorem reddere posse arbitramur. Ex quaestionibus autem aliae intelliguntur perfecte, etiamsi illarum solutio ignoretur, de quibus solis agemus in duodecim regulis proxime sequentibus; aliae denique non perfecte intelliguntur, quas ad duodecim posteriores regulas reservamus.";
_txt.x=100;
_txt.y=100;
this.addChild(_txt);

_txt.addEventListener(MouseEvent.CLICK, traceIn);
_txt.addEventListener(KeyboardEvent.KEY_UP, traceIn);

var selec_mc:MovieClip = new MovieClip();
selec_mc.graphics.lineStyle(2,0xff0000)
this.addChild(selec_mc);

function traceIn(e:Event):void {
var carRect:Rectangle
var curseurX:Number;
if(_txt.length < _txt.caretIndex+1){
carRect=_txt.getCharBoundaries(_txt.caretIndex-1);
curseurX=_txt.x+carRect.x + carRect.width;
}else{
carRect=_txt.getCharBoundaries(_txt.caretIndex);
curseurX=_txt.x+carRect.x;
}
var curseurY:Number =_txt.y+carRect.y;
var curseurH:Number =carRect.height;
trace(curseurX, curseurY, curseurH);


selec_mc.graphics.clear();
selec_mc.graphics.lineStyle(2,0xff0000)
selec_mc.graphics.moveTo(0,0);
selec_mc.graphics.lineTo(0, curseurH);

selec_mc.x=curseurX;
selec_mc.y= curseurY;
}
AurelR
Le probleme est toujours le meme, les lignes vides ne sont pas prises en compte.

Le textField est de text de saisie, l'utilisateur peut donc sauter des lignes. Cela creer une erreur car sur ces lignes il n'y a pas de caractere.
AurelR
Il n'y aurait pas une méthode magique du genre

monTextField.getCaretBounds():Rectangle;
la pieuvre
bon faut tout te faire si j'ai bien compris !! wink.gif

alors une vieille ruse de sioux :

Action Script

var _txt:TextField = new TextField();
_txt.type=TextFieldType.INPUT;
_txt.width=250;
_txt.multiline=true;
_txt.wordWrap=true;
_txt.autoSize=TextFieldAutoSize.LEFT;
_txt.text="dividimus quidquid cognosci potest in propositiones simplices, et quaestiones. Ad propositiones simplices non alia praecepta tradimus, quam quae vim cognoscendi praeparant ad objecta quaevis distinctius intuenda et sagacius perscrutanda, quoniam hae sponte occurrere debent, nec quaeri possunt; quod in duodecim prioribus praeceptis complexi sumus, ac quibus nos ea omnia exhibuisse existimamus, quae rationis usum aliquomodo faciliorem reddere posse arbitramur. Ex quaestionibus autem aliae intelliguntur perfecte, etiamsi illarum solutio ignoretur, de quibus solis agemus in duodecim regulis proxime sequentibus; aliae denique non perfecte intelliguntur, quas ad duodecim posteriores regulas reservamus.";
_txt.x=100;
_txt.y=100;
this.addChild(_txt);

_txt.addEventListener(MouseEvent.CLICK, traceIn);
_txt.addEventListener(KeyboardEvent.KEY_UP, traceIn);

var selec_mc:MovieClip = new MovieClip();
selec_mc.graphics.lineStyle(2,0xff0000)
this.addChild(selec_mc);

function traceIn(e:Event):void {
var carRect:Rectangle
var curseurX:Number;
if(_txt.getCharBoundaries(_txt.caretIndex) == null){
_txt.setSelection(_txt.caretIndex,_txt.caretIndex);
_txt.replaceSelectedText(" ");
_txt.setSelection(_txt.caretIndex-1,_txt.caretIndex-1);
carRect=_txt.getCharBoundaries(_txt.caretIndex);
curseurX=_txt.x+carRect.x;
_txt.setSelection(_txt.caretIndex,_txt.caretIndex+1);
_txt.replaceSelectedText("");
}else{
carRect=_txt.getCharBoundaries(_txt.caretIndex);
curseurX=_txt.x+carRect.x;
}
var curseurY:Number =_txt.y+carRect.y;
var curseurH:Number =carRect.height;
trace(curseurX, curseurY, curseurH);


selec_mc.graphics.clear();
selec_mc.graphics.lineStyle(2,0xff0000)
selec_mc.graphics.moveTo(0,0);
selec_mc.graphics.lineTo(0, curseurH);

selec_mc.x=curseurX;
selec_mc.y= curseurY;
}
AurelR
J'y avais pensé à cette gruge de code (ajouté un caratere pour l'enlever apres). Je trouvais juste ça vraiment crade. Mais ça a le mérite de marché. C'est bizarre qu'il n'ya pas de methode toute faite. De mon coté, j'avias pensé à recuperer la ligne sur laquelle on est et multiplié le resultat par la hauteur d'une ligne, supposant que toutes les lignes fassent la meme taille.
AurelR
J'ai oublié de te remercier pour le temps passé sur mon probleme et pour m'avoir m'aider.

Merci
la pieuvre
you'r wellcome wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.