Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

METTRE DES PROGRESSBAR DANS UNE LISTVIEW


Information sur la source

Catégorie :Control Niveau : Débutant Date de création : 25/03/2005 Date de mise à jour : 26/03/2005 09:02:19 Vu / téléchargé: 6 962 / 1 066

Note :
8,5 / 10 - par 2 personnes
8,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
J'avais trouvé une source ici http://www.swissdelphicenter.ch/torry/showcode.php?id=801
qui affichait une (seule) ProgressBar dans une TListView.
Ce code étant incomplet (pas de gestion du scrolling et du resize des colonnes), je l'ai donc modifé.

Dans mon code, dès qu'on modifie la taille d'une colonne (avec une capture de message avec WM_NOTIFY), les ProgressBar sont automatiquement mise à la bonne taille.
Bon, ca clignote un tout petit peu quand il y en a beaucoup (j'ai expliqué pourquoi dans le code).

Normalement, cela devrait fonctionner assez bien.
J'ai mis des commentaires (que j'espère assez clair).

Si vous voyez un bug, j'essaierai de le corriger le plus vite possible.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

26 mars 2005 09:02:03 :
26 mars 2005 09:02:19 :

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 25/03/2005 22:00:50 administrateur CS

C'est un excellent travail. Mais je me demande quand même si l'on aurait pas pu éviter de réécrire certaines portions de code trois fois.

Mis sous forme de composant, ça serait surement très apprécié.
Félicitations.

signaler à un administrateur
Commentaire de piwee le 25/03/2005 23:44:14

merci.

Oui, je pouvais un peu réduire le code mais j'avais pas eu le temps. Je vais essayer de faire une nouvelle version en faisant ça.

signaler à un administrateur
Commentaire de piwee le 26/03/2005 09:04:32

Voilà, j'ai modifié le code et j'ai fait une procédure qui donne la bonne taille à la ProgressBar.
Comme ça, il n'y a plus qu'une seule fois le code.

signaler à un administrateur
Commentaire de Delphiprog le 26/03/2005 09:50:54 administrateur CS

Super !
Merci pour le travail accompli en un temps record.

signaler à un administrateur
Commentaire de MAsterC le 27/03/2005 16:36:34

Super! mais sous forme de composant sa serait génial!

signaler à un administrateur
Commentaire de MAURICIO le 30/03/2005 12:34:27

Il y a un gros bug !
Je me disais aussi: qu' arrive t-il aux progressbar des items non visualisés?
Bem ils sont toujours là !!!
Donc, si vous vous positionnez sur le dernier item et que vous remontez les items, le progressbar du dernier item ne correspond pas !! il suffit de montrer la propriété 'position' du progressbar dans le caption de l' item pour vous en apercevoir ... Faudrait mettre la propriété visible à false des progressbar lorsque leur item associé n' est pas visible. L' autre solution serait de faire le BringToFront afin de cacher le items non visualisés par ceux visualisés (c' est pas tres français, dsl)!

signaler à un administrateur
Commentaire de MAURICIO le 30/03/2005 13:08:53

Voilà la solution que j' ai trouvée:

procedure TForm1.AdjustProgressBar(item: TListItem; r: TRect);
var
  pb: TProgressBar;
begin
//Procédure qui met à jour la taille de la ProgressBar en fonction du rectangle d'affichage de l'élément
//qui contient la ProgressBar et en fonction de la taille de la colonne
//dans laquelle on met la progressbar (ici, la 2ème colonne)
  r.Left := r.Left + Listview1.columns[0].Width;
  r.Right := r.Left + Listview1.columns[1].Width;
  pb := item.Data;

  if item.Index in [ListView1.TopItem.Index..ListView1.TopItem.Index + ListView1.VisibleRowCount-1]
  then begin
    pb.Visible := true;
    pb.BoundsRect := r;
  end
  else
    pb.Visible := false;
end;

signaler à un administrateur
Commentaire de Delphiprog le 03/04/2005 20:24:55 administrateur CS

Juste un point de détail pour ceux qui auraient ajouté des éléments en mode conception dans le TListView alors l'indice du premier élément à "triturer" ne doit pas être l'élément d'indice zéro.
Il est préférable d'utiliser une référence sur le dernier élément créé dans la boucle :
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Byte;
  r: TRect;
  pb: TProgressBar;
  li: TlistItem; //<- référence
begin
  //Initialisation de la listview
  Listview1.Columns.Add.Width := 100;
  Listview1.Columns.Add.Width := 200;
  Listview1.ViewStyle := vsReport;
  //limiter le flickering
  ListView1.DoubleBuffered := True;

  //Ajout de lignes pour le test
  Randomize;
  for i := 0 to 40 do
  begin
   //utilisation de cette référence
    li := Listview1.Items.Add;
   //Ajout d'un texte bidon
    li.Caption := 'Texte ' + IntToStr(i);

    //On récupère le rectangle d'affichage de l'élément
    //Il sera utilisé pour mettre la progressbar à la bonne taille
    r := li.DisplayRect(drBounds);
    //Création et initialisation de la progressbar
    pb := TProgressBar.Create(Self);
    pb.Parent := Listview1;
    //Ici, c'est juste pour avoir des positions différentes
    pb.Position := Random(pb.Max);
    //On stocke la progressbar dans la propriété Data de l'élément
    //afin de pouvoir la récupérer plus tard
    li.Data := pb;
    AdjustProgressBar(li, r);
  end;
end;

Pour le reste (version téléchargée ce jour), je ne vois pas de problèmes.
L'affichage des éléments visibles est traité dans WM_NOTIFY et rien à signaler.

signaler à un administrateur
Commentaire de MAURICIO le 04/04/2005 11:05:04

Exact, je pense que ça reste une très bonne source :)
Sinon, j' aurais opté par créer une fonction pour ajouter des items et une autre pour les eliminer. Surtout dans un programme où on ajoute des items un peu partout dans le code.

Perso, Je savais pas qu' on pouvait faire:
li.Data := pb;

A+

signaler à un administrateur
Commentaire de Delphiprog le 04/04/2005 12:23:23 administrateur CS

Ce serait encore mieux sous forme de composants. De plus,ça ne devrait pas être trop dur à adapter.

Mauricio : comme la propriété Data est un pointeur non typé, tu peux donc lui affecter n'importe quelle référence ou pointeur. CQFD.

Bon alors, ce composant, qui le fait ? :-)

signaler à un administrateur
Commentaire de MAURICIO le 04/04/2005 13:29:10

Désolé mais moi j' ai pas le temps pour l' instant :(
Même si ça me plaierait de le faire.
Mais, il faudrait pouvoir insérer n' importe quel type de compo (boutons, gauges etc ...) à chaque item dans une ou plusieurs colonnes ... Donc, c' est pas évident !

signaler à un administrateur
Commentaire de memphisakeronaleron le 13/11/2005 17:00:42

Bonjour,
déja bon boulot, mais je viens de tester ton code et il reste des bugs. On peut facilement le voir quand on ne met pas des positions aléatoire mais proportionelle a la varaible i et que l'on monte et descend avec l'ascenseur.

Voila je tenais juste a le signaler, malheuresement je n'ai pas assez d'experience pour pouvoir corriger ce bugs tout seul.

signaler à un administrateur
Commentaire de jpt le 14/11/2006 22:44:06

Salut,
Je confirme le bug du 13/11. Pour le voir, il suffit de faire,dans le FormCreate:
    //pb.Position := Random(pb.Max);
    pb.Max := 40;
    pb.Position := i;
et de scroller : c'est l'horreur...
Mes 2 cts,
--
jp

signaler à un administrateur
Commentaire de tichto11 le 05/05/2007 18:23:52

c sup merci  

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.