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

Lazarus Pascal Discussion :

Couleur des sous-items d'une ListView [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut Couleur des sous-items d'une ListView
    Bonjour,
    Voilà mon souci : je remplis mon listview avec des données issues d une bdd, sauf que suivant la valeur d'un champ je dois mettre le subitem correspondant d'une certaine couleur.
    J"ai trouvé sur le net comment mettre un subitem avec une couleur de fond différente mais pas comment le faire en fonction de la valeur d'un autre subitems.
    J'utilise cette fonction pour mettre de la couleur mais en réponse j'ai une erreur car il me dit que le String[1] est not found... Je précise que le listview est rempli lors de la saisie sur un champ Tedit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure Tfrm_recherche.lst_persCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
     
    begin
    if ((subitem=7) and (item.SubItems.Strings[1]='tot')) then sender.Canvas.font.color:=clgreen;
     
    end;
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut
    Subitems est deja un TStrings donc le Strings est de trop

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure Tfrm_recherche.lst_persCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
     
    begin
      if ((subitem=7) and (item.SubItems[1]='tot')) then 
         sender.Canvas.font.color:=clgreen;
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut
    j ai essaye avec ton code mais il me redonne la même erreur : List Index 7 out of bounds ( j ai remplace le numero d' index de 1 par 7 )

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut
    Pour bien comprendre ma demarche voila le bout de code complet avec le remplissage de la Tlistview
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
     
    procedure Tfrm_recherche.lst_persCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    begin
      if ((subitem=6) and (item.SubItems[6]='0')) then sender.Canvas.font.color:=clgreen;
     
    end;
     
     
     
     
     
    procedure Tfrm_recherche.txt_rechChange(Sender: TObject);
    var li:TlistItem;
        Senderb: TCustomListView;
        Item: TListItem ;
    begin
      reqsql.close;
      reqsql.sql.text:='select id_pers,CAST(nom_pers AS CHAR(255)) as nom_pers,prenom,naissance,lieu,badge,statut from accueil2_personnes where nom_pers like "'+txt_rech.Text+'%" or prenom like "'+txt_rech.text+'%"';
      reqsql.Open;
      lst_pers.Clear;
      while not reqsql.EOF do
      begin
    //       ShowMessage(SQLquery1.Fields[0].AsString);
           li:=lst_pers.Items.add;
           li.Caption:=reqsql.Fields[0].AsString;
           li.SubItems.Add(reqsql.Fields[1].AsString);
           li.SubItems.Add(reqsql.Fields[2].AsString);
           li.SubItems.Add(reqsql.Fields[3].AsString);
           li.SubItems.Add(reqsql.Fields[4].AsString);
     
           if (reqsql.fields[5].AsString='0') then
             begin
                   li.SubItems.Add('');
             end
           else
           begin
           li.SubItems.Add(reqsql.Fields[5].AsString);
             end ;
     
           if reqsql.fields[6].AsString='0'  then
              begin
                    li.SubItems.Add('AUTORISE');
              end
            else
            begin
            li.SubItems.Add('NON AUTORISE');
             end;
     
            li.SubItems.Add(reqsql.Fields[6].AsString);
     
     
     
           reqsql.Next;
     
      end;
     
    end;

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Je pense que ton ListView, chaque fois qu'il doit se redessiner, va exécuter le test.
    Chaque fois que tu lui ajoutes un élément, il va vouloir se redessiner, y compris avant de lui avoir ajouté autant d'éléments, d'où une violation d'accès (index out of bounds).
    Il doit suffire de tester la propriété Count avant de faire le test pour être sûr de ne pas dépasser.
    Autre solution, si applicable, encadrer d'un ListView.BeginUpdate/EndUpdate sa mise à jour pour qu'il ne se rafraichisse pas avant d'être rempli.

    [EDIT] la liste des SubItems est d'indice démarrant à zéro, donc subitems[0..Count-1]
    mais le test if (subitem=6) ne devrait pas déclencher la vérification and (item.SubItems[6]='0')) sauf option de compilation réglée pour évaluer toutes les conditions même quand résultat de l'évaluation déjà connu, non ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut
    merci pour la dernière idée , j ai ajouté un beginupdate et endupdate et cela fonctionne correctement.
    merci encore

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/09/2007, 16h39
  2. Sélectionner la zone d'un SubItem d'une TListView
    Par FredericB dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/04/2006, 22h15
  3. [VB.NET] BackColor d'un subitem d'une ListViewItem
    Par jennings dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/12/2004, 08h54
  4. Changer dynamiquement la couleur d'un item d'une listview
    Par little_cypress dans le forum C++Builder
    Réponses: 2
    Dernier message: 29/11/2004, 14h46
  5. couleurs des éléments 3D d'une appli
    Par Eugénie dans le forum MFC
    Réponses: 29
    Dernier message: 12/03/2004, 11h31

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