F
Damit hab ich mich auch beschäftigt, als ich ein ZIP Programm geschrieben hab.
Hab da mal eine kleine Hilfsfunktion geschrieben die genau dies macht.
Sie liest das Icon einer Datei ein, schreibt es in eine Imagelist und liefert den Index zurück. Sollte eine datei nicht existieren legt sie sie einfach an, holt sich dann das Icon und löscht sie wieder.
Evtl ist diese Funktion ja eine kleine Hilfe für manche, darum Poste ich einfach mal den Code.
/*Die Funktion ermittelt das Icon einer Datei
Input-Parameter:
const AnsiString & sFileName_i:
Referenz auf den Dateiname der Datei,
von welcher man das Icon möchte
( Optional mit oder ohne Pfad )
vector< AnsiString > & oExtensionList_i:
Referenz auf den Vector, welcher bereits
benutzte Dateiendungen ( doc, exe, ... )speichert
-> Wird wärend der Funktion befüllt
TImageList & oImageList_i :
Referenz auf die ImageList, welche die Icons abspeichert
-> Wird wärend der Funktion befüllt
const AnsiString & sExeDir_i: (Optional, wenn der Pfad in sFileName_i steht)
Referenz auf den Pfad, in dem die Datei liegt,
bzw wo sie temporär angelegt wird
( z.B. bei ZIP Archiven, bei denen die Dateien noch nicht
existieren, müssen sie temporär angelegt werden)
HINWEIS: Bitte darauf achten, dass oExtensionList_i und oImageList_i
AUSSCHLIESSLICH von dieser Funktion gefüllt werden, da
sie Synchron arbeiten müssen!
Rückgabewert:
Index des Icons in oImageList_i bzw. -1 bei einem Fehler
*/
int getIcon( const AnsiString & sFileName_i,
vector< AnsiString > & oExtensionList_i,
TImageList & oImageList_i,
const AnsiString & sExeDir_i = "" )
{
//sFileName_i muss einen Wert haben
assert( !sFileName_i.IsEmpty() );
//Wenn sFileName_i nur den Dateinamen+Dateiendung enthält
//wird als Datei-Pfad sExeDir_i genommen
AnsiString sTempFile;
if( sFileName_i.LastDelimiter("\\") > 0 ){
sTempFile = sFileName_i;
}
else{
assert( !sExeDir_i.IsEmpty() );
sTempFile = sExeDir_i + "\\" + sFileName_i;
}
//Die Dateiendung ( z.B. doc, exe ) wird sExtension zugewiesen
AnsiString sExtension = sFileName_i.SubString( sFileName_i.LastDelimiter(".")+1,
sFileName_i.Length() - sFileName_i.LastDelimiter("."));
//Es wird geprüft ob in oExtensionList_i die Dateiendung sExtension existiert
//Wenn sie existiert, wird der Index zurückgegeben
for( unsigned int i = 0; i < oExtensionList_i.size(); i++ ){
if( oExtensionList_i[i] == sExtension ){
return i;
}
}
//Überprüfung ob die Datei existiert
bool bFileExists = FileExists( sTempFile );
//sollte die datei nicht existieren, wird eine Temporäre Datei mit der
//selben Endung angelegt
if( !bFileExists ){
ofstream oFile( sTempFile.c_str() );
oFile.close();
}
//das Handle des Icons wir ermittelt
TIcon *MyIcon = new TIcon();
WORD wTemp;
HICON h = ExtractAssociatedIcon(Application->Handle,sTempFile.c_str(),&wTemp);
//Sollte das Handle ungültig sein wird -1 zurückgegeben
if( !h ) return -1;
//Sonst wird das Icon in oImageList_i aufgenommen
MyIcon->Handle = h;
oImageList_i.AddIcon(MyIcon);
//und die Dateiendung in oExtensionList_i
oExtensionList_i.push_back( sExtension );
//sollte die Datei nur Temporär angelegt worden sein, wird sie gelöscht
if( !bFileExists ){
remove( sTempFile.c_str() );
}
//der Index des Icons wird zurückgeliefert
return oImageList_i.Count - 1;
}
Gruß FightingWolf