用户间通讯

提示:本节的内容已经过时,大家可以直接使用Foxtable内置的OpenQQ实现用户间的即时通讯功能。

在学习以下内容之前,可以先打开CaseStudy目录下的文件:用户通讯.Table
请启动两个Foxtable打开此文件,分别用张三和李四登录,互相发送信息,5秒钟之后对方即可收到,具体时间可以自行调整,但不宜过短,因为时间间隔越短,服务器负载就越大,用户多的时候尤甚 。

设计步骤:

1、首先通过代码或者设置,使得信息表在初始状态不加载任何数据。

如果是内部表,设置BeforeLoadInnerTable事件为:

If e.DataTableName = "信息表" Then
   
e.Filter = "[_Identify] Is Null"
End If

如果是外部表,可以在定义外部表的时候,直接定义加载条件:

3、然后在项目事件LoadUserSetting事件中设置代码,只加载登录用户发送或接受的信息:

Dim Filter As String
Select
Case User.Name
   
Case "张三","李四", "王五"
        Filter =
"接收者 = '" & User.Name & "' Or 发送者 = '" & User.Name & "'"
    Case Else
        Filter = ""
'其他用户记载所有行
End
Select
DataTables
("信息表").LoadFilter = Filter
DataTables
("信息表"
).Load()
Dim
drs As List(of DataRow) = DataTables("信息表").Select("接收者 = '" & User.Name & "' And 接收时间 Is Null")
If
drs.Count > 0 Then
    For Each dr As DataRow In drs
        dr(
"接收时间") = Date.Now
    Next
   
DataTables("信息表").Save()
End If

上面的代码只针对张三、李四、王五进行了设置,所以如果是其他用户登录,如开发者或管理员,将加载所有行。

4、在PrepareEdit事件中设置代码,禁止用户直接编辑信息表:

e.Cancel = True

5、新建一个下图所示的窗口:

发送按钮的代码为:

Dim re As String = e.Form.Controls("ComboBox1").Value '获得接收用户名
Dim
cn As String = e.Form.Controls("TextBox1").Text '获得发送内容
If
re = "" OrElse cn = "" Then
    Return
End
If
If
re = User.Name Then
    MessageBox.Show(
"不能给自己发信息!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Return
End
If
Dim
r As Row = Tables("信息表").AddNew()
r(
"发送者") = User.Name
r(
"发送时间") = Date.Now
r(
"接收者") = re
r(
"内容") = cn
r
.Save()

6、新建一个计划,计划的执行间隔为5秒(即5000毫秒),代码为:

Dim flt As String
Dim
drs As List(Of DataRow)
flt =
"接收者 = '" & User.Name & "' And 接收时间 Is Null"
drs =
DataTables("信息表").AppendLoad(flt, False)
For
Each dr As DataRow In drs
    dr(
"接收时间") = Date.Now()
    dr.Save()

Next

实际应用的时候,只要不影响工作时效,时间间隔应该尽可能长一些,以免用户较多的时候,服务器负载过重,毕竟我们设计的不是一个类似QQ的即时通讯系统,大多数时候只是用于内部通知的发送而已 。


本页地址:http://www.foxtable.com/webhelp/topics/2265.htm