METTRE DES PROGRESSBAR DANS UNE LISTVIEW

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 25 mars 2005 à 22:00
tichto11 Messages postés 1 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 6 mai 2007 - 5 mai 2007 à 18:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30324-mettre-des-progressbar-dans-une-listview

tichto11 Messages postés 1 Date d'inscription samedi 5 mai 2007 Statut Membre Dernière intervention 6 mai 2007
5 mai 2007 à 18:23
c sup merci
cs_jpt Messages postés 7 Date d'inscription samedi 12 octobre 2002 Statut Membre Dernière intervention 25 août 2007
14 nov. 2006 à 22:44
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,
memphisakeronaleron Messages postés 3 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 13 novembre 2005
13 nov. 2005 à 17:00
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.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
4 avril 2005 à 13:29
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 !
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
4 avril 2005 à 12:23
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 ? :-)
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
4 avril 2005 à 11:05
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+
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 avril 2005 à 20:24
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.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 mars 2005 à 13:08
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;
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
30 mars 2005 à 12:34
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)!
cs_MAsterC Messages postés 217 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 19 décembre 2012
27 mars 2005 à 16:36
Super! mais sous forme de composant sa serait génial!
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 mars 2005 à 09:50
Super !
Merci pour le travail accompli en un temps record.
cs_piwee Messages postés 34 Date d'inscription lundi 10 juin 2002 Statut Membre Dernière intervention 20 octobre 2009
26 mars 2005 à 09:04
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.
cs_piwee Messages postés 34 Date d'inscription lundi 10 juin 2002 Statut Membre Dernière intervention 20 octobre 2009
25 mars 2005 à 23:44
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.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
25 mars 2005 à 22:00
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.
Rejoignez-nous