Couleur pour le composant TreeView

Signaler
Messages postés
12
Date d'inscription
jeudi 15 avril 2004
Statut
Membre
Dernière intervention
7 juin 2004
-
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
Voila j'ai une arborescence a trois niveau.

Premier niveau j'ai le nom des sites
Deuxieme niveau j'ai le nom des batiments relié
Troisieme niveau j'ai le nom des articles relié

Pour chaqu'un correspond une date.
Je souhaiterai que si la date est antérieur a celle du jour le nom qui apparai dans le treeView soit en rouge ...

Ma question est donc comment changer la couleur de ce que l'on ecrit dans l'arborescence ?

7 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Pour cela, il faut utiliser l'évènement OnCustomDrawItem.
Exemple avec une écriture en encre verte du texte des noeuds dont la propriété StateIndex vaut zéro :
procedure TMainFormDemo.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if Node.StateIndex = 0 then
    TreeView1.Canvas.Font.Color := clGreen

end;


Il te suffira de remplacer la condition (et la couleur, lol) par celle qui est la tienne.
May Delphi be with you
Messages postés
12
Date d'inscription
jeudi 15 avril 2004
Statut
Membre
Dernière intervention
7 juin 2004

Merci a toi Delphiprog

J'ai encore un petit probleme car voila ma situation :

J'ai trois tables
La premier Site ou j'ai le nom du site, son identifiant et la date de la prochaine visite,
La deuxieme Batiment ou j'ai le nom du batiment, son identifiant, la date de la prochaine visite et l'identifiant du site au quel il appartient,
La troisieme Article ou j'ai le nom de l'article, son identifiant, la date de la prochaine visite et l'identifiant du batiment au quel il appartient.

J'ai donc mis trois ADOTable.

Et donc je voudrai que si la date de visite d'un élément est dépassé seul cette elément soit en rouge.
Et que son ou ses parents si eux meme ne sont pas déja rouge soit violet

J'espere avoir ete le plus clair possible

Voila le code que moi j'ai mis :

procedure TFicheArbo.TreeViewArboCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Node.Level = 0) then
begin
if (ADOTableSite.FieldByName('ProchVisitSite').asdatetime < date) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
end;
if (ADOTableSite.FieldByName('ProchVisitSite').asdatetime > date) then
begin
TreeViewArbo.Canvas.Font.Color := ClWindowText;
end;
end;

if (Node.Level = 1) then
begin
if ( (ADOTableBat.FieldByName('ProchVisitBat').asdatetime < date) and (ADOTableSite.FieldByName('ProchVisitSite').asdatetime < date) ) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
end;
if ( (ADOTableBat.FieldByName('ProchVisitBat').asdatetime < date) and (ADOTableSite.FieldByName('ProchVisitSite').asdatetime > date) ) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
//Mise en ClFuchsia du noeud supérieur
end;
if ( (ADOTableBat.FieldByName('ProchVisitBat').asdatetime > date) and (ADOTableSite.FieldByName('ProchVisitSite').asdatetime > date) ) then
begin
TreeViewArbo.Canvas.Font.Color := ClWindowText;
end;
end;

if (Node.Level = 2) then
begin
if ( (ADOTableArt.FieldByName('ProchVisitArt').asdatetime < date) and (ADOTableBat.FieldByName('ProchVisitBat').asdatetime < date) ) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
end;
if ( (ADOTableArt.FieldByName('ProchVisitArt').asdatetime < date) and (ADOTableBat.FieldByName('ProchVisitBat').asdatetime > date) and (ADOTableSite.FieldByName('ProchVisitSite').asdatetime < date) ) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
//Mise a ClFuchsia du noeud supérieur
end;
if ( (ADOTableArt.FieldByName('ProchVisitArt').asdatetime < date) and (ADOTableBat.FieldByName('ProchVisitBat').asdatetime > date) and (ADOTableSite.FieldByName('ProchVisitSite').asdatetime > date) ) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
//Mise a ClFuchsia du noeud supérieur
//Mise a ClFuchsia du noeud supérieur-supérieur
end;
if ( (ADOTableArt.FieldByName('ProchVisitArt').asdatetime > date) ) then
begin
TreeViewArbo.Canvas.Font.Color := ClWindowText;
end;
end;
end;

Avec ce code des que pour le level 0 un site a sa date de prochaine visite qui est dépassé tous les site sont en rouge et pour les level 1 et 2 il ne se passe rien ...

J'avais eu l'idée des désigner les couleurs dans le remplissage de mon TreeView
juste après chaque

TreeViewArbo.selected:=items.add(selected,ADOTableSite.FieldByName('NomSite').asstring);

mettre

if (ADOTableSite.FieldByName('ProchVisitSite').asdatetime < date) then
begin
TreeViewArbo.Canvas.Font.Color := clRed;
end;
if (ADOTableSite.FieldByName('ProchVisitSite').asdatetime > date) then
begin
TreeViewArbo.Canvas.Font.Color := ClWindowText;
end;

mais ca ne fai absolument rien...
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Pour ceux que ça intéresse, tous les détails de cette affaire sont disponibles sur mon site : j'y vais de suite !.
Allez y, vous ne serez pas déçus, c'est promis.
May Delphi be with you
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
hello,

me voici avec un ptit soucis :
j'ai un TListView en vsReport, j'ai une TListImage avec 24 images de w25*h15.

quand j'ajoute un item avec un stateindex > 16, il ne prends pas l'image 17, 18 mais reviens à 0, 1 ...

le stateindex est il limité à 16 etats ?
dans ce cas, comment afficher mes images correctement ! merci

ps : au cas ou, voila le bout de code ki insere : (lv_ranks = ma listview et lPlayer declaré en TListItem)
lPlayer := lv_ranks.Items.Add;
lplayer.StateIndex := 20;
lPlayer.SubItems.Add('truc');
lPlayer.SubItems.Add('machin');
lPlayer.SubItems.Add('bidule');
lPlayer.SubItems.Add('dernier');

merci :|
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Question bête : la propriété StateImages de ton composant lv_ranks est-elle renseignée avec la même liste d'images que la propriété SmallImages ou LargeImages ?
Parce que si tu n'as pas les mêmes listes d'images... :big)
May Delphi be with you
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
smallimages et largeimages ne sont pas renseignees
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
je viens de remplir les deux (small et large) mais rien n'y fait : les images revienne tà 0 a partir de la 16éme