ImageList ListView Icon anzeigen die zweite



  • Guten morgen,

    so habe mir das Beispiel aus den BCB Examples mal näher angeschaut (VirtualListView), um die Icons entlich angezeigt zu bekommen.

    Nun habe ich vlt. ein kleines Problem.
    Wenn ich diese nun ausgebe, bekommen alle Einträge das Festplatten Icon.

    Ich habe auch mal versucht, die ImageList vorher zu aktualliesieren nur dann bekomm ich gar kein Icon angezeigt.
    Jede FileInfo die ich dann auch auslese, ist der Wert von iIcon (aus SHFILEINFO) immer = 4 somit holt er ja immer das Icon an der Stelle 4 raus.

    Hiereinmal 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);
    
          SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
    
          while(FindNextFile(fHandle,&wfd)){    //Ordner durchsuchen
            // list_Left[i_AktPos]->OwnerData = false;
             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
    
             // ImageHandle=SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
             // SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
              SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
               //ImageList1->AddIcon(FileInfo);
               // 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("<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;
    
              // ImageHandle=SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
              // SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
               TListItem *newItem; //Ein neues ListItem-Objekt erzeugen
    
               AnsiString path = "C:\\";
               path += wfd.cFileName;
    
              //  ImageHandle=SHGetFileInfo(path.c_str(),0,&FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
              // SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
               //SHGetFileInfo(path.c_str(), 0,&FileInfo, sizeof(FileInfo),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>
    
                iFiles++;
    
             }
          }FindClose(fHandle);
    

    Ein paar sachen hatte ich auskommentiert. So wie es jetzt ist, bekomme ich immer das Festplattenicon.

    Ich hatte auch irgendwie im Gefühl, dass GetFileInfo C:\\ beim "Arbeitsplatz" anfängt und FindFirstFile nur auf Laufwerk C:\\ ??

    Ich hab bestimmt mal wieder was falsch verstanden. Wäre nett wenn mir da einer helfen könnte.

    Danke!

    GRuß
    Thorsten



  • Benutze die Forumsuche mit dem Stichwort SHGetFileInfo!



  • habe den Code nun ein wenig umgeschrieben.

    für die Dateien die nun auf c liegen gibt er mir die icons aus. nur die ordner icons werden nicht angezeigt??

    hier 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);
    
          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_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
               //ImageList1->AddIcon(FileInfo);
               // 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 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
    
              ImageHandle=SHGetFileInfo(wfd.cFileName,0,&FileInfo, sizeof(FileInfo),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    
              SendMessage(list_Left[i_AktPos]->Handle, LVM_SETIMAGELIST, LVSIL_SMALL,ImageHandle);
              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>
    
                iFiles++;
    
             }
          }FindClose(fHandle);
    

    gruß
    thorsten



  • meines erachtens nach, wird die system imagelist richtig geladen, sonst würde er mir ja nicht die icons der dateien auf c: anzeigen. Nun frage ich mich warum er mir die Ordner Icons nicht anzeigt. Der Wert von FileInfo.iIcon ist bei Ordner immer 3. Das ist bei mir auch das OrdnerIcon in der SystemImage List habe ich festgestellt. Ich habe auch mal FindFirstFile in einem anderem Verzeichniss ausgeführt. Dort holt er mir auch nicht immer das Icon jeder Datei raus.
    Weiß hier nicht mehr weiter? Wäre nett wenn mir da einer helfen könnte.

    Gruß
    Thorsten



  • ach, noch eine anmerkung. ich habe das VirtualListView Example ja natürlich auch mal ausgeführt. Beim Start hatte er mir alle Symbole angezeigt, später als ich durch ein paar Ordnern hin und her gewechselt bin, hatte mir das Programm auch einige Icons nicht mehr angezeigt??



  • hmm, ich weiß echt nicht weiter. ich habe nun mal code angelegt, damit ich die verzeichnisse mal durch gehen kann. und zum größten teil werden mir halt gar nicht die ordner symbole angezeigt und von einigen exen auch nicht

    oder soll ich mein problem lieber im winapi forum posten?

    gruß
    thorsten


Anmelden zum Antworten