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

Langage Delphi Discussion :

Listbox MultiSelect avec clic souris


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut Listbox MultiSelect avec clic souris
    Bonjour,

    Je n'arrive pas a sélectionné plusieurs lignes dans une listbox comme avec
    (ctrl-touche souris gauche)
    voici ce que j'ai essayé mais qui ne fonctionne pas..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    procedure TForm1.linstbox1DblClick(Sender: Tobject);
    begin
      linstbox1.MultiSelect := true;
      linstbox1.Selected[linstbox1.ItemIndex] := true ;
    end;
    j'ai constaté, après chaque clique la sélection se désélectionne
    que pouvez-vous me conseillé, Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    bonjour,
    Tu peux le faire comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.ListBox1DblClick(Sender: TObject);
    var
    i: integer;
    begin
    listbox1.MultiSelect := true;
    for i := 0 to ListBox1.Items.Count-1 do begin
     ListBox1.Selected[i]  ;
    end;
    end;
    et dans le "On create" de ta fiche, ajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ListBox1DblClick(Sender)
    end;
    NABIL74

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Merci pour ton conseil mais ta proposition ne fonctionne pas pour mes besoins..
    je ne sais pas s'il faut passer par une boucle et répéter a chaque fois la procédure.
    Je suis en train de chercher quelque chose sur Mouse_Event et Keybd_Event peut-être dans cette direction?

  4. #4
    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
    Je ne comprend pas pourquoi tu utilises l'évènement DblClick de la listbox.
    Si tu mets la propriété Multiselect à True directement dans ton composant. Cela fonctionne normalement.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Oui c'est juste, en postant j'ai fait une faute de copy-paste à vrais dire je l'ai mis dans OnClick,sorry.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Listbox1Click(Sender: TObject);
    begin
      linstbox1.MultiSelect := true;
      instbox1.Selected[linstbox1.ItemIndex] := true ;
    end;
    Tu me dis de le mettre directement dans ton composant. Je ne vois pas ce que tu veux dire! Peux-tu me guider avec un petit exemple, merci beaucoup.

  6. #6
    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
    Ce que veux dire Rayek, c'est que la multi-sélection est nativement gérée par le composant. La seule chose que tu aies à faire est de basculer la propriété MultiSelect à true dans l'inspecteur d'objet.

    Rien d'autre à faire. Aucune implémentation supplémentaire n'est nécessaire.

    @+ Claudius

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 138
    Points
    3 138
    Par défaut
    Bonjour,

    ou bien dans le create de ta fiche tu mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       linstbox1.MultiSelect := true;
    si tu ne veux pas le faire dans l'inspecteur d'objet.

    A ce propos, je ne sais pas ce qui est le mieux ? (plus rapide, plus correct en programmation ?). C'est peut être plus lisible dans le code pour la maintenance.

    A+

    Charly

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    oui, je l'ai bien mis à True le MultiSelect dans l'inspecteur d'objet. Mais quand je clique sur un autre ItemIndex, l’ancienne sélection se désélectionne a chaque fois, je ne sais pas encore pourquoi...

  9. #9
    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
    Citation Envoyé par Ardely Voir le message
    Mais quand je clique sur un autre ItemIndex, ...
    Shift+Click ou Ctrl+click, pour les sélections multiples.

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Avec Ctrl+click, pour les sélections multiples sa fonctionne. Le but c'est de ne pas insert avec la touche Ctrl-click, y a -t-il peux-être un autre moyen..

  11. #11
    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
    Citation Envoyé par Ardely Voir le message
    Bonjour,
    Je n'arrive pas a sélectionné plusieurs lignes dans une listbox comme avec
    (ctrl-touche souris gauche)
    Citation Envoyé par Ardely Voir le message
    Avec Ctrl+click, pour les sélections multiples sa fonctionne. Le but c'est de ne pas insert avec la touche Ctrl-click, y a -t-il peux-être un autre moyen..
    je ne saisis plus ton besoin ???

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Désoler si je me suis mal exprimer*!
    Je voudrais bien uniquement sélectionner des lignes dans la listebox uniquement par un clique de souris sans passer par la touche CTRL-Click. Merci

  13. #13
    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
    Utilise alors la Checklistbox
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Merci pour ton conseil, mais c'est plutôt des lignes que je voudrai sectionner.

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Bonjours,
    Voici ce que j'ai fait, j'arrive à sélectionner les lignes mais la touche control reste toujours enfoncer et je ne sais pas ou la désactiver sans désactiver toutes les autres lignes!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.Listbox1Click(Sender: TObject);
    begin
        Keybd_Event(VK_CONTROL,0,0,0);
    end;
    Si mes Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); expl. dans MouseUp toute les lignes de la listbox ce déselecte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Listbox1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    begin
         Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
    end;
    Que pouvez-vous me proposez pour atteindre cette possibilité.
    Merci beaucoup

    Salutation

  16. #16
    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
    Ou alors tu crées un tableau de booléen en mémoire qui correspond au même nombre d'item de ta listbox.
    Sur chaque click sur une ligne de la liste box tu mets vrai ou faux dans le booléen correspondant, puis tu fais en sorte que lors que ta listbox se redessine elle vérifie le tableau et se mets en sélectionné ou pas
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  17. #17
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Bonjour,
    OK,Merci pour ta proposition, tu me dit: «..lors que ta listbox se redessine..» donc à chaque clique de souris je fais passer tous mes Items de ma listbox par une boucle, mais si j'ai plus de 40.000 items, est-ce assez rapide? Merci

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Mets les Keybd_Event dans OnMouseEnter, OnMouseLeave du ListBox.

  19. #19
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Je viens de tester ta proposition qui fonctionne très bien. J'avais passé plongement sur cette difficulté, n'y croyant plus vraiment.. Merci beaucoup à vous tous.

  20. #20
    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
    Citation Envoyé par Ardely Voir le message
    Bonjour,
    OK,Merci pour ta proposition, tu me dit: «..lors que ta listbox se redessine..» donc à chaque clique de souris je fais passer tous mes Items de ma listbox par une boucle, mais si j'ai plus de 40.000 items, est-ce assez rapide? Merci
    40 000 items dans une listbox

    Pour le redessine, il y a un évènement prévu à cet effet qui ne redessine que ce qui est visible à l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure Tfrm_MSSMain.Lbx_DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
     
    end;
    Avec Index qui correspond à l'item en cours.

    Après le système avec les KeyBd_Event le problème c'est que si tu vas vite ou que tu fait un alt+Tab pour switcher vers une autre application le Ctrl reste dans l'état appuyé. Et que ce passe-t-il lorsque ton curseur est sur la listbox et que tu appuies sur CTRL et le relache ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. mapper évent calvier avec clic souris
    Par guillaume07 dans le forum Qt
    Réponses: 4
    Dernier message: 26/11/2009, 16h29
  2. Gérer un clic souris maintenu avec OpenGL
    Par PetitProgJava dans le forum OpenGL
    Réponses: 1
    Dernier message: 09/01/2009, 13h39
  3. [Sources] Positionnement et clic souris avec API "mouse_event"
    Par DAUDET78 dans le forum Vos contributions VB6
    Réponses: 0
    Dernier message: 01/05/2008, 13h43
  4. Rafraichir OnPaint() avec clic de souris
    Par dragongia_fr dans le forum MFC
    Réponses: 2
    Dernier message: 27/04/2008, 13h39
  5. jtable avec cellule modifiable lors du clic souris
    Par ASSOUMA2007 dans le forum Composants
    Réponses: 1
    Dernier message: 24/03/2007, 16h46

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