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