Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

eigenes Event programmieren?

  Alt 25. Mai 2006, 12:57
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.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat