Błąd z portem

0

Witam, mam do napisania kółko i krzyżyk przez sieć. Działa na zasadzie p2p, nie ma osobnego serwera. Uruchamia się normalnie, działa też normalnie, ale właśnie tylko do pewnego momentu. Jak postawie kilka 'ixów' i kilka 'kółek' to obie aplikacje się sypią i wywala mi takie errory:

http://iv.pl/images/75303977557760574127.png

Wiem, że kod jest do bani, nieskładny i da się to napisać 100 razy wydajniej i krócej no ale cóż 😉

Kod jednego:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    RadioGroup1: TRadioGroup;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure RadioGroup1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('1X');
Button1.Caption := 'X';
Button1.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('2X');
Button2.Caption := 'X';
Button2.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('3X');
Button3.Caption := 'X';
Button3.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('4X');
Button4.Caption := 'X';
Button4.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('5X');
Button5.Caption := 'X';
Button5.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('6X');
Button6.Caption := 'X';
Button6.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('7X');
Button7.Caption := 'X';
Button7.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('8X');
Button8.Caption := 'X';
Button8.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('9X');
Button9.Caption := 'X';
Button9.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  znak : string;
begin
znak := Socket.ReceiveText;
if znak = '1O' then
begin
Button1.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '2O' then
begin
Button2.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '3O' then
begin
Button3.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '4O' then
begin
Button4.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '5O' then
begin
Button5.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '6O' then
begin
Button6.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '7O' then
begin
Button7.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '8O' then
begin
Button8.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '9O' then
begin
Button9.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 :
begin
ServerSocket1.Active := False;
ClientSocket1.Active := True;
end;
1 :
begin
ClientSocket1.Active := False;
ServerSocket1.Active := True;
end;
end;

end;

end.

I drugiego:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    RadioGroup1: TRadioGroup;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure RadioGroup1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('1O');
Button1.Caption := 'O';
Button1.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('2O');
Button2.Caption := 'O';
Button2.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('3O');
Button3.Caption := 'O';
Button3.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('4O');
Button4.Caption := 'O';
Button4.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('5O');
Button5.Caption := 'O';
Button5.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('6O');
Button6.Caption := 'O';
Button6.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('7O');
Button7.Caption := 'O';
Button7.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('8O');
Button8.Caption := 'O';
Button8.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('9O');
Button9.Caption := 'O';
Button9.Enabled := False;
RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  znak : string;
begin
znak := Socket.ReceiveText;
if znak = '1X' then
begin
Button1.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '2X' then
begin
Button2.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '3X' then
begin
Button3.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '4X' then
begin
Button4.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '5X' then
begin
Button5.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '6X' then
begin
Button6.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '7X' then
begin
Button7.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '8X' then
begin
Button8.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '9X' then
begin
Button9.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 :
begin
ServerSocket1.Active := False;
ClientSocket1.Active := True;
end;
1 :
begin
ClientSocket1.Active := False;
ServerSocket1.Active := True;
end;
end;

end;

end.
0

Hmmm.... Dam Ci kilka wskazówek dzięki którym być może znajdziesz błąd sam, ponieważ wkleiłeś tutaj cały kod obydwu programów, dzięki czemu post zajmuje więcej niż niejeden artykuł w wikipedii...

Słyszałeś kiedykolwiek o czymś takim jak reguła DRY...? Tutaj masz link, więc poczytaj; Jak się to ma do Twojego programu? A no tak, że 80% kodu można skrócić dzięki kilku trikom; Zwróć uwagę na to, że w kółko powtarzasz pewne instrukcje w zdarzeniach kliknięcia na przycisk, np. ten:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Socket.SendText('1X');
  Button1.Caption := 'X';
  Button1.Enabled := False;
  RadioGroup1.ItemIndex := 1;
end;

można bardzo łatwo napisać jedną procedurę i podpiąć ją pod wszystkie 9 przycisków:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton(Sender) do
    begin
      ClientSocket1.Socket.SendText(Name[7] + 'X');
      Caption := 'X';
      Enabled := False;
    end;

  RadioGroup1.ItemIndex := 1;
end;

dzięki czemu połowa zbędnego kodu odpada; Jedziemy dalej;

Znowu powtarzasz pewny kod w zdarzeniu ServerSocket1ClientRead:

if znak = '1O' then
begin
Button1.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;
if znak = '2O' then
begin
Button2.Caption := 'O';
RadioGroup1.ItemIndex := 0;
end;

{...}

także łatwo to zastąpić kilkoma liniami:

TButton(FindComponent('Button' + Socket.ReceiveText[1])).Caption := 0;
RadioGroup1.ItemIndex := 0;

dzięki czemu znów oszczędzasz pisania wielu linii kodu, a działanie jest takie samo; Jeszcze sprawa zdarzenia RadioGroup1Click, cały ten kod:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 :
begin
ServerSocket1.Active := False;
ClientSocket1.Active := True;
end;
1 :
begin
ClientSocket1.Active := False;
ServerSocket1.Active := True;
end;
end;
end;

można skrócić do:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  ServerSocket1.Active := RadioGroup1.ItemIndex <> 0;
  ClientSocket1.Active := RadioGroup1.ItemIndex = 0;
end;

i też będzie działać, a znów zaoszczędzamy kilka linii kodu; To tyle, jeśli chodzi o pierwszy moduł, teraz zabieramy się za drugi;

Znowu te przyciski... Ten kod:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Socket.SendText('1O');
  Button1.Caption := 'O';
  Button1.Enabled := False;
  RadioGroup1.ItemIndex := 1;
end;

oczywiście można zamienić na:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton(Sender) do
    begin
      ClientSocket1.Socket.SendText(Name[7] + 'O');
      Caption := 'O';
      Enabled := False;
    end;

  RadioGroup1.ItemIndex := 1;
end;

i podpiąć pod wszystkie przyciski;

Także ten kod:

if znak = '1X' then
begin
Button1.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;
if znak = '2X' then
begin
Button2.Caption := 'X';
RadioGroup1.ItemIndex := 0;
end;

{...}

Można łatwo skrócić do:

TButton(FindComponent('Button' + Socket.ReceiveText[1])).Caption := 'X';
RadioGroup1.ItemIndex := 0;

i gitara;

Ten kod:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0 :
begin
ServerSocket1.Active := False;
ClientSocket1.Active := True;
end;
1 :
begin
ClientSocket1.Active := False;
ServerSocket1.Active := True;
end;
end;
end;

także można skrócić:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  ServerSocket1.Active := RadioGroup1.ItemIndex <> 0
  ClientSocket1.Active := RadioGroup1.ItemIndex = 0
end;

i będzie dobrze;

No i teraz cały program powinien wyglądać tak (bez deklaracji klas i innych niepotrzebnie podanych informacji):

Moduł 1:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton(Sender) do
    begin
      ClientSocket1.Socket.SendText(Name[7] + 'X');
      Caption := 'X';
      Enabled := False;
    end;

  RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  TButton(FindComponent('Button' + Socket.ReceiveText[1])).Caption := 0;
  RadioGroup1.ItemIndex := 0;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  ServerSocket1.Active := RadioGroup1.ItemIndex <> 0;
  ClientSocket1.Active := RadioGroup1.ItemIndex = 0;
end;

Moduł 2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton(Sender) do
    begin
      ClientSocket1.Socket.SendText(Name[7] + 'O');
      Caption := 'O';
      Enabled := False;
    end;

  RadioGroup1.ItemIndex := 1;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  TButton(FindComponent('Button' + Socket.ReceiveText[1])).Caption := 'X';
  RadioGroup1.ItemIndex := 0;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  ServerSocket1.Active := RadioGroup1.ItemIndex <> 0
  ClientSocket1.Active := RadioGroup1.ItemIndex = 0
end;

i to wszystko; Wystarczyło pomyśleć i poczytać o pewnych rzeczach; Teraz będzie o wiele łatwiej znaleźć bug'a, niż wcześniej;

Przede wszystkim zacznij na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) formatować kod, bo podałeś nie dość, że bardzo długi to jeszcze niesformatowany, na który nikt nie spojrzy, dopóki nie będzie na tyle czytelny, żeby można było szybko dowiedzieć się co wykonuje i znaleźć błąd;

Popraw kod u siebie, przetestuj, dowiedz się jak działają instrukcje, których nie rozumiesz a potem zastanów się dlaczego Twój program nie działa tak, jak założyłeś;

1 użytkowników online, w tym zalogowanych: 0, gości: 1