Einzelnen Beitrag anzeigen

Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#1

Datei über die Indys mit Fortschrittsanzeige senden (Indy10)

  Alt 21. Aug 2005, 21:39
Das ist ein Beispiel. Natürlich macht es Sinn, die Angaben wie z.B. den Ziel-Host zu überprüfen und noch die Indy-Fehler abzufangen.

Voraussetzungen:
Die Indy-Komponenten ab Version 10
Sender: TidTCPClient (hier: "TCPSender")
Empfänger: TidTCPServer (hier: "TCPReceiver")

Hinweise:
Die ProgressBar auf dem Sender hat MIN := 0 und MAX := 100.
Das hat den Sinn, dass man sie durch eine andere Komponente ersetzen kann, die Prozentwerte verlangt. Zudem kann man den errechneten Wert z.B. für ein Label verwenden.

Delphi-Quellcode:
// Sender

{Global} 
var Groesse: Integer;


procedure TSendeForm.DateiSendeButtonClick(Sender : TObject);
var
  FStream: TFileStream;
  IDS: TidStreamVCL;

begin
  { Hier wird die Datei "ermittelt" }
  TCPSender.Host := HostEdit.text;
  if not (DateiOpenDialog.Execute) then
    exit;

  { Die Streams initialisieren - Beim IDS wird FStream gleich eingelesen }
  FStream := TFileStream.Create(DateiOpenDialog.FileName, fmOpenRead);
  try
    IDS := TidStreamVCL.Create(FStream);
    try
      { Senden }
      with TCPSender do
      begin
        Connect;
        try
          Socket.Write(IDS, 0, true);
        finally
          Disconnect;
        end;
      end;
    finally
      FreeAndNil(IDS);
    end;
  finally
    FreeAndNil(FStream);
  end;
end;

procedure TSendeForm.TCPSenderWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
  { Aktualisierung der Fortschrittsanzeige, ProcessMessages nicht vergessen! }
  ProgressBar.Position := Round((AWorkCount / Groesse) * 100);
  Application.ProcessMessages;
end;

procedure TSendeForm.TCPSenderWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer);
begin
  { Damit klar ist, wie groß die Datei ist | Reset der ProgressBar }
  Groesse := AWorkCountMax;
  ProgressBar.Position := 0;
end;



// Empfänger

procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext);
var
  FSTream: TFileStream;
  SizeOfIncomingStream: Integer;
  IDS: TidStreamVCL;
begin
  { Wo soll die Datei gespeichert werden? }
  if not (DateiSaveDialog.execute) then
  begin
    ShowMessage('Es wurde keine Datei ausgewählt!');
    exit;
  end;

  { Wieder die Streams }
  FStream := TFileStream.Create(DateiSaveDialog.FileName, fmCreate);
  try
    IDS := TidStreamVCL.Create(FStream);
    try
      { Empfangen }
      with AContext.connection do
      begin
        try
          SizeOfIncomingStream := Socket.ReadInteger;
          Socket.ReadStream(IDS, SizeOfIncomingStream);
        finally
          Disconnect;
        end;
      end;

      { Damit der Inhalt von IDS in FStream übertragen wird }
      IDS.VCLStream.Position := 0;
    finally
      FreeAndNil(IDS);
    end;
  finally
    FreeAndNil(FStream);
  end;
end;
[edit] Kommentare hinzugefügt [/edit]


[edit=Matze]Code angepasst (korigiert und formatiert). Mfg, Matze[/edit]
  Mit Zitat antworten Zitat