![]() |
IconHandle von Icon Datei
Meine Funktion..
Delphi-Quellcode:
Aufruf..
function TSkinPopUpMenu.GetHIconFromFile(AFileName: PWideChar; ASmall: Boolean; AIndex: Integer)
: HIcon; var LDummy: HIcon; LInfo: TSHFileInfo; begin Result := 0; If ExtractIconEx(AFileName, -1, Result, LDummy, 0) <> 0 then begin If ASmall then ExtractIconEx(AFileName, AIndex, LDummy, Result, 1) else ExtractIconEx(AFileName, AIndex, Result, LDummy, 1); end else begin SHGetFileInfo(PWideChar(ExtractFileExt(AFileName)), FILE_ATTRIBUTE_NORMAL, LInfo, SizeOf(LInfo), IfThen(ASmall, SHGFI_SMALLICON, SHGFI_LARGEICON) or SHGFI_ICON or SHGFI_LINKOVERLAY or SHGFI_USEFILEATTRIBUTES); Result := LInfo.HIcon; end; end;
Delphi-Quellcode:
Freigeben..
if ImageIconPath <> '' then
begin FIcon[ButtonCount].ImageIcon := GetHIconFromFile(ImageIconPath, true); if (FIcon[ButtonCount].ImageIcon <> 0) then btnMenu[ButtonCount].ImageDrop(HButton, FIcon[ButtonCount], X, Y, W, H); end;
Delphi-Quellcode:
Funktioniert soweit alles..
if ButtonCount > 0 then
begin for IntI := 0 to ButtonCount - 1 do begin btnMenu[IntI].ImageDropRemove(btnMenu[IntI].Handle); btnMenu[IntI].DestroyWindow; btnMenu[IntI] := nil; end; SetLength(btnMenu, 0); SetLength(FIcon, 0); ButtonCount := 0; end; Aber! Wenn ich das PopuMenu ca.. 30 > 40 mal hintereinander aufrufe dann schlägt das fehl.
Delphi-Quellcode:
If ExtractIconEx(AFileName, -1, Result, LDummy, 0) <> 0 then
und kracht dann in
Delphi-Quellcode:
Result := LInfo.HIcon;
Warum? Wenn doch alle Icon Handles freigegeben werden.
Delphi-Quellcode:
gruss
procedure TSkinPushButton.ImageDropRemove(WinHandle: HWND);
begin if ImgDrop <> 0 then begin DestroyIcon(ImgDrop); SkinEngine.SetImageProperty(WinHandle, PROP_IMAGE_DROP, 0); end; end; |
AW: IconHandle von Icon Datei
Du extrahierst zwei Icons pro Aufruf von ExtractIconEx, also musst du auch beide zerstören. Oder du castest so, dass nur ein Icon extrahiert wird:
Delphi-Quellcode:
Auch der Aufruf von ExtractIconEx(PChar(AFileName), -1, ...) könnte Icons extrahieren; die Doku zu
ExtractIconEx(PChar(AFileName), AIndex, Result, HICON(nil^), 1);
![]() Grüße Dalai |
AW: IconHandle von Icon Datei
Zitat:
Du meinst das LDummy + Result? ja ich sehe es gerade ;) Danke.. kann mir dann das LDummy sparen..
Delphi-Quellcode:
function TSkinPopUpMenu.GetHIconFromFile(AFileName: PWideChar; ASmall: Boolean; AIndex: Integer)
: HIcon; var LInfo: TSHFileInfo; begin Result := 0; If ExtractIconEx(AFileName, -1, Result, HICON(nil^), 0) <> 0 then // << denke das sollte so ausreichen begin If ASmall then ExtractIconEx(AFileName, AIndex, HICON(nil^), Result, 1) else ExtractIconEx(AFileName, AIndex, Result, HICON(nil^), 1); end else begin SHGetFileInfo(PWideChar(ExtractFileExt(AFileName)), FILE_ATTRIBUTE_NORMAL, LInfo, SizeOf(LInfo), IfThen(ASmall, SHGFI_SMALLICON, SHGFI_LARGEICON) or SHGFI_ICON or SHGFI_LINKOVERLAY or SHGFI_USEFILEATTRIBUTES); Result := LInfo.HIcon; end; end; Habe das PopupMenu jetzt 100 mal geöffnet und geschlossen scheint zu funktionieren.. ;) Na ja wer macht das schon bei normaler Bedienung. gruss |
AW: IconHandle von Icon Datei
Zitat:
Zitat:
Vielleicht kann eine Untersuchung auf Speicherlecks nicht schaden, mit einer Software, die auch Windows Handles mit untersucht; leider weiß ich nicht, was es da gibt, was für aktuellere/neuere Delphis taugt. FastMM bzw. ReportMemoryLeaksOnShutdown meldet nicht freigegebene Icons eben nicht, wie ich selber schon in einem ähnlichen Zusammenhang festgestellt habe. Grüße Dalai |
AW: IconHandle von Icon Datei
Zitat:
Sorry ja dann dürfte das ausreichen oder?
Delphi-Quellcode:
If ExtractIconEx(AFileName, -1, HICON(nil^), HICON(nil^), 0) <> 0 then
Zitat:
Aber! Seltsam ist das schon denn die Icons liegen nur im Format 16x16 vor direkt von einem Icon File nicht aus einer EXE-Datei! Habe auch im Taskmanager nicht feststellen können das sich der Speicher erhöht der blieb immer konstant. Also das LDummy hätte eigentlich gar kein Icon ausgeben dürfen. Weil kein Large Icon in der Icon Datei existiert. Diese Icons werden addiert + die Icons für die Pfeile. Danke nochmal für deine Hilfe. Wenn ein Icon übergeben wird, wird dieses als Overlay auf den Button gezeichnet.
Delphi-Quellcode:
und später mit
if ImageIconPath <> '' then
begin FIcon[ButtonCount].ImageIcon := GetHIconFromFile(ImageIconPath, true); if (FIcon[ButtonCount].ImageIcon <> 0) then btnMenu[ButtonCount].ImageDrop(HButton, FIcon[ButtonCount], X, Y, W, H); end;
Delphi-Quellcode:
btnMenu[IntI].ImageDropRemove(btnMenu[IntI].Handle);
gelöscht.. gruss |
AW: IconHandle von Icon Datei
Zitat:
Delphi-Quellcode:
. Das eigentliche Extrahieren der Icons erfolgt ja erst danach in einem weiteren Aufruf von ExtractIconEx (sofern der erste Aufruf klappte).
if ExtractIconEx(..., -1, ...) <> 0
Anders ausgedrückt: Sofern das erste ExtractIconEx klappt, rufst du es danach nochmals auf. Wenn man die Doku zu ![]() Zitat:
Delphi-Quellcode:
ruft, also nIconIndex=-1 und nIcons=0, aber trotzdem ein Ziel (hier Result) angegeben wurde.
ExtractIconEx(AFileName, -1, Result, HICON(nil^), 0)
Zitat:
Zitat:
Grüße Dalai |
AW: IconHandle von Icon Datei
Zitat:
Delphi-Quellcode:
If ExtractIconEx(AFileName, -1, HICON(nil^), HICON(nil^), 0) <> 0 then
oder besser so!
Delphi-Quellcode:
If ExtractIconEx(AFileName, -1, -1, -1) <> 0 then
gruss |
AW: IconHandle von Icon Datei
Zitat:
Zitat:
Grüße Dalai |
AW: IconHandle von Icon Datei
Zitat:
gruss |
AW: IconHandle von Icon Datei
Mir fällt gerade ein, dass es wohl gar nicht geht, eine Konstante (hier -1) als
Delphi-Quellcode:
-Parameter zu übergeben. Und die beiden HICON-Parameter von ExtractIconEx sind im Delphi als var deklariert. D.h. der Compiler müsste meckern, wenn 3x -1 übergeben wird.
var
Grüße Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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