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
En fait les EditField que j'utilise sont dérivés d'une sous-classe
UndoEditField que j'ai créé : qui gère un buffer (string, selStart et
selLength avec une methode KeepBuffer appelé à chaque fois qu'on fait
une modif du texte et une méthode Undo qui permet de restaurer l'état
(j'ai pas encore fait les undo multiples mais il suffirait d'utiliser
un tableau avec les différentes propriétés)
Donc il suffit d'utiliser le truc d'Arnaud "if me.selLength >0" dans
textChange et d'appeler alors la méthode Undo de la classe
UndoEditField (qui restaure donc à la fois le texte mais aussi la
sélection)
Merci à tous.
|