In eine ListView es zu stellen ist besser, denn so kannst du direkt eine ShellTreeView machen. Dafür stellst du beim TreeView den ViewStyle auf vsReport. Als nächstes klickst du doppelt auf die Komponente

es öffnet sich ein kleines Fenster wo du Columns hinzufügen kannst:
0 - Name
1 - Größe
2 - Typ
3 - Geändert am
Hinweis: Die x - fügt Delphi automatisch hinzu.
Wenn du das hast klickst du in dem kleinem Dialog auf Größe und stellst du im Objectinspektor Alignment auf taRightJustify. Dann kannst du das kleine Fenster schließen, da du es nicht mehr brauchst. Damit hast du schon einmal das Aussehen einer ShellTreeView.
Zum Befüllen des ListViw gebe ich dir mal den fertigen Quelltext, allerdings musst du das Befüllen des Arrays TDateiInfo selber machen (also aus dem FTP auslesen):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| procedure InitialisiereIcons; var SysIL: uint; SFI: TSHFileInfo; SmallImages: TImageList; begin SmallImages := TImageList.Create(Form1); SysIL := SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON); if SysIL <> 0 then begin SmallImages.Handle := SysIL; SmallImages.ShareImages := TRUE; end; Form1.DateienListView.SmallImages := SmallImages; end;
function GetFileSize(Groesse: Integer): String; begin if Groesse>1023 then begin if Groesse>1048575 then begin if Groesse>1073741823 then begin Result:=Format('%.2f GB', [Groesse/1073741824]) end else begin Result:=Format('%.2f MB', [Groesse/1048576]) end end else begin Result:=Format('%.2f KB', [Groesse/1024]) end end else begin Result:=IntToStr(Groesse)+' Bytes' end end;
procedure ShowFiles; var i: integer; ListItem: TListItem; Info: TSHFileInfo; begin Form1.DateienListView.Items.Clear; Form1.DateienListView.Items.BeginUpdate; for i:=0 to High(DateiInfo) do begin ListItem:=Form1.DateienListView.Items.Add; SHGetFileInfo(PChar(DateiInfo[i].Dateiname), FILE_ATTRIBUTE_NORMAL, Info, SizeOf(TSHFileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES or SHGFI_TYPENAME); ListItem.ImageIndex:=Info.IIcon;
ListItem.Caption:=DateiInfo[i].Dateiname; ListItem.SubItems.Add(GetFileSize(DateiInfo[i].Bytes)); ListItem.SubItems.Add(Info.szTypeName); ListItem.SubItems.Add(DateiInfo[i].Datum); end; Form1.DateienListView.Items.EndUpdate; Form1.DateienListView.Repaint; end; |
Dafür musst du im globalen Bereich den Typ TDateiInfo erst einmla noch festlegen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TDateiInfo=record Dateiname: String; Bytes: Integer; Datum: String; end; |
Und natürlich die Variable noch definieren mit
Delphi-Quelltext
1: 2: 3:
| var Form1: TForm1; DateiInfo: array of TDateiInfo; |
Was in das Array TDateiInfo gespeichert werden soll erkennt man sicherlich von alleine

. Das Array bei der Auflistung der Dateien vom FTP (wie du das ausliest musst du selber machen, da mein Programm wo ich das hier gemacht habe nicht auf FTP sondern PHP beruht

).
Jetzt ist es eigentlich schon Startklar, allerdings werden die Bilder zu den Dateien noch nicht richtig angezeigt. Falls du dir den Quelltext genau anschaust weißt du auch warum.
Genau, wir haben die Prozedur InitialisiereIcons noch nicht aufgerufen. Das machen wir im OnShow wenn auch die ListView zu 100% erzeugt wurde und somit keine Fehlermeldungen evtl. auftreten (alternativ kannst du es auch im OnActivate aufrufen):
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormShow(Sender: TObject); begin InitialisiereIcons; end; |
So das wäre es erst einmal meinerseits. Wenn zum Quelltext fragen bestehen beantworte ich sie gerne, allerdings kann ich dir beim FTP nicht weiterhelfen, da ich damit nicht mehr arbeite (war mir zu Unsicher, da man das PW abfangen konnte). Aber zum dem Problem das nur Ordner angezeigt werden habe ich noch einen kleine Frage. Hast du die Zeile in der if-Abfrage mit dem
(Pos('.', list.Strings[i]) <> 0) entfernt? Denn diese filtert alle Dateien aus, die einen Punkt beinhalten und somit alle Dateien.
mfg
Heiko