SHGetFileInfo komme nicht weiter...



  • Im VCL Forum kann mir wohl momentan keiner helfen, vlt. hat es ja doch mehr mit API zu tun, deswegen versuche ich nun mal hier mein Glück.

    Ich hole nun mit SHGetFileInfo ein Handle zu der SystemImage List, so wie ich es hier im Forum gesehn hatte.
    Nun habe ich aber das Problem, dass nicht alle Icons angezeigt werden, wie es sein sollte. Hauptsächlich fehlen die Ordner-Icons und Icons von .ink und .exe Dateien.

    Ich habe mir auch mal das Beispiel Programm von der Seite http://www.catch22.net/tuts/sysimg.asp mal runtergeladen und ausgeführt.

    (Hinweis: Ich benutze den BCB5)

    Das Programm zeigt ja meine komplette SystemImageList.
    Wenn ich das Programm nun in Einzelschritten durchlaufen lasse, und mir einmal den Wert von iIcon anschaue, ist der Wert bei Ordner immer der Wert 3.
    In meiner ImageList die geladen werden, sind aber nur 5 oder 6 Icons, jenachdem welchen Ordner ich wohl aufliste.
    Auf jeden Fall bekommen meine Ordner ein Icon für "unbekannte" dateien zugeordnet.

    Ich habe irgendwie so im Gefühl, dass mit der Zeile:

    ImageHandle = SHGetFileInfo("C:\\",0,&FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);
    
         SendMessage(list_Left[0]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
    
    //das gleiche dann auch mit LargeIcon
    

    gar nicht die ganze Liste geladen wird. Ich dachte die komplette Liste wird geladen und meiner ListView zugeordnet, wo ich dann mit FileInfo.iIcon den Index des Icons bekomme und diesen dann ausgeben kann.

    Ich weiß da nicht weiter, auch die Beispiele hier im Forum haben mir nicht weiter geholfen.
    Hier nun einmal der Code:

    THandle ImageHandle;
    SHFILEINFO FileInfo;
    HANDLE fHandle;          //DateiHandle Var. festlegen
    WIN32_FIND_DATA wfd;         //WIN32_FIND_DATA Var. festlegen
    
    fHandle=FindFirstFile("C:\\*",&wfd);      //FileHandle zuweisen RootVerzeichnis C*
    
    ImageHandle = SHGetFileInfo("C:\\",0,&FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);
    
    //Habe auch hier mal anstatt C:\\ mal nichts oder nur C eingeben, kommt eigentlich das gleiche Ergebnis bei raus.
    
    SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
    
    ImageHandle = SHGetFileInfo("C:\\", 0, &FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
    
    SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_NORMAL,ImageHandle);
    
     while(FindNextFile(fHandle,&wfd)){    //Ordner durchsuchen
    
             if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){  //Ist das gefundene Objekt ein Ordner?
    
            iDirectorys++; //Gefundene Anzahl an Ordnern um 1 erhöhen
    
           //Eintragen der Ordner
    
           TListItem *newItem; //Ein neues ListItem-Objekt erzeugen
    
        SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
               // List Struktur:
               // Dateiname,Erweiterung,Größe,Datum+Zeit
    
               newItem=list_Left[0]->Items->Add(); //Neus Item der Liste hinzufügen
               newItem->ImageIndex = FileInfo.iIcon;  //Icon Index
               newItem->Caption = wfd.cFileName;   //Den gefundenen Namen ausgeben
               newItem->SubItems->Add("--");       //Erweiterung angeben (bei Ordnern --)
               newItem->SubItems->Add("<DIR>");    //Größe angeben (Bei Ordnern <DIR>
    
               // Datum und Zeit von "Zuletzt Geändert"
    
               SYSTEMTIME stUTC, stL;  //Systemtime Variablen festlegen
    
               FileTimeToSystemTime(&wfd.ftLastWriteTime, &stUTC);  // Abspeicherung der Systemtime in stUTC
                                                                    // aus WIN32_FIND_DATA.ftLastWriteTime
    
               SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stL); //Systemzeit zur Localzeit stL umwandeln
    
               //Variablen für die Datum/Zeit ausgabe
               AnsiString asDate, asDay, asMonth, asYear, asHour, asMinute;
    
              // Prüfen ob der Zahlenwert unter 10 liegt. Wenn ja, dann eine null Anfügen
    
               if(stL.wDay <=9){ asDay="0"; }
                asDay += IntToStr(stL.wDay);      //Tag
    
               if(stL.wMonth <=9){ asMonth="0"; }
               asMonth += IntToStr(stL.wMonth);   //Monat
    
               if(stL.wHour <=9){ asHour="0"; }
               asHour += IntToStr(stL.wHour);     //Stunde
    
               if(stL.wMinute <=9){ asMinute="0"; }
               asMinute += IntToStr(stL.wMinute);  //Minute
    
               asYear = IntToStr(stL.wYear);      //Jahr
    
               // Zusammensetzung des Datum/Zeit Strings mit allen Werten
               // Bsp.: 30.07.2005 12:43
               asDate = asDay + "." + asMonth + "." + asYear + "  " + asHour + ":" + asMinute;
    
               newItem->SubItems->Add(asDate);  //Neues Item "Datum" entgülig der ListBox hinzufügen
    
             }
             else{ // Ist das gefunde Objekt eine Datei? Dann hinzufügen
    
                iSize.Length=iSize.Length + 1;
                asFileName.Length=asFileName.Length + 1;
                asFileName[asFileName.Length-1] = wfd.cFileName;
                iSize[iSize.Length-1] = wfd.nFileSizeLow;
    
               TListItem *newItem; //Ein neues ListItem-Objekt erzeugen
    
            SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
               // List Struktur:
               // Dateiname,Erweiterung,Größe,Datum+Zeit
    
               newItem=list_Left[0]->Items->Add(); //Neus Item der Liste hinzufügen
               newItem->ImageIndex = FileInfo.iIcon;
               newItem->Caption = wfd.cFileName;   //Den geundenen Namen ausgeben
               newItem->SubItems->Add("--");       //Erweiterung angeben (bei Ordnern --)
               newItem->SubItems->Add("FILE");    //Größe angeben (Bei Ordnern <DIR>
    
             }
          }FindClose(fHandle);
    

    Ich denke irgendwie, das mit

    SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    

    vor der Ausgabe der Dateien, das Icon an der letzten Stelle in der ImageList geschrieben wird.

    Weiß echt nicht weiter?
    Vlt. verstehen ich auch nur irgendetwas falsch. Währe sehr nett wenn mir einer Helfen könnte.

    Gruß
    Thorsten



  • kann mir hier auch keiner weiterhelfen?

    gruß
    thorsten



  • Du hast zuviel Text und zu viel Code geschrieben.



  • Also dann versuche ich mich mal kurz zu fasssen.

    Ich möchte ein Verzeichnis mit dessen Inhalt in einer TListView ausgeben, mit den dazugehörigen Icons und Ordner- bzw. Dateinamen.

    Ich habe nun nur das Problem, dass mir keine Icons für Ordner und ein paar andere wie .exe oder .ink nicht ausgegeben werden.

    So die SystemIcons hinzufügen:

    ImageHandle = SHGetFileInfo("C:\\",0,&FileInfo,sizeof(FileInfo),SHGFI_SYSICONINDEX  | SHGFI_SMALLICON);
    
    //Habe auch hier mal anstatt C:\\ mal nichts oder nur C eingeben, kommt eigentlich das gleiche Ergebnis bei raus.
    
    SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
    
    ImageHandle = SHGetFileInfo("C:\\", 0, &FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
    
    SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_NORMAL,ImageHandle);
    

    Dann bei der Ausgabe der Daten in der ListView wollte ich so die Icons bzw. den Index laden:

    SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_DISPLAYNAME |SHGFI_ICON |SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    

    Was ist daran nun verkehrt?

    (Hoffe is kurz genug so 😉 )
    (Hinweis noch: Benutzte BCB 5)
    Gruß
    Thorsten


Anmelden zum Antworten