Le 28 juin 08 à 08:12 (matin), Nicolas Jullien a écrit:
Le 27 juin 08 à 16:00, Arnaud Nicolet a écrit :
Le 27 juin 08 à 08:07 (matin), Nicolas Jullien a écrit:
Le 26 juin 08 à 19:49, Arnaud Nicolet a écrit :
Le 26 juin 08 à 17:42 (soir), Jean-Luc Arnaud a écrit:
Le 26 juin 08 à 14:28, Arnaud Nicolet a écrit :
Le 26 juin 08 à 13:44 (soir), Nicolas Jullien a écrit:
Je viens de trouver mais alors c'est pas satisfaisant du tout !
http://support.realsoftware.com/listarchives/realbasic-nug/
2007-12/msg00233.html
How to stop an EditField to automatically accept any text
dropped on?
The DropObject event never fires, so I can't control the
text dropped
onto the editField.
This is not a great method, but I'd simply think that if the
text has
changed without a keydown event or the cut/paste/clear menu
item (or
by code), it's a text drop.
I'd make a new class (as EditField) and add a property
(TextWillChange
As Boolean). Then you put "TextWillChange=true" in the menu
handlers
of the cut and paste menu items and in the keydown event
(and anywhere
you change the text in code).
C'est un peu désespérant !
SVP, Real Guys débogez RB !
Bon, je reconnais là l'un de mes anciens messages, désolé que
ma solution ne vous convienne pas.
Comment se fait-il que vous disiez avoir trouvé, mais qu'en
même temps ce n'est pas satisfaisant? Ça veut donc dire que
vous n'avez pas trouvé, j'aurais cru.
J'ai trouvé une des solutions proposées (la votre donc) mais
en meme temps c'est pas satisfaisant car ca montre qu'il
s'agit donc d'un hack/trick mais pas d'une solution propre
d'interception de l'event drag comme on aurait pu l'espérer
dans un monde sans bug.
Personnellement, j'utilise ceci:
Dans un EditFiled:
Open: Me.AcceptTextDrop
DragEnter: DropText=obj.Text
DragExit: DropText=""
TextChange:
If DropText<>"" Then
Me.Text=DropText
DropText=""
End If
Cela fonctionne bien (au moins pour mes besoins!)
Intéressant... Cependant, dans l'exemple précis de supprimer le
texte déposé, il faut quand-même savoir où il se trouve, donc,
utiliser SelStart et SelLength, comme une solution déjà donnée:
if me.sellength > 0 then
me.selText = ""
end if
Sauf que, là, il n'y a pas besoin de passer par DragEnter,
DragExit et de mettre une propriété (DropText). Juste ce code
dans l'événement TextChange suffit.
Un brin d'explications: la seule façon d'avoir du texte
sélectionné dans un événement TextChange est le dépôt de texte,
et rien d'autre n'est empêché:
-Si vous sélectionnez du texte, l'événement SelChange est
appelé, pas le TextChange, donc on peut sélectionner sans encombre.
-Si vous écrivez du texte, SelLength vaut 0 (l'éventuel texte
sélectionné étant remplacé par le caractère entré).
-Édition->Coller: idem que lors de l'écriture (s'il y a du texte
sélectionné, il est remplacé).
-Tandis que le texte déposé, lui, est sélectionné dès son
insertion.
Le gros problème de la solution est le glisser-déposer à
l'intérieur même de l'editField : par ce que du coup on efface le
morceau de texte qu'on vient de déplacer et évidemment on le
replace pas là ou il était
Pour l'instant, on sait quand le texte a été déposé (Un TextChange
avec SelLength>0), donc, il faut ajouter une condition (est-ce que
le texte a été déplacé de la même zone de texte, en d'autres
termes, est-ce qu'il y a eu un événement "MouseDown" avant le
"TextChange") et mémoriser le texte tel qu'il était.
Ce que je vous suggère (non testé):
Ajouter ces propriétés:
IsDropWithMouseDown As Boolean 'Est vrai si le dépôt est effectué
avec un événement MouseDown qui le précède
LastSelStart As Integer 'Le SelStart obtenu dans l'événement
"MouseDown". Utilisé pour replacer le texte déplacé
Dans l'événement MouseDown:
LastSelStart=me.SelStart
IsDropWithMouseDown=true
Dans "TextChange":
dim s As string
if me.selLength>0 then
if not IsDropWithMouseDown then 'Dépôt depuis l'extérieur
me.SelText=""
else 'Replacer le texte
s=me.selText
me.selText=""
me.selStart=LastSelStart
me.selLength=0
me.selText=s
me.selStart=LastSelStart
me.selLength=len(s)
end if
IsDropWithMouseDown=false 'Pour que la prochaine fois, si le texte
est déposé de l'extérieur.
end if
Il reste encore un seul problème: si on commence à déplacer du
texte dans la même zone de texte, mais qu'on annule (en déposant
sur la barre des menus), et qu'ensuite on prend du texte
extérieur, ça réagit toujours comme si le texte était de la même
zone de texte (il n'y a aucun événement pour remettre à zéro
IsDropWithMouseDown si TextChange n'est pas appelé).
Peut-être quelqu'un peut résoudre ce dernier problème?
En remettant le falg a false dans l'evenement MouseExit ca semble
OK. Puisqu'on ne peut pas utiliser MouseUp (en renvoyant true par
le MouseDown) dans un EditField que l'on veut parfaitement
fonctionnel notamment pour pouvoir faire des sélections en glissant
la souris
On se rapproche d'un truc presque normal.
Ah, oui. Bien vu!
Merci encore Arnaud.
De rien.
|