Autor Beitrag
crncpz
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 59

WIN 2000, WIN XP Pro
Delphi 6
BeitragVerfasst: Mo 29.09.08 22:14 
Hallo zusammen

Ich arbeit momentan mit einer Imagelist um Icons aus Dateien in meinem Prog zu verwenden.
Die Icons lese ich so ein:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var SysIL       : uint;
      SFI         : TSHFileInfo;

begin
  SysIL := SHGetFileInfo(pchar(filename), 0, SFI, SizeOf(SFI),
            SHGFI_SYSICONINDEX or SHGFI_LARGEICON);//oder SHGFI_SMALLICON
  if (SysIL <> 0)then
    Form1.ImageList1.Handle := SysIL;
end;

Das hatte ich hier im Forum gefunden und das funktioniert auch super.

Leider gibt es da genau eine Ausnahme wo es nicht funktioniert. Das ist genau dann der Fall wenn eine Datei das gleiche Icon hat wie irgend eine andere Datei vorher auch.
In diesem Fall wird der Imagelist das Icon nicht hinzugefügt. Scheinbar erkennt die Imagelist das dieses Icon schon vorhanden ist.

Jetzt ist meine Frage kann man irgendwie die Imagelist zwingen auch doppelte Icons auf zu nehmen? Oder kann man ermitteln welches das doppelte Icon in der Imagelist ist, was gerade nicht hinzugefügt wurde? Also ich meine gerade an welcher Position dieses Icon in der Imagelist schon einmal vorkommt?

Ich bin gerade etwas ratlos, weil ich einfach keine Lösung finde :?!?:

Danke für Eure Hilfe


Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Mo 29.09.2008 um 23:19
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.09.08 10:46 
Du überschreibst doch das Handle der ImageList, da wundere ich mich eigentlich, dass da überhaupt Icons hinzugefügt werden, denn die alte Liste wird ja praktisch mit der der gerade geholten Infos überschrieben. Rein nach dem Quelltext nicht hinzugefügt.
Oder fügt Delphi den Inhalt hinzu wenn man das Handle zuweist? Das kann ich mir kaum vorstellen, ich werde es mal schnell testen.

// EDIT:
So, ich habe mir die Dokumentation mal angeschaut. Wenn du das Icon einer anderen Imageliste hinzufügen willst, warum holst du nicht einfach auch nur dieses Icon?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  SFI: TSHFileInfo;
  tmpIcon: TIcon;
begin
  tmpIcon := TIcon.Create;
  SHGetFileInfo(pchar(edit1.Text), 0, SFI, SizeOf(SFI),
    SHGFI_ICON or SHGFI_LARGEICON);//oder SHGFI_SMALLICON
  tmpIcon.Handle := SFI.hIcon;
  ImageList1.Width := tmpIcon.Width;
  ImageList1.Height := tmpIcon.Height;
  ImageList1.AddIcon(tmpIcon);
  tmpIcon.Free;
Wenn du die Systemimageliste verwenden willst, musst du das auch richtig machen:
newsgroups.derkeiler...007-10/msg00517.html
crncpz Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 59

WIN 2000, WIN XP Pro
Delphi 6
BeitragVerfasst: Di 30.09.08 18:16 
Ich hätte vielleicht noch erwähnen sollen das ich
ausblenden Delphi-Quelltext
1:
form1.imagelist1.shareimages := true;					

gesetzt habe, was veranlasst das die Zuweisung mit handle die Icons hinzugefügt werden.

Dein Vorschlag funktioniert auf jeden Fall erstmal und beseitigt mein Problem, Danke ;)

Deine Variante zeigt allerdings bei *.lnk Dateien diesen kleinen hässlichen Verknüpfungspfeil an, den ich gerne verschwinden lassen würde.
Bei meiner Variante sieht man den nicht weil ich mir alle Icons aus der Datei hole und dann alle die ich nicht brauche lösche (das ist aber oben nicht im Quelltext drin).

Man könnte einfach in der Registry folgenden Schlüssel löschen/umbenennen

ausblenden Quelltext
1:
HKEY_CLASSES_ROOT\Lnkfile\IsShortcut					


aber ich würde ungern mit meinem Prog in der Registry rum hantieren. Nicht nur wegen irgendwelchen Problemen die es mit Zugriffsrechten geben könnte, sondern auch weil ich absolut kein Fan davon bin irgend etwas in die Registry zu speichern oder besser gesagt die Registry überhaupt zu verwenden.

Gibt es noch eine Möglichkeit den Verknüpfungspfeil in meinem Programm zu unterdrücken?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.09.08 19:05 
Mit der Systemimagelist sollte es so gehen wie in dem Link, den ich gepostet habe.
crncpz Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 59

WIN 2000, WIN XP Pro
Delphi 6
BeitragVerfasst: Di 30.09.08 19:20 
Ja du hast recht, ich hab das ja bisher genau so gemacht :P
Nur dann gibts eben das problem das er identische Icons einfach ignoriert.

Wahrscheinlich werde ich das einfach über die Registry abschalten.

Danke Dir
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.09.08 20:38 
Hast du nicht, du weist jedesmal wieder das Handle zu, du musst dir aber die Liste holen und dann darin schauen welches Icon das ist (der Index) und dann dieses aus der Liste herausholen.
crncpz Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 59

WIN 2000, WIN XP Pro
Delphi 6
BeitragVerfasst: Di 30.09.08 21:39 
Oh stimmt da kommt ja noch etwas dahinter was ich nicht hatte.
Man sollte doch immer bis zum Ende lesen :?

Danke jetzt geht es so wie ich es mir vorgestellt habe.