Einzelne schwarze System Icons auf Windows

Antworten
Benutzeravatar
theo
Beiträge: 11092
Registriert: Mo 11. Sep 2006, 19:01

Einzelne schwarze System Icons auf Windows

Beitrag von theo »

Ich versuche gerade die TurboPower ShellShock Komponenten nach Lazarus zu konvertieren.
Das geht auch schon ein bisschen (Siehe Screenshot).

Kennt jemand das Problem, dass ein paar Icons einfach schwarze Kästen bleiben, so wie man sie auf dem Bild sieht?

Ich erkenne gar kein System dahinter. Das Icon von lazarus.exe klappt, das von lazarus.old.exe nicht.

Es hat auch nicht direkt mit den Shell Komponenten zu tun, das gleiche passiert auch so:

Code: Alles auswählen

SHGetFileInfo(PChar(Edit1.text), FILE_ATTRIBUTE_NORMAL, SHFileInfo, SizeOf(TSHFileInfo),   
   SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES or SHGFI_ICON  or SHGFI_SMALLICON);
Image1.Picture.icon.Handle:=SHFileInfo.hIcon;  
Windows (8.1) Explorer hat natürlich kein Problem mit der Darstellung.

Hat sich jemand von euch schon mal damit herumgeschlagen?
Danke.
Dateianhänge
Screenshot (3).png

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Einzelne schwarze System Icons auf Windows

Beitrag von Antrepolit »

Ich hatte das Problem mal. Meine Lösung bestand darin, dass ich alle System-Icons bekannter Dateitypen in eine TImageList gesteckt habe und später anhand der Endung einer Datei das System-Icon zugeordnet habe. Ich weiß nun nicht, ob dir diese Lösung hilft, aber ich habe eine korrekte Darstellung der Icons dadurch. Das Problem mit der Icon-Größe (einige werden abgeschnitten dargestellt) ist ein anderes, das habe ich noch nicht näher untersucht.

Ich habe auch nur einen kleinen Unterschied in der aufrufenden Funktion, und zwar der Aufruf von ReleaseHandle:

Code: Alles auswählen

if SHGetFileInfo(PChar(UTF8ToSys(pFileName)), Attributes, FI, SizeOf(FI), Flags) <> 0 then
begin
  pIcon.ReleaseHandle;
  pIcon.Handle := FI.hIcon;
  Result := True;
end
else
  Result := False;  
almostnoerror.png
Grüße, Antrepolit

care only if your os is really burning

Benutzeravatar
theo
Beiträge: 11092
Registriert: Mo 11. Sep 2006, 19:01

Re: Einzelne schwarze System Icons auf Windows

Beitrag von theo »

Danke für die Antwort.
Antrepolit hat geschrieben:Ich hatte das Problem mal. Meine Lösung bestand darin, dass ich alle System-Icons bekannter Dateitypen in eine TImageList gesteckt habe und später anhand der Endung einer Datei das System-Icon zugeordnet habe.
Ja, aber das ist mir zu wenig genau. So haben alle *.exe das gleiche Icon, oder?

Ausserdem besteht bei mir die Schwierigkeit darin, ein Konstrukt umzusetzen, welches so in Lazarus nicht möglich ist (lasse mich gerne belehren).
Der Delphi Code sieht so aus:

Code: Alles auswählen

SmallFolderImages.Handle := SHGetFileInfo('', 0, SHFileInfo, SizeOf(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);     
Es wird also das Resultat von SHGetFileInfo, also ein DWORD_PTR resp. ein HIMAGELIST, direkt dem Handle einer TImageList (SmallFolderImages) zugewiesen. Fertsch! Dann hast du deine Imagelist.
Bei Delphi ist das alles um das HIMAGELIST herum aufgebaut, und Icons werden nur nach Bedarf abgeholt.

Bei Lazarus kann ich das Handle nicht setzen.

Wenn ich nicht die Lazarus TImageList komplett umbauen will, dann muss ich das zu Beginn alles einkopieren.
Das sind dann bei mir z.Zt. 501 Icons, die man mit CommCtrl.ImageList_GetIcon abholen muss.
Irgendwie schmeckt dem Windows das aber nicht richtig, so dass es irgendwann zu streiken anfängt, und dann nur noch schwarze Kästen liefert.

Benutzeravatar
theo
Beiträge: 11092
Registriert: Mo 11. Sep 2006, 19:01

Re: Einzelne schwarze System Icons auf Windows

Beitrag von theo »

So, jetzt klappt es mit den Icons. War eine ziemliche Zangengeburt. :roll:
Dateianhänge
Screenshot (4).png

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Einzelne schwarze System Icons auf Windows

Beitrag von Michl »

theo hat geschrieben:jetzt klappt es mit den Icons
Da ich das mal zum Test nachgebaut hatte und obiges Verhalten ebenfalls sehe, kannst du uns/mir noch mitteilen, wie?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 11092
Registriert: Mo 11. Sep 2006, 19:01

Re: Einzelne schwarze System Icons auf Windows

Beitrag von theo »

Michl hat geschrieben:
theo hat geschrieben:jetzt klappt es mit den Icons
Da ich das mal zum Test nachgebaut hatte und obiges Verhalten ebenfalls sehe, kannst du uns/mir noch mitteilen, wie?
Nichts schönes, ein unanständiges Gehacke.
Da die relevanten Teile in der LCL private und nicht virtual sind :cry: , habe ich die TCustomImageList kopiert und daraus TCustomImageListHack gemacht und dann den kleinen Code, den es wirklich braucht eingebaut.
Das sind eig. nur drei Teile:
1. Man muss der List das Windows HIMAGELIST verklickern.
2. Man muss irgendwie den Count in der Liste setzen, ohne tatsächlich etwas ge-Added zu haben.
3. Man muss im geeigneten Moment auf den Canvas malen.

Das View muss man dann auch noch veräppeln und TCustomImageListHack auf TCustomImageList casten.
Ist nicht schön, aber die Icons sind schön. :mrgreen:

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: Einzelne schwarze System Icons auf Windows

Beitrag von Michl »

Ok, das baue ich jetzt nicht nach :wink: - danke trotzdem für die Info - und ja, der letzte Snapshot sieht besser aus :mrgreen:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten