《控件按比例随窗体缩放》的代码报错 System.Windows.Forms.Control.Tag.get 返回 Nothing

menghuidaoxiang 2018-02-18 05:33:00
Public Class Form1

Dim x As Single = 0
Dim y As Single = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'得到原始窗体大小
x = Me.Width
y = Me.Height
setTag(Me)
End Sub

Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
'得到现在窗体的大小,然后根据原始大小计算缩放比例
Dim newx As Single = Me.Width / x
Dim newy As Single = Me.Height / y
setControls(newx, newy, Me)
End Sub
'递归取控件的原始大小和位置,用tag来纪录
Private Sub setTag(ByVal obj As Object)
For Each con As Control In obj.Controls
con.Tag = con.Width & ":" & con.Height & ":" & con.Left & ":" & con.Top & ":" & con.Font.Size
'如果是容器控件,则递归继续纪录
If con.Controls.Count > 0 Then
setTag(con)
End If
Next
End Sub
'递归重新设定控件的大小和位置
Private Sub setControls(ByVal newx As Single, ByVal newy As Single, ByVal obj As Object)
For Each con As Control In obj.Controls
con.AutoSize = False
Dim mytag() As String = con.Tag.ToString.Split(":")
con.Width = mytag(0) * newx
con.Height = mytag(1) * newy
con.Left = mytag(2) * newx
con.Top = mytag(3) * newy
'计算字体缩放比例,缩放字体
Dim currentSize As Single = newy * mytag(4)
con.Font = New Font(con.Font.Name, currentSize, _
con.Font.Style, con.Font.Unit)
'如果是容器控件,则递归继续缩放
If con.Controls.Count > 0 Then
setControls(newx, newy, con)
End If
Next
End Sub
End Class

这段代码是我在网上复制的《控件按比例随窗体缩放》的代码,我在一个窗口中已经调试成功了,然而在另一个窗体中的出现《System.NullReferenceException:“未将对象引用设置到对象的实例。”System.Windows.Forms.Control.Tag.get 返回 Nothing。》的错误,然后我从新建立了一个VB.NET窗体应用,随意加几个控件也是这个错误,我再次将通过调试的窗体控件复制到新建的窗体应用里面,再次调试,还是这个错误,请问我这问题到底可能出在哪里呢,请帮忙,谢谢
收起
我X,我刚刚随意更改那个调试成功窗体里面的一个控件的位置,然后调试就不成功了........ VS2017版本
...全文
1291 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jzdcf 2019-09-21
  • 打赏
  • 举报
回复
因为我也遇到过这种问题,查到最后是designer存在删掉控件的代码,并且少写遗漏了 X = this.Width;//获取窗体的宽度 Y = this.Height;//获取窗体的高度 setTag(this);//调用方法
引用 3 楼 menghuidaoxiang 的回复:
[quote=引用 2 楼 From_TaiWan 的回复:] 按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件?
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015[/quote]
weixin_58317284 2021-07-13
  • 举报
回复
@jzdcf 层主解决了吗,我也遇到相同问题了
jzdcf 2021-07-15
  • 举报
回复
@weixin_58317284 有的控件不是继承自Control,而是其他类
jzdcf 2019-09-21
  • 打赏
  • 举报
回复
是不是设计里面删控件了但designer里没删对应的代码
引用 3 楼 menghuidaoxiang 的回复:
[quote=引用 2 楼 From_TaiWan 的回复:] 按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件?
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015[/quote]
CyanFighting 2018-12-30
  • 打赏
  • 举报
回复
引用 9 楼 weixin_42150685 的回复:
哈哈,搞笑的呢,用个try……catch语句就不会报错了,而且效果没影响


哈哈,真的搞笑,竟然就可以了
面向医学编程 2018-09-15
  • 打赏
  • 举报
回复
哈哈,搞笑的呢,用个try……catch语句就不会报错了,而且效果没影响
SoulRed 2018-02-28
  • 打赏
  • 举报
回复
你看看是不是你手动更改了控件的某些属性,导致不能达到预期。在设计面板里右键控件,然后属性里查看
menghuidaoxiang 2018-02-24
  • 打赏
  • 举报
