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.