[原创]使用pb的dw实现在线聊天
<P>[attach]21621[/attach]<BR><BR><BR>首先是设计数据库,我使用的是sqlserver。</P><P>表名chat//存放聊天记录<BR>字段分别有<BR>id//自动编号<BR>shuo//发言人<BR>ting//接收人<BR>chatmessage//为消息内容<BR><BR>[attach]21624[/attach]<BR><BR>表名users//存放用户数据,在我的库中有很多字段,只介绍有用的字段<BR>username//用户名<BR>userpass//用户密码<BR>truename//用户的真实姓名<BR>online//判断用户是否在线1为在线,0为离线。<BR>好了,数据库搞好了。<BR>下面就要打开PB搞东西了。。。。<BR>在PB中新建一个grid的datawindow,选择chat数据表中的id、shuo、ting、message这几个表<BR>调整好各表的宽窄,然后在rows菜单中的update proper.... 中的allow updates的钩选中,tabuptate下拉框中选chat表,然后将下面两个框中的所有字段都选中。<BR><BR>[attach]21622[/attach]<BR><BR>[attach]21623[/attach]<BR><BR>再在rows菜单中的shot...,在soucre data中将id拖至右面的columns中,将后面的钩取掉,设置数据为倒序排序。这样,最新的消息内容在最前面。然后确定退出,并保存为d_chat。<BR>再新建一个为grid的datawindow,选择users数据表中的username、truename、online这三个字段,然后在条件选择where中选择users.online = 1,保存为d_chat_online<BR>在PB中设计一个登录窗口w_login,我想这个大家应该都会(如果不会的话可以给我留言,我发源码给你)主要是不能直接用open事件打开聊天w_chat窗口,要用openwithparm(w_chat,username)<BR>再新建一个稍微大一点的窗口w_chate,以下是w_chate的控件清单<BR>两个dw控件,分别是dw_1、dw_2(dw_2缩的小些),dw_1存放聊天内容,dw_2存放在线用户。<BR>一个下拉框ddlb_user,用来选择在线用户的。<BR>一个文本输入框sle_message,用来写发言内容的。<BR>三个按钮控件cb_1,text的属性为‘发送’,用来确定发送消息。cb_2用来暂停数据更新,cb_3用来回复数据更新。<BR>所有使用到的控件都在这里了,至于怎么摆放随便自己喽,发挥想象力DIY一下。<BR>下面开始往窗口内写代码喽!!!<BR>在w_chat窗口的open事件里写<BR>title=message.stringparm+'使用的在线消息'//定义窗口标题栏的,其中message.stringparm是从w_login窗口传来的数据<BR>cb_3.enabled=false//设定cb_3为不可操作属性<BR>dw_1.dataobject='d_chat'//设置dw_1的dataobject为d_chat<BR>dw_2.dataobject='d_chat_online'//dw_2的dataobject为d_chat_online<BR>dw_2.visible=false//设置dw_2为不可见属性,也就是程序运行后用户是看不到的。<BR>timer(0.5)//设定计时器,以秒为单位,这里设定dw_1的刷新时间。可以设置的更大或更小。<BR>在w_chat窗口的timer事件里写<BR>connect using sqlca;<BR>dw_1.settransobject(sqlca)<BR>dw_1.retrieve()<BR>//这里主要是读取数据内容,也就是每隔0.5秒读取一次数据<BR>双击w_chat窗口中的ddlb_user下拉框,并在getfocus事件里写<BR>dw_2.settransobject(sqlca)<BR>dw_2.retrieve()<BR>int i<BR>for i = 1 to dw_2.rowcount() <BR>ddlb_user.additem(dw_2.object.username【i】) //有些地方不支持英文的方括号,使用时注意将中文的方括号替换为英文的方括号。<BR>next<BR>//这里设定当你点击下拉框的时候读取在线用户。并添加到下拉框中。<BR>在cb_1的clicked事件中写<BR>insert into chat(chat.shuo,chat.ting,chat.chatmessage)<BR>values (:message.stringparm,:ddlb_user.text,:sle_message.text);<BR>dw_1.update()<BR>dw_1.retrieve()<BR>sle_message.text=''<BR>commit;//这个commit一定要有,不然同时使用的其他用户是没办法得到消息数据的。<BR>在cb_2的clicked事件中写<BR>timer(0)//停止计时器<BR>cb_2.enabled=false<BR>cb_3.enabled=true<BR>在cb_3的clicked事件中写<BR>timer(0.5)//恢复计时器<BR>cb_2.enabled=true<BR>cb_3.enabled=false<BR>好了,至此,一个利用dw简单的聊天程序就成功写完了,大家可以测试一下。<BR>注:如果只想让当前用户看到关于自己的对话内容,可以在d_chat中增加条件选项,以达到屏蔽其他用户聊天内容。<BR>而且还可以设置管理员身份,以使其看到所有的聊天内容<BR>在这里就不过多阐述。<BR>再有就是,本人也是刚刚学pb没几天,在程序编写中有不当的地方,请大家指正。<BR>谢谢!!!!<BR>本帖直接转自我的blog。street_boy.blog.xunlei.com<BR></P>
页:
[1]
