Guten Tag,
Ich habe eine Programm geschrieben das nur aus einer
Unit und einem From besteht.
Beim Starten wird das From angezeigt.
Beim erstellen des Froms wird im OnActivate folgendes aufgerufen:
Delphi-Quellcode:
procedure THeaderFooterForm.FormActivate(Sender: TObject);
var i : integer;
begin
if not assigned(server) then
server := TServer.Create('127.0.0.1',25222,true);
i := 0;
end;
Die TServer Klasse ist in der
Unit definiert wie folgt:
Delphi-Quellcode:
type
TServer = class(TObject)
constructor Create(_IP:String; _Port:Word; _Start:Boolean); overload;
destructor Destroy; override;
procedure BeforeDestruction; override;
private
tcpServer: TIdTCPServer;
recievedData : TStringList;
procedure fillPersonData;
procedure tcpServerExecute(AContext: TIdContext);
public
end;
var
personData: TPersonData;
server : TServer;
implementation
procedure TServer.BeforeDestruction;
begin
Stop;
inherited BeforeDestruction;
end;
constructor TServer.Create(_IP:String; _Port:Word; _Start:Boolean);
begin
inherited Create;
tcpServer := TIdTCPServer.Create(nil);
recievedData := TStringList.Create;
tcpServer.Bindings.Clear;
tcpServer.Bindings.Add;
tcpServer.Bindings.Items[0].IP := _IP;
tcpServer.Bindings.Items[0].Port := _Port;
tcpServer.Bindings.Items[0].IPVersion := Id_IPv4; // uses IdGlobal
tcpServer.OnExecute := tcpServerExecute;
tcpServer.Active := _Start;
end;
destructor TServer.Destroy;
begin
if Assigned(tcpServer) then
FreeAndNil(tcpServer);
if Assigned(recievedData) then
FreeAndNil(recievedData);
end;
Wie zu sehen ist starte ich den tcpServer im constructor, dies funktioniert auch wie gewünscht.
Sobald ich nun aber das Form schliesse und
tcpServer.Active := true ist erhalte ich eine Socket
exception: 'Socket-Fehler#10093'
Diese erhalte ich aber nur wenn ich das Projekt im Debug-Modus starte. Ich erhalte keine
exception wenn ich die exe direkt starte.
Da ich mir beim verwenden von Konstruktoren und Destruktoren noch nicht sicher bin ob dies korrekt ist bitte ich euch diese zuerst zu überprüfen.
Ich gehe davon aus das der tcpServer nicht korrekt freigegeben wird und daher auch der Socket.
Besten Dank für die Hilfe,
Int3g3r
EDIT:
Wenn ich im Form beim OnClose den server freigebe ist die Fehlermeldung weg.
Delphi-Quellcode:
procedure THeaderFooterForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
FreeAndNil(server);
end;
Daher müsste ich beim Konstructor einen Owner setzen ist dies korrekt ?
Somit würde beim zerstören des Form auch die
Unit freigegeben.
Kann mir dazu jemand ein Beispiel machen ?
.... Hmm habe gerade bemerkt das ein Owner nur bei einem TForm gesetzt werden kann.
TObject bietet dies nicht an. Ich möchte erreichen das das Objekt "server"
automatisch zerstört wird
wenn ich das Form schliesse. Ohne ein manuelles FreeAndNil.