none
VB2008利用OWC11元件繪製即時曲線圖 RRS feed

  • 問題

  • 請教各位大大!小弟利用OWC元件來繪製即時數據的曲線圖!

    程式架構為建立一個主表單Main去收集線上溫度資訊,在建置一個表單Display1放置一個OWC元件將將Main收集的數據即時顯示出來,

    繪製的部分是OK的但是會有圖面閃爍的情況出現!請問要如何解決圖面閃爍的問題呢?

    以下是小弟繪製的語法

    Private Sub OWC_WRITE()
            Me.SuspendLayout()
           
            XValues.Clear()
            YValues.Clear()
            X1Values.Clear()
            Y1Values.Clear()
           
            Dim Rows_Cunt As Integer = myDataBuffer.PLC2_Temp_table.Rows.Count
            If myDataBuffer.PLC2_Temp_table.Rows.Count > 1 Then
                For cunt As Integer = 0 To myDataBuffer.PLC2_Temp_table.Rows.Count - 1
                    Try
                        XValues.Add(myDataBuffer.PLC2_Temp_table.Rows(cunt).Item(1))
                        YValues.Add(myDataBuffer.PLC2_Temp_table.Rows(cunt).Item(2))
                        X1Values.Add(myDataBuffer.PLC2_Temp_table.Rows(cunt).Item(1))
                        Y1Values.Add(myDataBuffer.PLC2_Temp_table.Rows(cunt).Item(3))
                   Catch ex As Exception
                        Rows_Cunt = cunt
                        Exit For
                    End Try
    
                Next
            Else
                Exit Sub
            End If
    
    
            Dim xObjects, yObjects, y1Objects, x1Objects As Object()
            Dim tmp = From x In XValues Select CObj(x)
            xObjects = tmp.ToArray()
            Dim tmp2 = From y In YValues Select CObj(y)
            yObjects = tmp2.ToArray()
    
            Dim tmp3 = From y1 In Y1Values Select CObj(y1)
            y1Objects = tmp3.ToArray
            Dim tmp4 = From x1 In X1Values Select CObj(x1)
            x1Objects = tmp4.ToArray
    
                   AxChartSpace1.Clear()
            AxChartSpace1.Refresh()
    
            If AxChartSpace1.Charts.Count > 0 Then
                AxChartSpace1.Charts.Delete(0)
            End If
    
    
    
            Dim Chart1 As ChChart = AxChartSpace1.Charts.Add
            With Chart1
                .HasTitle = True
                .Title.Caption = "溫度曲線"
                .Title.Font.Name = "Arial"
                .Type = ChartChartTypeEnum.chChartTypeScatterLine
                .PlotArea.Interior.SetSolid("White")
            End With
            If Temp_Line(0) = True Then
                Dim series As Object
                series = Chart1.SeriesCollection.Add
                With series
                    .Name = "Series 1"
                    .Caption = "左上"
                    .SetData(ChartDimensionsEnum.chDimXValues, ChartSpecialDataSourcesEnum.chDataLiteral, xObjects)
                    .SetData(ChartDimensionsEnum.chDimYValues, ChartSpecialDataSourcesEnum.chDataLiteral, yObjects)
                    .Line.Color = "RosyBrown"
                    .Line.Weight = LineWeightEnum.owcLineWeightThick
                End With
            End If
            If Temp_Line(1) = True Then
                Dim series1 As Object
                series1 = Chart1.SeriesCollection.Add
                With series1
                    .Name = "Series 2"
                    .Caption = "右上"
                    .SetData(ChartDimensionsEnum.chDimXValues, ChartSpecialDataSourcesEnum.chDataLiteral, x1Objects)
                    .SetData(ChartDimensionsEnum.chDimYValues, ChartSpecialDataSourcesEnum.chDataLiteral, y1Objects)
                    .Line.Color = "DarkGreen"
                    .Line.Weight = LineWeightEnum.owcLineWeightThick
                End With
            End If
    
                    Dim Max As Date = DateAdd(DateInterval.Second, 20, CDate(myDataBuffer.PLC2_Temp_table.Rows(Rows_Cunt - 1).Item(1)))
    
            With Chart1.Axes(1)
                .NumberFormat = "HH:mm:ss"
                With .Scaling
                    .Minimum = CDate(myDataBuffer.PLC2_Temp_table.Rows(0).Item(1)).ToOADate
                    .Maximum = CDate(Max).ToOADate
                End With
            End With
    
            With Chart1.Axes(0)
                .MajorUnit = 20
                .MinorUnit = 15
                With .Scaling
                    .Maximum = MAX_Value
                    .Minimum = Min_Value
                End With
            End With
            System.Threading.Thread.Sleep(100)
            Me.ResumeLayout()
    
        End Sub


    新手上路


    • 已編輯 eblue 2012年3月14日 下午 01:30
    2012年3月14日 下午 01:28

解答

  • 迴圈加資料時,先隱藏,加完後再顯示。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月14日 下午 04:46

所有回覆

  • 迴圈加資料時,先隱藏,加完後再顯示。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月14日 下午 04:46
  • 我依心冷大的建議在進入迴圈加資料前加入 AxChartSpace1.Visible = False,分別測試2個地方

     位置1:

    AxChartSpace1.Visible = False

    If myDataBuffer.PLC2_Temp_table.Rows.Count > 1 Then
          ..略

    End If


    位置2:

    AxChartSpace1.Visible = False

    Dim xObjects, yObjects, y1Objects, x1Objects As Object()
           
    Dim tmp = From x In XValues Select CObj(x)
            xObjects
    = tmp.ToArray()
           
    Dim tmp2 = From y In YValues Select CObj(y)
            yObjects
    = tmp2.ToArray()

           
    Dim tmp3 = From y1 In Y1Values Select CObj(y1) y1Objects = tmp3.ToArray
           
    Dim tmp4 = From x1 In X1Values Select CObj(x1)
            x1Objects
    = tmp4.ToArray

    都可改善畫面閃爍的情況!但以位置2的狀態最好應該是 隱藏再顯示的時間較短

    原始程式的情況應該是一開始啟動時資料筆數不多所以迴圈抓取資料時間較短畫面幾乎不會閃爍

    但當筆數到達200筆就開始顯現出來(目前即時畫面可顯示5分鐘內的即時曲線)故當筆數>300筆時會先加入第301筆後移除位置0的資料

    閃爍嚴重時甚至會出現OWC的原始畫面(有Microsoft Office Web字樣)-應該是AxChartSpace1.Refresh()

    以上是小弟的淺見~~

    感謝心冷大的指點


    新手上路

    2012年3月15日 上午 04:09