procedure TForm2.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if (listview1.Items.Count>0) and (listview1.SelCount>0)then
begin
sel_who:=listview1.Selected.Index;
caption:=inttostr(sel_who);
end;
end;procedure TForm2.startbtnClick(Sender: TObject);
begin
serversocket1.Active:=true;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器启动!');
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器昵称!'+label3.Caption);
end;procedure TForm2.stopbtnClick(Sender: TObject);
begin
serversocket1.Active:=false;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器关闭!');
end;procedure TForm2.namebtnClick(Sender: TObject);
var
tmpstr:string;
begin
tmpstr:=inputbox('昵称输入','请输入用户昵称:','');
if tmpstr<>''then
begin
label3.Caption:=tmpstr;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;
end;procedure TForm2.aboutbtnClick(Sender: TObject);
begin
showmessage('关于...');
//shellabout(handle,'yyd聊天工具',#13+'yyd聊天工具1。0版'+#13
//+'欢迎使用',0);
end;procedure TForm2.quitbtnClick(Sender: TObject);
begin
close;
end;procedure TForm2.N10Click(Sender: TObject);
begin
showmessage('帮助请见主页');
//shellexecute(handle,nil,'帮助.txt',nil ,
// nil,sw_normal);
end;procedure TForm2.N12Click(Sender: TObject);
begin
showmessage('关于...');
//shellabout(handle,'yyd聊天工具',#13+'yyd聊天工具1。0版'+#13
//+'欢迎使用!',0);
end;procedure TForm2.N9Click(Sender: TObject);
begin
showmessage('mailto:[email protected]');
//shellexecute(handle,nil,'mailto:[email protected]',nil,
//nil,sw_normal);
end;procedure TForm2.N8Click(Sender: TObject);
begin
showmessage('http//yyd3.com.cn');
//shellexecute(handle,nil,'http//yyd3.com.cn',nil,
//nil,sw_normal);
end;procedure TForm2.N6Click(Sender: TObject);
begin
serversocket1.Active:=true;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器启动:'+label3.Caption);
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;procedure TForm2.N5Click(Sender: TObject);
begin
serversocket1.Active:=false;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器关闭:'+label3.Caption);
end;procedure TForm2.N4Click(Sender: TObject);
var
tmpstr:string;
begin
tmpstr:=inputbox('昵称输入','请输入用户昵称:','');
if tmpstr<>''then
begin
label3.Caption:=tmpstr;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;
end;procedure TForm2.N2Click(Sender: TObject);
begin
close;
end;procedure TForm2.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
var
newitem:tlistitem;
ii,jj:integer;
user,usercur:string;
begin
newitem:=listview1.Items.Insert(listview1.Items.Count);
newitem.Caption:='client:'+inttostr(listview1.Items.Count);
newitem.SubItems.add(socket.RemoteHost);
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(inttostr(socket.RemotePort));
listview1.Items.Item[listview1.Items.Count-1].Selected:=true;
display('连接到主机:'+socket.RemoteAddress+'成功');
ii:=listview1.Itemindex;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'
+listview1.Items[ii].Caption+'加入进来');
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText('增加用户#!^'+
user+'^') ;
end;
end;procedure TForm2.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
ii,jj:integer;
user:string;
begin
for ii:=0 to listview1.Items.Count-1 do
begin
if listview1.Items.Item[ii].SubItems.Strings[2]=
inttostr(socket.RemotePort)then
begin
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText('删除用户#!^'
+user+'^') ;
end;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+listview1.Items[ii].Caption+'走了');;
listview1.Items.Item[ii].Delete();
display(socket.RemoteHost+'走了');
end;
end;
if listview1.Items.Count=0 then
begin
display('获取信息......');
end;end;procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmpstr,user:string;
ii,jj:integer;
listitem:tlistitem;
exist:bool;
begin
exist:=false;
tmpstr:=socket.ReceiveText;
if getstring(tmpstr,'^',1)='昵称@#!'then
begin
for jj:=0 to listview1.Items.Count-1 do
begin
user:=getstring(tmpstr,'^',2);
serversocket1.Socket.Connections[jj].SendText('交谈@#!^'+user+'^');
end;
richedit1.Lines.Add(getstring(tmpstr,'^',2));
end;
if getstring(tmpstr,'^',1)='昵称@#!'then
begin
for ii:=0 to listview1.Items.Count-1 do
begin
if socket.RemotePort=strtoint(listview1.Items[ii].SubItems[2])
then
begin
exist:=true;
if getstring(tmpstr,'^',2)<>listview1.Items[ii].Caption
then
begin
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+
'==>>'+listview1.Items[ii].Caption+'更名为'+
getstring(tmpstr,'^',2));
listview1.Items[ii].Caption:=getstring(tmpstr,'^',2);
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText(
'昵称@#!^'+user+'^') ;
end; end;
end;
end; end;
end;end.
Selected: Boolean);
begin
if (listview1.Items.Count>0) and (listview1.SelCount>0)then
begin
sel_who:=listview1.Selected.Index;
caption:=inttostr(sel_who);
end;
end;procedure TForm2.startbtnClick(Sender: TObject);
begin
serversocket1.Active:=true;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器启动!');
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器昵称!'+label3.Caption);
end;procedure TForm2.stopbtnClick(Sender: TObject);
begin
serversocket1.Active:=false;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'+
'yyd聊天服务器关闭!');
end;procedure TForm2.namebtnClick(Sender: TObject);
var
tmpstr:string;
begin
tmpstr:=inputbox('昵称输入','请输入用户昵称:','');
if tmpstr<>''then
begin
label3.Caption:=tmpstr;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;
end;procedure TForm2.aboutbtnClick(Sender: TObject);
begin
showmessage('关于...');
//shellabout(handle,'yyd聊天工具',#13+'yyd聊天工具1。0版'+#13
//+'欢迎使用',0);
end;procedure TForm2.quitbtnClick(Sender: TObject);
begin
close;
end;procedure TForm2.N10Click(Sender: TObject);
begin
showmessage('帮助请见主页');
//shellexecute(handle,nil,'帮助.txt',nil ,
// nil,sw_normal);
end;procedure TForm2.N12Click(Sender: TObject);
begin
showmessage('关于...');
//shellabout(handle,'yyd聊天工具',#13+'yyd聊天工具1。0版'+#13
//+'欢迎使用!',0);
end;procedure TForm2.N9Click(Sender: TObject);
begin
showmessage('mailto:[email protected]');
//shellexecute(handle,nil,'mailto:[email protected]',nil,
//nil,sw_normal);
end;procedure TForm2.N8Click(Sender: TObject);
begin
showmessage('http//yyd3.com.cn');
//shellexecute(handle,nil,'http//yyd3.com.cn',nil,
//nil,sw_normal);
end;procedure TForm2.N6Click(Sender: TObject);
begin
serversocket1.Active:=true;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器启动:'+label3.Caption);
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;procedure TForm2.N5Click(Sender: TObject);
begin
serversocket1.Active:=false;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器关闭:'+label3.Caption);
end;procedure TForm2.N4Click(Sender: TObject);
var
tmpstr:string;
begin
tmpstr:=inputbox('昵称输入','请输入用户昵称:','');
if tmpstr<>''then
begin
label3.Caption:=tmpstr;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+'yyd聊天服务器昵称:'+label3.Caption);
end;
end;procedure TForm2.N2Click(Sender: TObject);
begin
close;
end;procedure TForm2.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
var
newitem:tlistitem;
ii,jj:integer;
user,usercur:string;
begin
newitem:=listview1.Items.Insert(listview1.Items.Count);
newitem.Caption:='client:'+inttostr(listview1.Items.Count);
newitem.SubItems.add(socket.RemoteHost);
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(inttostr(socket.RemotePort));
listview1.Items.Item[listview1.Items.Count-1].Selected:=true;
display('连接到主机:'+socket.RemoteAddress+'成功');
ii:=listview1.Itemindex;
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+'==>>'
+listview1.Items[ii].Caption+'加入进来');
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText('增加用户#!^'+
user+'^') ;
end;
end;procedure TForm2.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
ii,jj:integer;
user:string;
begin
for ii:=0 to listview1.Items.Count-1 do
begin
if listview1.Items.Item[ii].SubItems.Strings[2]=
inttostr(socket.RemotePort)then
begin
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText('删除用户#!^'
+user+'^') ;
end;
richedit1.Lines.add(datetostr(date)+''+timetostr(time)+
'==>>'+listview1.Items[ii].Caption+'走了');;
listview1.Items.Item[ii].Delete();
display(socket.RemoteHost+'走了');
end;
end;
if listview1.Items.Count=0 then
begin
display('获取信息......');
end;end;procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tmpstr,user:string;
ii,jj:integer;
listitem:tlistitem;
exist:bool;
begin
exist:=false;
tmpstr:=socket.ReceiveText;
if getstring(tmpstr,'^',1)='昵称@#!'then
begin
for jj:=0 to listview1.Items.Count-1 do
begin
user:=getstring(tmpstr,'^',2);
serversocket1.Socket.Connections[jj].SendText('交谈@#!^'+user+'^');
end;
richedit1.Lines.Add(getstring(tmpstr,'^',2));
end;
if getstring(tmpstr,'^',1)='昵称@#!'then
begin
for ii:=0 to listview1.Items.Count-1 do
begin
if socket.RemotePort=strtoint(listview1.Items[ii].SubItems[2])
then
begin
exist:=true;
if getstring(tmpstr,'^',2)<>listview1.Items[ii].Caption
then
begin
richedit1.Lines.Add(datetostr(date)+''+timetostr(time)+
'==>>'+listview1.Items[ii].Caption+'更名为'+
getstring(tmpstr,'^',2));
listview1.Items[ii].Caption:=getstring(tmpstr,'^',2);
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText(
'昵称@#!^'+user+'^') ;
end; end;
end;
end; end;
end;end.
解决方案 »
- fastreport masterdata 里怎么能显示"勾"
- 散分了
- 把一个listbox多选的内容导入到另一个listbox中的问题
- 在websnap技术中,我用LoginFormAdapter1.NextPage转到另一个网页的同时以新的IE浏览器窗口打开,最好不用脚本语言,该如何制作呢?
- 高级的模糊查找功能的实现!!!!!!!
- delphi初学者的超级简单问题!来者有分!!!!!!!!!!!!!!!!!!
- 在delphi6中怎样安装fastreport呢?
- 為什么????
- 最近比较烦
- 问大家一个关于网格控件的问题
- 请教在Delphi中使用ShellExecute运行另一个.EXE文件时如何不使程序继续执行,只有当执行的程序运行完成后才继续执行下面的语句?...
- 如何查询2个表的数据---Sql语句的问题
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
//for jj:=0 to listview1.Items.Count-1 do //改成下面的count-2
for jj:=0 to listview1.Items.Count-2 do begin
serversocket1.Socket.Connections[jj].SendText('增加用户#!^'+
user+'^') ;
end;
Socket: TCustomWinSocket);
begin
statusbar1.Panels.Items[0].Text:='连接成功!';//这一句
end;你的statusbar1没有添加任何的StatusPanel,也就是说状态栏中没有分栏,因此:procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//statusbar1.Panels.Items[0].Text:='连接成功!';//这一句改为下面这一句:
statusbar1.SimpleText:='连接成功!';
end;
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
...
serversocket1.Socket.Connections[jj].SendText('增加用户#!^'+
user+'^') ;
end;注意通讯头为: 增加用户#!^2.客户端unit2.pas的事件中
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);begin
...
if getstring(tmpstr,'^',1)='增加用户@#!'then
...
end;接收的通讯头却是: 增加用户@#!
增加用户#!^ 与 增加用户@#! 比较当然是不相等的所以客户端改成if getstring(tmpstr,'^',1)='增加用户#!'then即可
多次调用了getstring这个函数,每一个if语句都调用了次,这是没有效率的.应该用个临时变量来代替这样var
...
commHead:string
...
begin
...
tmpstr:=socket.ReceiveText;
commHead := getstring(tmpstr,'^',1); if commHead ='昵称@#!'then
...
if commHead='交谈@#!'then
...
if commHead='增加用户#!'then
...
if commHead='删除用户@#!'then
检查一下,是否你没有重新编译呀;另外测试了一下你的程序,发现情况
1.服务端运行;
2.客户1进入聊天室,即可在右近的listview中看到自己的信息;到这时,程序算是正确的;
3.客户2进入聊天室时,就会通知客户1,然后客户1的listview中会显示客户2进来,//这也是正确的; 同时客户2的listview用户用户列表中,也显示了自己的信息;
但是呢,服务器并没有把客户1的信息,通知给客户2; 客户2的列表中只有自己的信息; 也就是说,后进入聊天室的人,不知道先进入聊室的用户列表;看了一下你的代码,问题出在服务器端的事件:
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);将
for jj:=0 to listview1.Items.Count-1 do
begin
user:=listview1.Items[ii].Caption+'^'+
listview1.Items[ii].SubItems[0]+'^'
+listview1.Items[ii].SubItems[1]+'^'
+listview1.Items[ii].SubItems[2];
serversocket1.Socket.Connections[jj].SendText('增加用户@#!^'+
user+'^') ;
end;这个for循环,改为如下即可 //这个字符串相加,从下面的for循环中独立出来,不必每循环一次就加一次
user := listview1.Items[ii].Caption + '^' +
listview1.Items[ii].SubItems[0] + '^'
+ listview1.Items[ii].SubItems[1] + '^'
+ listview1.Items[ii].SubItems[2];
//通知所有聊天的人,有新的人进来
for jj := 0 to listview1.Items.Count - 1 do
begin
serversocket1.Socket.Connections[jj].SendText('增加用户@#!^' +
user + '^');
end; exit; //把已经在线的用户列表,通知给刚加入的用户
for jj := 0 to listview1.Items.Count - 2 do
begin
user := listview1.Items[jj].Caption + '^' +
listview1.Items[jj].SubItems[0] + '^'
+ listview1.Items[jj].SubItems[1] + '^'
+ listview1.Items[jj].SubItems[2]; serversocket1.Socket.Connections[ii].SendText('增加用户@#!^' +
user + '^');
end;
需要再加一个for语句,将所以已经在线的用户,通知给刚刚进来的新用户;
按照上贴中写的两个for循环,替换掉原来的那个for循环即可
就是上两楼的exit;这个语句 //这个字符串相加,从下面的for循环中独立出来,不必每循环一次就加一次
user := listview1.Items[ii].Caption + '^' +
listview1.Items[ii].SubItems[0] + '^'
+ listview1.Items[ii].SubItems[1] + '^'
+ listview1.Items[ii].SubItems[2];
//通知所有聊天的人,有新的人进来
for jj := 0 to listview1.Items.Count - 1 do
begin
serversocket1.Socket.Connections[jj].SendText('增加用户@#!^' +
user + '^');
end; //exit; 注释删除这个exit语句,否则下面的这个for循环就不执行了,也就和原来一样, //把已经在线的用户列表,通知给刚加入的用户
for jj := 0 to listview1.Items.Count - 2 do
begin
user := listview1.Items[jj].Caption + '^' +
listview1.Items[jj].SubItems[0] + '^'
+ listview1.Items[jj].SubItems[1] + '^'
+ listview1.Items[jj].SubItems[2]; serversocket1.Socket.Connections[ii].SendText('增加用户@#!^' +
user + '^');
end;
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=vk_return)and(combobox1.Text<>'')then
begin
combobox1.Items.Add(combobox1.Text);
serversocket1.Socket.Connections[sel_who].SendText('交谈@#!^'+
label3.Caption+'说:'+combobox1.Text+'^'); //这里只发送给出一个客户端而已
//sel_who就是在右边选择一个客户端的数
richedit1.Lines.Add(label3.Caption+'说:'+combobox1.Text);
combobox1.Text:='';
end;
end;如果服务器说的话,要所有客户端都看得到,这个写一个for循环;上面的代码,改成这样
procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
jj:integer;
ss:string;
begin
if (key=vk_return)and(combobox1.Text<>'')then
begin
combobox1.Items.Add(combobox1.Text);
ss := '交谈@#!^'+ label3.Caption+'说:'+combobox1.Text+'^'
for jj := 0 to listview1.Items.Count - 1 do
begin
serversocket1.Socket.Connections[jj].SendText(ss);//给所有客户端发送消息
end;
richedit1.Lines.Add(label3.Caption+'说:'+combobox1.Text);
combobox1.Text:='';
end;
end;
1.[Error] Unit1.pas(130): Missing operator or semicolon
2.[Error] Unit1.pas(133): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'
3.[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
其中1。对应for jj := 0 to listview1.Items.Count-1 do
2对应本段代码第一个end;
最后丢了[;],现在已经解决了[服务器说话,只能最后一个客户端可以看见:如一共客户1,2,3,只能3收到 ]但是为什么又出现[多个客户端时只能只能前面先连的看后面的端口等信息,反之不成立,]的问题了,我发给你的最新程序就是这问题[当然‘;’我还没加上去]