回复
引用 6 楼 menghuidaoxiang 的回复:
[quote=引用 4 楼 menghuidaoxiang 的回复:] [quote=引用 3 楼 menghuidaoxiang 的回复:] [quote=引用 2 楼 From_TaiWan 的回复:] 按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015[/quote] 安装2015再看看[/quote]
引用 5 楼 From_TaiWan 的回复:
不要用预览版,用正式发布的版本 应该是VS版本问题,就这么点代码,都是常规的功能,不会有问题
我已经疯了,另一个电脑已经试过了,能正常运行,这个电脑重装、修复VS,重装系统、格式化所有盘重装系统,在装VS,就是通不过,VS2017、VS2015,都一样,我特么的疯了,这两天系统都被我重装了三 、四次了,VS被我重装了五六次了[/quote] 另一个电脑是VS2017和这个电脑一样的版本号
menghuidaoxiang 2018-02-24
  • 打赏
  • 举报
回复
引用 4 楼 menghuidaoxiang 的回复:
[quote=引用 3 楼 menghuidaoxiang 的回复:] [quote=引用 2 楼 From_TaiWan 的回复:] 按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015[/quote] 安装2015再看看[/quote]
引用 5 楼 From_TaiWan 的回复:
不要用预览版,用正式发布的版本 应该是VS版本问题,就这么点代码,都是常规的功能,不会有问题
我已经疯了,另一个电脑已经试过了,能正常运行,这个电脑重装、修复VS,重装系统、格式化所有盘重装系统,在装VS,就是通不过,VS2017、VS2015,都一样,我特么的疯了,这两天系统都被我重装了三 、四次了,VS被我重装了五六次了
秋的红果实 2018-02-20
  • 打赏
  • 举报
回复
不要用预览版,用正式发布的版本 应该是VS版本问题,就这么点代码,都是常规的功能,不会有问题
秋的红果实 2018-02-20
  • 打赏
  • 举报
回复
按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件?
秋的红果实 2018-02-20
  • 打赏
  • 举报
回复
帮你测试了,代码没有问题

Public Class Form1
    Dim x As Single = 0
    Dim y As Single = 0

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '得到原始窗体大小
        x = Me.Width
        y = Me.Height
        setTag(Me)

    End Sub

    Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
        '得到现在窗体的大小,然后根据原始大小计算缩放比例
        Dim newx As Single = Me.Width / x
        Dim newy As Single = Me.Height / y
        setControls(newx, newy, Me)
    End Sub
    '递归取控件的原始大小和位置,用tag来纪录
    Private Sub setTag(ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.Tag = con.Width & ":" & con.Height & ":" & con.Left & ":" & con.Top & ":" & con.Font.Size
            '如果是容器控件,则递归继续纪录
            If con.Controls.Count > 0 Then
                setTag(con)
            End If
        Next
    End Sub

    '递归重新设定控件的大小和位置
    Private Sub setControls(ByVal newx As Single, ByVal newy As Single, ByVal obj As Object)
        For Each con As Control In obj.Controls
            con.AutoSize = False
            Dim mytag() As String = con.Tag.ToString.Split(":")
            con.Width = mytag(0) * newx
            con.Height = mytag(1) * newy
            con.Left = mytag(2) * newx
            con.Top = mytag(3) * newy
            '计算字体缩放比例,缩放字体
            Dim currentSize As Single = newy * mytag(4)
            con.Font = New Font(con.Font.Name, currentSize, _
            con.Font.Style, con.Font.Unit)
            '如果是容器控件,则递归继续缩放
            If con.Controls.Count > 0 Then
                setControls(newx, newy, con)
            End If
        Next
    End Sub

End Class
menghuidaoxiang 2018-02-20
  • 打赏
  • 举报
回复
引用 3 楼 menghuidaoxiang 的回复:
[quote=引用 2 楼 From_TaiWan 的回复:] 按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件?
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015[/quote] 安装2015再看看
menghuidaoxiang 2018-02-20
  • 打赏
  • 举报
回复
引用 2 楼 From_TaiWan 的回复:
按理说,所有控件都继承自Control,都有Tag这个属性,难道有特别情况? lz放了哪些控件?
再看看 我什么控件都试过了,比如一个label控件,或者一个button控件,或者一个textbox控件,或者几个控件的混搭,都会出现这个问题,只有没控件才能运行,我在想是不是VS版本问题,我的VS2017 Community,而且怎么版本号是15.5.6,而官网上怎么才更新到15.5.5,而预览版本才是15.5.6,也就是他默认给我安装的预览版,我到时候回公司用其他电脑安装VS2015

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