www.pudn.com > 200589952618.rar > TCPthreadpas.pas


unit TCPthreadpas; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, IdBaseComponent, 
  IdComponent, IdTCPConnection, IdTCPClient, myconst, mytype, main, 
  ImgList, OleCtrls, SHDocVw; 
 
type 
  Ttcpthread = class(TThread) 
  private 
    IdTCPClient: TIdTCPClient; 
    onlineview: TListView; 
    chat: TRichEdit; 
    CS: TRTLCriticalSection; 
 
    procedure addonline; 
    procedure deleonline; 
    procedure getmes; 
    procedure modiuserstate; 
  protected 
    procedure Execute; override; 
  public 
    frmMain: TfrmMain; 
    user: Ruserdata; 
    online: array of Ruserdata; 
    procedure startplay; 
    procedure setobject(tcpclient: TIdTCPClient; listview: TListView; chatlist: TRichEdit); 
    procedure gamestart(var userdata: Ruserdata); 
    procedure gamerefuse(var userdata: Ruserdata); 
    procedure logout; 
  end; 
 
implementation 
uses mainformpas; 
 
{ Ttcpthread } 
 
procedure Ttcpthread.addonline; 
var 
  userdata: Ruserdata; 
begin 
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
  EnterCriticalSection(CS); 
  setlength(online, high(online) + 2); 
  online[high(online)] := userdata; 
  //更新显示 
  with onlineview.Items.Add do 
  begin 
    Caption := userdata.username; 
    imageindex := userdata.whatdoing; 
    subitems.Add(userdata.email); 
  end; 
  LeaveCriticalsection(CS); 
end; 
 
procedure Ttcpthread.deleonline; 
var 
  i: integer; 
  userdata: Ruserdata; 
begin 
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
  EnterCriticalSection(CS); 
  for i := 0 to high(online) do 
  begin 
  //删除online的节点。 
    if online[i].username = userdata.username then 
    begin 
      online[i] := online[high(online)]; 
      setlength(online, high(online)); 
      if onlineview.Items.Item[i].Caption = userdata.username then 
        onlineview.Items.Item[i].Delete; 
      break; 
    end; 
  end; 
  LeaveCriticalsection(CS); 
end; 
 
procedure Ttcpthread.getmes; 
var 
  mestext: Rtextdata; 
begin 
  IdTCPClient.ReadBuffer(mestext, sizeof(mestext)); 
  EnterCriticalSection(CS); 
  chat.lines.Add(mestext.fromwho + ' 对 ' + mestext.towho + ' 说:' + mestext.Text); 
  chat.SelStart := length(chat.Text) - length(mestext.fromwho + ' 对 ' + mestext.towho + ' 说:' + mestext.Text) - 2; 
  chat.SelLength := length(mestext.fromwho + ' 对 ' + mestext.towho); 
  chat.SelAttributes.color := clblue; 
  chat.SelAttributes.size := mestext.size; 
 
  chat.SelStart := length(chat.Text) - length(mestext.Text) - 2; 
  chat.SelLength := length(mestext.Text); 
  chat.SelAttributes.color := mestext.color; 
  chat.SelAttributes.size := mestext.size; 
 
  chat.SelStart := chat.Perform(EM_LINEINDEX, chat.lines.count, 0) + chat.lines.count; 
  chat.Perform(EM_SCROLLCARET, 0, 0); 
  LeaveCriticalsection(CS); 
end; 
 
procedure Ttcpthread.modiuserstate; 
var 
  i: integer; 
  userdata: Ruserdata; 
begin 
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
  EnterCriticalSection(CS); 
  for i := 0 to high(online) do 
  begin 
    if online[i].username = userdata.username then 
    begin 
      online[i] := userdata; 
      onlineview.Items.Item[i].imageindex := userdata.whatdoing; 
      onlineview.Items.Item[i].subitems.Strings[0] := userdata.email; 
    end; 
  end; 
  LeaveCriticalsection(CS); 
end; 
 
procedure Ttcpthread.logout; 
var 
  userdata: Ruserdata; 
begin 
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
  if frmMain.Width = 487 then 
  begin 
    frmMain.Width := 280; 
    frmMain.Timer1.Enabled := False; 
    frmMain.Timer2.Enabled := False; 
    frmMain.EnemyInit; 
    frmMain.Init; 
    frmMain.mnuStart.Enabled := True; 
    frmMain.mnuPause.Enabled := False; 
    frmMain.mnuCancel.Enabled := False; 
    showmessage(userdata.username + '已经退出了比赛'); 
  end; 
end; 
//开始游戏 
procedure Ttcpthread.startplay; 
var 
  userdata: Ruserdata; 
  ctext: Rcommandtext; 
begin 
  IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
  if frmMain.PlayerConnect(userdata) = True then 
  begin 
    frmMain.Width := 487; 
    frmMain.playerenemy := userdata; 
    frmMain.Timer1.Enabled := False; 
    frmMain.Timer2.Enabled := False; 
    frmMain.mnuStart.Enabled := True; 
    frmMain.mnuPause.Enabled := False; 
    frmMain.mnuCancel.Enabled := False; 
    frmMain.Init; 
    ctext.command := Cok; 
    IdTCPClient.WriteBuffer(ctext, sizeof(ctext)); 
    IdTCPClient.WriteBuffer(userdata, sizeof(userdata)); 
  end 
  else 
  begin 
    ctext.command := Crefuse; 
    IdTCPClient.WriteBuffer(ctext, sizeof(ctext)); 
    IdTCPClient.WriteBuffer(userdata, sizeof(userdata)); 
  end; 
 
end; 
 
procedure Ttcpthread.gamestart(var userdata: Ruserdata); 
begin 
  frmMain.playerenemy := userdata; 
  frmMain.Timer1.Enabled := False; 
  frmMain.Timer2.Enabled := False; 
  frmMain.mnuStart.Enabled := True; 
  frmMain.mnuPause.Enabled := False; 
  frmMain.mnuCancel.Enabled := False; 
  frmMain.Init; 
  frmMain.enemystart(userdata); 
end; 
 
procedure Ttcpthread.gamerefuse(var userdata: Ruserdata); 
begin 
  showmessage(userdata.username + ' had refused your request'); 
end; 
 
procedure Ttcpthread.Execute; 
var 
  ctext: Rcommandtext; 
  userdata: Ruserdata; 
begin 
  while not Terminated do 
  begin 
    IdTCPClient.ReadBuffer(ctext, sizeof(ctext)); 
    case ctext.command of 
      Caddonline: addonline; 
      Cdeleonline: deleonline; 
      Csendtext: getmes; 
      Cmodiuserstate: modiuserstate; 
      Cstart: begin 
          startplay; 
        end; 
      Cok: begin 
          IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
          gamestart(userdata); 
        end; 
      Crefuse: begin 
          IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
          gamerefuse(userdata); 
        end; 
      Cenemystart: begin 
          frmMain.enemyplay; 
        end; 
      Cdraw: begin 
          IdTCPClient.ReadBuffer(userdata, sizeof(userdata)); 
          frmMain.EFG := userdata.Rfg; 
          frmMain.EBG := userdata.Rbg; 
          frmMain.EnemyDraw; 
        end; 
      Cover: frmMain.win; 
      Clogout: logout; 
    end; //case 
  end; 
end; 
 
 
 
procedure Ttcpthread.setobject(tcpclient: TIdTCPClient; 
  listview: TListView; chatlist: TRichEdit); 
begin 
  self.IdTCPClient := tcpclient; 
  self.onlineview := listview; 
  self.chat := chatlist; 
  InitializeCriticalSection(CS); 
end; 
 
 
 
end.