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 :

Utilisation Listview avec CheckBoxes


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Par défaut Utilisation Listview avec CheckBoxes
    Bonjour,
    Je suis retraité depuis quelques années ce qui explique que je m'accroche désespérément à mon Delphi 7 pour faire travailler encore un peu mon cerveau.
    J'aimerais améliorer mon programme Eject_USB
    Composant : ListView1 avec Listview1.CheckBoxes
    An démarrage je fais l'inventaire des unités USB à éjecter
    Donc aucune ligne n’est sélectionnée
    En cliquant sur un CheckBoxes, la coche alternativement ListView1.Items[I].Checked est à true ou false (Bien)
    mais la partie de droite n'est pas sélectionnée (j'aimerais améliorer)
    En cliquant sur une ligne (caption) la case cochée apparait ou disparait et les lignes sont activées au fur et à mesure (Bien)
    Mes questions :
    1) Comment faire pour qu'un clic sur une coche entraine automatiquement un fond bleu sur le "caption" ; en fait pour Synchroniser les 2 éléments.
    Formulé autrement :
    Si le clic se fait sur une coche alors qu'aucune ligne 'caption' n'a encore été sélectionnée il faudrait automatiquement que ligne soit aussi sélectionnée.
    2) Eventuellement peut-on neutraliser une coche comme JvxCheckListBox1 (ex. pour le disque dur ou SDD de la machine) je sui obligé de passer par ListView1Click
    D'avance merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 636
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par dennler Voir le message
    Je suis retraité depuis quelques années, ce qui explique que je m'accroche désespérément à mon Delphi 7 pour faire travailler encore un peu mon cerveau.
    l'utilisation de la version 11.3 Community le ferait chauffer à moins que Lazarus pour son côté "fouille dans la mécanique" ne soit une option plus D7.
    Cela étant, allant bientôt faire partie du joyeux club des retraités, moi aussi je vais continuer à faire travailler mes neurones (avec un gros avantage que m'apporte mon nouveau titre de MVP l'accès aux nouvelles versions)

    J'aimerais améliorer mon programme Eject_USB
    Marrant, j'avais bossé sur un sujet semblable il y a des années
    (entre 2007 et 2010 avec une assiduité erratique)

    Au démarrage je fais l'inventaire des unités USB à éjecter
    Je serais intéressé par le comment. "WMI or not WMI that is the question"


    Mes questions
    Intéressantes, je lance ma machine virtuelle pour satisfaire ma curiosité ....

    Alors, je partirai sur les évènements CustomDraw, ce simple code répondrait-il à la question 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
    Item.Checked:=Item.Selected;
    end;
    ici multiselect est actif, mais fonctionne correctement aussi dans le cas contraire (un seul item en bleu)
    Nom : Capture.PNG
Affichages : 181
Taille : 2,7 Ko

    Cependant, je ne peux plus faire un clic sur une coche, contrairement à ce qui est mis en redéfinition de la question, donc l'instruction Item.Checked:=Item.Selected est incorrecte.

    Ceci me semble plus juste sans être sûr d'une correspondance au besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if Item.Checked then
        TListView(Sender).Canvas.Brush.Color := clHighlight
      else TListView(Sender).Canvas.Brush.Color := clWindow;
    En m'attachant à la question 2, j'ai ma réponse à l'utilisation de WMI, j'ai l'impression que c'est non, car tous les lecteurs (amovibles ou pas serait listé ?)
    À mon avis, là encore, il s'agit d'utiliser ce même évènement en dessinant sur le canvas de la ListView selon une valeur de l'item (l'indice état ou l'indice image d'un élément me parait pas mal)
    Cela reste un peu plus compliqué mais jouable

    nouveau 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
    procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var R : Trect;
    begin
    if Item.Checked then
        TListView(Sender).Canvas.Brush.Color := clHighlight
      else TListView(Sender).Canvas.Brush.Color := clWindow;
    if Item.ImageIndex=1 then  // test à voir 
     begin
        r := Item.DisplayRect(drBounds);
        TListView(Sender).Canvas.Brush.Color := clSilver;
        ListView1.Canvas.FillRect(R);
        ListView1.Canvas.TextOut(R.left+18,r.top,Item.Caption);
        defaultdraw:=false;
      end;
    end;
    et voilà le résultat
    Nom : Capture.PNG
