realbasic-nug.fr
[Top] [All Lists]

Re: Désactiver (ou du moins contrôler ) le drag'n drop dans un

To: REALbasic NUG French <realbasic-nug.fr@lists.realsoftware.com>
Subject: Re: Désactiver (ou du moins contrôler ) le drag'n drop dans un editField
From: Arnaud Nicolet <anic297@mac.com>
Date: Sat, 28 Jun 2008 09:25:54 +0200
Authentication-results: mx.google.com; spf=neutral (google.com: 74.124.194.228 is neither permitted nor denied by best guess record for domain of realbasic-nug.fr-bounces@lists.realsoftware.com) smtp.mail=realbasic-nug.fr-bounces@lists.realsoftware.com
Delivered-to: listarchive@realsoftware.com
In-reply-to: <774B4A3A-A93F-401C-96B0-7EC673C3371F@free.fr>
References: <E5F637B2-38A6-4D39-8378-7426CE21C31C@free.fr> <p06240802c488fa85b592@[62.161.36.122]> <FECA4291-50B8-420A-AA5E-FCBF9BD1C40C@free.fr> <p06240804c48905d45c13@[62.161.36.122]> <0FC8766F-5F1C-418C-A4B5-49A13E44EAEF@free.fr> <EB3754F3-CDAE-4899-8AA2-F86481B31402@mac.com> <717C8F51-F0DB-483D-BD34-9047F1673BA7@free.fr> <p06240808c48968988221@[62.161.36.122]> <7C9C766A-5656-4A59-BB80-7E96AEF06DA2@mac.com> <A3D198FC-B848-4621-A248-73E700722DD2@free.fr> <E06B4A61-9BA6-4BC8-81D5-2BFFF36AF3A7@mac.com> <774B4A3A-A93F-401C-96B0-7EC673C3371F@free.fr>
Reply-to: REALbasic NUG French <realbasic-nug.fr@lists.realsoftware.com>
Sender: realbasic-nug.fr-bounces@lists.realsoftware.com
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.


<Prev in Thread] Current Thread [Next in Thread>