Windows system icons

Re: Windows system icons

Beitragvon MAC » 24. Dez 2010, 17:47 Re: Windows system icons

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;
MAC
 
Beiträge: 770
Registriert: 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Socke » 24. Dez 2010, 19:35 Re: Windows system icons

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
Socke
 
Beiträge: 2557
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon NickNameX » 24. Dez 2010, 23:01 Re: Windows system icons

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 24. Dez 2010, 23:15, insgesamt 1-mal geändert.
NickNameX
 
Beiträge: 19
Registriert: 22. Jun 2010, 12:52

Beitragvon NickNameX » 24. Dez 2010, 23:21 Re: Windows system icons

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 .. ;-)
NickNameX
 
Beiträge: 19
Registriert: 22. Jun 2010, 12:52

Beitragvon Socke » 25. Dez 2010, 00:02 Re: Windows system icons

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
Socke
 
Beiträge: 2557
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon NickNameX » 25. Dez 2010, 00:26 Re: Windows system icons

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 ..)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
NickNameX
 
Beiträge: 19
Registriert: 22. Jun 2010, 12:52

Beitragvon NickNameX » 25. Dez 2010, 21:32 Windows system icons

Die Unit - zur freien Verfügung.

xplorerimagelist.pas
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
NickNameX
 
Beiträge: 19
Registriert: 22. Jun 2010, 12:52

Beitragvon Bora4d » 2. Mär 2011, 04:53 Re: Windows system icons

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.
Bora4d
 
Beiträge: 290
Registriert: 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
Nach oben

Beitragvon MemberOfClub » 16. Feb 2016, 10:11 Re: Windows system icons

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 ?
MemberOfClub
 
Beiträge: 2
Registriert: 16. Feb 2016, 09:54

• Themenende •
Vorherige

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried