Autor Beitrag
FSS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Mo 01.01.07 19:03 
Hallo,

ich lese über IdFTP1.List(ListBox1.Items, '' , false) denn Inhalt eines FTPServers in eine Listbox ein. Funktioniert wunderbar. Nun sollen Ordner oder Dateien vom Server gelöscht werden. Dazu kann der Anwender in der Lisbox einen Eintrag markieren und auf einen Button klicken, das Programm stellt fest, ob es sich bei dem Eintrag um einen Ordner oder eine Datei handelt und löscht es dann. Genau bei dieser Afrage liegt das Problem:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditDirectory then begin //hier muss der Fehler liegen...
    IdFTP1.RemoveDir(Self.ListBox1.Items.Strings[Self.ListBox1.Itemindex]);  //... da dies funktioniert (getestet)
end else if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditFile then begin
    IdFTP1.Delete(Self.ListBox1.Items.Strings[Self.ListBox1.Itemindex]);
end;


In der ersten Zeile bekomme ich den Fehler "Listenindex überschreitet das Maximum", in Klammern gibt er noch die Zahl des markierten Eintrages in der Listbox an.

Weiß jemand was hier schief läuft?
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mo 01.01.07 19:54 
Ich habe mich offen gestanden recht lange nicht mehr mit TIdFTP befasst. Bin also auch etwas unsicher.

Wofür genau hast du in der zweiten Zeile das self? Und warum in der ersten Zeile nicht?
FSS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Mo 01.01.07 20:01 
Wenn der Anwender in der Listbox einen Eintrag wählt, sehe Ich ja über ItemIndex welchen Eintrag er gewählt hat. Da die Einträge in der Listbox und in IdFTP1.DirectoryListing (meines Wissens nach) übereinstimmen müssten, lasse ich prüfen, ob das gewählte Objekt ein Ordner oder eine Datei ist.

In der zweiten Zeile hole ich mir dann den Namen des Objektes und lösche es.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mo 01.01.07 20:06 
Ääähm ... nochmal ... :wink:

Meine Frage war:
Warum verwendest du mal Self.Listbox1 und mal "nur" Listbox1, um auf die Listbox zuzugreifen?
FSS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Mo 01.01.07 20:55 
Ach jetzt, versteh ich was du meinst. Geht ohne Self auch, den Teil habe ich aus einem älteren Programm übernommen.
Das hat in diesem fall aber keine Auswirkungen.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Mo 01.01.07 21:12 
Okay. :)

Dann ans Eingemachte:

Zunächstmal wirft die Kiste (Indy 9.0.14) bei mir eine Exception, wenn ich
ausblenden Delphi-Quelltext
1:
if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditDirectory then					

abfragen will ohne die List-Methode zuvor mit true aufgerufen zu haben.

Also so müsste es m.E. sein:
ausblenden Delphi-Quelltext
1:
IdFTP1.List(ListBox1.Items,'',true)					


Mit false, so wie du es gemacht hast, lädt er die ganzen File-Attribute gar nicht erst mit runter, sondern im Prinzip nur die Filenamen.

So klappt es bei mir jetzt jedenfalls alles anstandslos.

Warum er bei dir scheinbar mit dem Index nicht einverstanden ist, kann ich so nicht sagen.
Hat zwischendurch bei dir vielleicht die Liste Items in IdFTP.DirectoryListing ihren Inhalt verloren?
Das würde ich mal überprüfen.
FSS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Mo 01.01.07 21:39 
Ich schaue mir das jetzt noch mal in aller Ruhe an. Danke erstmal!
FSS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Di 02.01.07 19:51 
Hab jetzt was gefunden!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  anzahl : Integer;
begin
  IdFTP1.List(ListBox1.Items, '' , true);
  anzahl := IdFTP1.DirectoryListing.Count;
  ShowMessage(IntToStr(anzahl));
end;


Hier bekommen ich als Message immer die Zahl 0, in DirectoryListing scheinen keine Items zu sein. Ich habe aber keine Ahnung, woran das liegt!
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Di 02.01.07 20:29 
user profile iconFSS hat folgendes geschrieben:
Hab jetzt was gefunden!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  anzahl : Integer;
begin
  IdFTP1.List(ListBox1.Items, '' , true);
  anzahl := IdFTP1.DirectoryListing.Count;
  ShowMessage(IntToStr(anzahl));
end;


Hier bekommen ich als Message immer die Zahl 0, in DirectoryListing scheinen keine Items zu sein. Ich habe aber keine Ahnung, woran das liegt!


Aber in der Listbox1 steht was drin?

Welche Version der Indy-Komponenten hast du?
FSS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83

Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
BeitragVerfasst: Di 02.01.07 20:49 
In der Listbox steht was drin, ich verwende die Version 10.0.52.
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Di 02.01.07 21:24 
Mal vorausgesetzt die Indys, die du verwendest, sind fehlerfrei, dann musst du mal sämtliche Eigenschaften der Komponente durchkauen und schauen, wie sie gesetzt sind und ob sie vielleicht das Verhalten der Komponente entsprechend beeinflussen.

Auch werden z.B. beim Befehl STATUS (ebenso wie bei LIST) die DirectoyListing-Items zuvor gelöscht. Soll heißen: Wenn vielleicht zwischen deinem LIST-Befehl und der Abfrage von DirectoryListing zuviele andere Dinge geschehen, könnten diese vielleicht die DirectoryListing killen.

Anders herum:

Wenn du - wie in deinem letzten Code angegeben - direkt nach dem LIST die Abfrage machst, darf DirectoryListing nicht leer sein. Es sei denn irgendwelche Einstellungen/Eigenschaften veranlassen die Komponente zu solch ungewünschtem Verhalten.