📄 tcpthreadpas.pas
字号:
unit TCPthreadpas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, RxRichEd, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient,myconst, mytype,fiveformpas,
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
fiveform1:Tfiveform;
user:Ruserdata;
online:array of Ruserdata;
procedure startplay;
procedure setobject(tcpclient:Tidtcpclient;listview:Tlistview;chatlist:Trichedit);
end;
implementation
{ 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(inttostr(userdata.fivejifeng));
subitems.Add(inttostr(userdata.fivewin));
subitems.Add(inttostr(userdata.fivelose));
subitems.Add(inttostr(userdata.fiveescape));
subitems.Add(inttostr(userdata.fivetotal));
end;
LeaveCriticalsection(CS);
end;
procedure Ttcpthread.deleonline;
var
i:integer;
userdata:Ruserdata;
begin
idtcpclient.ReadBuffer(userdata,sizeof(userdata));
EnterCriticalSection(CS);
for i:=0 to 1 do
begin
//删除online的节点。
if online[i].username=userdata.username then
begin
online[i]:=online[high(online)];
setlength(online,high(online));
end;
if onlineview.Items.Item[i].caption=userdata.username then
onlineview.Items.item[i].Delete;
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]:=inttostr(userdata.fivejifeng);
onlineview.Items.Item[i].SubItems.Strings[1]:=inttostr(userdata.fivewin);
onlineview.Items.Item[i].SubItems.Strings[2]:=inttostr(userdata.fiveescape);
onlineview.Items.Item[i].SubItems.Strings[3]:=inttostr(userdata.fivetotal);
end;
end;
LeaveCriticalSection(CS);
end;
//开始游戏
procedure Ttcpthread.startplay;
var
userdata:Ruserdata;
begin
idtcpclient.ReadBuffer(userdata,sizeof(userdata));
fiveform1.playerenemy:=userdata;
fiveform1.qitype:='黑';
fiveform1.Show;
end;
procedure Ttcpthread.Execute;
var
ctext:Rcommandtext;
userdata:Ruserdata;
mestext:Rtextdata;
begin
while not Terminated do
begin
idtcpclient.ReadBuffer(ctext,sizeof(ctext));
case ctext.command of
Caddonline:addonline;
Cdeleonline:deleonline;
Csendtext:getmes;
Cmodiuserstate:modiuserstate;
Cstart:startplay;
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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -