begin process at 2010 02 10 07:06:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Control

 > METTRE DES PROGRESSBAR DANS UNE LISTVIEW

METTRE DES PROGRESSBAR DANS UNE LISTVIEW


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :7 278 / 1 084

Auteur : piwee

Ecrire un message privé
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

Les Membres Club peuvent 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 :

 Sources de la même categorie

Source avec Zip Source avec une capture GESTION DE CASES À COCHER PERSONNALISÉES DANS UN STRINGGRID par Jean_Jean
Source avec Zip UN TASKDIALOG EN TROIS CLICKS par chramade
Source avec Zip Source avec une capture DÉPLACER LES ITEMS D'UNE TLISTVIEW PAR DRAG AND DROP par krzysiu
Source avec Zip Source avec une capture DEPLACER LES ITEMS D'UNE LISTBOX VERS UNE AUTRE PAR DRAG AND... par japee
Source avec Zip Source avec une capture SELECTDIRECTORY AVEC UNE CHECKBOXE. par ROCABDEL

Commentaires et avis

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.

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.

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.

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

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

Commentaire de MAsterC le 27/03/2005 16:36:34

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

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)!

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;

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.

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+

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 ? :-)

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 !

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.

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

Commentaire de tichto11 le 05/05/2007 18:23:52

c sup merci  

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales