Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SHGetFileInfo
BeitragVerfasst: Di Aug 31, 2004 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Ich hab da ein kleines Problem mit der SHGetFileInfo function.

Ich erstelle mir eine himagelist der shell icons.
A:
Code:
  1.     fImageList := SHGetFileInfo(nil,0, FileInfo, SizeOf(FileInfo),
  2.                         SHGFI_SYSICONINDEX or SHGFI_SMALLICON);



Für jedes icon was ich brauche hohle ich mir den Index des icons in der image liste
B:
Code:
  1.         SHGetFileInfo(PChar(fItemIcon),0, FileInfo, SizeOf(FileInfo),
  2.             SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  3.         fIconIndex := FileInfo.iIcon;



Gezeichnett wird das Icon dann auch über einen API Befehl :
C:
Code:
  1. ImageList_Draw(fImageList, Self.fIconIndex, Canvas.Handle, Rect.Left+6, imageTop,ILD_TRANSPARENT);


Problem ist das sobald Code B aufgerufen wird irgendwie Speicher für jedes Icon belegt wird.
Bei mehreren Icons kommen da schon mal 4 MB zusammen obwohl ich ja eigentlich nur den Index für die Imageliste ziehe und nicht das komplette icon. Muß ich noch irgendetwas freigeben? (destroyicon(FileInfo.hicon) bringt nichts da hicon = nil)
Oder wird mit dem Aufruf von Code B: das Icon in die image liste geladen(obwohl die imageliste ja nicht mit angegeben ist) so das Code C überhaupt funktioniert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 31, 2004 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Von wie vielen Icons redest du eigetlich bei deiner Anwendung? Und vor allem wie viele unterschiedliche?

Und der Speicher ist ja irgendwo logisch. Sobald er etwas anfasst was neu ist, dann muss er das ja in den Speicher laden. Und ich habe gerade mal in eine alte Anwendung von mir geschaut. Da kommt auch einiges an Speicher zusammen. Allerdings ist mir dabei auch aufgefallen, dass knapp 10.000 GDI Handles habe. Das könnte bei dir auch der Fall sein. Diese müssen auch wieder frei gegeben werden.

Schau mal in die MSDN's da steht auch etwas von Freigeben drin.
SHGetFileInfo
SHFILEINFO Structure


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 31, 2004 20:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Was normalerweise freigegeben werden muß ist das TFileInfo.hicon,
das ist jedoch nil da ich ja eh nur den Index hohle.

Aber ich glaube das Problem hat sich erledigt,
Die himagelist die ich erzeuge gilt für den ganzen Prozess.
Ich denke das sämtliche Icons für die ich den Index hohlen will automatisch in die image liste geladen werden.
Das ganze soll ja nicht nur mit shell icons funktionieren...
Dann ist natürlich klar wo der Speicher hin geht, er lädt da wirklich die Icons rein - sonst müßte er sie ja beim Zeichnen jedesmall neu laden (geht ja auch um nicht shell icons)

[EDIT]
Hab gerade nochmal nach den GDI Handles geschaut,
benötigt so insgesammt ~100, also sicherlich 1 für jedes Icon.
Entsteht aber kein GDI Handle leak, wird alles wieder ordentlich freigegeben :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 31, 2004 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich hatte mir auch immer nur den Index geholt. Für so eine Art Explorer. Dann aber mehrere hundert Mal immer wieder ein und das Selbe Icon. Allerdings ist mein Code mit 100%tiger Wahrscheinlichkeit nicht fehlerfrei, da das nur ne Spielwiese war. Aber wenn du die Icons nur einmal lädst, dann hat es ja den Anschein als sei alles in Ordnung. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]