менеджер интернет-кафе с использованием сокетов клиент / сервер - PullRequest
0 голосов
/ 15 октября 2019

У меня проблема с динамическим уничтожением компонентов. Я хочу создать образ ПК при подключении, что я и сделал, но я не могу уничтожить выбранный компонент изображения при отключении клиента.

Я пытался использовать объект sender, но это не такработать со мнойМожете ли вы предоставить лучший код, пожалуйста.

сервер

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    Button2: TButton;
    Edit1: TEdit;
    ClientSocket1: TClientSocket;
    Memo1: TMemo;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    procedure getname(sender:Tobject);
    { Public declarations }
  end;
var
  Form1: TForm1;
  pcname:string;
  j,k:integer;
  IP11:TImage;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  j:=0;
  k:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lab:Tlabel;
begin
  if   (j <800) then
  begin
    IP11:=TImage.Create(panel1);
    IP11.Parent:=panel1;
    IP11.Picture.Bitmap.LoadFromFile('PPoste.Bmp');
    IP11.Top:=20+k; IP11.Left:=(48+j);
    IP11.Name:=pcname;
    lab:=Tlabel.Create(IP11);
    lab.Parent:=panel1;
    lab.Caption:=pcname;
    lab.Font.Size:=18;
    lab.Font.Color:=clred;
    lab.Color:=clwhite;
    lab.Transparent:=true;
    lab.Top:=100+k; lab.Left:=(48+j);
    lab.Name:=pcname;
    j:=j+120;
  end else
  begin
    k:=k+120;
    j:=0;
    Button1.Click;
  end ;
  IP11.OnClick:=getname;
end;

procedure TForm1.getname(sender: Tobject);
begin
  form1.Caption:=((sender as Timage).Name);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  clientsocket1.Address:=edit1.Text;
  clientsocket1.Active:=true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  memo1.Lines.Add(socket.RemoteAddress);
  memo1.Lines.Add(socket.RemoteHost);
  memo1.Lines.Add(socket.LocalHost);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  a:integer;
  pc : string;
begin
  edit2.Text:=socket.ReceiveText;
  sleep(20);
  a:=pos ( '/', edit2.Text );
  pcname:=copy(edit2.Text,0,a-1);
  pc:=copy(edit2.Text,a+1,a+1);
  if (pc='c') then
    button1.Click;
  if (pc='d') then
  begin
    if IP11.Name=pcname then
      IP11.Free;
    j:=j-120;
  end;
end;

end.

клиент

Я использую кнопки 3 & 4 & 5 & 6 для имитации соединенияи отключиться от других клиентов

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    ServerSocket1: TServerSocket;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ServerSocket1Listen(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  ip:string;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if not (edit1.Text = '') then
  begin
    ip:=edit1.Text;
    form1.Hide;
    memo1.Text:=edit1.Text;
    memo1.Lines.SaveToFile('d:/key.txt');
  end
  else
    showmessage('enter ip');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  serversocket1.Active:=true;
  if fileexists('d:/key.txt') then
  begin
    form1.Hide;
  end;
end;

procedure TForm1.ServerSocket1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  form1.Caption:='listen';
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  form1.Caption:='conected';
  edit1.Text:=socket.LocalHost;
  serversocket1.Socket.Connections[0].SendText(edit1.text+'/c');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  edit1.Text:=serversocket1.socket.LocalHost;
  serversocket1.Socket.Connections[0].SendText(edit1.text+'/d');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  serversocket1.Socket.Connections[0].SendText('hakim/c');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  serversocket1.Socket.Connections[0].SendText('hakim/d');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  serversocket1.Socket.Connections[0].SendText('taha/c');
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  serversocket1.Socket.Connections[0].SendText('taha/d');
end;

end.
...