2017-02-01 6 views
0

私はハングマンアプリケーションを作成しようとしていますが、何らかの理由で私は単語を得ることができません。正しく表示するには「推測」する必要があります。ループの中でわかるように、すべての反復で新しいラベルが作成されます。ラベルのtextプロパティはw​​ordLetterとして定義されたwordStringの文字として設定されます。新しいラベルのすべてのプロパティが設定されると、それがフォームに追加され、ポイントはラベルの下に線を描くように定義され、xAxis(前のラベルの右に次のラベルを配置するために使用されます)とiが繰り返されます。問題は、最初のラベルのみが表示されるか、wordString "PROGRAM"の "P"です。ループを繰り返すたびに、同じ名前の新しいラベル「wordLabel」が作成され、新しいラベルが作成されないためです。私はこれを回避する方法がわかりません。配列を使用したとしても、すべての繰り返しで新しいラベルを作成する必要があります。ループの繰り返しごとに新しいラベルを追加する

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」は、コントロール名ではなく、変数名です。複製しても問題は発生しませんが、コントロールへの参照が失われているため、後で問題が発生する可能性があります。私はあなたの問題は、各ラベルの間に3ピクセルのスペースしか入れていない可能性があると思います。彼らはおそらくお互いの上に描いています。 –

+0

1つのラベルに文字を追加する代わりに、複数のラベルを使用する理由はありますか? –

+0

@AhmedAbdelhameed私は、Comic Sansがモノスペースではないということで、各レターの下線の位置をより良くすることができると考えています。 –

答えて

1

これはあなたのために働く必要があります。 前のラベルの最後の左の位置を保持します。

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

繰り返しごとに新しい 'Font'を作成するのは避けるべきです。一度作成して再利用してください。私は今100%肯定的ではありませんが、私は*フォントがIDisposableだと思っています。 –

+0

注目!毎回新しいフォントを作成することの欠点は何ですか?私は全く気づかない。 –

+0

フォントには、アンマネージドリソース、特にGDIフォントハンドルが含まれています。 OSは、アプリケーションをあきらめてクラッシュさせる前に、限られた数のGDIオブジェクトに対するハンドルしか追跡できません。必要な最小限の数値を作成し、適切に処理する描画オブジェクト( 'Pen'、' Brush'、 'Font'、' Bitmap'など)には非常に注意する必要があります。そうしないと、重大なパフォーマンス上の問題が発生する可能性があります。また、OSのハンドルが不足すると「ランダム」クラッシュが発生する可能性があります。 –

関連する問題