Entwickler-Ecke
Internet / Netzwerk - datein aus memo/listbox ermitteln für upload
crossit - So 26.07.09 01:18
Titel: datein aus memo/listbox ermitteln für upload
hey leute bin gerade dabei ein programm zu schreiben das alle gewünschte datein in einem ordner sucht sie in einer memo/listbox aufzulisten und dannach upzuloaden. habe das mit dem raussuchen alleine geschafft und mit dem uploadne von normalen datein. jetzt bin ich auch ein problem gestoßen unzwar wie kann ich das wenn alle datein in der listbox aufgelistet sind alle einzeln nacheinander uploaden? mit iidftp.put() habe ich das nicht hinbekommen. kann mir einer helfen?
elundril - So 26.07.09 02:18
Was haut den nicht hin mit dem IdFTP.Put()-Befehl? Gibts eine Fehlermeldung oder so?
lg elundril
jaenicke - So 26.07.09 06:42
Wozu überhaupt die ListBox? Brauchst du die wirklich, also soll der Benutzer dort die hochzuladenden Dateien auswählen oder so?
Und ansonsten sollte da eine Schleife über alle Einträge der ListBox ausreichen, wie hast du es denn versucht?
ffgorcky - So 26.07.09 09:24
Ich kenne mich leider auf dem Gebiet des Uploads noch nicht so wirklich aus (dazu müsste ich mir dann z.B. erstmal den Thread
92891 [
http://www.delphi-forum.de/viewtopic.php?t=92891&start=0&postorder=asc&highlight=idftp+put] genauer durchlesen), aber ich denke, Du könntest doch dann einfach nur eine For-Schleife machen, mit der Du die einzelnen Einträge durchgehst und dann jeweils die aktuelle Datei hochlädst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure markierteListBoxEintraegeNacheinanderHochladen(aktuelleListBox:TListBox); var i:integer; begin for i := 0 to aktuelleListBox.Items.Count-1 do if aktuelleListBox.Selected[i] then ladeDieDateiHoch(aktuelleListBox.Items[i])); end; |
crossit - So 26.07.09 10:18
also die listbox muss nicht inbedingt dasein man kann sie auch weglassen wollt. der benutzer soll nur die ftp daten angeben den datein typ wonach gesucht wird und das verzeichniss mehr nicht den rest sollte das programm machen. dh nach datein suchen (kein problem) und dann uploaden (das mein problem) dachte mir das geht mit einer listbox aber hatte mich geirrt
jaenicke - So 26.07.09 10:26
crossit hat folgendes geschrieben : |
| also die listbox muss nicht inbedingt dasein |
Dann nimm einfach eine TStringList für die Dateilisten, das geht dann etwas einfacher und schneller.
crossit hat folgendes geschrieben : |
| und dann uploaden (das mein problem) dachte mir das geht mit einer listbox aber hatte mich geirrt |
Gehen schon, aber nicht so schön wie ohne und mit TStringList. Aber wo liegt denn das Problem?
Du musst mit einer Schleife die Dateiliste durchgehen, und jede Datei mit IdFtp.Put hochladen, mehr ist das eigentlich auch nicht.
Aber wenn du nicht zeigst, was du versucht hast und was da nicht geklappt hat mit IdFtp.Put, kann ich dir auch schlecht helfen... :nixweiss:
crossit - So 26.07.09 10:34
hier der code
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:
| Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStrings); Var FindRec: tSearchRec; Begin If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then Exit; If aPath[Length (aPath)] <> '\' Then aPath := aPath + '\'; If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then aResult.Add (aPath + FindRec.Name); Until FindNext (FindRec) <> 0; FindClose (FindRec); If Not aWithSub Then Exit; If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then If Boolean (FindRec.Attr and faDirectory) Then FindFiles (aPath + FindRec.Name, aFindMask, aWithSub, aResult); Until FindNext (FindRec) <> 0;
FindClose (FindRec); End; procedure TForm2.Button1Click(Sender: TObject); begin findfiles ('gewählter Pfad' , '*.jpg', true, listbox1.items); end;
procedure tform2.upload var var MyIdFTP: TIdFTP; begin MyIdFTP := TIdFTP.Create; try myidftp.host :=host.text; MyIdFTP.UserName:= uname.text; MyIdFTP.Passwort:= pass.text; MyIdFTP.Put (listbox1.items); finally MyIdFTP.Free; end; end; |
Moderiert von
Gausi: Code- durch Delphi-Tags ersetzt
jaenicke - So 26.07.09 10:36
Ja, wie schon gesagt: Du musst da eine Schleife machen und jede Datei einzeln hochladen. Den entsprechenden Ansatz hat
ffgorcky ja bereits gepostet. ;-)
crossit - So 26.07.09 10:39
kann ich auch die listbox einfach wegnehmen so dass das alles im "hintergrund" läuft?
crossit - So 26.07.09 14:05
so habe das mal umgeändert und mache das mit einer tstringlist
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:
| Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStringlist); Var FindRec: tSearchRec; Begin If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then Exit; If aPath[Length (aPath)] <> '\' Then aPath := aPath + '\'; If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then aResult.Add (aPath + FindRec.Name); Until FindNext (FindRec) <> 0; FindClose (FindRec); If Not aWithSub Then Exit; If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then If Boolean (FindRec.Attr and faDirectory) Then FindFiles (aPath + FindRec.Name, aFindMask, aWithSub, aResult); Until FindNext (FindRec) <> 0;
FindClose (FindRec); End;
procedure TForm2.Button1Click(Sender: TObject); begin datei := tstringlist.Create; findfiles ( 'C:\Dokumente und Einstellungen\Frost\Eigene Dateien\Eigene Bilder\' , '*.jpg', true, datei); end;
procedure TForm2.Button2Click(Sender: TObject); begin for i := 0 to datei.Count-1 do MyIdFtp := TIdFtp.Create; try myidftp.host := 'ftp.stimmterersadasde.st.ohost.de'; myidftp.Username := 'asd'; myidftp.Password := ''; myidftp.Passive := false; myidftp.Connect; myidftp.Put(datei[i]); finally Myidftp.Free; end; end;
end. |
bekomme die fehlermeldung : listenindex überschreitet das maximum (68 )
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
jaenicke - So 26.07.09 14:34
Du hast ein Speicherleck drin, da du datei jedes Mal beim ButtonClick neu erzeugst und nie wieder freigibst. Lass am besten die globalen Variablen sein...
Ich denke du willst das ohnehin alles direkt hintereinander machen. Dann kannst du doch datei einfach lokal deklarieren.
Und zum Fehler: Ich rücke mal korrekt ein, wenn du das tun würdest, würdest du den Fehler auch sofort sehen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm2.Button2Click(Sender: TObject); begin for i := 0 to datei.Count-1 do MyIdFtp := TIdFtp.Create;
try myidftp.host := 'ftp.stimmterersadasde.st.ohost.de'; myidftp.Username := 'asd'; myidftp.Password := ''; myidftp.Passive := false; myidftp.Connect; myidftp.Put(datei[i]); finally Myidftp.Free; end; end; |
Andreas L. - So 26.07.09 14:42
Sollte aResult nicht als Var-Parameter deklariert werden?
Delphi-Quelltext
1:
| Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; var aResult: tStringlist); |
jaenicke - So 26.07.09 14:44
Andreas L. hat folgendes geschrieben : |
| Sollte aResult nicht als Var-Parameter deklariert werden? |
Wofür? Es ist eine Klasse und damit ein Pointer auf die Instanz der Klasse. Wenn du das als var deklarierst, dann hieße das, dass du eine neue Instanz in diese Variable legen können willst, aber wozu? :gruebel:
Andreas L. - So 26.07.09 14:48
Ein einfacher Parameter ist doch nur eine Kopie des Objekts während bei einem var-Parameter das original Objekt durchgereicht wird, oder?
Er beschreibt in seiner Procedure ja den Parameter aResult. Die Daten werden nie in seiner globalen "datei"-Variable ankommen. Oder täusche ich mich da?
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:
| Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStringlist); Var FindRec: tSearchRec; Begin If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then Exit; If aPath[Length (aPath)] <> '\' Then aPath := aPath + '\'; If FindFirst (aPath + aFindMask, faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then aResult.Add (aPath + FindRec.Name); Until FindNext (FindRec) <> 0; FindClose (FindRec); If Not aWithSub Then Exit; If FindFirst (aPath + '*.*', faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then If Boolean (FindRec.Attr and faDirectory) Then FindFiles (aPath + FindRec.Name, aFindMask, aWithSub, aResult); Until FindNext (FindRec) <> 0;
FindClose (FindRec); End; |
jaenicke - So 26.07.09 14:52
Andreas L. hat folgendes geschrieben : |
| Er beschreibt in seiner Procedure ja den Parameter aResult. Die Daten werden nie in seiner globalen "datei"-Variable ankommen. Oder täusche ich mich da? |
Ja, sehr sogar. ;-)
Andreas L. hat folgendes geschrieben : |
| Ein einfacher Parameter ist doch nur eine Kopie des Objekts während bei einem var-Parameter das original Objekt durchgereicht wird, oder? |
Das stimmt für einfache Typen wie Integervariablen. Hier ist der weitergereichte Parameter aber nur der 4 Byte Pointer, der auf die Instanz der Klasse zeigt, also auf das Objekt.
Und diesen Pointer will man ja gar nicht verändern, sondern nur auf das Objekt zugreifen. Und dieses wird ja in der "Kopie des Pointers" als Parameter weitergegeben.
Wie sollte ein Objekt auch so einfach kopiert werden? Bei einem Integerwert oder Pointer oder so ist das einfach, aber bei einem Objekt? ;-)
Andreas L. - So 26.07.09 14:53
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ohh, man lernt nie aus ;-) Danke für die Erklärung :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!