IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Image : Différence entre un click et un click glisser lacher?


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 82
    Points : 47
    Points
    47
    Par défaut Image : Différence entre un click et un click glisser lacher?
    Bonsoir,

    Je me heurte à un petit problème:

    J'affiche une image dans un controle TImage32 (de la collection Graphics32), mais dans mon problème c'est équivalent à un Timage.

    Mon application doit permettre deux choses:

    -L'utilisateur clique sur un point de l'image, maintient le bouton enfoncé, déplace la souris (ce qui fait scroller l'image qui est plus grande que le contrôle), et enfin relâche le bouton quand l'image est en position voulue.

    -L'utilisateur clique sur un point de l'image (click rapide) et mon application retient les coordonnées de ce point pour des calculs. (à effectuer seulement si click rapide sans mouvement)

    pour le glisser j'utilise les évènements MouseDown et Mouse Up.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    procedure TForm1.ImgView321MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);
    begin
      if layer = nil then
       begin
        app.Panning:=True;
        app.OldPos:=point(X,Y);
       end;
    end;
     
    procedure TForm1.ImgView321MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer; Layer: TCustomLayer);
    begin
     if app.Panning then
      begin
        imgView321.Scroll(app.OldPos.X-X,app.OldPos.Y-Y);
        app.OldPos:=point(x,y);
      end;
    end;
     
    procedure TForm1.ImgView321MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer);
    begin
     if app.Panning then
       begin
         app.Panning:=false;
         imgView321.SetFocus;
         exit;
       end;
     case app.Phase of
       pCalibrating: // Ici vient ma routine de calcul
         begin
    end;
    Mon problème réside dans le fait que dès lors que l'utilisateur appuie sur le bouton, indépendamment de la durée, ma variable app.Panning devient vraie, et la deuxième partie du code MouseUP n'est jamais effectuée. Bien sur si l'utilisateur déplace l'image (app.panning), le click ne doit pas être pris en compte pour les calculs.
    J'ai bien essayé avec l'évènement OnClick, mais le résultat est le même: MouseDown fait invariablement basculer la variable app.panning.
    De temps en temps, un double click fait se lancer ma routine de calcul.

    Pour le moment j'ai contourné cette difficulté en associant le panning uniquement au bouton droit de la souris, mais mon interface s'en retrouve moins intuitive.

    Avez vous une idée du comment procéder? Calculer le temps écoulé entre mousedown et mouseup?

    Merci d'avance!

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    deux choses possibles

    1) ajouter un ClickTime qui sauvegarde l'heure (ou le GetTickCount) au moment du MouseDown, puis regarder combien de temps le bouton a été maintenu dans le MouseUp

    2) cumuler les distances de déplacement du mouseMove pour déterminer si la souris a bougé. Le cumul permet de détecter un déplacement même si la souris revient à son point d'origine.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    C'est une erreur d'algo selon moi.
    Il te manque une variable.
    Au niveau du mouseMove, tu devrais coder ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if app.panning then
    begin
      app.panning := false;
      app.moving := true;   // on sait désormais que le user à cliqué puis déplacé
    end;
     
    // ici ton code propre au déplacement
    if app.moving then
      ...

    et ensuite dans le mouseup, jongler sur ces deux variables.

    si panning => alors c'est un simple click...

    si moving => alors c'est un clicker-glisser...

Discussions similaires

  1. Différence entre onclick et click?
    Par LuluHow dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/06/2015, 08h59
  2. Différence entre les signaux pushed() et clicked() de QAbstractButton
    Par Glân von Brylân dans le forum Débuter
    Réponses: 2
    Dernier message: 24/06/2014, 19h30
  3. Différence entre deux images
    Par Mookie dans le forum 2D
    Réponses: 3
    Dernier message: 13/04/2006, 15h46
  4. Faire la différence en click et shift-click
    Par htristra dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/01/2006, 22h03
  5. Réponses: 5
    Dernier message: 17/05/2004, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo