Einzelnen Beitrag anzeigen

cgimda

Registriert seit: 20. Jan 2005
5 Beiträge
 
#37

Re: Beispiel zum Versenden von Dateien mit Indy

  Alt 26. Jan 2005, 13:09
Hallo ich das gleiche Problem wie jonny.
Wenn ich das Projekt runterlade und ausführe dann funktioniert alles bestens, wenn ich aber die Projektdateien öffne und neu Compiliere (Delphi 7 Pro) so funktioniert das ganze nicht mehr.

Ich habe herausgefnunden an was es liegt, konnte aber das Problem nicht lösen.

Das Problem liegt in folgender Funktion:

Delphi-Quellcode:
function TFileReceiver.Start : Boolean;
Var bError : Boolean;
      bReady : Boolean;
      fs : TFileStream;
begin
   result := true;
   if iFileSize > 0 then begin
      // Alle Startwerte setzen
      bError := false;
      bReady := false;
      iReceivedBytes := 0;
      // erstmal versuchen die Datei zu erstellen
      // das Zielverzeichnis wo die Daten gespeichert werden sollen könnt Ihr nachher selber bestimmen
      sFileName := 'C:\'+sFileName;
      try
         fs := TFileStream.Create(sFileName,fmCreate or fmShareExclusive);
      except
         // Fehler beim Erstellen der Datei aufgetreten
         result := false;
         exit;
      end;
      try
         // Solange keine Abbruch Bediengung erreicht ist Stream-Pakete lesen
         While (not AThread.Terminated) and (AThread.Connection.Connected) and
                  (not bError) and (not bReady) do begin
            // Buffer(Speicher-Stream) leeren
            tmpMS.clear;
            try
               // versuchen Stream zu Lesen
               AThread.Connection.ReadStream(tmpMS);
               // Steht jetzt auch wirklich was im Stream drin
               if tmpMS.Size > 0 then begin
                  // die gelesenen Bytes jetzt direkt in den FileStream schreiben
                  fs.copyFrom(tmpMS,0);
                  // Anzahl der gelesenen Bytes erhöhen
                  iReceivedBytes := iReceivedBytes + tmpMS.Size;
                  // jetzt durch den Thread die Methode UpdateProgress ausführen
                  // dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe
                  AThread.Synchronize(UpdateProgress);
               end;
               bReady := (fs.Size = iFileSize);
            except
               // Fehler beim Lesen des Stream aufgetreten, Speicher leeren
               tmpMS.Clear;
               // Vorgang abbrechen
               bError := true;
            end;
         end;
      finally
         fs.free;
         if bError then
            DeleteFile(sFileName);
      end;
      result := FileExists(sFileName);
   end;
end;
Genauer gesagt liegt es an dieser Zeile:

Delphi-Quellcode:
// jetzt durch den Thread die Methode UpdateProgress ausführen
// dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe
AThread.Synchronize(UpdateProgress);
Wenn ich also "AThread.Synchronize(UpdateProgress);" aus der Funktion herausnehme funktioniert das Programm wieder. Leider ist dann die ProgressBar nicht mehr verfügbar.

Wenn ich also während des Empfangen, irgendetwas versuche anzuzeigen bleibt das Programm hängen. Und Wenn es nur ein "Refresh" ist.

Kann mir jemand sagen warum das bei Delphi 7 so ist? DataCool hat es mit Delphi 5 programmiert und es hat funktioniert. Hat jemand eine Lösung für das Problem?
  Mit Zitat antworten Zitat