| Autor |
Beitrag |
crossit
      
Beiträge: 39
|
Verfasst: So 26.07.09 01:18
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 26.07.09 02:18
Was haut den nicht hin mit dem IdFTP.Put()-Befehl? Gibts eine Fehlermeldung oder so?
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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 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 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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... 
|
|
crossit 
      
Beiträge: 39
|
Verfasst: So 26.07.09 10:34
hier der code
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 39
|
Verfasst: So 26.07.09 10:39
kann ich auch die listbox einfach wegnehmen so dass das alles im "hintergrund" läuft?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.07.09 10:41
jaenicke hat folgendes geschrieben : | 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 
      
Beiträge: 39
|
Verfasst: So 26.07.09 14:05
so habe das mal umgeändert und mache das mit einer tstringlist
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 26.07.09 14:44
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: 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 
|
|
|