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]