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 :

Mettre de la couleur dans un TListView avec l'utilisation de l'apparence dynamique


Sujet :

Delphi

  1. #1
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut Mettre de la couleur dans un TListView avec l'utilisation de l'apparence dynamique
    Chers membres du club,

    Nous avons le plaisir de publier un nouveau tutoriel proposé par Serge Girard.


    Mettre en exergue, via une couleur de fond, l'élément d'un TListView est une demande fréquemment formulée dans les forums consacrés à Delphi. Les solutions proposées ne sont pas toujours faciles à mettre en œuvre, car, contrairement à une liste simple de type TListBox, il n'est pas possible de passer par des styles personnalisés pour le faire.

    L'apparition de l'apparence dynamique d'un élément de liste avec la version Berlin 10.1, ainsi que les compétences techniques et pédagogiques de Serge Girard vont vous permettre de résoudre ce problème très simplement !

    http://serge-girard.developpez.com/t...ings/ListView/

    Nom : serge.PNG
Affichages : 1792
Taille : 9,4 Ko


    Que pensez-vous de ce tutoriel ?

    Quels problèmes rencontrez-vous dans la manipulation des couleurs et des contrôles avec Delphi ?

    Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation Delphi
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  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
    Bonsoir,

    Je tiens à remercier notre ami Serge d'avoir pris le temps de rédiger cet intéressant tutoriel. Il est toujours disponible ce vieux codeur

    Ce tutoriel, je le trouve formidable ! Il est bien expliqué, clair et net.
    Bravo

    Encore merci !

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Intéressant de voir à quel point la même chose avec un VCL TListView fait à l'ancienne n'a rien à voir avec un FMX 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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    procedure TZooXXXXVCLMainForm.lvColorsClick(Sender: TObject);
    begin
      if Assigned(TListView(Sender).Selected) then
        ShowMessage(TListView(Sender).Selected.Caption);
    end;
     
    procedure TZooXXXXVCLMainForm.lvColorsColumnClick(Sender: TObject; Column: TListColumn);
    var
      Critere: string;
      I: Integer;
    begin
      if InputQuery('Recherche', 'la couleur contient', Critere) then
      begin
        for I := 0 to TListView(Sender).Items.Count - 1 do
        begin
          if ContainsText(TListView(Sender).Items[I].Caption, Critere) then
          begin
            TListView(Sender).Selected := TListView(Sender).Items[I];
            TListView(Sender).Selected.MakeVisible(False);
            Exit;
          end;
        end;
      end;
    end;
     
    procedure TZooXXXXVCLMainForm.lvColorsCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
     
      function GetConstratedColor(AColor: TColor): TColor;
      var
        H, S, L: Word;
      begin
        ColorRGBToHLS(ColorToRGB(AColor), H, L, S);
        if L > 120 then
        begin
          if L < 168 then
          begin
            if H <= 140 then
            begin
              if (H in [0..20]) or (H in [220..240]) then
                Result := clWhite // Clair sur rouge
              else
                Result := clBlack // Foncé jaune et vert moyen
            end
            else
              Result := clWhite // Clair sur bleu ou violet moyen
          end
          else
            Result := clBlack // Foncé sur Clair
        end
        else
        begin
          if L > 90 then
          begin
            if (H in [0..20]) or (H in [48..240]) then
            begin
              if (S > 200) and (H in [48..128]) then
                Result := clBlack // Vert Citron
              else
                Result := clWhite // Clair sur Marron, Vert, Bleu et Pourpre
            end
            else
              Result := clBlack // Foncé sur le Jaune et Fuschia
          end
          else
            Result := clWhite; // Clair sur Foncé
        end;
      end;
     
     
    var
      ItemRect: TRect;
      ItemText: string;
    begin
      DefaultDraw := False;
      Sender.Canvas.Pen.Color := GetConstratedColor(Item.GroupID);
      Sender.Canvas.Brush.Color := Item.GroupID;
      ItemRect := Item.DisplayRect(drBounds);
      Sender.Canvas.FillRect(ItemRect);
     
      ItemText := Item.Caption;
      Sender.Canvas.Font.Color := GetConstratedColor(Item.GroupID);
      Sender.Canvas.TextRect(ItemRect, ItemText, [tfSingleLine, tfCenter, tfVerticalCenter]);
    end;
     
    procedure TZooXXXXVCLMainForm.ColorCallBack(const AName: String);
    var
      L: Integer;
    begin
      L := Length(FColorArray);
      SetLength(FColorArray, L + 1);
      FColorArray[L].Name := AName;
      FColorArray[L].Value := ColorToRGB(StringToColor(AName));
    end;
     
    procedure TZooXXXXVCLMainForm.lvColorsDblClick(Sender: TObject);
    var
      iWebColor: Integer;
      I, L: Integer;
    begin
      SetLength(FColorArray, 0);
      TListView(Sender).Items.Clear();
     
      Vcl.Graphics.GetColorValues(ColorCallBack);
     
      L := Length(FColorArray);
      SetLength(FColorArray, L + Length(Vcl.GraphUtil.WebNamedColors));
     
      for iWebColor := Low(Vcl.GraphUtil.WebNamedColors) to High(Vcl.GraphUtil.WebNamedColors) do
      begin
        FColorArray[L + iWebColor].Name := Vcl.GraphUtil.WebNamedColors[iWebColor].Name;
        FColorArray[L + iWebColor].Value := ColorToRGB(Vcl.GraphUtil.WebNamedColors[iWebColor].Value);
      end;
     
      SortColorArray(FColorArray, Low(FColorArray), High(FColorArray), stSaturation);
     
      for I := Low(FColorArray) to High(FColorArray) do
        with TListView(Sender).Items.Add() do
        begin
          Caption := FColorArray[I].Name;
          GroupID := FColorArray[I].Value;
        end;
    end;
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut Correction/Errata
    Bonjour,
    Même si le programme proposé était FMX, on m'a signalé (il y a peu) qu'il ne fonctionnait qu'uniquement en application de bureau et pas sur les mobiles

    Tout d'abord une faute s'était glissé dans le zip, dans la version proposée le PrototypeBindSource n'a pas de champ Bitmap et donc pas de liaison, contrairement à ce qui est indiqué dans le texte du tutoriel. À la place un TBitmap était créé à l'exécution et ce pour chaque élément, ce qui nécessitait, au demeurant, un nettoyage en fin de programme.

    Vous serez certainement heureux d'apprendre que j'ai enfin trouvé une solution à ce problème et ce en ajoutant une seule ligne de 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
     
    procedure TForm1.ListView1UpdatingObjects(const Sender: TObject;
      const AItem: TListViewItem; var AHandled: Boolean);
    var AListItemBitmap : TListItemImage;
        AListItemText : TListItemText;
        AColor : TAlphaColor;
        i : Word;
    begin
    AListItemBitmap:=AItem.Objects.FindObjectT<TListItemImage>('Image2');
    {$IFNDEF STEP2}
    AListItemText:=AItem.Objects.FindObjectT<TListItemText>('Text1');
    if Assigned(AListItemBitmap) then
     begin
         AListItemBitmap.OwnsBitmap:=True; // ici la modification
         AListItemBitmap.Bitmap:=TBitmap.Create(40,40);
         try
           AColor:=StringToAlphaColor(AListItemText.Text)
         except // certaines couleurs sont inconnues! i.e. monneygreen, ltgrey
          AColor:=TAlphaColorRec.Null;
         end;
         AListItemBitmap.Bitmap.Clear(Acolor); //:=ABitmap;
     end;
    {$ENDIF}
    {$IFDEF STEP2}
    if Assigned(AListItemBitmap) then
     begin
        AListItemBitmap.OwnsBitmap:=True; // ici la modification
        AListItemBitmap.Bitmap:=TBitmap.Create(40,40);
        i:=Abs(AItem.Text.ToInteger) mod 3;
           case i of
             0 : AColor:=TAlphaColorRec.Green;
             1 : AColor:=TAlphaColorRec.Yellow;
             2 : AColor:=TAlphaColorRec.Red;
           end;
        AListItemBitmap.Bitmap.Clear(AColor);
     end;
    {$ENDIF}
    end;
    Le fait d'indiquer que l'image appartient à l'élément (OwnsBitmap:=True) change tout et, cerise sur le gâteau, plus besoin de nettoyage en fin de programme.

    Je vais tenter de modifier tutoriel via un addenda et les sources jointes, toutefois la rédaction de ces derniers avait été faite sur un disque qui a planté lors de ma présentation à Paris, croisez les doigts
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 213
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Vous serez certainement heureux d'apprendre que j'ai enfin trouvé une solution à ce problème et ce en ajoutant une seule ligne de code !
    C'est "amusant" comme c'est souvent le cas. De gros bugs sont résolus avec si peu de code.

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. Mettre une couleur dans une cellule avec user form
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 10/01/2008, 12h12
  3. mettre de la couleur dans une cellule
    Par Jiraiya42 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 03/06/2005, 10h16

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