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

Composants VCL Delphi Discussion :

Procedure ListBox1DrawItem avec condition


Sujet :

Composants VCL Delphi

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut Procedure ListBox1DrawItem avec condition
    Bonjour,

    Je voudrais savoir pourquoi lorsque je mets une condition, l'affichage de mon listbox ne se reinitialise pas ? L'erreur doit etre enorme, mais je ne la vois pas. J'ai meme essayé avec un listbox1.repaint, ca me fait n'importe quoi !!!

    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
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
    var marge:integer;
    begin
        //on dessine le fond des lignes en alternant les couleurs
        if index mod 2<>1 then
          begin
              ListBox1.canvas.brush.color:=clwhite;
              ListBox1.canvas.fillrect(rect);
          end
        else
          begin
              ListBox1.canvas.brush.color:=$00F4F3EE;
              ListBox1.canvas.fillrect(rect);
          end;
        //on affiche le texte
        ListBox1.canvas.textout(rect.left+30,rect.top+2,ListBox1.items[index]);
        //affichage lorsque la ligne est sélectionnée
        if (odSelected in state) then
          begin
    //          ListBox1.canvas.brush.color:=$00F8D1C5;
              ListBox1.canvas.fillrect(rect);
              ListBox1.canvas.font.color:=clblue;
              ListBox1.canvas.font.style:=ListBox1.canvas.font.style +[fsbold]+[fsitalic];
              ListBox1.canvas.textout(rect.left+30,rect.top+2,ListBox1.items[index]);
          end;
        {Dessin des icônes}
    Puis, si je mets comme ceci, le listbox s'affiche correctement !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              marge:=(Rect.Bottom-Rect.Top-DM.imageList1.Height) div 2;
              DM.imageList1.Draw(ListBox1.canvas, Rect.Left+4, Rect.Top+marge, 13);
          end;

    Le problème vient d'ici. Lorsque je remplace mes deux dernieres lignes de code par une condition, le premier affichage est parfait, mais lorsqu'une fenetre s'affiche par dessus mon listbox et que je la referme, les icones sont soient effacées ou tronquées !!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        {Dessin des icônes}
        if Tableau_Icone[DessinIcone]<>'' then
          begin // Dessin de l'icône avec "cadenas"
              marge:=(Rect.Bottom-Rect.Top-DM.imageList1.Height) div 2;
              DM.imageList1.Draw(ListBox1.canvas, Rect.Left+4, Rect.Top+marge, 13);
          end
        else
          begin // Dessin de l'icône "vide"
              marge:=(Rect.Bottom-Rect.Top-DM.imageList1.Height) div 2;
              DM.imageList1.Draw(ListBox1.canvas, Rect.Left+4, Rect.Top+marge, 0);
          end;
        inc(DessinIcone);
    end;

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Une petite piste :
    j'ai pas analysé vraiment le code, mais il est probable que les images débordent sur l'item du dessous. Ca n'a pas d'importance lorsqu'on trace toute la liste. Par contre, si qui masquait une partie de la liste disparait, seulement lest items masqués sont retracés.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    J'ai oublié de preciser :
    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListBox1.style:=lbOwnerDrawVariable;
    et pour ItemHeight, je l'ai agrandi de 13 par défaut à 20
    En fait, lorsque je referme une fenetre qui s'était affichée au dessus de mon listbox, il ne tient plus compte de ma condition, il dessine toujours les icones "cadenas". Des fois, je ne sais pour quelle raison, l'icone est coupée en 2 ...

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    La procédure ondraw pouvant se produire à tout moment et sur un ou plusieurs items de la liste, l'instruction inc(dessinIcone) me semble anormale.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Tu viens de soulever, je pense le problème. J'ai absolument besoin de l'instruction inc(dessinIcone). Le problème est à quel moment, dessinIcone se reinitialise à 0 ... Je vais reflechir de ce coté !!!!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 92
    Par défaut
    Effectivement, le probleme venait de l'incrementation. Alors qu'il suffisait juste de remplacer par index ...

    Merci de m'avoir mis la puce à l'oreille !!!!

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Par défaut
    J'y avais pensé mais je pensais que tu avais une liste d'icône à afficher côte à côte, un peu comme dans les treeView!

    Bien joué!

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

Discussions similaires

  1. ALTER VIEW avec condition
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/04/2004, 17h22
  2. Index avec conditions
    Par marhnix dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/03/2004, 10h48
  3. pbl procedure liée avec delphi
    Par coucoucmoi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/02/2004, 18h12
  4. Procedure stockée avec ntext dans SQL server 2000
    Par nagababa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/11/2003, 20h46
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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