Affichages : 173
Taille : 2,5 Ko
    améliorable : la zone colorée en argent est trop grande, mais ce n'est qu'une question facultative

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Question TCheckListBox existe en D7 ?
    Si Oui, il est plus simple à revisiter que la TListView


    La propriété RowSelect peut aussi jouer sur le visuel de sélection

    Mais la CheckBox et le Selected restent deux choses disjointes en temps normal, on peut sélectionner sans cocher et réciproquement.

    A OnCustomDrawItem je lui préfère OnAdvancedCustomDrawSubItem au Stage = cdPrepaint quand il s'agit de la couleur de fond

    Sache que tu peux redessiner ce que tu veux, par exemple voir ma fonction TListViewSLTAssistant.DrawItemCheckBox alors j'utilise plus souvent de TDBGrid et donc TDBGridSLTAssistant.DrawCheckBox car je ne voulais pas forcément avoir la case à cocher sur la gauche

    Avec un TListView en Report avec SubItems, je me souviens avoir dessiner un check box dans un SubItem, si je retrouve ça

    Je dois avoir quelque part un code en TListview OnAdvancedCustomDrawSubItem qui ne requiert pas de redessiner le texte (cela conserver le OwnerDraw à True mais change juste le fond) ...


    Cela c'est avec un TDBGrid mais je chercherais la version en TListView ... probablement en C++Builder 6 d'ailleurs qui sera facile à transcrire en D7


    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Par défaut Pour SergioMaster
    Bonjour,
    Mr SergioMaster j’aimerais bien vous envoyer mes sources largement inspirées et copiées d’internet (certainement de vous aussi); mais je ne sais pas faire (je n’ai pas réussi en pièces jointes)
    La solution avec .ListView1CustomDrawItem me donne pas entièrement satisfaction

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Par défaut A ShaiLeTroll
    Bonjour,
    Je n’ai pas encore tout étudié mais avec OnAdvancedCustomDrawSubItem tout semble fonctionner, super.
    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 636
    Billets dans le blog
    65
    Par défaut
    Généralement, il y a le bouton pièce jointe (à droite du bouton Smiley) qui accepte les zips.
    ouvrant une fenêtre
    Nom : Capture.PNG
Affichages : 177
Taille : 95,8 Ko
    cliquer sur ajouter des fichiers
    Nom : Capture.PNG
Affichages : 177
Taille : 28,3 Ko
    puis envoyer
    Il reste ensuite l'étape inserrer directement qui devrait finir le job
    Nom : Capture.PNG
Affichages : 173
Taille : 11,3 Ko

    Seulement, il faut peut-être un certainement un statut membre (nombre de points)
    Sinon la solution copier/coller dans un bloc code (bouton #) ça fonctionne pas mal

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Par défaut ShaiLeTroll
    Bonjour,
    A priori je préfère un TlistView à un TCheckListBox car j’ai sur une même ligne :
    - Checkbox
    - Une icône pour représenter l’unité
    - Un texte avec l’unité et le nom ……
    Nom : Eject_USB.JPG
Affichages : 168
Taille : 34,1 Ko

Discussions similaires

  1. ListView avec checkbox et adapter
    Par Beetle dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 21/02/2011, 15h59
  2. WPF ListView avec Checkbox, trouver l'item qui a été Checked
    Par fmadore dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 09/12/2008, 17h21
  3. [VB.NET] Problème ListView avec checkbox
    Par elkidos dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2007, 15h27
  4. Listview avec checkboxes (récupérer cocher)
    Par Ardely dans le forum Delphi
    Réponses: 3
    Dernier message: 08/01/2007, 17h01
  5. [VB.NET] Listview avec checkboxes
    Par Tiib_CD dans le forum Windows Forms
    Réponses: 8
    Dernier message: 05/12/2006, 09h23

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