AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Neue Klasse: TFileTypeInfo
Thema durchsuchen
Ansicht
Themen-Optionen

Neue Klasse: TFileTypeInfo

Ein Thema von Chewie · begonnen am 14. Aug 2003 · letzter Beitrag vom 16. Aug 2003
Antwort Antwort
Chewie
Registriert seit: 10. Jun 2002
Vielleicht hätte ich das in die Code-Library schreiben sollen, aber da ein Demo-Programm dabei ist, poste ichs mal hier.

Ich habe eine kleine Klasse geschrieben, mit der man die Icons eines Dateityps ermitteln kann. Das Tolle daran ist: Icons können gecacht werden, d.h. nach dem ersten Aufruf verbleibt das Icon im Speicher und muss nicht erneut angefordert werden. Wenn man beispielsweise 1000 mal das Icon einer MP3-Datei anzeigen lassen will (als Ordneranzeige), braucht man mit deaktiviertem Caching etwa 2s, mit aktiviertem Caching aber nur etwa 50 ms.
Das ist jetzt natürlich der Idealfall, aber vielleicht kanns ja jemand auch so gebrauchen. Falls ja und es jemand wünscht, soll er Bescheid sagen, dann mach ich noch ne Art Filterliste, um bestimmte Dateiicons vom Caching auszuschließen.

Im Anhang ein Demoprojekt sowie die Klasse als einzelne Unit.
Angehängte Dateien
Dateityp: exe tfiletypeicon.exe (221,7 KB, 37x aufgerufen)
Dateityp: pas filetypeicon.pas (3,6 KB, 30x aufgerufen)
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
 
Benutzerbild von negaH
negaH
 
#2
  Alt 15. Aug 2003, 00:11
Jetzt wäre es ideal wenn du statt TIcons zwei TImageList's benutzen würdest. Beide Listen werden mit ImageList.Handle := SHGetFileInfo(nil, 0, ..., SHGFI_ICON / SHGFI_SMALLICON ); initialisiert. Beide ImageListen müssen .Shared := True sein. So nun haste schon mal in beiden Image Listen alle Symbole in einem Rutsch die zu allen Extensionen in der Shell angezeigt werden. Nun kannst du zu einer Dateiextension speziell mit SHGetFileInfo() den Index in diese Listen ermitteln.

Aus Sicht der Nutzbarkeit wäre es jetzt easy diese IMageListen mit einem TShellListView/TShellTreeView zu verknüpfen.

Gruß Hagen
  Mit Zitat antworten Zitat
Chewie

 
Turbo Delphi für Win32
 
#3
  Alt 15. Aug 2003, 11:22
Seltsam, das ist der gleiche Punkt, auf den ich Sakura bereits angesprochen habe.
Wenn ich SHGetFileInfo lediglich mit SHGFI_ICON bzw. SHGFI_SMALLICON aufrufe, dann bekomme ich als Rückgabewert kein Handle einer Imagelist, sondern 0, falls ein Fehler auftrat, andernfalls einen Wert ungleich 0. Dass das ein Handle einer Imagelist ist, geht nicht aus dem SDK hervor. Dies ist lediglich der Fall, wenn SHGFI_SYSICONINDEX spezifiziert wurde.
Ich denke, du meintest das.
Wie auch immer, mal schauen, ob ich das so machen werde. Ich werd zunächst mal einige Tests machen, um die Performance & die Speicherauslastung zu pürfen, wobei, wenn es so funktioniert, wie ich denke, deine Methode in beiden Punkten gewinnen wird (außer vielleicht in wenigen Spezialfällen, wie beispielsweise oben angesprochenen Fall mit 1000 Dateien des gleichen Typs).
Martin Leim
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH
 
#4
  Alt 15. Aug 2003, 14:47
SHGetFileInfo('C:\', ....); ist vollkommen ausreichend. Man muß also einen gültigen Pfad bzw. FileSystem Object angeben.

Zitat:
Wie auch immer, mal schauen, ob ich das so machen werde. Ich werd zunächst mal einige Tests machen, um die Performance & die Speicherauslastung zu pürfen, wobei, wenn es so funktioniert, wie ich denke, deine Methode in beiden Punkten gewinnen wird (außer vielleicht in wenigen Spezialfällen, wie beispielsweise oben angesprochenen Fall mit 1000 Dateien des gleichen Typs).
Es ist keine Frage der Performance sondern eine Frage der Resourcen. Icons so wie du sie benutzt sind Objecte des GDI's, ImageListen sind Objecte des Kernels. Der Unterschied besteht darin das bei 1000 Extensionen in deiner Methode 1000 GDI Objecte nötig sind. Bei einer ImageList ist nur 1 GDI Object nötig, nämlich die Bitmap der ImageList. Aber im Grunde nutzt das ImageList API noch nichtmal dieses 1 Bitmap GDI Object, sondern nutzt seine eigenen Funktionen um den Bitmap Speicher zu verwalten. Erst wenn man ein Icon oder Bitmap zum Zeichnen anfordert existiert dieses GDI Object. Gleich nach dem zeichnen wird es sofort zerstört und freigegeben. Somit sind ImageList enorm Resourcenschonende Objecte. Dadurch das sie viele gleichartige Bilder als ein Bild verwalten (sprich Größe, Farbanzahl sind gleich) sind sie auch noch schneller.

Das eigentlich langsamme an SHGetFileInfo() ist aber der Prozess des Heraussuchens der Infomationen zur Extension aus der Registry. Diesen könntest du mit einer eigenen Liste beschleunigen. ABER! eine Veränderung der Extensionsregistrierung würdest du dann nicht mehr mitbekommen. Deswegen sucht SHGetFileInfo() auch immer wieder in der Registry statt selber zwischen zuspeichern.

Gruß Hagen
  Mit Zitat antworten Zitat
Chewie

 
Turbo Delphi für Win32
 
#5
  Alt 16. Aug 2003, 13:26
Zitat von negaH:
SHGetFileInfo('C:\', ....); ist vollkommen ausreichend. Man muß also einen gültigen Pfad bzw. FileSystem Object angeben.
Das ist es ja gerade. Ich will nur eine Erweiterung eingeben müssen, um das Icon zu bekommen.
Und das mit den Imagelisten: Ich muss wirklich SHGFI_SYSICONINDEX angeben, um ein Imagelist-Handle zu bekommen (andernfalls bekomm ich nur 1 zurück). Und ich kann nur auf Elemente in dieser Imagelist zugreifen, die ich auch explizit angefordert habe. Alles andere erzeugt "undefined behaviour", wie es das PSDK passend ausdrückt, denn ich versteh nicht ganz, nach welchen Kriterien die Indizes in der Imagelist vergeben werden. Eine feste Zuordnung vor dem Zugriff auf Elemente gibt es aber soweit ich das jetzt feststellen konnte nicht.

Ich weiß jetzt also nicht, wie du das mit den Imagelisten gemeint hast, vielleicht könntest du mir ja ein paar Zeilen Code schreiben, damit ich versteh, was du meintest.
Martin Leim
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz