2017-02-01 2 views
0

Ich versuche eine Hangman-Anwendung zu erstellen, aber aus welchen Gründen auch immer kann ich nicht das Wort bekommen, das Sie "raten" müssen, um richtig zu zeigen. Wie Sie in der Schleife sehen können, wird bei jeder Iteration ein neues Label erstellt. Die Texteigenschaft des Labels wird als ein Zeichen von wordString definiert, das als wordLetter definiert ist. Sobald alle Eigenschaften des neuen Labels festgelegt sind, wird es dem Formular hinzugefügt, Punkte werden definiert, um eine Linie unter dem Label zu zeichnen, und xAxis (wird verwendet, um das nächste Label rechts von dem vorherigen zu platzieren) und i werden iteriert. Das Problem ist, nur das erste Label erscheint, oder "P" aus dem WordString "PROGRAM". Ich glaube, das liegt daran, dass jedes Mal, wenn ich die Schleife wiederhole, ein neues Label mit demselben Namen "wordLabel" erstellt wird, das verhindert, dass neue Labels erstellt werden. Ich bin nicht sicher, wie ich das umgehen soll. selbst wenn ich ein Array verwenden würde, müsste ich bei jeder Iteration ein neues Label erstellen.Hinzufügen eines neuen Labels bei jeder Schleifeniteration

The result

Dim point1, point2 As Point 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim i As Integer 

    Dim wordString As String = "PROGRAM" 
    Dim wordLetter As String 
    Dim xAxis As Integer 

    Do While i < wordString.Length 
     Dim wordLabel As New Label 

     wordLetter = wordString.Chars(i) 

     wordLabel.Font = New Font("Comic Sans MS", 25) 
     wordLabel.AutoSize = True 
     wordLabel.Text = wordLetter 
     wordLabel.BackColor = Color.Transparent 
     wordLabel.Location = New System.Drawing.Point(xAxis + 7, 190) 

     Me.Controls.Add(wordLabel) 

     point1.X = Convert.ToInt32(wordLabel.Location.X) - 10 
     point1.Y = Convert.ToInt32(wordLabel.Location.Y) + 40 

     point2.X = Convert.ToInt32(wordLabel.Size.Width) - 13 
     point2.Y = Convert.ToInt32(wordLabel.Location.Y) + 40 

     xAxis += 3 
     i += 1 

    Loop 
End Sub 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint 

    e.Graphics.DrawLine(Pens.Black, point1, point2) 

End Sub 
+0

'wordLabel' ist Ihr Variablenname, nicht der Kontrollname. Duplizieren, das das Problem, das du siehst, nicht verursacht, aber du * verlierst * den Verweis auf das Steuerelement, was wahrscheinlich später Probleme verursachen wird. Ich denke, Ihr Problem besteht möglicherweise darin, dass Sie nur 3 Pixel Abstand zwischen den einzelnen Etiketten setzen. Sie ziehen sich wahrscheinlich übereinander. –

+0

Gibt es einen Grund, mehrere Etiketten zu verwenden, anstatt die Buchstaben an ein Etikett anzuhängen? –

+0

@AhmedAbddelhameed Meine Vermutung ist, dass es ihm ermöglicht, besser auf den Unterstreichungen für jeden Buchstaben zu positionieren, da Comic Sans nicht mono-spaced ist. –

Antwort

1

Dies sollte für Sie arbeiten. Es behält die letzte linke Position des vorherigen Etiketts.

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 
+1

Beachten Sie, dass das Erstellen eines neuen 'Font' bei jeder Iteration vermieden werden sollte. Erstellen Sie es einmal und verwenden Sie es erneut. Ich bin momentan nicht 100% positiv, aber ich denke * Schrift ist 'IDisposable'. –

+0

Bekannt! Was ist der Nachteil, wenn Sie jedes Mal eine neue Schriftart erstellen? Ich bin mir völlig unbewusst. –

+0

Schriftarten enthalten nicht verwaltete Ressourcen, insbesondere eine GDI-Schriftart. Das Betriebssystem kann nur eine begrenzte Anzahl von Handles für GDI-Objekte verfolgen, bevor es aufgibt und Ihre Anwendung abstürzt. Sie müssen sehr vorsichtig mit jedem Zeichnungsobjekt sein, das Sie erstellen ('Pen',' Brush', 'Font',' Bitmap', etc ...), dass Sie die erforderliche Mindestanzahl erstellen und diese ordnungsgemäß entsorgen. Wenn Sie dies nicht tun, können schwerwiegende Leistungsprobleme oder ein "zufälliger" Absturz auftreten, da das Betriebssystem keine Handles mehr hat. –

Verwandte Themen