自定义信息提示窗口
多数时候,我们会用PopMessage进行信息提示。
但是PopMessage没有提供按钮,在一些需要交互操作的场合是无法满足要求的。
不过Foxtable 2016新增了一个窗口类型PopupForm,PopupForm同样以弹窗形式,在屏幕右下角显示。
我们可以设计一个PopupForm类型的窗口,代替PopMessage进行消息提示,这样就能满足上述要求了。
本节内容需要实现下述任务:
送货单由用户张三开单,由李四审核。
当张三开送货单保存时,系统自动发给李四发一个消息:“张三已新增送货单20151028001,请审核”。
李四收到此消息后,点此消息,打开这张送货单,进行审核,审核后,反馈回张三消息:“送货单20151028001已由用户李四审”
下图就是我们要设计的提示窗口:
李四收到信息之后,单击提示窗口的查看按钮,即可加载(或刷新)并定位到此送货单,并自动打开送货单编辑窗口,查看该送货单信息并审核。
本节内容使用OpenQQ发送和接收信息,关于OpenQQ服务端和客户端的设计,前面的章节已经有详细介绍,这里就不重复。
以下的设计全部在客户端项目完成。
设计步骤
1、首先我们要定义一个集合,用于存储收到的审核申请,在全局代码中定义一个Public变量:
Public fhs As New List(of String)
因为存在一种可能,就是张三连续开了多个送货单,李四因故没有即时审核,所以我们应该将收到的审核申请存储在集合fhs中,逐个提醒李四。
2、现在我们要约定一个消息格式,审核申请的格式为"+@|主键|送货单号|制单人",审核完成的格式为"-@|送货单号|审核人"。
3、在发货单编辑窗口的保存按钮中,写入如下代码:
Dim
r As
Row = Tables("送货单").Current
r.Save()
QQClient.Send("李四","+@|"
& r("_Identify")
& "|"
& r("单号")
& "|"
& User.Name)
4、在发货单编辑窗口的审核按钮中,写入如下代码:
Dim
r As
Row = Tables("送货单").Current
r("审核")
= True
r.Save()
'发送审核通过的消息
QQClient.Send("张三","-@|"
& r("单
号")
& "|"
& User.Name)
5、在OpenQQ客户端的MessageReceived事件中编写代码:
Dim
pts() As
String = e.Message.Split("|")
If
pts.Length =
4 AndAlso
pts(0) =
"+@"
'如果是申请审核消息
fhs.Add(pts(1)
& "|"
& pts(2)
& "|"
& pts(3))
'将主健、单号和制单人
合成为一个字符串存储在集合中
ElseIf
pts.Length =
3 AndAlso
pts(0) =
"-@"
'如果是审核通过消息
PopMessage("送货单"
& pts(1)
&
"已由"
& pts(2)
&
"审核通过!")
Dim dr
As DataRow =
DataTables("送货单").Find("单号
= '"
& pts(1)
& "'")
If dr
IsNot Nothing
Then
dr.Load
End
If
End
If
6、在客户端项目新建一个下图所示的窗口,窗口名为“审核提示”,窗口类型设置为PopupForm:
这个窗口有两个Label控件,Label1用于显示提示信息,Label2的可见属性设置为False,用于存储发货单的主键(Identify)。
这是一个技巧,因为Foxtable并没有提供窗口级别的变量,所以通常用一些不可见的Label控件来存储临时信息。
将查看按钮的代码设置为:
DataTables("送货单").Save()
'接下来要根据主键查找,必须先保存,因为只有保存后新增行的主键才是有效值。
Dim
id As
String = e.Form.Controls("Label2").Text
Dim
dr As
DataRow = DataTables("送货单").Find("[_Identify]
= " & id)
If
dr Is
Nothing Then
DataTables("送货单").AppendLoad("[_Identify]
= " & id)
dr = DataTables("送货单").Find("[_Identify]
= " & id)
Else
dr.Load()
End
If
If
dr IsNot
Nothing Then
Dim wz
As Integer =
Tables("送货单").FindRow(dr)
If wz <
0 Then
'如果因为筛选导致此送货单不可见
Tables("送货单").Filter
= ""
wz =Tables("送货单").FindRow(dr)
End
If
If wz
>= 0 Then
Tables("送货单").Position
= wz
Forms("发货单").Open()
End
If
End
If
e.Form.Close()
上面的代码不难理解,需要注意的是,为什么必须首先保存一下送货单表呢?
实际上如果李四只有审核送货单的权限,没有增加送货单的权限,那么第一行保存表的代码是可以省略的,这又是为什么呢?
假定送货单表原来有10行(主键值0-9),张三和李四都可以增加送货单,两人分别增加1个订货单,主键值都是10。
张三保存后,李四收到通知,如果李四不保存,直接用AppendLoad追载主键为10的行,由于表中已经有一个主键为10的行,所以会出现错误提示。
如果李四先保存,其新增行的主键会在保存后变为11,此时就可以正常根据通知信息追载主键为10的行了。
7、在项目事件SystemIdle中加入代码:
If
fhs.Count >
0 AndAlso
Forms("审核申请").Opened
= False Then
Dim pts()
As String =
fhs(0).Split("|")
fhs.RemoveAt(0)
With Forms("审核申请")
.Open()
.Controls("Label1").Text
= pts(2)
& "新增订货单"
& pts(1)
& ",请审核!"
.Controls("Label2").Text
= pts(0)
'将发货单主健设置为Label2的标题
End
With
End
If
上述代码在系统空闲的时间检查fhs集合,判断是否有新的审核申请;如果有新的申请且审核申请提示窗口未显示,则显示集合中的第一个审核申请,并将其从集合中移除。
上述代码将待审核送货单的主键设置为Label2的标题,这样在审核申请窗口单击查看按钮时,可以根据Label2的标题找出待审核的订单。