Hi und sorry, dass ich schon wieder einen neuen Thread auf machen...ist erstmal der letzte, versprochen.
Folgendes: Ich habe eine
Unit programmiert, welche für mich per
Indy Dateien verschickt und empfängt. Hierbei sage ich einfach meiner
Unit, welcher filestream verschickt werden soll und an welche
IP. Um den rest (Server und Client verwaltung etc) kümmert sich dann die
Unit.
In dieser
Unit benutzte ich den IDTCPServer. Der hat ein Event "OnExecute" das ja genau dann aufgerufen wird, wenn Daten "ankommen" also eine clientverbindung besteht.
Jetzt stellt euch folgendes vor:
Die Daten werden von der
Unit empfangen. D.h. ich jetzt jetzt da in irgendeiner form z.B. in einem Memorystream die Daten vorliegen, will sie jetzt aber von der
Unit in mein Hauptprogramm übergeben. Will die
Unit selber aber so allgemein halten, dass ich nicht irgendwie das Hauptprogramm damit verwebe...
Daher hatte ich mit gedacht, es wäre sinnvoll so eine Art weiteres OnEvent zu haben, sodass man im Hauptprogramm z.B. eine OnDATARECEIVED Procedur schreiben kann, welche als Parameter den Memorystream an das Hauptprogramm übergibt...
Ich hoffe ihr wisst, was ich meine?!
Habe die Suche bemüht, aber nichts gefunden was wirklich zu diesem Problem passt?!
Vorsichtshalber schicke ich euch nochmal den sourcecode mit
Delphi-Quellcode:
unit LANFS_KERNAL;
interface
uses SysUtils, Classes,
IdBaseComponent,IdStreamVCL, IdComponent,
IdTCPServer,IdTCPConnection,IdTCPClient,IdContext;
type
TLANFS_KERNAL =
class
public
procedure ReceiveStream(Acontext:TidContext);
procedure Start(port:integer);
procedure Stop();
procedure SendStream(Stream: TFilestream;Host:
String);
end;
var LANFS_SYSTEM :TLANFS_KERNAL;
TCPClient1: TIdTCPClient;
TCPServer1: TIdTCPServer;
implementation
procedure TLANFS_KERNAL.Start(port:integer);
{
+Aktiviert TCPClient und TCPServer
+Sollte immer am Start des Programms aufgerufen werden.
+zuletzt editiert: 24.05.06
}
begin
TCPClient1:= TIdTCPClient.Create;
TCPClient1.Port:=Port;
with TCPClient1
do
begin
ReadTimeout:=5000;
ConnectTimeout:=5000;
end;
TCPServer1:= TIdTCPServer.Create;
TCPServer1.OnExecute := LANFS_SYSTEM.ReceiveStream;
with TCPServer1
do
begin
MaxConnections:=1;
DefaultPort:=Port;
Active:=True;
end;
end;
procedure TLANFS_KERNAL.Stop();
{Stopt Server und Client, gibt Speicher frei.
zuletzt editiert: 24.06.05}
begin
TCPClient1.Free;
TCPServer1.Active:=False;
TCPServer1.Free;
end;
procedure TLANFS_KERNAL.SendStream(Stream: TFilestream;Host:
String);
{
+Versendet vom TCPClient an TCPServer einen Filestream
+Dieser wird als Parameter übergeben, und muss vorher erzeugt worden sein.
+zuletzt editiert: 24.05.06
}
var
IndyStream: TidStreamVCL;
begin
TCPClient1.Host:=Host;
try
IndyStream := TidStreamVCL.Create(Stream);
try
{ Senden }
with TCPClient1
do
begin
Connect;
try
Socket.
Write(IndyStream, 0, true);
finally
Disconnect;
end;
end;
finally
FreeAndNil(IndyStream);
end;
finally
FreeAndNil(Stream);
end;
end;
procedure TLANFS_KERNAL.ReceiveStream(Acontext:TidContext);
{
+Empfängt vom TCPClient an TCPServer einen Filestream
+zuletzt editiert: 25.05.06
}
var
FSTream: TFileStream;
SizeOfIncomingStream: Integer;
IDS: TidStreamVCL;
begin
FStream := TFileStream.Create('
C:\test.tmp', fmCreate);
//Hier soll der Filestream nicht mehr als
try //Datei gespeichert werden, sondern an das
IDS := TidStreamVCL.Create(FStream);
//Hauptprogramm übergeben werden!
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;
end.