![]() |
Indy10 / etwas probleme mit selbstgebastelter unit
Hi@all!
Ich bin gerade dabei, eine eigentständige Unit zu schreiben, die mit Hilfe von Indy-TCP Server und Client Dateistreams verschicken kann. Ich stelle mir folgendes vor: Ich will einfach nur hinschreiben meineUnit.versendeStream(derStream,IpAdresse) Um den Rest soll ich die Unit kümmern, in ihr soll server und client erzeugt und verwaltet werden. ich habe dafür folgenden Code erstellt:
Delphi-Quellcode:
unit MeineUnit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent,IdStreamVCL, IdComponent, IdTCPServer,IdTCPConnection, IdTCPClient,IdContext; var TCPClient1: TIdTCPClient; TCPServer1: TIdTCPServer; procedure Start(port:integer); procedure Stop(); procedure SendStream(Stream: TFilestream;Host:String); procedure ReceiveStream(Acontext:TidContext); implementation procedure 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:=@ReceiveStream; with TCPServer1 do begin MaxConnections:=1; DefaultPort:=Port; Active:=True; end; end; procedure Stop(); {Stopt Server und Client, gibt Speicher frei. zuletzt editiert: 24.06.05} begin TCPClient1.Free; TCPServer1.Active:=False; TCPServer1.Free; end; procedure 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 ReceiveStream(Acontext:TidContext); var FSTream: TFileStream; SizeOfIncomingStream: Integer; IDS: TidStreamVCL; begin FStream := TFileStream.Create('C:\test.tmp', 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; end. Leider überträgt das ganze System noch keine Dateien. D.h. Die Datei kommt zwar an, ist aber leer, also wird der filestream nicht aufgefüllt. Ich weiß, das ist jetzt ziemlich blöd, weil ich den fehler nicht genauer eingrenzen kann, aber ich hab mir schon stundenlang den kopf darüber zerbrochen...kann das was mit dem "@TCPServer1.OnExecute:=@ReceiveStream;" zu tun haben...was genau bewirkt das "@" eigentlich? Sorry, dass ich hier mit so was aufwendingem einfach reinplatze ;) Wäre cool, wenn ihr ne lösungsidee habt :) Vielen lieben dank, euer alleinherrscher |
Re: Indy10 / etwas probleme mit selbstgebastelter unit
Okay, ich habe noch ein bisschen was rausgefunden:
Er springt im Server ab, und zwar sobald er anfängt, etwas mit AContext zu machen. Also angezeigt wird die Zeile "with AContext do..." Kann es sein dass ich einfach nicht die speicheradressen so umlegen darf, dass das on... Ereignis auf meine prozedur gelenkt wird? Kann ich das On..Ereignis denn irgendwie anders "umlenken" ohne private und public zu benutzten? |
Re: Indy10 / etwas probleme mit selbstgebastelter unit
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz