Windows system icons

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Windows system icons

Beitrag von MAC »

ist die "Windows-Liste" jetzt eine ultimative liste, oder sind das die pr hand ausgelesenen datein ?

Code: Alles auswählen

TMyFileIcons = record
file:string;
extention:string;
index:integer;
end;
 
// globale variable
var
    winIcons:array of TMyFileIcons; // gespeichert wird das in einem array of TMyFileIcons;
 
 
//beim laden:
//
var
schonmal:boolean;
begin
 
for i := 0 to anzahl_der_files_in_dem_aktuellen_ordner do
begin
 
 
schonmal := False;
for i2 := 0 to high(winIcons) do // i2 = er testet beim laden, ob er die aktuelle endung schonmal geladen hat.
  begin
  if winIcons[i].extention = winIcons[i2].extention then
    begin
    schonmal := True;
    break;
    end;
  end;
if schonmal then continue; // fals ja, dann wird das laden abgebrochen
 
 
// jetzt kann er laden.
 
end;
 
end;


Also würd ich einfach einen Array erzeugen,dem dann je, einmal die endung, (evt pfad) und der index der imagelist zugeordnet wird...

Code: Alles auswählen

Signatur := nil;

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Windows system icons

Beitrag von Socke »

Ist es unter Windows nicht auch mit ShellExtensions oder so möglich Icons aus dem Dateiinhalt (Bild-/Video-/Textvorschau, Executabel-Ressourcen) zu generieren. Damit wäre doch für jede Datei ein völlig anderes Icon möglich.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

NickNameX
Beiträge: 19
Registriert: Di 22. Jun 2010, 13:52

Re: Windows system icons

Beitrag von NickNameX »

MAC hat geschrieben:ist die "Windows-Liste" jetzt eine ultimative liste, oder sind das die pr hand ausgelesenen datein ?

Das Zuweisen der originalen Windows-Icon-Liste funktioniert - wie gesagt - unter Delphi,
nicht aber unter Lazarus.
Die Zuweisung des Handle an die ImageList des TTreeView
geht nicht, da Handle ReadOnly ist (.. das ist das Symptom, nicht die Ursache ..)

MAC hat geschrieben:Also würd ich einfach einen Array erzeugen,dem dann je, einmal die endung, (evt pfad) und der index der imagelist zugeordnet wird...


ImageList.AddIcon( ..);
funktioniert - wie gesagt - auch nicht (unter Lazarus).
Nur über den Umweg xxx:Bitmap wie bereits beschrieben.
Und TTreeview will nunmal eine ImageList, kein
Array of TIcon ..
Zuletzt geändert von NickNameX am Fr 24. Dez 2010, 23:15, insgesamt 1-mal geändert.

NickNameX
Beiträge: 19
Registriert: Di 22. Jun 2010, 13:52

Re: Windows system icons

Beitrag von NickNameX »

Socke hat geschrieben:Ist es unter Windows nicht auch mit ShellExtensions oder so möglich Icons aus dem Dateiinhalt (Bild-/Video-/Textvorschau, Executabel-Ressourcen) zu generieren. Damit wäre doch für jede Datei ein völlig anderes Icon möglich.

Ja.

Aber das schießt völlig über's Ziel hinaus da Windows - wie in diesem
Thread dargestellt - eine ImageListe per SHGetFileInfo() bereitwillig
und mundgerecht generiert (nur nutzen kann man sie (noch) nicht unter Lazarus).
Ich kann mit SHGetFileInfo() und entsprechenden Parametern
die gesamte Liste für z.B. SmallIcons anfordern, bekomme auch das Handle - aber
TTreeView's ImageList kann mit dem Handle (noch) nichts anfangen.

(Es gibt auch ImageList_Read und ImageList_Write,
zum ein- oder auslesen der gesamten generierten IconListe,
aber damit bin ich garnicht zurecht gekommen, bisher ..)

Als temporäres Workaround bleibt anscheinend nur, eine eigene ImageList
einzeln mit Icons zu befüllen und parallel dazu eine eigene Index-Liste (TStringList)
der Bezeichner zu führen (was bei mir in Ansätzen ja auch schon funktioniert).

Sobald das zuverlässig funktioniert, stelle ich den Code hier ein .. ;-)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Windows system icons

Beitrag von Socke »

NickNameX hat geschrieben:[Aber das schießt völlig über's Ziel hinaus da Windows - wie in diesem
Thread dargestellt - eine ImageListe per SHGetFileInfo() bereitwillig
und mundgerecht generiert (nur nutzen kann man sie (noch) nicht unter Lazarus).
Ich kann mit SHGetFileInfo() und entsprechenden Parametern
die gesamte Liste für z.B. SmallIcons anfordern, bekomme auch das Handle - aber
TTreeView's ImageList kann mit dem Handle (noch) nichts anfangen.

Ich habe ein wenig in den LCL-Quellen herumgewühlt. Sobald es aber an die eigentliche Schnittstelle zwischen LCL und Widgeset geht, verstehe ich da kaum noch was. Sieht aber so aus, als ob du für eine besser Lösung, eine eigene Widgetset-Klasse, die ein fertiges Windows-Handle übernimmt, erstellen müsstest. Wäre nur noch zu klären, ob Windows für wirklich alle Dateien immer die selbe Liste verwendet oder doch unterschiedliche Listen anlegt...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

NickNameX
Beiträge: 19
Registriert: Di 22. Jun 2010, 13:52

Re: Windows system icons

Beitrag von NickNameX »

Socke hat geschrieben: .. Wäre nur noch zu klären, ob Windows für wirklich alle Dateien immer die selbe Liste verwendet oder doch unterschiedliche Listen anlegt...


Windows erstellt passende Image-Listen je nach den Parametern,
die ich SHGetFileInfo() mit auf den Weg gebe.

Für TListView braucht man (unter WinXP) zwei Listen:
- SmallImageList
- LargeImageList
Diese generiert Windows dann je nach Parameter-Werten
(SHGFI_LARGEICON bzw. SHGFI_SMALLICON, und SHGFI_OPENICON)
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Mein WorkAround scheint jetzt einigermaßen
stabil zu funktionerieren, siehe Bild .. ;-)

(Jetzt muß ich das allerdings noch einigermaßen sauber in einer
abgeleiteten Klasse von TImageList implementieren ..)
Dateianhänge
Xplorer 2010-12-24.PNG

NickNameX
Beiträge: 19
Registriert: Di 22. Jun 2010, 13:52

Windows system icons

Beitrag von NickNameX »

Die Unit - zur freien Verfügung.

xplorerimagelist.pas
(7.14 KiB) 147-mal heruntergeladen

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Windows system icons

Beitrag von Bora4d »

Dieses Problem habe ich ohne Icons kopieen gelöst. Windows SystemImageList-Handle habe ich einfach an TListView mit API-Funktionen weitergeleitet.
Da ich nicht wußte an wen ich mich wenden soll habe ich in Lazarus geschrieben, damit sie es in in ShellControls integrieren:
http://www.lazarus.freepascal.org/index.php/topic,12300.0.html

Warum ich das hier schreibe?
Weil als ich nachgeschaut habe ob jemand das schon gemacht hat, erschien dieses Thema in Google als erste und war nirgendwo Lösung zu finden.

MemberOfClub
Beiträge: 2
Registriert: Di 16. Feb 2016, 09:54

Re: Windows system icons

Beitrag von MemberOfClub »

Bora4d hat geschrieben:Dieses Problem habe ich ohne Icons kopieen gelöst.


Hallo Bora4d,

ist Deine Lösung denn in den Lazarus LCL Quellcode aufgenommen worden ?

Antworten