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

user profile iconcrossit hat folgendes geschrieben Zum zitierten Posting springen:
also die listbox muss nicht inbedingt dasein
Dann nimm einfach eine TStringList für die Dateilisten, das geht dann etwas einfacher und schneller.

user profile iconcrossit hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconGausi: 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 user profile iconffgorcky 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?


jaenicke - So 26.07.09 10:41

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconcrossit hat folgendes geschrieben Zum zitierten Posting springen:
also die listbox muss nicht inbedingt dasein
Dann nimm einfach eine TStringList für die Dateilisten, das geht dann etwas einfacher und schneller.


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 user profile iconNarses: 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

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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. ;-)

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Ohh, man lernt nie aus ;-) Danke für die Erklärung :D