Autor Beitrag
Handycommander
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1054

Windows XP Pro, Vista
Visual Studio 2008
BeitragVerfasst: Fr 24.02.06 00:25 
hi,

ich habe eine listview und möchte damit die ordnerstruktur meines ftp server anzeigen! die verbindung über indy ftp klappt! wie kann ich jetzt in die listview die ordnerstruktur anzeigen?

danke
Grolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95

Win XP, Win 7
Delphi 2010 Pro
BeitragVerfasst: Fr 24.02.06 00:46 
Hi!
Bei mir klappt dies hier (Indy10):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.listverzeichnisse;
var
list : TStringList;
i : integer;
begin
  Listbox2.Clear;
  list := TStringList.Create;
  IdFTP.List(list, '', false);
  for i := (list.Count - 1downto 0 do
    if (list.Strings[i] = ''or
       (list.Strings[i] = '.'or
       (list.Strings[i] = '..'or
       (Pos('.', list.Strings[i]) <> 0then
       begin
         list.Delete(i);
         Listbox2.Items := list;
       end;
    list.free;
end;


Viele Grüße....
Handycommander Threadstarter
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1054

Windows XP Pro, Vista
Visual Studio 2008
BeitragVerfasst: Fr 24.02.06 12:46 
dabei hängt sich das programm auf...
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Fr 24.02.06 13:22 
Hast du schon mal versucht, das Programm zu debuggen?

_________________
Ein Nutzer der Ecke ;-)
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 24.02.06 21:28 
user profile iconHandycommander hat folgendes geschrieben:
dabei hängt sich das programm auf...


user profile iconMartin1966 hat folgendes geschrieben:
Hast du schon mal versucht, das Programm zu debuggen?


Das Problem mit dem Aufhängen des Programmes hat sich geklärt, nach dem er über MSN mit dem Problem an mich herantrat. Es lag daran, dass er vergessen hat Passiv auf true zu setzten (Verbinung über Proxy (also auch Router) läuft dann nicht richtig).


user profile iconGrolle hat folgendes geschrieben:
Hi!
Bei mir klappt dies hier (Indy10):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.listverzeichnisse;
var
list : TStringList;
i : integer;
begin
  Listbox2.Clear;
  list := TStringList.Create;
  IdFTP.List(list, '', false);
  for i := (list.Count - 1downto 0 do
    if (list.Strings[i] = ''or
       (list.Strings[i] = '.'or
       (list.Strings[i] = '..'or
       (Pos('.', list.Strings[i]) <> 0then
       begin
         list.Delete(i);
   Listbox2.Items := list;
       end;
    list.free;
end;


Viele Grüße....


Ich glaube nicht dass der Quelltext wirklich das macht was er soll, denn bei Dateien ergibt Pos('.', DateiName) immer größer 0 (da immer einer vorhanden ist bei Dateinamen unter Win.). Des weiteren sollte man aus Performancegründen die Zeile Listbox2.Items := list; erst nach der Schleife ausführen (du überschreibstt ja immer die alte Liste ... ).
Handycommander Threadstarter
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1054

Windows XP Pro, Vista
Visual Studio 2008
BeitragVerfasst: Sa 25.02.06 17:47 
wie kann ich des dann in einer listview anzeigen lassen?
mit der ordneranzeige in einer combobox bzw in einer treeview?
in ner listbox funktionierts aber nur mit den ordnern!

wie funtkioniert das?
danke
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 25.02.06 19:39 
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 :arrow: 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):

ausblenden volle Höhe Delphi-Quelltext
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 //KB
  begin
    if Groesse>1048575 then //MB
    begin
      if Groesse>1073741823 then //MB
      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:

ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
3:
var
  Form1: TForm1;
  DateiInfo: array of TDateiInfo; //<--die hier


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):

ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 25.02.06 19:59 
@heiko: Und der ShellTreeview kann auch Verzeichnisse auf einem FTP-Server auflisten?
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 25.02.06 20:13 
user profile iconLuckie hat folgendes geschrieben:
@heiko: Und der ShellTreeview kann auch Verzeichnisse auf einem FTP-Server auflisten?


Meines Wissens kann ein ShellTreeView es nicht, des wegen habe ich hier ja einen TreeView genommen, den man dann manuell befüllen muss. Zum Auffüllen muss man nur die Daten auslesen und in das Array geben und nach dem Befüllen noch ShowFiles aufrufen zum Anzeigen. Das Array braucht man eigentlich gar nicht, sprich man kann es auch ohne machen. Da das jedoch Source aus meinem Programm ist wollte ich den jetzt nicht umschreiben (da brauche ich das Array noch für viele Dinge ;) ).
Handycommander Threadstarter
ontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1054

Windows XP Pro, Vista
Visual Studio 2008
BeitragVerfasst: So 26.02.06 19:05 
wie muss ich des mit dem array machen? :oops: