Hi!
Das Programm soll ein Netzwerkspiel werden. Die Hauptform (TMainForm) ist ein kleines Chatfenster mit Userliste. Über Kontextmenü der Userliste kann man einen Spieler zu einem Spiel auffordern - es wird eine (halbtransparente) Form darübergelegt, um die Einladung zu schicken (TInvitationForm) (beispiel: "Sie wurden von Spieler XY eingeladen. Möchten Sie annehmen?") Nachdem der User auf annehmen geklickt hat soll sich bei diesem das eigentliche Spielfenster (TBoardForm) öffnen, bzw. auch bei seinem Gegenüber, sobald der die Message ('accept') bekommen hat.
Soweit so gut. Funktioniert eigentlich, nur:
Bei dem Spieler, der auf 'Annehmen' klickt, macht sich das Spielfenster reibungsfrei auf. Bei dem jedoch, der die Message erhält und bei dem sich darauf hin das Fenster öffnen soll, hängt sich das gesamte Programm auf. Man sieht den Umriss der Form und ein paar Umrisse der Komponenten, aber alles inaktiv / defekt. Ich kann als User nichts mehr machen, außer die Andwendung mit Hilfe des Taskmanagers zu beenden.
Chronologisch:
Delphi-Quellcode:
procedure TInvitationForm.BtnAcceptClick(Sender: TObject);
begin
MainForm.SendStatus('Accept');
SuddenClose:=False;
Close;
end;
Delphi-Quellcode:
procedure TMainForm.SendStatus(FStatus: String);
var
SendText: String;
begin
try
if TcpClient.Connect then
begin
SendText:='Status'+'#'+FStatus;
TcpClient.Sendln(SendText);
end;
finally
TcpClient.Disconnect;
end;
if (FStatus = 'Accept') then
begin
Board:=TBoardForm.Create(nil);
Board.SetProperties(Paths,UserData,Opponent.Nick,Opponent.IP,5200,
Language);
Board.Show;
// FUNKTIONIERT!!
end;
end;
Delphi-Quellcode:
procedure TMainForm.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
i,j: Integer;
RecievedLn: String;
RecievedKind: String;
RecievedStatus: String;
begin
RecievedLn:=ClientSocket.Receiveln;
i:=0;
while not(RecievedLn[i]='#')
do inc(i);
RecievedKind:=Copy(RecievedLn,0,i-1);
if not(RecievedKind='Status')
then exit;
inc(i);
j:=i;
while not(length(RecievedLn)=i)
do inc(i);
RecievedStatus:=Copy(RecievedLn,j,i-j+1);
CheckRecievedStatus(RecievedStatus);
end;
Delphi-Quellcode:
procedure TMainForm.CheckRecievedStatus(FStatus: String);
var
BBoard: TBoardForm;
begin
(...)
else
if (FStatus='Accept') then
begin
Invitation.SuddenClose:=False;
Invitation.Close;
Board:=TBoardForm.Create(nil);
Board.SetProperties(Paths,UserData,Opponent.Nick,Opponent.IP,5200,
Language);
Board.Show;
//FUNKTIONIERT NICHT!!!
end
else
(...)
end;
Delphi-Quellcode:
procedure TBoardForm.FormCreate(Sender: TObject);
begin
FirstStart:=True;
end;
procedure TBoardForm.FormActivate(Sender: TObject);
begin
if not(FirstStart)
then exit;
FirstStart:=False;
LoadImages;
SetButtons;
SetForm;
end;
Delphi-Quellcode:
procedure TBoardForm.SetProperties(FPaths: RPaths; FUserData: RUserData;
FOppNick,FOppIP: String; FPort: Integer; FLanguage: String);
begin
Paths:=FPaths;
UserData:=FUserData;
OppData.Nick:=FOppNick;
OppData.IP:=FOppIP;
UsedPort:=FPort;
Language:=FLanguage;
SetNetwork;
end;
Ich hoffe, mir kann jemand weiterhelfen, ich hab keinen Plan, wo ich da nach Fehlern suchen soll, bin die einzelnen Befehle schon x-mal step-by-step durchgegangen und funktioniert auch alles ohne fehlermeldungen. Es hängt sich eben nur immer auf. Ein dritter hat da oft mehr Durchblick ...
Danke!