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 :

TPanel OnMouseEnter... comment selectionner plusieurs panel


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut TPanel OnMouseEnter... comment selectionner plusieurs panel
    Bonjour,

    Voici mon problème :

    Je génère dynamiquement un ensemble de panel de manière a représenter un grille horaire. Est associé a l'évènement onclick sur le panel, une methode changant la couleur du panel. Idéalement, il serait bien de pouvoir cliquer sur un panel, laisser le bouton de la souris enfoncé et descendre le curseur, colorant par la meme occasion les panels survolés.

    Je cherche donc la manière d'obtenir ce résultat.

    J'ai essayé d y parvenir via l'event OnMouseMove mais comme son nom l'indique cet event se produit a chaque fois que la souris bouge au dessus du panel donc ca ne m'arrange pas, le panel changant constamment de couleur. En plus si je teste pour voir si la touche de la souris est pressée, la méthode associée a l'event ( changement de couleur ) ne se produis que sur le panel ou a été effectué le clique, pas sur celui que l'on est en train de survoler.


    lors de la generation des panels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MonPanel.OnMouseMove := MonSurvolPanel;
    Plus bas, définition de la métode survol panel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    procedure TCoursFrm.Label4MouseEnter(Sender: TObject);
    begin
      If (GetAsyncKeyState(VK_LBUTTON)And $8000)<>0 then
      begin
        if(label4.Caption<>'coucou')then
        label4.Caption:='coucou'
        else
        label4.Caption:='c''est nous';
      end;
    end;
    If (GetAsyncKeyState(VK_LBUTTON)And $8000)<>0
    vérifie que le bouton de la souris est enfoncé ( voir http://delphi.developpez.com/faq/?pa...s#testertouche )


    Parrallèlement j'ai decouvert l'évènement OnMouseEnter sur les label qui correspond bien au comportement recherché ( mais qui lui aussi, a du mal quand je verifie que le bouton est enfoncé )

    Pourriez vous m'aiguiller vers une solution à mon problème?

    Merci d'avance.
    Seb

    P.S : le titre du post est un peu nul, désolé

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    On pourrait :
    - identifier l'activation du mode "coloriage" et le panel de départ sur l'évenement onmousedown de chaque panel,
    - colorier les panel sur leurs évenement onMousemove, lorsqu'on est en mode "coloriage",
    - identifier la fin du mode "coloriage" sur tout événement Mouse UP, ce qui suppose qu'on doit intercepter cet événement même lorsqu'on est en dehors des panels (pour détecter les événement mouse Up de l'application , utiliser "Application.Onmessage").

    Il faut aussi, déactiver le coloriage si on passe à une autre appli : pour cela, utiliser "Application.Onactivate".

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu peux faire voir ton code de changement de couleur sur le panel ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Malatar
    Tu peux faire voir ton code de changement de couleur sur le panel ?
    procedure TCoursFrm.MonClicSurPanel(Sender: TObject);
    begin
    //showMessage('clic sur le panel'''+TPanel(Sender).Name+'''');
    if(TPanel(Sender).color <> clBackground ) then
    TPanel(Sender).color := clBackground
    else
    TPanel(Sender).color := clCaptionText;
    end;


    Citation Envoyé par Graffito
    Bonjour,

    On pourrait :
    - identifier l'activation du mode "coloriage" et le panel de départ sur l'évenement onmousedown de chaque panel,
    - colorier les panel sur leurs évenement onMousemove, lorsqu'on est en mode "coloriage",
    - identifier la fin du mode "coloriage" sur tout événement Mouse UP, ce qui suppose qu'on doit intercepter cet événement même lorsqu'on est en dehors des panels (pour détecter les événement mouse Up de l'application , utiliser "Application.Onmessage").

    Il faut aussi, déactiver le coloriage si on passe à une autre appli : pour cela, utiliser "Application.Onactivate".
    Le problème avec OnMouseMove est que si je bouge la souris au dessus d un meme panel, il se declenche plusieurs fois donc mon panel clignote :p
    Comment empecher cela?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    En utilisant les event de drag and drop, j'arrive à un résultat se rapprochant du comportement esperé.


    dans la generation des panels ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
          MonPanel.DragMode := dmAutomatic;
          MonPanel.OnDragDrop := Panel2DragDrop;
          MonPanel.OnDragOver := Panel2DragOver;

    code des procédure ..

    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 TCoursFrm.Panel2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      If (GetAsyncKeyState(VK_LBUTTON)And $8000)=0 then
        TPanel(Sender).color := clCaptionText
      else
      begin
        if(TPanel(Sender).color <> clBackground ) then
          TPanel(Sender).color := clBackground;
      end;
    end;
     
    procedure TCoursFrm.Panel2DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      If (GetAsyncKeyState(VK_LBUTTON)And $8000)=0 then
        TPanel(Sender).color := clCaptionText
      else
      begin
        if(TPanel(Sender).color <> clBackground ) then
          TPanel(Sender).color := clBackground;
      end;
    end;

    Ce code ne permet que de colorier les panels survolés à l'exception du dernier[, au dessus duquel l'on relache le bouton de la souris,] avec le bouton de la souris enfoncé et de réinitialiser la couleur par un simple clic. Il ne permet pas de selectionner un panel par un simple clic.


    Si j'implemente une méthode liée a l'evenement OnDragEnd avec le meme traitement, la couleur des premier et dernier panel se réinitialise :s

    Une idée?

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Lors du mousemove, il ne faut changer la couleur du background que si elle est différente de celle désirée.

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Juste une petite réflexion comme çà ^^

    Ca serait pas plus simple de faire cela avec un stringgrid ou un drawgrid car le comportement que tu indiques ou que tu veux correspond enormement à ces composants.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    Lors du mousemove, il ne faut changer la couleur du background que si elle est différente de celle désirée.
    Il n'y a pas de couleur désirée, c'est en fonction de l'utilisateur : il clique et selectionne ("met en couleur") certains panel. Il doit pouvoir revenir sur sa décision et donc réinitialiser la couleur du panel.

    Citation Envoyé par Malatar
    Juste une petite réflexion comme çà ^^

    Ca serait pas plus simple de faire cela avec un stringgrid ou un drawgrid car le comportement que tu indiques ou que tu veux correspond enormement à ces composants.
    Je vais chercher des infos sur ces composant, n'ayant pas encore eu l'occasion de les utiliser. Merci pour la piste.

Discussions similaires

  1. Comment créer plusieurs Panel dans une Frame
    Par developppez dans le forum Composants
    Réponses: 9
    Dernier message: 02/07/2012, 13h57
  2. Comment utiliser plusieurs panels ?
    Par sv-mars dans le forum wxPython
    Réponses: 4
    Dernier message: 01/12/2010, 13h08
  3. [JComboBox] Comment selectionner plusieurs éléments ?
    Par Bella la vita dans le forum Composants
    Réponses: 4
    Dernier message: 19/08/2008, 14h57
  4. [VBA-E] comment selectionner plusieurs lignes
    Par Annick.w dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/01/2007, 20h15
  5. comment savoir si on a selectionne plusieurs lignes? LISTBOX
    Par nath-0-0 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/03/2006, 14h23

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