![]() |
Speicher problem mit SHGetFileInfo
Hatten wir schon mal.
Delphi-Quellcode:
Wenn ich mir von 5000 Dateien das Icon hole gibt es ein Speicherproblem
procedure TSkinListView.SetSysItemIcon(nItem, nSubItem: Integer; wsItems: WideString);
var fi: TSHFileInfo; begin ZeroMemory(@fi, sizeof(TSHFileInfo)); if SHGetFileInfo(PWideChar(wsItems), 0, fi, sizeof(TSHFileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON) <> 0 then begin SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].ImgIcon := fi.hIcon; end; end; Muss ich noch irgendetwas freigeben ? Wüsste jetzt nicht wo. Zitat:
Aber ich hab 8GB Ram. gruss |
AW: Speicher problem mit SHGetFileInfo
MSDN sagt zu
![]() If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it. |
AW: Speicher problem mit SHGetFileInfo
Zitat:
gruss |
AW: Speicher problem mit SHGetFileInfo
Geht leider nicht.
Wenn ich die Icons lösche dann habe ich zwar das Handle im Array aber das Image liegt dann nicht mehr im Speicher und kann dann logischer weise nicht mehr gezeichnet werden. Muss mir da was anderes überlegen. grus |
AW: Speicher problem mit SHGetFileInfo
Darum steht da auch, erst freigeben, wenn du sie nicht mehr brauchst (also spätestens beim Programmende).
|
AW: Speicher problem mit SHGetFileInfo
Zitat:
Wie also beheben. 5000 Icons ist schon ne Menge aber das geht auch im Explorer. Werde mal schauen ob ich das nur auf die Sichtbaren Einträge der Liste umlegen kann. bzw. Nur ein Icon laden und dieses zum Array addieren. (Vom gleichen FileTyp) gruss |
AW: Speicher problem mit SHGetFileInfo
So sollte es gehen.
Addieren..
Delphi-Quellcode:
Freigeben
procedure TSkinListView.SetSysItemIcon(nItem, nSubItem: Integer; wsItems: WideString);
var fi: TSHFileInfo; begin ZeroMemory(@fi, sizeof(TSHFileInfo)); if SHGetFileInfo(PWideChar(wsItems), 0, fi, sizeof(TSHFileInfo), SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON) <> 0 then begin SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].Path := wsItems; ItemsInfo[nItem].Extension := ExtractFileExt(wsItems); // Extension geändert neues Icon addieren if Extension <> ExtractFileExt(wsItems) then begin Extension := ItemsInfo[nItem].Extension; ItemsInfo[nItem].ImgIcon := fi.hIcon; Icon:= ItemsInfo[nItem].ImgIcon; end else begin // gleiche Extension fi.hIcon löschen DestroyIcon(fi.hIcon); ItemsInfo[nItem].ImgIcon := Icon; end; end; end;
Delphi-Quellcode:
5700 Titel addiert ohne Probleme.
procedure TSkinListView.Clear(hListView: hWnd);
var i: Integer; count: Integer; Icon: HICON; begin count := High(ItemsInfo); Icon := 0; for I := 0 to count - 1 do begin // Icon geändert dann löschen if Icon <> ItemsInfo[i].ImgIcon then begin Icon := ItemsInfo[i].ImgIcon; DestroyIcon(ItemsInfo[i].ImgIcon); end; end; ListView_DeleteAllItems(hListView); SetLength(ItemsInfo, 0); end; gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz