Hi,
erstmal halte ich Deine Idee, die Indys in ne eigene Klasse auszulagern, nicht unbedingt verkehrt, aber auch nicht zwingend erforderlich !
Habe schon einiges mit den Indys gemacht, teils mit eigenen dynamischen erstellen eigenen Klassen die Indys beinhalten und teils einfach per Drag und Drop der
Indy-Komponenten.
Wenn Du den Weg Deiner eigener Klasse weiter gehen möchtest, dann solltest Du es auch richtig machen *lol*
Also wo fang ich an ?
Delphi-Quellcode:
constructor TTCPIP.Create (Owner : TComponent);
begin
inherited Create (Owner);
...
CreateTCPServer(Owner); // hier auch den Besitzer übergeben
CreateTCPClient(Owner); // hier auch den Besitzer übergeben
end;
procedure TTCPIP.CreateTCPServer(Owner : TComponent);
begin
// Dein Code absoluter Schwachsinn, Du erzeugst in Form1 eine Instanz
// der Klasse TTCPIP und nennst die TCPConnection
// in Create Deiner eigenen Klasse verweist über Form1,
// da genau wieder auf die Klasse die Du gerade am erzeugen bist ????
// Was soll das ?
//TCPServer := TIdTCPServer.Create (Form1.TCPConnection); // ist das Form1.TCPConnection im Create richtig?
TCPServer := TIdTCPServer.Create(Owner);
// oder TCPServer := TIdTCPServer.Create(nil); Server brauch nicht zwingend einen Besitzer
with TCPServer do
begin
OnConnect := TCPServerOnConnect;
...
OnListenException := TCPServerOnListenException;
end;
ServerConnected := false;
end;
procedure TTCPIP.CreateTCPClient(Owner : TComponent);
begin
// Wieder dasselbe wie beim Server, Du bist noch im Create Deiner eigenen Klasse
// und das Parent/der Besitzer soll über Form1 die Klasse selber seien ???????????
//TCPClient := TIdTCPClient.Create (Form1.TCPConnection);
TCPClient := TIdTCPClient.Create(Owner);
// oder : TCPClient := TIdTCPClient.Create(nil);
with TCPClient do
begin
OnConnected := TCPClientOnConnected;
...
OnStatus := TCPClientOnStatus;
end;
ClientConnected := false;
end;
In Deinen restlichen proceduren könnte das ein oder andere auch noch optimiert/schöner gelöst werden, aber ich bin schreibfaul und die Art der Lösung hängt auch stark davon ab was Du nachher jetzt damit machen willst.
Warum Du Deine
Exception bekommst, kann ich Dir sagen(vermute es, bin zu faul es komplett nach zu proggen).
Beim Beenden des Servers werden alle Threads des Servers beendet, d.h. alle Client-Threads
UND der Listener-Thread des Servers(der wird nämlich immer erzeugt), und genau dieser lässt sich bei Dir nicht beenden, deshalb die
Exception. Den Grund vermute ich in den oben schon beschrieben Fehler(Parentverbiegung).
Hoffe ich konnte Dir weiter helfen, sonst mußte mir mal ne PN schicken.
Mit den Indys kenn ich mich recht gut aus,
Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.