Chargement d'images en masse depuis un TImagelist [Résolu]

Mr7Bungle 17 Messages postés vendredi 1 octobre 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mars 2006 à 11:50 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 17 mars 2006 à 23:39
Bonjour à tous ,



Je réalise un programme qui scan tout les dossiers d'un repertoire
donné. Chaque dossier contient une image nommée "Folder.jpg" . Ensuite
le programme , au cours du scan, recupere le nom du dossier et le
chemin de l'image contenu dans le dossier sélectionné.



Comme l'image est en Jpeg, je dois passer par une conversion de jpeg
vers bmp pour ensuite la stocker dans une imagelist. Et pour finir ,
pour chaque dossier scanné, je recupere le nom pour lafficher dans un
Tlistview avec en icône l'image stocké à l'index correspondant dans la
TImagelist.





Voici le code :



procedure tform1.refreshdisc;

var

listajout : tlistitem;

jpeg :tjpegimage;

bmp : tbitmap;

img : integer;

rect : trect;

i : integer;

f : textfile;

way,str : string;



begin

listview1.Clear;

jpeg := Tjpegimage.Create;

bmp := Tbitmap.Create;

i := 0;



While i<= shelllistview1.items.Count - 1
do
//quand que non fin du repertoire faire

begin



way :=
shelllistview1.Root+'\'+shelllistview1.folders[i].DisplayName+'\'+'folder.jpg';



//conversionde l'image



jpeg.LoadFromFile(way);

Bmp.Width :=64;

Bmp.Height :=64;

Rect.Left :=0;

Rect.Top :=0;

Rect.Right :=Bmp.Width-1;

Rect.Bottom:=Bmp.Height-1;

Bmp.Canvas.StretchDraw(Rect,Jpeg);



//insertion de l'image dans la Timagelist



image1.Picture.Bitmap.Assign(bmp);


imagelist1.Insert(i,image1.Picture.Bitmap,nil); // cette
ligne ralenti le processus d'affichage





// ajout de l'item dans la Tlistview

listajout := listview1.Items.add;

listajout.Caption := shelllistview1.folders[i].DisplayName;

listajout.imageindex := i;



i := i +1;

end;



Bmp.Free;

Jpeg.Free;

end;





Voila et donc, mon problème est le temps d'affichage de la listview
sachant que 200 à 500 items doivent y etre affiché. c'est trop
long et je cherche donc un moyen d'optimiser l'affichage.



J'ai pensé à une solution qui serait d' éviter de passer par une
Timagelist, mais je ne vois pas comment afficher des icones dans un
Tlistview sans Timagelist





En attente de vos suggestions....merci encore !





MrBungle .
Afficher la suite 

3 réponses

Répondre au sujet
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 17 mars 2006 à 23:39
+3
Utile
Je pense que l'augmentation de la valeur de la propriété AllocBy du composant TImageList pourrait augmenter les performances :
AllocBy
"Définit le nombre d'images dont s'agrandit la liste d'images quand elle doit faire de la place pour de nouvelles images."

Quand on sait qu'il y aura beaucoup d'images à charger, il vaut mieux éviter d'incessantes réallocations de mémoire.


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 17 mars 2006 à 13:24
0
Utile
Salut,
tu te compliques un peut la vie
Dans ce sens tu peux te passer d'un TJpegImage
C'est juste un exemple il faudra l'adapter à tes besoins :

procedure TForm1.Button11Click(Sender: TObject);
Var Bmp, Bmp2 : TBitmap;
begin
Image1.Picture.LoadFromFile('aDemo.jpg'); // on charge le Jpg directement dans un TImage
Bmp := TBitmap.Create; // on crée le Bmp
Bmp.Width := 64; // on ajuste sa taille
Bmp.Height:= 64;
Bmp.Canvas.StretchDraw(Rect(0, 0, 64, 64), Image1.Picture.Graphic); // on le dessine à la bonne taille
ImageList1.Add(Bmp, Nil); // ici on l'ajoute à l'ImageList
Bmp2 := TBitmap.Create; // que pour tester
ImageList1.GetBitmap(0, Bmp2); // que pour tester
Canvas.Draw(0,0, Bmp2); // que pour tester
Bmp2.Free;
Bmp.Free;
end ;


Tu peux aussi récupérer l'index de l'image Comme ceci:
Index : = ImageList1.Add(Bmp, Nil);

Voilà donc si on retire Bmp2 qui n'est la que pour le teste il nous reste que un Bmp et un TImage et bien sur le TImageListe
ceci devrait déjà accélérer l'exécution

@+
Cirec
Commenter la réponse de Cirec
Mr7Bungle 17 Messages postés vendredi 1 octobre 2004Date d'inscription 30 octobre 2007 Dernière intervention - 17 mars 2006 à 15:21
0
Utile
Merci beaucoup ! éffectivement je me compliquais un peu la vie !



Résultat des courses donc et bien oui j'ai une execution tout de meme
plus rapide mais encore un peu long tout de même... et c'est le
chargement de l'imagelist qui prend le plus de temps ...n'est il
vraiment pas possible de remplir une listview avec icônes sans passer
par une ImageList?




Dans tout les cas merci à toi Cirec ! ça va bcp mieux deja, mais un peu plus serai le top du top !!



En attentes de suggestions....Merci



MrBungle.
Commenter la réponse de Mr7Bungle

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.