玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
多媒体评审系统的设计与实现
来源:━━━━《电脑编程技巧与维护》2005第2期作者:刘中甫网址:http://www.jh-lzf.com浏览数:11

多媒体评审系统的设计与实现

摘  要:本文介绍了多媒体评审系统的程序设计方法,并给出了程序代码及说明。

关键词:评审项目  评委  统计  排序 语音报分

一个产品、一项科研成果都要经过一定级别的评审鉴定才能推广应用。传统的评审鉴定采用人工计时报时及手工统计排序方式,不仅计时报时准确性差,而且统计排序速度慢易出错。应用计算机定时报时并统计排序,克服了传统评审方式落后、透明度不高等诸多缺点,使评审更具有公正性、透明性、准确性及权威性。

一、系统总体结构

多媒体评审系统包括定时报时子系统、统计排序子系统及评委自测子系统,其系统总体结构如下图所示。

其中评审项目数据库为评审的结果数据库,包括“评审项目”表、“评审形式”表、“评委评分”表和“评委姓名”表。“评审形式”表存储评审会的主题,如XX论文发布会、XX学术交流会、XX歌咏演唱会等;“评委评分”表存储评委对所有项目的评分;“评委姓名”表存储评委的姓名,用于切换评委;“评审项目”表存储项目名称、发布者、初审分等统计结果数据。

二、系统设计环境

限于篇幅,本文仅讨论统计排序子系统的程序设计方法。统计排序子系统将参加项目评审的专家组给出的一组评分数据进行统计,并将评审的结果进行语音报分、打印输出、实时排序等,同时将评审的结果数据存入评审项目数据库。

本系统在VB6+Spk3+Win98环境下调试通过。在VB系统\工程\部件中选择Microsoft Multimedia Control 6.0、Microsoft FlexGrid Control 6.0、Microsoft Common Dialog Control 6.0;在VB系统\工程\引用中选择Microsoft DAO3.51 Object Library,并在公共模块中定义如下变量:

Public FileName As String    '用户选择的数据库名

Public PS_Form As String     '评审形式变量

Public RecNnm As Integer     '评审项目表记录总数

Public RecNOi As Integer     '评审项目表当前记录号

Public RecNOj As Integer     '评审项目表先前记录号

Public PS_db As Database     '评审数据库

Public PS_froms As Recordset '评审形式表

Public PS_Item As Recordset  '评审项目表

Public PS_Score As Recordset '评委评分表

Public PS_name As Recordset  '评委姓名表

Public EditName As Boolean   '编辑评委姓名

Public SQL As String         'SQL命令串

Public Max As Single         '最高分

Public Min As Single         '最低分

Public Avg As Single         '平均分

Public Add As Single         '附加分

Public Fri As Single         '初审分

Public Sum As Single         '最终分

Public Men As Single         '有效评委数

Public Maxi As Integer       '最高分的评委号

Public Mini As Integer       '最低分的评委号

Public Ctrl_I As Integer     '输入评委姓名标志:点击"切换评委"时是否同时按了Ctrl键

Public Ctrl_N As Integer     '数据统计不去最大最小值标志:点击"数据统计"时是否同时按了Ctrl键

Public Ctrl_S As Integer     '语音报分标志:点击"打印报分"时是否同时按了Ctrl键

Public Mode As Integer       '排序方式(1:升序,2:降序)

Public dirs As String        '记录本系统的安装路径

Public ID_Same As Boolean    '关联评委评分表与评审项目中的项目ID、

Public Score(15) As String   '保存输入修改评委姓名前评分框中的数据

三、程序窗体设计

1、数据处理主窗体

本子系统有三个窗体:数据处理窗体(Counting)、初始设置窗体(Evaluate)、结果排序窗体(Sorts)。其中,数据处理窗体为本子系统的主窗体,如下图所示。

其上主要有如下控件:

Item:用于选择或输入项目名称的下拉列表控件。

Issue:用于选择或输入发布者的下拉列表控件。

Label1:用于显示评审形式。

Label15(0)~Label15(15) 用于显示评委姓名或评委编号。

Text9 (0)~Text9 (15) 显示或输入评委评分、显示或输入评委姓名。

Text1用于显示数据库名/当前记录号/记录总数。

Text3~Text8 用于显示评审结果:去掉的最高分、去掉的最低分、计算的平均分、前次初审分、项目附加分、项目最终得分。

