Vb.net 在每个循环迭代中添加新标签

Vb.net 在每个循环迭代中添加新标签,vb.net,visual-studio-2015,Vb.net,Visual Studio 2015,我正试图申请绞刑,但无论出于什么原因,我都无法得到这个词,你必须“猜”才能正确地显示出来。正如您在循环中看到的,每次迭代都会创建一个新标签。标签的文本属性设置为wordString的字符,定义为wordLetter。设置新标签的所有属性后,将其添加到表单中,定义点以在标签下方绘制一条线,并迭代xAxis(用于将下一个标签放置到上一个标签的右侧)和i。问题是,只有第一个标签显示出来,或者是单词字符串“PROGRAM”中的“P”。我相信这是因为每次我迭代循环时,都会创建一个同名的新标签“wordLa

我正试图申请绞刑,但无论出于什么原因,我都无法得到这个词,你必须“猜”才能正确地显示出来。正如您在循环中看到的,每次迭代都会创建一个新标签。标签的文本属性设置为wordString的字符,定义为wordLetter。设置新标签的所有属性后,将其添加到表单中,定义点以在标签下方绘制一条线,并迭代xAxis(用于将下一个标签放置到上一个标签的右侧)和i。问题是,只有第一个标签显示出来,或者是单词字符串“PROGRAM”中的“P”。我相信这是因为每次我迭代循环时,都会创建一个同名的新标签“wordLabel”,从而阻止创建新标签。我不知道该如何解决这个问题;即使我使用了一个数组,我仍然必须在每次迭代中创建一个新标签

Dim点1,点2作为点
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
作为整数的Dim i
Dim wordString As String=“PROGRAM”
将单词字母变暗为字符串
作为整数的Dim xAxis
当我
这应该适合您。 它保留上一个标签的最后一个左位置

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        BuildHangman("PROGRAM")
    Catch ex As Exception
        MessageBox.Show(String.Concat("An error occurred: ", ex.Message))
    End Try
End Sub

Private Sub BuildHangman(wordString As String)

    Dim i As Integer
    Dim wordLetter As String
    Dim lastLeft As Integer

    Dim sensibleFont As New Font("Segoe UI", 25)

    Do While i < wordString.Length

        Dim wordLabel As New Label

        wordLetter = wordString.Chars(i)
        wordLabel.Font = sensibleFont
        wordLabel.AutoSize = True
        wordLabel.Text = wordLetter
        wordLabel.BackColor = Color.Transparent
        wordLabel.Location = New System.Drawing.Point(lastLeft + 7, 190)

        Me.Controls.Add(wordLabel)

        lastLeft = wordLabel.Left + wordLabel.Width

        i += 1

    Loop

End Sub
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
尝试
建筑刽子手(“计划”)
特例
Show(String.Concat(“发生错误:”,ex.Message))
结束尝试
端接头
私有子构建库管理员(wordString作为字符串)
作为整数的Dim i
将单词字母变暗为字符串
将左整数设置为整数
暗淡的敏感字体为新字体(“Segoe UI”,25)
当我
wordLabel
是变量名,而不是控件名。复制它不会导致您看到的问题,但是您正在丢失对控件的引用,这可能会在以后导致问题。我认为你的问题可能是你在每个标签之间只放置了3个像素的空间。他们很可能是在互相重叠。你有理由使用多个标签而不是将字母附加到一个标签上吗?@AhmedAbdelhameed我猜这会让他更好地定位每个字母的下划线,因为连环画不是单间距的。请记住,每次迭代都应该避免创建新的
字体。创建一次,然后重用它。我现在不是100%肯定,但我认为字体是可识别的!每次创建新字体的缺点是什么?我完全不知道。字体包含非托管资源,特别是GDI字体句柄。在操作系统放弃并崩溃应用程序之前,它只能跟踪GDI对象的有限数量的句柄。对于创建的任何图形对象(
画笔
画笔
字体
位图
,等等),必须非常小心,以确保创建所需的最小数量并正确处理它们。如果您不这样做,您可能会有严重的性能问题,或者在操作系统的句柄用完时“随机”崩溃。这可能不是这个特定代码的严重问题,因为对象的数量受最大字长的限制,但是正确管理和清理GDI对象是一个很好的习惯,可以尽早开始。谢谢。有用的信息。我会相应地更新答案。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        BuildHangman("PROGRAM")
    Catch ex As Exception
        MessageBox.Show(String.Concat("An error occurred: ", ex.Message))
    End Try
End Sub

Private Sub BuildHangman(wordString As String)

    Dim i As Integer
    Dim wordLetter As String
    Dim lastLeft As Integer

    Dim sensibleFont As New Font("Segoe UI", 25)

    Do While i < wordString.Length

        Dim wordLabel As New Label

        wordLetter = wordString.Chars(i)
        wordLabel.Font = sensibleFont
        wordLabel.AutoSize = True
        wordLabel.Text = wordLetter
        wordLabel.BackColor = Color.Transparent
        wordLabel.Location = New System.Drawing.Point(lastLeft + 7, 190)

        Me.Controls.Add(wordLabel)

        lastLeft = wordLabel.Left + wordLabel.Width

        i += 1

    Loop

End Sub