Autor |
Beitrag |
FSS
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if IdFtp1.DirectoryListing.Items[ListBox1.ItemIndex].ItemType = ditDirectory then begin IdFTP1.RemoveDir(Self.ListBox1.Items.Strings[Self.ListBox1.Itemindex]); 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
      
Beiträge: 629
D7
|
Verfasst: 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 
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: 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
      
Beiträge: 629
D7
|
Verfasst: Mo 01.01.07 20:06
Ääähm ... nochmal ...
Meine Frage war:
Warum verwendest du mal Self.Listbox1 und mal "nur" Listbox1, um auf die Listbox zuzugreifen?
|
|
FSS 
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: 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
      
Beiträge: 629
D7
|
Verfasst: 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
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:
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 
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: Mo 01.01.07 21:39
Ich schaue mir das jetzt noch mal in aller Ruhe an. Danke erstmal!
|
|
FSS 
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: Di 02.01.07 19:51
Hab jetzt was gefunden!
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
      
Beiträge: 629
D7
|
Verfasst: Di 02.01.07 20:29
FSS hat folgendes geschrieben: | Hab jetzt was gefunden!
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 
      
Beiträge: 83
Win 7 Professional 64Bit
Delphi 7 PE, Delphi 2005 PE, Turbo Delphi Explorer 2006
|
Verfasst: Di 02.01.07 20:49
In der Listbox steht was drin, ich verwende die Version 10.0.52.
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: 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.
|
|