MMControl1:多媒体控件,用于语音报分。

Command1~Command8:分别为初始设置、打印报分、插入项目、删除项目、数据统计、结果排序、退出系统及切换评委等命令键。

Command9:此命令键不可见。若点击切换评委键时同时按了Ctrl键,则显示此键;在评分框中输入或修改评委姓名后,点击此键存储评委姓名并隐藏此键。此后可用“切换评委”键切换评委编号与姓名。

2、初始设置窗体

初始设置窗体如图所示。其上主要有如下控件:

CommonDialog1:对话框控件,用于弹出数据库文件选择框。

Text1:评审形式输入框。

Text2:评审结果文件名(即新的评审项目数据库)输入框。

Option1:打开已存在的评审项目数据库单项选择按钮。

Option2:建立以下新的评审项目数据库单项选择按钮。

Command1:确认键;Command2:取消键。

3、结果排序窗体

结果排序窗体如图所示。其上主要有如下控件:

Data1:数据库控件,数据源关联到评委项目数据库。

MSFlexGrid1:数据表控件(10行10列、固定1行、固定1列),且数据源关联到Data1。

Command2:返回键。

四、程序设计代码

1、数据处理代码

Private Sub Item_Click()           'Item项目名称

   RecNOi = Item.ListIndex        '表中的当前记录号

   If RecNOi < 0 Then RecNOi = 0

   Issue = Issue.List(RecNOi)     '改变项目名称时,相应改变发布者

   ResultDisplay                  '显示评审结果

   Max_Min                        '求最大值及最小值

End Sub

Private Sub Issue_Click()          'Issue发布者

   RecNOi = Issue.ListIndex       '表中的当前记录号

   If RecNOi < 0 Then RecNOi = 0

   Item = Item.List(RecNOi)       '改变发布者时,相应改变项目名称

   ResultDisplay                  '显示评审结果

   Max_Min                        '求最大值及最小值

End Sub

Public Sub Combo_init()

   Item.Clear

   Issue.Clear

   RecNnm = PS_Item.RecordCount   '获取表中的记录数

   Text1 = "【" + FileName + "】" + Str(RecNOi + 1) + "/" + Str(RecNnm)

   If RecNnm = 0 Then Text1 = "【" + FileName + "】0/0"

   Text3 = "": Text4 = "": Text5 = "": Text6 = "": Text7 = "": Text8 = ""

   For i = 0 To 15

       Text9(i) = ""

       Text9(i).BackColor = &HFFFFFF  '白底色

   Next

   If RecNnm = 0 Then Exit Sub

   PS_Item.MoveFirst

   Do While Not PS_Item.EOF

      Item.AddItem PS_Item.Fields("项目名称")   '向下拉列表框添加评审项目

      Issue.AddItem PS_Item.Fields("发布者")    '向下拉列表框添加发布者

      PS_Item.MoveNext

   Loop

   PS_Item.MoveFirst

   Item_Click                     '更新项目名称

   Issue_Click                    '更新发布者

End Sub

Private Sub ResultDisplay()        '显示结果

   If PS_Item.RecordCount = 0 Then Exit Sub

   Text1 = "【" + FileName + "】" + Str(RecNOi + 1) + "/" + Str(RecNnm)

   PS_Item.MoveFirst

   PS_Item.Move RecNOi

   Text3.FontSize = 16: Text4.FontSize = 16

   If PS_Item.Fields("最高分") <> "" Then Text3 = PS_Item.Fields("最高分")

   If PS_Item.Fields("最低分") <> "" Then Text4 = PS_Item.Fields("最低分")

   If PS_Item.Fields("平均分") <> "" Then Text5 = PS_Item.Fields("平均分")

   If PS_Item.Fields("初审分") <> "" Then Text6 = PS_Item.Fields("初审分")

   If PS_Item.Fields("附加分") <> "" Then Text7 = PS_Item.Fields("附加分")

   If PS_Item.Fields("最终分") <> "" Then Text8 = PS_Item.Fields("最终分")

   If PS_Item.Fields("去高低") <> "去高低" Then

      Text3.FontSize = 11: Text4.FontSize = 11

      Text3 = "未去最高分": Text4 = "未去最低分"

   End If

   If PS_Score.RecordCount <> 0 Then    '以下显示评分数据

      PS_Score.MoveFirst

      Do While Not PS_Score.EOF         '显示评委评分表中的评委评分

         If PS_Score.Fields("项目ID") = PS_Item.Fields("项目ID") Then

            For i = 0 To 15

                If Not IsNull(PS_Score.Fields("评委" + Format(i + 1, "00"))) Then

                   Text9(i) = PS_Score.Fields("评委" + Format(i + 1, "00"))

                   If Text9(i) = "0" Then Text9(i) = ""

                End If

            Next

         End If

         PS_Score.MoveNext

      Loop

   End If

End Sub

Private Sub Sounds()                             '播放语音波形文件

   Dim Bits As Integer                          '数据位数(含负号及小数点)

   Dim WavFile As String                        '语音波形文件

   If Len(Text8) = 0 Then Exit Sub

   For k = 3 To 8

       Select Case k

         Case 3

              Text = Text3: WavFile = dirs + "\max.wav"   '去掉一个最高分

         Case 4

              Text = Text4: WavFile = dirs + "\min.wav"    '去掉一个最低分

         Case 5

              Text = Text5: WavFile = dirs + "\avg.wav"    '本次计算平均分

         Case 6

              Text = Text6: WavFile = dirs + "\fri.wav"    '加上前次初审分

         Case 7

              Text = Text7: WavFile = dirs + "\add.wav"    '加上项目附加分

         Case 8

              Text = Text8: WavFile = dirs + "\sum.wav"    '本项目最终得分

       End Select

       If Text <> "未去最高分" And Text <> "未去最低分" Then

          Sound WavFile                                    '读标签文字

          If Val(Text) < 0 Then                            '负数发“负”音

             Text = Abs(Val(Text))

             Sound dirs + "\minus.wav"                     '发“负”音

          End If

          If Abs(Val(Text)) < 1 And Val(Text) <> 0 Then Text = "0" & Text

          bit = Len(Int(Str(Text)))               '整数位数

          Bits = Len(Text)                        '数据位数

          For i = 1 To Bits

              If i <= bit Then                    '报整数部分

                 GetWav Mid(Text, i, 1), SoundFile

                 Select Case bit                  '分析整数位数中0的情况

                   Case 1

                        Sound SoundFile

                   Case 2                         '分析10、11二种形式

                        If Mid(Text, i, 1) <> 1 Then Sound SoundFile

                        Ands bit - i

                        GetWav Mid(Text, i + 1, 1), SoundFile

                        If Mid(Text, i + 1, 1) <> 0 Then Sound SoundFile

                        i = i + 1

                   Case 3                         '分析100、101、110、111四种形式

                        Sound SoundFile

                        Ands bit - i

                        If Mid(Text, i + 1, 1) <> 0 And Mid(Text, i + 2, 1) <> 0 Then

                           GetWav Mid(Text, i + 1, 1), SoundFile

                           Sound SoundFile

                           Ands bit - i - 1

                           GetWav Mid(Text, i + 2, 1), SoundFile

                           Sound SoundFile

                        Else

                           If Mid(Text, i + 1, 1) = 0 And Mid(Text, i + 2, 1) <> 0 Then

                              GetWav Mid(Text, i + 1, 1), SoundFile

                              Sound SoundFile

                              GetWav Mid(Text, i + 2, 1), SoundFile

                              Sound SoundFile

                           End If

                           If Mid(Text, i + 1, 1) <> 0 And Mid(Text, i + 2, 1) = 0 Then

                              GetWav Mid(Text, i + 1, 1), SoundFile

                              Sound SoundFile

                              Ands bit - i - 1

                           End If

                        End If

                        i = i + 2

                   Case 4, 5, 6

                        GetWav Mid(Text, 1), SoundFile

                        Sound SoundFile

                 End Select

              Else                         '报小数部分

                 GetWav Mid(Text, i, 1), SoundFile

                 Sound SoundFile

              End If

          Next

          Sound dirs + "\scope.wav"        '

       End If

   Next

End Sub

Private Sub GetWav(N, SoundFile)            '根据N值,发相应语音文件

   Select Case N

     Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9     '数字语音文件

          SoundFile = dirs + "\" + Trim(N) + ".wav"

     Case "."

          SoundFile = dirs + "\point.wav"  '语音文件""

     Case "-"

          SoundFile = dirs + "\minus.wav"  '语音文件""

     Case "分"

          SoundFile = dirs + "\scope.wav"  '语音文件""

   End Select

End Sub

Private Sub Sound(wav_x)                    '语音报分

   Dim t As Integer

   MMControl1.Command = "Close"           '关闭声音控制系统,相当于初始化

   MMControl1.Notify = True

   MMControl1.Wait = True

   MMControl1.Shareable = False

   MMControl1.DeviceType = "WaveAudio"

   MMControl1.FileName = wav_x

   MMControl1.Command = "Open"

   MMControl1.Command = "play"

   t = MMControl1.Length

   delay t

End Sub

Private Sub delay(t As Integer)        '延时

   delay_start = Timer

   Do Until delay_end - delay_start >= t / 960  '1=1000毫秒,但为了延时足够用960

      delay_end = Timer

   Loop

End Sub

Private Sub Ands(bit)                  '在数字之间加发拾百千万等音,bit为第几位整数-1

   Select Case bit

     Case 1                           '2位整数,中间加发"拾":N拾N

          Sound dirs + "\10.wav"

     Case 2                           '3位整数,中间加发"百":N百N拾N

          Sound dirs + "\100.wav"

     Case 3                           '4位整数,中间加发"千":N千N百N拾N

          Sound dirs + "\1000.wav"

     Case 4                           '5位整数,中间加发"万":N万N千N百N拾N

          Sound dirs + "\10000.wav"

     Case 5                           '5位整数,中间加发"拾":N拾N万N千N百N拾N

          Sound dirs + "\10.wav"

   End Select

End Sub

Private Sub Max_Min()                  '求最大值及最小值

   Fri = Val(Text6): Add = Val(Text7)

   Sum = 0: Max = -99999: Min = 999999: Men = 0

   For i = 0 To 15                     '求出最大最小值

       Text9(i).BackColor = &HFFFFFF   '白:初始化

       If Trim(Text9(i)) <> "" Then

          Men = Men + 1

          Sum = Sum + Val(Text9(i))

          If Val(Text9(i)) > Max Then

             Max = Val(Text9(i))

             Maxi = i                 '标记最高分的评委号

          End If

          If Val(Text9(i)) < Min Then

             Min = Val(Text9(i))

             Mini = i                 '标记最低分的评委号

          End If

       End If

   Next

   If Men > 2 Then

      Text9(Maxi).BackColor = &HFF&    '红:最大值

      Text9(Mini).BackColor = &HFFFF&  '黄:最小值

   End If

End Sub

Private Sub Command1_Click()            '初始设置

   Evaluate.Show vbModal               '系统初始设置:输入评审形式并选择评审数据库

   If FileName = "" Then Exit Sub

   For i = 0 To 15

       Label15(i) = Trim(i + 1) & "号评委"

   Next

   ResultDisplay                       '显示评审结果

   Max_Min                             '求最大值及最小值

   Command2.Enabled = True

   Command3.Enabled = True

   Command4.Enabled = True

   Command5.Enabled = True

   Command6.Enabled = True

   Command8.Enabled = True

End Sub

Private Sub Command2_Click()           '打印报分

   If Ctrl_S = 2 Then                 '按打印报分键时同时按了Ctrl键

      Sounds                          '语音输出

      Exit Sub

   End If

   '..................................打印输出代码略

End Sub

Private Sub Command2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Ctrl_S = Shift And 7   '判断按键:点击"打印报分"时是否同时按了Ctrl键

End Sub

Private Sub Command3_Click()          '插入项目

   RecNnm = PS_Item.RecordCount      '获取表中的记录数

   RecNOi = Item.ListIndex           '当前记录号

   If RecNOi < 0 Then RecNOi = 0

   If RecNnm <> 0 Then               '若表中有记录

      PS_Item.MoveFirst

      Do While Not PS_Item.EOF

         If PS_Item.Fields("项目名称") = "请修改项目名称" Or PS_Item.Fields("发布者") = "请修改发布者" Then

            PS_Item.MoveFirst

            PS_Item.Move RecNOi

            Exit Sub

         End If

         PS_Item.MoveNext

      Loop

   End If

   SQL="insert into 评审项目(项目名称,发布者)values ('请修改项目名称','请修改发布者')"

   PS_db.Execute SQL                  '向评审项目表中插入新的项目

   Combo_init

   Item.ListIndex = PS_Item.RecordCount - 1

End Sub

Private Sub Command4_Click()           '删除项目

   Dim RecID As String                '记录的项目ID

   If Item.ListCount <= 0 Then Exit Sub

   RecID = PS_Item.Fields("项目ID")  '评审项目表中记录的项目ID

   '以下删除评审项目表中相关记录

   If MsgBox("确实要删除此项目吗?", vbQuestion + vbYesNo) = vbYes Then

      PS_Item.Delete

      PS_Item.MoveLast                '记录指移到尾部

      Combo_init

   End If

   '以下删除评委评分表中相关记录

   If PS_Score.RecordCount <> 0 Then PS_Score.MoveFirst

   Do While Not PS_Score.EOF          '查找评委评分表中与此项目相关的记录

      If PS_Score.Fields("项目ID") = RecID Then

         PS_Score.Delete

         PS_Score.MoveLast            '记录指移到尾部

         Exit Sub

      End If

      PS_Score.MoveNext

   Loop

End Sub

Private Sub Command5_Click()           '数据统

   If PS_Item.RecordCount = 0 Then Exit Sub  '禁止没有项目时进行数据统计

   Max_Min                            '求最大值及最小值

   If Men = 0 Then Exit Sub           '没输评分数据时

   Max = Int(Max * 1000 + 0.5) / 1000

   Min = Int(Min * 1000 + 0.5) / 1000

   If Ctrl_N = 2 Then                 '下Ctrl不去最高/最低分

      Text3.FontSize = 11: Text4.FontSize = 11

      Text3 = "未去最高分": Text4 = "未去最低分"

   Else

      If Men > 2 Then

         Men = Men - 2

         Sum = Sum - Max - Min

      End If

      Text3.FontSize = 16: Text4.FontSize = 16

      Text3 = Max:  Text4 = Min

   End If

   Avg = Sum / Men:    Sum = Fri + Add + Avg

   Avg = Int(Avg * 1000 + 0.5) / 1000

   Fri = Int(Fri * 1000 + 0.5) / 1000

   Add = Int(Add * 1000 + 0.5) / 1000

   Sum = Int(Sum * 1000 + 0.5) / 1000

   Text5 = Avg: Text6 = Fri: Text7 = Add: Text8 = Sum

   RecNOj = RecNOi

   PS_Item.Edit

If IsNull(PS_Item.Fields("项目ID")) Then PS_Item.Fields("项目ID") = Trim(Str(RecNOi + 1))

   If Trim(Item) <> "" And (Issue) <> "" Then

      PS_Item.Fields("项目名称") = Item

      PS_Item.Fields("发布者") = Issue

      PS_Item.Fields("初审分") = Fri

      PS_Item.Fields("附加分") = Add

      PS_Item.Fields("最高分") = Max

      PS_Item.Fields("最低分") = Min

      PS_Item.Fields("平均分") = Avg

      PS_Item.Fields("最终分") = Sum

      PS_Item.Fields("去高低") = "去高低"

      If Ctrl_N = 2 Then PS_Item.Fields("去高低") = "平均值"   '按下Ctrl键

      PS_Item.Update

   Else

      Response = MsgBox("项目名称及发布者不能为空!", vbCritical)

   End If

   If PS_Score.RecordCount <> 0 Then PS_Score.MoveFirst

   ID_Same = False

   Do While Not PS_Score.EOF          '查找评委评分表中是否有与此项目相关的记录

      If PS_Score.Fields("项目ID") = PS_Item.Fields("项目ID") Then

         ID_Same = True

         Exit Do

      End If

      PS_Score.MoveNext

   Loop

   If ID_Same = False Then            '评委评分表中无记录时插入记录

      If PS_Score.RecordCount <> 0 Then PS_Score.MoveLast

      PS_Score.AddNew

      PS_Score.Update

      PS_Score.MoveLast

   End If

   '以下写入评委的评分

   PS_Score.Edit

   PS_Score.Fields("项目ID") = PS_Item.Fields("项目ID")

   PS_Score.Fields("项目名称") = PS_Item.Fields("项目名称")

   PS_Score.Fields("发布者") = PS_Item.Fields("发布者")

   For i = 0 To 15

       PS_Score.Fields("评委" + Format(i + 1, "00")) = Val(Text9(i))

   Next

   PS_Score.Update

   Combo_init

   Item.ListIndex = RecNOj

   Issue.ListIndex = RecNOj

End Sub


Private Sub Command5_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Ctrl_N = Shift And 7   '判断按键:点击"数据统计"时是否同时按了Ctrl键

End Sub


Private Sub Command6_Click()           '结果排序

   Sorts.Show vbModal                 '弹出排序窗口

End Sub

Private Sub Command7_Click()           '退出系统

   If MsgBox("确实要退出系统吗?", vbQuestion + vbYesNo) = vbYes Then End

End Sub

Private Sub Command8_Click()           '切换评委

   If Ctrl_I = 0 Then

      Static ChangeDisplay As Boolean  '是否切换评委序号或评委姓名

      If PS_name.RecordCount = 0 Then Exit Sub

      PS_name.MoveFirst

      If ChangeDisplay = False Then    '若为评委序号

         For i = 0 To 15

             If IsNull(PS_name.Fields("评委" & Format(i + 1, "00"))) Then

                Label15(i) = "XX评委"

             Else

                Label15(i) = PS_name.Fields("评委" & Format(i + 1, "00"))

                If Trim(Label15(i)) = "" Then Label15(i) = "XX评委"

             End If

         Next

      Else

         For i = 0 To 15

             Label15(i) = (i + 1) & "号评委"

         Next

      End If

      ChangeDisplay = Not ChangeDisplay

      ResultDisplay                   '显示评审结果

   Else                               '同时按下Ctrl键,输入或修改评委姓名

      EditName = True

      Command9.Visible = True

      If PS_name.RecordCount = 0 Then Exit Sub

      PS_name.MoveFirst

      For i = 0 To 15

          Score(i) = Text9(i)        '保存输入修改评委姓名前评分框中的数据

          Text9(i) = ""

          Text9(i).ToolTipText = "请输入或修改评委姓名!"

          'IF语句在评分框中显示评委姓名

          If Not IsNull(PS_name.Fields("评委" & Format(i + 1, "00"))) Then

             Text9(i) = PS_name.Fields("评委" & Format(i + 1, "00"))

          End If

      Next

   End If

End Sub


Private Sub Command8_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Ctrl_I = Shift And 7   '判断按键:点击"切换评委"时是否同时按了Ctrl键

End Sub


Private Sub Command9_Click()           '存储评委姓名

   If PS_name.RecordCount = 0 Then

      PS_name.AddNew

      PS_name.Update

   End If

   PS_name.MoveFirst

   For i = 0 To 15

       PS_name.Edit

       PS_name.Fields("评委" & Format(i + 1, "00")) = Text9(i)

       PS_name.Update

       Text9(i) = Score(i)           '恢复显示编辑评委姓名前评分框中的数据

       Text9(i).ToolTipText = "请输入评分数据,空白表示此评委弃权!"

   Next

   Command9.Visible = False

   EditName = False

End Sub


Private Sub Form_Load()

   dirs = App.Path          'dirs:本系统的安装路径

   Ctrl_N = 0               '数据统计不去最大最小值标志:点击"数据统计"时是否同时按了Ctrl键

   Ctrl_S = 0               '语音报分标志:点击"打印报分"时是否同时按了Ctrl键

   Ctrl_I = 0               '输入评委姓名标志:点击"切换评委"时是否同时按了Ctrl键

End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    '退出系统

   If MsgBox("确实要退出系统吗?", vbQuestion + vbYesNo) = vbNo Then Cancel = True

End Sub


Private Sub Text9_KeyPress(Index As Integer, KeyAsc As Integer)   '输入数据合法性检查

   If EditName Then Exit Sub

   If (KeyAsc < vbKey0 Or KeyAsc > vbKey9) And KeyAsc <> 46 Then '只许输入数字或小数点

      Response = MsgBox("请输入数字!", vbCritical, "错误!")

   End If

End Sub

2、初始设置代码

Private Sub Command1_Click()            '系统初始设置:输入评审形式并选择项目数据库

   If Option1.Value Then

      ExistDB                          '处理已经有的评审项目数据库

   Else

      If Trim(Text2) = "" Then

         FileName = ""

         Me.Visible = False

         Exit Sub

      End If

      NewsDB                           '新建评审项目数据库

   End If

   Counting.Combo_init

   Counting.Label1.Caption = PS_Form   '显示评审形式

   Me.Visible = False

End Sub

Private Sub Command2_Click()            '取消

   FileName = ""

   Me.Visible = False

End Sub

Private Sub Form_Load()

   CommonDialog1.InitDir = dirs

   Text2.Enabled = False

End Sub

Private Sub Option1_Click()            '选择:打开已存在的评审项目数据库

   Text2.Enabled = False

End Sub

Private Sub Option2_Click()            '选择:建立新的评审项目数据库

   Text2.Enabled = True

End Sub

Private Sub NewsDB()                   '新建评审项目数据库

   FileName = Trim(Text2) + ".mdb"

   If Dir(FileName) <> "" Then Kill FileName

   Set PS_db = CreateDatabase(FileName, dbLangGeneral)

   SQL = "create table[评审项目]([项目ID]TEXT(5),[项目名称]text(50),[发布者]TEXT(50),[初审分]single,[附加分]single,[最高分]single,[最低分]single,[去高低]Text(6),[平均分]single,[最终分]single)"

   PS_db.Execute SQL                       '新建“评审项目”表

   SQL = "create table[评委评分]([项目ID]text(5),[项目名称]TEXT(50),[发布者]text(50),"

   For i = 1 To 15

       SQL = SQL & "[评委" & Format(i, "00") & "]" & " single,"

   Next

   SQL = SQL & "[评委16]single)"

   PS_db.Execute SQL                       '新建“评委评分”表

   SQL = "create table[评委姓名]("

   For i = 1 To 15

       SQL = SQL & "[评委" & Format(i, "00") & "]" & " TEXT(8),"

   Next

   SQL = SQL & "[评委16]TEXT(8))"

   PS_db.Execute SQL                       '新建“评委姓名”表

   SQL = "create table[评审形式]([评审名称]TEXT(50))"

   PS_db.Execute SQL                       '新建“评审形式”表

   OpenDB                                  '打开数据库表

   PS_froms.AddNew

   PS_froms.Fields("评审名称") = Trim(Text1)

   PS_froms.Update

   PS_Form = "【" + Trim(Text1) + "】"

End Sub

Private Sub ExistDB()                      '处理已有的评审项目数据库

   CommonDialog1.ShowOpen                 '弹出数据库文件选择框

   FileName = CommonDialog1.FileName

   If Trim(FileName) = "" Then Exit Sub   '若没选择数据库文件则返回

   OpenDB                                 '打开数据库表

   PS_Form = "【" + PS_froms.Fields("评审名称") + "】"

End Sub

Private Sub OpenDB()                                '打开数据库表

   On Error GoTo ErrDo

   Set PS_db = OpenDatabase(FileName)            '打开选择的数据库

   Set PS_Item = PS_db.OpenRecordset("评审项目")   '打开评审项目表

   Set PS_Score = PS_db.OpenRecordset("评委评分")  '打开评委评分表

   Set PS_name = PS_db.OpenRecordset("评委姓名")   '打开评委姓名表

   Set PS_froms = PS_db.OpenRecordset("评审形式")  '打开评审形式表

   Exit Sub

ErrDo:

   MsgBox Error(Err), vbCritical, "数据库打开错误!"

End Sub

3、结果排序代码

Private Sub Command2_Click()                     '返回

   Unload Me

End Sub

Private Sub DisplayNO()                          '显示序号

   MSFlexGrid1.TextMatrix(0, 0) = "序号"

   MSFlexGrid1.Rows = PS_Item.RecordCount + 1

   For i = 2 To MSFlexGrid1.Rows

       MSFlexGrid1.TextMatrix(i - 1, 0) = Str(i - 1)

   Next

End Sub

Private Sub Form_Load()

   Mode = 2                                      '初始排序为降序

   Data1.DatabaseName = FileName

   Data1.RecordSource = "评审项目"

   MSFlexGrid1.FixedRows = 1                     'MSFlexGrid1固定行显示表头

   MSFlexGrid1.FixedCols = 1                     'MSFlexGrid1固定列显示序号

   MSFlexGrid1.Rows = PS_Item.RecordCount + 1

   MSFlexGrid1.Cols = PS_Item.Fields.Count

   MSFlexGrid1.ColWidth(0) = MSFlexGrid1.ColWidth(0) / 2    '序号列宽

   MSFlexGrid1.ColWidth(1) = 0                              '不显示项目ID

   MSFlexGrid1.ColWidth(2) = MSFlexGrid1.ColWidth(2) * 1.5  '项目名称列宽

   MSFlexGrid1.ColWidth(3) = MSFlexGrid1.ColWidth(3)        '发布者列宽

   For i = 4 To 9

       MSFlexGrid1.ColWidth(i) = MSFlexGrid1.ColWidth(i) * 3 / 4

   Next

End Sub


Private Sub MSFlexGrid1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

   Mode = IIf(Mode = 1, 2, 1)       '乒乓改变升降排序方式

   MSFlexGrid1.Col = MSFlexGrid1.ColSel

   MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1

   MSFlexGrid1.Sort = Mode          '对鼠标所选列进行排序

   MSFlexGrid1.Redraw = True

   DisplayNO

End Sub

Private Sub Form_Activate()

   DisplayNO

End Sub

五、设计及运行说明

1、因诸多原因,系统定义了Ctrl+打印报分、Ctrl+数据统计、Ctrl+切换评委三个组合键,同时定义了Ctrl_S、Ctrl_N、Ctrl_I三个变量,而这三个变量的值分别来源于Command2_MouseDown、Command5_MouseDown、Command8_MouseDown三个事件过程。当Ctrl_S(或Ctrl_N或Ctrl_I)值为0时表明点击“打印报分”(或“数据统计”或“切换评委”)键时没按Ctrl键;当Ctrl_S(或Ctrl_N或Ctrl_I)值为2时表明点击“打印报分”(或“数据统计”或“切换评委”)键时同时按了Ctrl键。

2、若需用语音播报窗体中的评审结果,必须预先录制好所有事件的声音,如“去掉一个最高分”、“去掉一个最低分”、“本次计算平均分”、“加上前次初审分”、“加上项目附加分”、“本项目最终得分”及0~10、“百”、“千”、“万”、“负”、“点”、“分”等语音,待相应的事件发生后调用相应的WAV文件。各语音信息及其所对应的WAV文件名如下表:

表1:语音信息与WAV文件对照表

语音信息

WAV文件

语音信息

WAV文件

去掉一个最高分

Max.wav

0~10

0.wav~10.wav

去掉一个最低分

Min.wav

百、千、万

100.wav、1000.wav、10000.wav

本次计算平均分

Avg.wav

Minus.wav

加上前次初审分

Fri.wav

Point.wav

加上项目附加分

Add.wav

scope

本项目最终得分

Sum.wav



3、运行系统出现数据处理窗体Counting,除“初始设置”、“退出系统”键可用外,其它键均不可用,即必须进行初始设置后,才能进行其它操作。而初始设置就是调用窗体Evaluate ,输入评审形式并打开或新建一个评审项目数据库。

4、评审项目信息(如项目名称、发布者、初审分等数据)可由工作人员预先输入到评审项目数据库中,亦可在评审会上动态实时地输入。评审时,用户可根据抽签情况,用鼠标在评审项目或发布者下拉列表中选择当时要评审的项目进行评审。插入项目后必须修改项目名称及发布者,输入评分后必须点击“数据统计”键(统计时去掉最高分及最底分)或按Ctrl键时同时点击“数据统计”键(统计时不去最高分及最底分),进行统计并存储输入的评分数据。

5、评分输入框空白不输,表示评委未到或弃权;项目初审分、项目附加分显示框,同时也作为输入框,如在定时报时子系统中,若发布者发布的时间超时了定时长度,按超过1分钟扣除多少分计算,则总扣除分应体现在附加分中(即可输入负数)。

6、点击“打印输出”键,既可打印单个项目的评审结果,也可打印所有项目的评审结果;按Ctrl键并同时点击“打印输出”键,将用语音报告显示在窗体上的评审结果。

7、点击“结果排序”键,将调用Sorts窗体。在数据表格中,用鼠标点击任意表头名称(即排序的关键字,如初审分、附加分、最终分等)的瞬间,表格便立即以升序方式刷新显示,再次点击此表头名称,则以降序方式刷新显示,如此反复。用鼠标可伸缩调整所选择列的列宽,也可拖动所选择的列到需要的位置,拖动列时,同时也将此列数据进行了升降序排列。点击“打印”键,可打印有序结果。

8、点击“切换评委”键将切换评委姓名或评委编号;按Ctrl键并同时点击“切换评委”键,则编辑评委姓名。

9、当鼠标停留在窗体中大多数控件上时,都将显示相应的提示信息。

六、结 论

本评审系统不仅具有定时报时功能,而且还具有数据统计、实时排序、语音输出、打印输出、数据存档等诸多功能。它不仅适用于科研成果鉴定、论文发布,而且还可应用于学生答辩、电视歌手大赛、各类娱乐、竞技比赛等各行各业。

参 考 文 献

刘中甫,PS2000多媒体评审系统,电脑爱好者光盘,北京,2000.11