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

C++Builder Discussion :

Problème affichage dans une TlistView


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Points : 53
    Points
    53
    Par défaut Problème affichage dans une TlistView
    Bonjour à tous,

    J'ai une TlistView qui m'affiche un ensemble d'informations sur plusieurs lignes. Afin de différencier les lignes doublons, j'ai surligné en jaune chaque nouvelles lignes de cette façon :

    Dans mon .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender, TListItem *Item,
    		  TCustomDrawState State, bool &DefaultDraw)
    {
    		if(Item->Caption == nvlligne){
    		  ((TListView*)Sender)->Canvas->Brush->Color = clWhite ;
    		}
    		else
    		{
    		  ((TListView*)Sender)->Canvas->Brush->Color = clYellow ;
    		}
     
    		nvlligne= Item->Caption;
    }
    Et dans mon .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern PACKAGE TForm1 *Form1;
    AnsiString nvlligne;
    Lorsque je compile le programme, tout fonctionne à merveille, les lignes sont bien surlignées cependant lorsque je passe ma souris sur ces lignes le surlignage disparaît par moment.

    Quelqu'un aurait une idée ?
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 581
    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 581
    Points : 25 239
    Points
    25 239
    Par défaut
    Il faut jouer avec DefaultDraw pour accepter ou non le dessin par défaut !
    Là dans ton cas, tu ne change que la couleur, mais lorsque State contient Selected ou Focused, cela doit ignorer ton changement de couleur

    essaye de voir avec OnAdvancedCustomDrawItem au lieu de OnCustomDrawItem, tu pourras mieux gérer chaque niveau de dessin par rapport à la sélection

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Merci ShaiLeTroll, j'ai réussi à résoudre l'état csSelected par contre je n'arrive pas à interdire le dessin lorsque ma souris passe au dessus de l'élément.

    J'utilise l'état :

    cdsHot : L'élément est sous le curseur de la souris et la propriété HotTrack a la valeur true.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Petit up, je n'ai toujours pas réussi à résoudre mon problème, j'ai beau manipuler les Etats du TCustomDrawState rien n'y fait. Si quelqu'un a une petite idée, je suis preneur.

    Code source :
    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
    void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender, TListItem *Item,
    		  TCustomDrawState State, bool &DefaultDraw)
    { // surligne en jaune les nouvelles adresse macs
    AnsiString nvlligne= "";
     
    if (State.Contains(cdsSelected) ){}
    else {
    	if(State.Contains(cdsMarked)){}
    	else{
    		if(Item->Caption == nvlligne){
    		  ((TListView*)Sender)->Canvas->Brush->Color = clWhite ;
    		}
    		else
    		{
    		  ((TListView*)Sender)->Canvas->Brush->Color = clYellow ;
    		}
    		nvlligne= Item->Caption;
    		}
    }
    }
    Quel est l'état lorsque la fenêtre dessine pour la 1ere fois les éléments, l'état défaut ?

    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Pour résumer J'aimerais mettre en surbrillance les lignes qui ont un caption unique. Lorsque la fenêtre se dessine pour la 1ere fois le résultat est bon. C'est lorsque je passe ma souris sur un élément que la listview commence à faire n'importe quoi.

    J'ai beau faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if (!(State.Contains(cdsHot))) {
    		if(Item->Caption == nvlLigne){
    		  ((TListView*)Sender)->Canvas->Brush->Color = clWhite ;
    		}
    		else
    		{
    		  ((TListView*)Sender)->Canvas->Brush->Color = clYellow ;
    		}
    		nvlLigne= Item->Caption;
     
    }else{
    Filtrer->Caption = "Bonjour";
    }
    Il me redessine quand même mes lignes en enlevant par moment la surbrillance.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 80
    Points : 53
    Points
    53
    Par défaut
    Est-ce qu'il est possible de mettre en couleur plusieurs lignes bien distinctes avec le composant ListView et sans passer par un customDraw ?

    Si oui comment faire ? Mon code est prêt mais je ne sais comment réalisé cette opération.

    Actuellement j'utilise ceci, mais il me colorie l’ensemble de la ListView...

    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
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString nvlMac;
    ListView1->Clear();
     
    TListItem *item;  
    TStringList *sl = new TStringList();
    sl->Sorted = true;
    sl->Duplicates = dupAccept;
    sl->LoadFromFile( "Adj.coz" );
     
    AnsiString date;
    AnsiString ip;
    AnsiString mac;
     
    for( int i=0; i < sl->Count; i++ )
    {
        item = ListView1->Items->Add();
        AnsiString l= sl->Strings[i];
        date = strtok(l.c_str(), ";"); 
        ip = strtok(NULL, ";");
        mac = strtok(NULL, ";");
     
        item->Caption = mac;
        item->SubItems->Add(ip);
        item->SubItems->Add(date);
     
        if(Item->Caption == nvlMac){
            ListView1->Canvas->Brush->Color = clWhite ;
        }
        else
        {
            ListView1->Canvas->Brush->Color = clYellow ;
        }
        nvlMac = Item->Caption;
    }
     
    delete sl ;
    }
    Merci et désolé du flood mais je dois résoudre ce problème au plus vite.

  7. #7
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Sixpounder
    Un petit bout de code qui permet de colorer le fond et la police d'un Item
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         ListView1->OnCustomDrawItem = ListView1CustomDrawItem;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender,
          TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
    {
     if(Item->Selected == true)
       {
         ListView1->Canvas->Font->Color = clRed;
         ListView1->Canvas->Brush->Color = clGreen;
       }
       else
       {
         ListView1->Canvas->Font->Color = clBlack;
         ListView1->Canvas->Brush->Color = clWhite;
       }
    }
    //---------------------------------------------------------------------------
    La modification s'effectue sur l'Items selectionne apres le click sur le button

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/02/2008, 13h48
  2. Réponses: 2
    Dernier message: 23/06/2007, 14h54
  3. [MySQL] problème d'affichage dans une liste
    Par bromlecornu dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 23/05/2007, 16h08
  4. problème affichage dans une page html
    Par ljoly dans le forum Flash
    Réponses: 6
    Dernier message: 22/09/2006, 16h57
  5. Problème d'affichage dans une zone de "dessin"
    Par jason69 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 28/08/2006, 16h12

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