noch immer gleiches Projekt (LAN-Schach), aber andere Stelle:
Ich überprüfe nach jedem Schachzug, auf Bedrohung (CheckSign = '+'), auf Matt (CheckSign = '#') und auf Patt (CheckSign = 'XX'). Bei einem 'normalen' Zug (also ohne den vorherigen Situationen) ist CheckSign = ''.
Bei dem, der gerade gezogen hat und wo das ganze gleich überprüft wird, funktioniert das ganze wunderbar. Aber sobald bei dem Empfänger das empfangene Checksign > '' ist, kommt eine Zugriffsverletzung.
Hier werden die Daten versandt:
Delphi-Quellcode:
procedure TBoardForm.SendGameFiles(FSrc, FDest: TPoint; FNewFig: String);
var
AFiles: RSendFiles;
begin
AFiles.DoEnPassant:=DoEnPassant;
AFiles.EnPassant:=IsEPPossible(FSrc,FDest);
AFiles.Src:=FSrc;
AFiles.Dest:=FDest;
AFiles.DoCastle:=DoCastle;
AFiles.CheckSign:=CheckSign; //wenn ich übrigens CheckSign absolut definiere: AFiles.CheckSign:='#' funktioniert es!?? Obwohl die Variable CheckSign ebenfalls '#' enthält!
AFiles.NewFig:=FNewFig;
// AFiles enthält korrekte Eingaben, hab ich schon öfters überprüft
try
if TcpClient.Connect then
begin
TcpClient.Sendln('GameFiles#');
TcpClient.SendBuf(AFiles,sizeof(AFiles));;
end;
finally
TcpClient.Disconnect;
end;
// auch das Senden funktioniert, ebenfalls überprüft
DoCastle.QWing:=False;
DoCastle.KWing:=False;
DoEnPassant:=False;
EnPassant.Possible:=False;
{ CheckSign überprüfen / Rückgabewert: Spiel aus (True / False) }
if (CheckCheckSign(UserWhite))
then exit;
ChangeTurn;
end;
Hier das Empfangen der Daten:
Delphi-Quellcode:
procedure TBoardForm.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
ReceivedLn: String;
i: Integer;
ReceivedKind: String;
ReceivedInfo: String;
AGameFiles: RGameFiles;
AFiles: RSendFiles;
begin
(...)
ReceivedLn:=ClientSocket.Receiveln;
i := Pos('#', ReceivedLn);
ReceivedKind := Copy(ReceivedLn, 1, Pred(i));
if (ReceivedKind = 'OpenGame') then (...)
if (ReceivedKind = 'GameFiles') then
begin
ClientSocket.ReceiveBuf(AFiles,sizeof(AFiles));
UpdateGame(AFiles); //das Problem ist, ich kann AFiles nicht gleich überprüfen, weil bei den überprüften Ausdrücken immer steht 'nicht verfügbarer Wert'. Wenn ich jedoch CheckSign beim Senden absolut definiere, kann ich hier per Ausdrucksüberprüfung zugreifen
exit;
end;
if (ReceivedKind = 'Info') then (...);
end;
Delphi-Quellcode:
procedure TBoardForm.UpdateGame(FFiles: RSendFiles);
var
AWhite: Boolean;
begin
AWhite:=not(UserWhite); //sobald das Programm diese Routine erreicht, kommt die Zugriffsverletzung und eben nur, wenn CheckSign > '' ist und ich es nicht absolut definiere
CheckSign:=FFiles.CheckSign;
DoEnPassant:=FFiles.DoEnPassant;
EnPassant:=FFiles.EnPassant;
MoveFigure(Field,FFiles.Src,FFiles.Dest,False,True,FFiles.DoCastle,AWhite,
FFiles.NewFig);
DoEnPassant:=False;
{ CheckSign überprüfen / Rückgabewert: Spiel aus (True / False) }
if (CheckCheckSign(not(UserWhite)))
then exit;
ChangeTurn;
end;
*Verzweiflung*