一个用MSCOMM控件接收数据的过程,需要6分钟。当点击的接收数据的按钮后,窗体就停止反应6分钟,这样往往会使用户不耐烦,如何在接收的过程中显示一个进度条,提示总共有多少条数据,接收了多少条,进度为百分之一,还需等等多长时间等信息。

解决方案 »

  1.   

    ProgressBar的最小值设为0,最大值设为100,记录文件总字节数,实时记录已接收数据的字节数,---下面不需要继续说了吧!
      

  2.   

    ProgressBar控件(进度条控件)位于“Microsoft Windows Common Controls 6.0”部件中
    【例】ProgressBar控件示例。设计一个进度条,用来指示程序操作的进度。
    窗体设计界面由一个标签、两个命令按钮以及一个进度条控件组成。
    代码编写如下。
    Option Explicit
    Private Sub cmdCompute_Click()
    '统计
    Dim sp As Single '完成一个操作所增加的值
    Me.MousePointer = vbHourglass
        With prgMain
            sp = (.Max - .Min) / 6  :  .Visible = True  :  .Value = .Min
            lblTip.Caption = "正在进行生产数据统计..."
            Call Delay  :  .Value = sp
            Call Delay  :  .Value = 2 * sp
            Call Delay  :  .Value = 3 * sp
            Call Delay  :  .Value = 4 * sp
            Call Delay  :  .Value = 5 * sp
            Call Delay  :  .Value = .Max
            .Visible = False  :  lblTip.Caption = ""
            MsgBox "统计完成!", vbOKOnly, "提示"
        End With
    Me.MousePointer = vbDefault
    End Sub
    Private Sub cmdExit_Click()
    '退出
        End
    End Sub
    Private Sub Delay()
    '延时
    Dim i%, j%
        For i = 1 To 10000
            For j = 1 To 2000   
            Next j
        Next i%
    End Sub
    Private Sub Form_Load()
    '初始化
        With prgMain
            .Align = vbAlignBottom  :  .Visible = False
            .Min = 0  :  .Max = 200
        End With
        lblTip.AutoSize = True
    End Sub

      

  3.   

    补充说明,这个进度提示是在点击了一个按钮后执行SUB1(SUB1中有一个循环代码,时间主要是消耗在这个循环代码上),在SUB1执行的过程中在一个小窗体中进行进度提示,直到SUB执行完。
      

  4.   

    循环里面加个
    doevents
    ProgressBar1.value = i 'i是循环因子,你得自己控制
    form2.text1.text="正在接收数据,已完成" & i/(总数)*100 & "%"
    大概就这么个样子了
      

  5.   

    strSql = "select a.PRICE as price,a.MODEL,a.WH,a.ITEMNO,b.ihinvn," & _
                 "c.illine,DECODE(d.ORIAVGCOST,null,'0',d.ORIAVGCOST) AS ORIAVGCOST,DECODE(d.BASEAVGCOST,null,'0',d.BASEAVGCOST) AS BASEAVGCOST ,c.ILRSV3" & Chr(13) & Chr(10) & _
                 "from tmp_uploadprice a,bilsih b,bilsil c,limcmf_avg d " & Chr(13) & Chr(10) & _
                 "where .........'"    Set rs2 = DbsBpcs.OpenRecordset(strSql, dbOpenSnapshot)
        intI = 0
        ProgressBar1.Visible = True
        If rs2.RecordCount > 32767 Then  '进度条的值最大支持32767
           ProgressBar1.Max = 32767
        Else
            If rs2.RecordCount = 0 Then     ‘找不到记录
                rs2.Close
                MsgBox "Can't find invoice data !"
                ProgressBar1.Visible = False
                insert_LIMCSTPCM = False
                Exit Function
            Else
                ProgressBar1.Max = rs2.RecordCount       '如果数据集的记录数量小于32767,则将度条的上限设为数据集的记录数量
            End If
        End If
        While Not rs2.EOF
            intI = intI + 1                                              ’滚动进度条
            ProgressBar1.Value = intI
        
            'GET CUSTNO
            strSql = "select distinct ref_cust as CUSTNO from con_inventory " & Chr(13) & Chr(10) & _
            "where IW_WH=" & rs2.Fields(2).Value & " and ITEM_NO='" & rs2.Fields(3).Value & "'"
            Set rs3 = DbsBpcs.OpenRecordset(strSql, dbOpenSnapshot)
            'GET BASEPRICE
            dblBASEPRICE = CDbl(rs2.Fields(0).Value) * dblEXGRATE
            'Initialize avg_cost
            If Len(Trim$(rs2.Fields(6).Value)) = 0 Then
                rs2.Fields(6).Value = 0
            End If
            If Len(Trim$(rs2.Fields(7).Value)) = 0 Then
                rs2.Fields(7).Value = 0
            End If
            'get new cost
    '        dblnewcost_b = get_newcost(rs2!price.Value * dblEXGRATE, dblsell_rate, dblcost_rate, rs2!BASEAVGCOST.Value)
    '
    '        dblnewcost_o = get_newcost(rs2!price.Value, dblsell_rate, dblcost_rate, rs2!ORIAVGCOST.Value)
            If CDbl(rs2!BASEAVGCOST.Value) * CDbl(rs2!ORIAVGCOST.Value) = 0 Then
                
                dblnewcost_b = CDbl(rs2!PRICE.Value) * dblEXGRATE * dblsell_rate * dblcost_rate
                dblnewcost_o = CDbl(rs2!PRICE.Value) * dblsell_rate * dblcost_rate
            Else
                If CDbl(rs2!BASEAVGCOST.Value) <= CDbl(rs2!PRICE.Value) * dblEXGRATE * dblsell_rate Then
                    dblnewcost_b = CDbl(rs2!BASEAVGCOST.Value)
                    dblnewcost_o = CDbl(rs2!ORIAVGCOST.Value)
                Else
                    dblnewcost_b = CDbl(rs2!PRICE.Value) * dblEXGRATE * dblsell_rate * dblcost_rate
                    dblnewcost_o = CDbl(rs2!PRICE.Value) * dblsell_rate * dblcost_rate
                End If
            End If
                
            'insert into LIMCSTPCM
            strSql = "insert into ......"
            DbsBpcs.Execute strSql
            rs3.Close
            rs2.MoveNext
        Wend
        rs2.Close
        ProgressBar1.Value = 0
        ProgressBar1.Visible = False
      

  6.   

    使用俺的SOCKET类代替WINSOCK控件,可以更方便地实现进度管理。
      

  7.   

    具体代码考见博客中《用WINSOCK API实现同步非阻塞方式的网络通讯》《用WINSOCK API实现同步阻塞方式的网络通讯》两篇文章。
      

  8.   

    在COM的接收事件中写代码,将已经接收的数据量和总数据量设置到PROCESSBAR的相应属性里就可以了.
      

  9.   

    加一个doevents
    这样效果好点