在控件中画线
Line (0#, Point)-(ScaleWidth, Point), RGB(120, 120, 120)Point为外部定义的一个属性点
Public Property Get Point() As Single
    PointSpt = sngPoint
End PropertyPublic Property Let Point(ByVal vNewValue As Single)
    sngPoint = vNewValue
    PropertyChanged "Point"
End Property当然sngPoint定义为内部点 Dim sngPoint As Single
我们无法预测外部属性点的值,如果外部给属性点的值过大,画线语句就会出现溢出错误。
请问怎么在内部预防,不管外部给多大或者多小的点值,做到没有溢出报警,或者屏蔽掉溢出,谢谢

解决方案 »

  1.   

    我看你用了ScaleWidth,应该是象素座标,象素座标能有多大?
    在规定的画线范围内判断一下,超出画线范围内的点就禁止画线!
      

  2.   

    即使我用TWIP坐标也一样存在问题,在X轴我想没有什么问题,
    在上下Y轴上,如果上下画线区间为最小为10个象素(x1,0),(x2,10),或者1000个象素(x1,0),(x2,1000),如果计算出的点象素值位于10或者1000以内则没有问题,
    如果超出一定范围也没有问题,如-2,12,在10以外,-100,1100在1000以外也没有问题,但范围超出多少则会有问题,应该怎么计算,
    因为10,1000这个范围是不定的,那是随着ScaleHeight的变化而变化的,或者有的时候因需要自定义为非常小或者非常大范围,总之是变化的,谢谢
      

  3.   

    你外部属性点用Single来定义就有问题了,而Line画线参数应该是整型,当外部点数值过大时就超出了整型范围。不溢出才怪!
      

  4.   

    Line的画线参数是Single类型的,在MSDN中是这么写的。
      

  5.   

    画线单位是像素,只能是整数.
    在画线单位是象素的时候,我输入Single类型的数据,我在放大的情况下,能看到因为有小数的存在,看到了线变化的效果请问在什么情况下,画线单位是Single呢,谢谢
      

  6.   

    而你用了象素座标,Line画线参数就应该用整数。
      

  7.   

    我用了twip,或者millimeter等坐标,还是同样的问题。但奇怪的是,用象素坐标,画线参数只能用整数的话,那我输入俘点的时候为什么没有被自动取整,相反线却有了变化的效果,MSDN上是写浮点的,难道没有说明全吗
      

  8.   

    Scalemode=3能画小于1个像素点,没实践还真不知道.如果不是数据类型的问题,还有就是使用非法字符,知道了,Point() 是数组!
      

  9.   

    应该没有非法字符,最上面我加了Option ExplicitPoint 是定义的一个属性点名称。
    Public Property Get Point() As Single 
        ’PointSpt = sngPoint (之前笔误写错了,现在纠正下) 
          Point = sngPoint
    End Property Public Property Let Point(ByVal vNewValue As Single) 
        sngPoint = vNewValue 
        PropertyChanged "Point" 
    End Property 
      

  10.   

    超出可见客户区的线就不用画了
    If (0 <= Point) AND (Point <= ScaleHeight) Then
        Line (0#, Point)-(ScaleWidth, Point), RGB(120, 120, 120) 
    End If
      

  11.   

    Option ExplicitPrivate Sub Form_Load()
        Me.ScaleMode = vbPixels
        Me.AutoRedraw = True
        
        Dim i As Long, y As Single
        For i = 0 To 10
            y = 10 ^ i
            Debug.Print y
            Me.Line (0, y)-(Me.ScaleWidth, y)
        Next
    End Sub
    y = 10^8 时还没有出错。
    你的坐标值怎么这么大!
      

  12.   

    谢谢Tiger_Zhao,
    你的测试是很能说明问题的,在实际的正常应用中,一般不会出现那么离谱的数据,
    但因为我做好的控件是需要嵌入到其他的应用程序中去的,是需要读取其他的设备给的数据,然后进行画线绘图,
    那种数据的大小和正确性是我无法预知的,经常性他们的数据源会出现问题,特别是在初期,也许会给过来特别大或者特别小的数据,
    那我接受到这些数据的时候就会出现溢出问题,我想屏蔽掉或者说是避免掉这些溢出问题,也就是在用户使用中,看不到溢出报警
    或者说是想办法对这些不正常的数据(特别大或者特别小)进行过滤或屏蔽,谢谢。
      

  13.   

    Public Property Let Point(ByVal vNewValue As Single) 
        if vNewValue < -1 Then
            sngPoint = -1
        elseif vNewValue > 100000000 then
            sngPoint = 100000000
        else
            sngPoint = vNewValue 
        end if
        PropertyChanged "Point" 
    End Property 
      

  14.   

    我想是不是有一种可能,就是超过画图区域缓冲区范围,WINDOWS无法自动建立这么大的区域
    最好的办法就是找出windows这个画图区域缓冲区是多大,然后对输入画点的数据进行判断,不在这个区域内的话,画一个最大这个区域的
    但是有什么方法可以找出这个确切的画图区域缓冲区
      

  15.   

    Tiger_Zhao,我想你找到的y = 10^8应该就是一个大概的缓冲区上界,你觉得呢?