Verzeichnisinhalt mit TidFTP auslesen (war : FTP Problem)
-
Hi,
Richtig! Du könntest auch - um es visuell zu haben - ne Listbox dafür nehmen
mfg, Micha
-
Moin,
ähnliches Problem habe ich auch. Ich möchte alle Dateien eines
Verzeichnisses auf dem FTP-Server in eine Liste vom Typ TStrings *
übergeben.IdFTP1->Connect(true); if(IdFTP1->Connected()) { IdFTP1->ChangeDir("/_private_files/"); myFiles = IdFTP1->ListResult; Label1->Caption = myFiles->Strings[0]; } IdFTP1->Disconnect();So sieht das bei mir aus. Die Variable myFiles ist als
TStrings *myFiles;deklariert!
Da die Funktion ListResult einen Rückgabewert vom Typ TStrings *
liefert, müßte es doch eigentlich so gehen, oder?
Leider geht es so aber nicht, woran liegt das?
-
-
"Geht nicht" ist keine Problembeschreibung.
-
Nochmal den Beitrag von akari durchlesen.
-
Nochmal den ersten Beitrag von RandomAccess85 durchlesen.
-
-
Jansen schrieb:
- "Geht nicht" ist keine Problembeschreibung.
Gut, was wollt Ihr dann hören? Routine läuft nicht in positive Richtung...
Jansen schrieb:
- Nochmal den Beitrag von akari durchlesen.
Is mir wohl klar, nur soweit ich weiß ist der Unterschied zwischen StringList und TStrings der, daß TStrings vom Compiler freigegeben werden. Und mit new habe ich die in anderen Projekten auch nicht instanziiert. Und da funzt alles... Lasse mich aber gerne eines Besseren belehren, wenn dem so ist... Deswegen frage ich ja um Hilfe...
Jansen schrieb:
- Nochmal den ersten Beitrag von RandomAccess85 durchlesen.
Da hast Du Recht. Aber muß ich das, wenn ich die Daten nicht visuell verwenden möchte?
Wär schön, wenn jemand noch irgendeine Idee hat, warum es nicht in positive Richtung läuft...

-
-
Eine sinnvolle Fehlerbeschreibung enthält z.B. den Inhalt von eventuellen Fehlermeldungen, oder Informationen zum erhofften und zum tatsächlich erhaltenen Ergebnis des Programm- oder Code-Teiles.
BCB-Hilfe schrieb:
Derive a class from TStrings to store and manipulate a list of strings. TStrings contains pure virtual methods and should not be directly instantiated [...]
Do not create instances of TStrings. TStrings methods rely on pure virtual methods that must be overridden in descendant objects [...]
TStringList implements the abstract properties and methods introduced by TStrings, and introduces properties, events, and methods [...]- Wo ist der Zusammenhang zu "visueller Verwendung"?
-
-
Das stimmt, habe den zweiten Eintrag von RandomAccess85 gelesen, sorry.
So wie im ersten Eintrag von RandomAccess85 habe ich es auch versucht.
Bei beiden Varianten bekomme ich folgende Fehlermeldung:Access violation at [...] in module 'Project1.exe'. Read of address 00000000.
-
arnedrews schrieb:
[i]Access violation at [...]
Siehe Punkt 2.
Dein Code hat zwar noch mindestens einen weiteren (logischen) Fehler, aber da kommst du bestimmt selbst drauf ...

-
Nö, keine Ahnung...

Hab mir grad' mal ein anderes Projekt geladen, bei dem ich das genau so
mache, aber mir fällt nichts auf...
In dem anderen Projekt sieht das so aus:myFiles = OpenDialog1->Files;...und da klappt das.
Ist das nicht dasselbe?
Ich mein, weil OpenDialog1->Files und IdFTP1->ListResult; denselben Rückgabewert vom Typ TString haben...???
-
Hallo
denselben Rückgabewert vom Typ TString
Bestimmt nicht. Der Rückgabetyp ist TStrings*. Der Unterschied des Sternchen (mal abgesehen vom Schreibfehler) ist erheblich.
Ist das nicht dasselbe?
Nur auf den ersten Blick. Denn bei Pointern als Rückgabetyp stellt sich immer die Frage, wer für die Speicherverwaltung verantwortlich ist? Im Fall vom TOpenDialog ist es der Dialog. Du bekommst nur eine Adresse auf ein TStrings-Objekt, das dem Dialog gehört. Wenn der Dialog gelöscht wird, ist die Adresse auch ungültig.
Bei dir ist die Sache anders. Zum einen must du bevor du ListResult abfragen kannst, erstmal die Methode List aufrufen. Und diese Funktion gibt keine TStrings* zurück, sondern hat einen solchen Parameter. Hier must du nämlich eine selbstverwaltete List angeben.
TStringList* myFiles = new TStringList(); // Stringliste erstellen IdFTP1->Connect(true); if(IdFTP1->Connected()) { IdFTP1->ChangeDir("/_private_files/"); // alle Dateien im FTP-Verzeichnis abfragen IdFTP1->List(myFiles, "", false); // Wenn mindestens eine vorhanden, diese anzeigen if (myFiles->Count > 0) Label1->Caption = myFiles->Strings[0]; } IdFTP1->Disconnect(); delete myFiles; // StringListe löschenDie Eigenschaft ListResult ist nur eine weitere möglichkeit das letzte Abfrageergebnis nachträglich zu bekommen. Aber trotzdem must du erstmal List aufrufen. Und hier must du eine eigene TStrings-Instanz übergeben.
bis bald
akari
-
Aaaaaaaaaaaaaaaaaaaaaaaah !!!
Super, daran hatte ich tatsächlich nicht gedacht!
Vielen Dank für Deine Hilfe!Arne