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

 Delphi Discussion :

Détecter le double-clic sur un Panel


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Détecter le double-clic sur un Panel
    Bonjour

    Je me demande s'il est possible sur un Panel de détecter le double-clic, dans le cas où la méthode du simple clic est également affectée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.pnlTestClick(Sender: TObject);
    begin
      ShowMessage('Hello = Simple clic !');
    end;
     
    procedure TForm1.pnlTestDblClick(Sender: TObject);
    begin
      ShowMessage('Hello = DOUBLE clic, snifff personne ne me verra...');
    end;
    Possible de détecter le double-clic ?

    C'est vraiment une question de débutant

    Je suppose que ce compo est un peu bâti comme le TImage et que son clic tourne autour du double-clic... ?

    Merci de vos lumières.

  2. #2
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    un boolean...

    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
     
     private
        { Déclarations privées }
        dbclick:boolean;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     dbclick:=true;
    end;
     
    procedure TForm1.Panel1Click(Sender: TObject);
    begin
     dbclick:=not dbclick ;
     if not dbclick  then    ShowMessage('Hello = Simple clic !');
    end;
     
    procedure TForm1.Panel1DblClick(Sender: TObject);
    begin
     if dbclick then ShowMessage('Hello = DOUBLE clic, snifff personne ne me verra...');
    end;
     
    end.

  3. #3
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Excuse, il faut encore compléter car pour deux clicks décalés dans le temps par exemple ça ne marche pas (normal) à cogiter...
    C'est faisable, en réfléchissant un peu...

  4. #4
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    C'est vrai que ce n'est pas simple car même en rajoutant :
    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
     
    procedure TForm1.Panel1Click(Sender: TObject);
    begin
     if not dbclick  then
     begin
      ShowMessage('Hello = Simple clic !');
      dbclick:=true;
     end;
    dbclick:=not dbclick ;
    end;
     
    procedure TForm1.Panel1DblClick(Sender: TObject);
    begin
     if dbclick then ShowMessage('Hello = DOUBLE clic, snifff personne ne me verra...');
    end;
    dbclick est à false par défaut au départ...(pas besoin de rajouter oncreate...

    la procedure panel1click est parcourue même pour un double click...


    pas cool lol

  5. #5
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Archimède, je te remercie de te pencher sur ce souci, je suis étonné de n'avoir lu nulle part que personne n'ai soulevé cela

    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
    procedure TForm1.pnlTestMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      If NOT (ssDouble in Shift)  Then
     begin
       ShowMessage('SIMPLE-clic');
       exit; //  halt;
     end;
     
     
     If (ssDouble in Shift)  Then
     begin
       ShowMessage('Double-clic');
       exit;
     end;
     
     //else  ShowMessage('SIMPLE-clic')
    end;
    Super curieux, car même en tentant de ruser comme ci-dessus, ça foire lamentablement.

    Qui pensait que cette particularité relevait du niveau débutant

    @+

  6. #6
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    oui, c'est bien vu à toi d'avoir soulevé ce truc là !

  7. #7
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Et même si je déplace le simple clic vers le MouseDown en laissant le double-clic sur le OndblClick = que dalle !

    Ça me fait un peu penser à ce thread :
    http://www.developpez.net/forums/d89...ontre-tbutton/


  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut JP

    Lors d'un double-clic sur ton panel, les 2 événements OnClick et OnDblClick seront exécutés. C'est un comportement standard.

    Dans ton exemple, l'évènement OnDblClick n'est pas exécuté à cause du ShowMessage placé dans le OnClick.
    En effet le second click est intercepté car la fiche du ShowMessage est modale. Le second Click se termine en 'ding'.

    @+

  9. #9
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut Claude

    Tu as absolument raison, greuuuuu le ShowMessage est donc à manier avec précaution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.pnlTestMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     If (ssDouble in Shift)  Then
     begin
       Edit1.Text := 'DOUBLE clic !';
     end
     else Edit1.Text := 'Simple clic !';
    end;
    Donc ce principe basique fonctionne impec.

    Mais l'ennui (en réel) est que je lance une fenêtre (modale) sur le double clic

    Là, si le simple clic comme à la confesse, passe toujours en premier ; je suis mal barré.

    @+ et merci de ton éclaircissement

    (Pour résumer, sur un panel j'ai un :
    - simple clic qui lance une ComboBox
    - Double-clic qui lance une fenêtre modale)

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Que je suis bête !!!

    Suffit que je réalise cela indirectement, par exemple en récupérant l'information, par exemple comme ci-dessus, ensuite la traiter.

    Youpi !!!!!!!!!!! merci aux participants

    Edit: la récup de l'info doit bien entendu être traitée après une petite tempo, hé oui car le simple clic passe toujours en premier.

  11. #11
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Deux exemples de codes
    Si ça peut en aider d'autres, je donne ici deux principes différents de méthodes :


    Première méthode avec timer (Interval = 200)
    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
     
    procedure TForm1.pnlTestMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Edit1.Text     := '';
      timer1.Enabled := true;
     
      If (ssDouble in Shift) then
      begin
        Edit1.Text := 'DOUBLE';
      end
      else Edit1.Text := 'Simple';
     
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled := false;
     
      if Edit1.Text = 'Simple' then ShowMessage('Simple clic');
      if Edit1.Text = 'DOUBLE' then ShowMessage('DOUBLE clic !!!');
     
    end;

    ------------------------------------------------------------------------------------------------------
    Deuxième méthode SANS composant timer
    (Il faut ajouter DateUtils en uses)

    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
    procedure WaitProcessMessages(Milliseconds : integer);
    var BeginTime : TDateTime;
    begin
      BeginTime := Now;
      while MilliSecondsBetween(Now, BeginTime) < Milliseconds do
        Application.ProcessMessages;
    end;
     
     
    procedure TForm1.Panel3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Edit1.Text := '';
     
      If (ssDouble in Shift) then
      begin
        Edit1.Text := 'DOUBLE';
        exit;
      end
      else Edit1.Text := 'Simple';
     
      WaitProcessMessages(200);
      if Edit1.Text = 'Simple' then ShowMessage('Simple clic');
      if Edit1.Text = 'DOUBLE' then ShowMessage('DOUBLE CLIC !!!');
    end;
    Si vous avez mieux, dites-le, merci ;-)

    Par principe, je n'aime pas trop l'ajout d'un Timer...
    Mais avouons que le "Application.ProcessMessages" dans la procédure WaitProcessMessages, n'est pas mieux non plus

    @+

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Droïde Système7

    Voici ma proposition plus légère et sans timer :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Procedure DoubleClick1(Sender: TObject);
        Procedure OnClick1(Sender: TObject);   
     procedure FormCreate(Sender: TObject); // A ajouter
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    panel1.ondblClick := DoubleClick1;
    panel1.onClick := OnClick1;
    end;
    
    Procedure TForm1.DoubleClick1(Sender: TObject); // Procédure ajoutée
    begin
    
     panel1.ondblClick := DoubleClick1;
     panel1.caption := 'C''est Ok pour un double click';
    
    end;
    
    Procedure TForm1.OnClick1(Sender: TObject); // Procédure ajoutée
    begin
    
     panel1.onClick := OnClick1;
     panel1.caption := 'C''est Ok pour un seul click';
    
    end;
    
    end.
    @+,

    Cincap

  13. #13
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Hello Cincap

    Heuu.... oui mais si tu as bien tout lu, ton code ne fonctionne pas avec une fenêtre modale.

    Ajoute un ShowMessage au lieu de placer une indication dans le caption du panel

    En lisant plus haut, il est bien indiqué qu'en tous les cas, le SIMPLE clic passe en premier.

    Alors, si tu ajoutes des ShowMessages... ?

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    @ Droïde Système7

    Je me suis basé uniquement sur ta question par défaut sans vraiment vérifier les réponses.

    Je me demande s'il est possible sur un Panel de détecter le double-clic, dans le cas où la méthode du simple clic est également affectée :
    Voila, voila.

    Au fait, on éliminer la procédure Onclick et utiliser ce code :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
           Procedure DoubleClick1(Sender: TObject);
     
        procedure FormCreate(Sender: TObject); // A ajouter
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    panel1.ondblClick := DoubleClick1;
     
    end;
     
    Procedure TForm1.DoubleClick1(Sender: TObject); // Procédure ajoutée
    begin
     
     panel1.ondblClick := DoubleClick1;
     panel1.caption := 'C''est Ok pour un double click';
     showmessage('bien');
     
    end;
     
     
    end.
    @+,

    cincap

  15. #15
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Cincap, bref, tu as lu en travers

    Mais je suis certain que tu peux nous montrer une autre méthode : valable avec un ShowMessage

    @+

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Bonjour à toutes et à tous,

    @ Droïde Système7,

    Voici donc la méthode avec un showmessage :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
     
        Procedure DoubleClick1(Sender: TObject);// A ajouter
     
        procedure FormCreate(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    panel1.ondblClick := DoubleClick1;
     
    end;
     
    Procedure TForm1.DoubleClick1(Sender: TObject); // Procédure ajoutée
    begin
     
     panel1.ondblClick := DoubleClick1;
     panel1.caption := 'C''est Ok pour un double click';
     showmessage('Et maintenant tu me vois !');
     
    end;
     
    end.
    Citation, il est vrai que si tu places aussi un message dans le onclick de ton panel, c'est ce message qui sera prioritaire.

    @+,

    Cincap

  17. #17
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Hello Cincap,

    est vrai que si tu places aussi un message dans le onclick de ton panel, c'est ce message qui sera prioritaire.
    Je ne te le fais pas dire

    Avec en prime l'impossibilité de détecter le double-clic !

    Mais alors pas besoin de tout ce code, un simple appel au DblClick fait l'affaire.

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ouverture d'un programme par double clic sur un fichier
    Par zieg18 dans le forum Visual C++
    Réponses: 6
    Dernier message: 12/07/2006, 11h02
  2. Double clic sur une feuille de données
    Par louroulou dans le forum Access
    Réponses: 7
    Dernier message: 14/06/2006, 12h33
  3. Réponses: 5
    Dernier message: 08/06/2006, 17h11
  4. écoute de touches, de double clics sur un JTable
    Par Nicool dans le forum Composants
    Réponses: 7
    Dernier message: 06/06/2006, 13h52
  5. comment autoriser le double clic sur un champ desactivé ?
    Par linou dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/04/2005, 18h23

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