Jag har ett litet problem. Nu var det länge sedan jag använde VB, men jag vill minnas att man kan ge kontroller "matrisnamn", dvs PictureBox(1), ..., PictureBox(5) i stället för PictureBox1, ..., PictureBox5 samt CheckBox(1), ..., CheckBox(5) i stället för CheckBox1, ..., CheckBox5. I VB icke-.Net gick det att ha "arraynamn" på kontrollerna, men tydligen inte i .Net. Varför inte göra varje tärning som en egen usercontrol. Sen t.ex. ha en metod som heter typ Roll eller nåt.. VB.Net har ju som nämnts inte controlarrayer, vilket kan vara störande ibland.5 Tärningar i vb.net
Jag har en väldigt lång kod för att kasta tärningar och spara dem i en matris.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
GroupBox1.Enabled = True
PictureBox1.Visible = True
PictureBox2.Visible = True
PictureBox3.Visible = True
PictureBox4.Visible = True
PictureBox5.Visible = True
If index = 2 Then
Button1.Enabled = False
End If
antal_kast(index, 0) = 1
index = index + 1
If CheckBox1.Checked = True Then
Else
t1 = Int((1 + 6 * Rnd()))
Select Case t1
Case 1
PictureBox1.Image() = System.Drawing.Image.FromFile("1.jpg")
Case 2
PictureBox1.Image() = System.Drawing.Image.FromFile("2.jpg")
Case 3
PictureBox1.Image() = System.Drawing.Image.FromFile("3.jpg")
Case 4
PictureBox1.Image() = System.Drawing.Image.FromFile("4.jpg")
Case 5
PictureBox1.Image() = System.Drawing.Image.FromFile("5.jpg")
Case 6
PictureBox1.Image() = System.Drawing.Image.FromFile("6.jpg")
End Select
End If
' Om checkbox är checkad så händer ingenting
If CheckBox2.Checked = True Then
Else
'Annars randomar den tärningen
t2 = Int((1 + 6 * Rnd()))
Select Case t2
Case 1
PictureBox2.Image() = System.Drawing.Image.FromFile("1.jpg")
Case 2
PictureBox2.Image() = System.Drawing.Image.FromFile("2.jpg")
Case 3
PictureBox2.Image() = System.Drawing.Image.FromFile("3.jpg")
Case 4
PictureBox2.Image() = System.Drawing.Image.FromFile("4.jpg")
Case 5
PictureBox2.Image() = System.Drawing.Image.FromFile("5.jpg")
Case 6
PictureBox2.Image() = System.Drawing.Image.FromFile("6.jpg")
End Select
End If
' Om checkbox är checkad så händer ingenting
If CheckBox3.Checked = True Then
Else
'Annars randomar den tärningen
t3 = Int((1 + 6 * Rnd()))
Select Case t3
Case 1
PictureBox3.Image() = System.Drawing.Image.FromFile("1.jpg")
Case 2
PictureBox3.Image() = System.Drawing.Image.FromFile("2.jpg")
Case 3
PictureBox3.Image() = System.Drawing.Image.FromFile("3.jpg")
Case 4
PictureBox3.Image() = System.Drawing.Image.FromFile("4.jpg")
Case 5
PictureBox3.Image() = System.Drawing.Image.FromFile("5.jpg")
Case 6
PictureBox3.Image() = System.Drawing.Image.FromFile("6.jpg")
End Select
End If
' Om checkbox är checkad så händer ingenting
If CheckBox4.Checked = True Then
Else
'Annars randomar den tärningen
t4 = Int((1 + 6 * Rnd()))
Select Case t4
Case 1
PictureBox4.Image() = System.Drawing.Image.FromFile("1.jpg")
Case 2
PictureBox4.Image() = System.Drawing.Image.FromFile("2.jpg")
Case 3
PictureBox4.Image() = System.Drawing.Image.FromFile("3.jpg")
Case 4
PictureBox4.Image() = System.Drawing.Image.FromFile("4.jpg")
Case 5
PictureBox4.Image() = System.Drawing.Image.FromFile("5.jpg")
Case 6
PictureBox4.Image() = System.Drawing.Image.FromFile("6.jpg")
End Select
End If
' Om checkbox är checkad så händer ingenting
If CheckBox5.Checked = True Then
Else
'Annars randomar den tärningen
t5 = Int((1 + 6 * Rnd()))
Select Case t5
'Om det blir 1 så visar den bild 1 etc.
Case 1
PictureBox5.Image() = System.Drawing.Image.FromFile("1.jpg")
Case 2
PictureBox5.Image() = System.Drawing.Image.FromFile("2.jpg")
Case 3
PictureBox5.Image() = System.Drawing.Image.FromFile("3.jpg")
Case 4
PictureBox5.Image() = System.Drawing.Image.FromFile("4.jpg")
Case 5
PictureBox5.Image() = System.Drawing.Image.FromFile("5.jpg")
Case 6
PictureBox5.Image() = System.Drawing.Image.FromFile("6.jpg")
End Select
End If
Finns det något sätt att förminska denna kod?Sv: 5 Tärningar i vb.net
I så fall borde du kunna förenkla koden avsevärt.Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
GroupBox1.Enabled = True
For i = 1 To 5
PictureBox(i).Visible = True
End For
If index = 2 Then
Button1.Enabled = False
End If
antal_kast(index, 0) = 1
index = index + 1
For i = 1 To 5
If Not CheckBox(i).Checked Then
t = Int((1 + 6 * Rnd()))
PictureBox(i).Image = System.Drawing.Image.FromFile(t & ".jpg")
End If
End For
Sv: 5 Tärningar i vb.net
Exempel från icke-.Net:
http://www.officecomputertraining.com/vbtutorial/tutpages/page22.asp#control
Du kan läsa om hur man gör i stället i .Net:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconcontrolarraychangesinvisualbasicnet.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/controlarrays.aspSv: 5 Tärningar i vb.net
Då skulle du bara behöva ha typ dice1.Roll() istllet för alla din kontroller med att sätta dina bilder etc...
dessutom är
If CheckBox4.Checked = True Then
Else
Kanske inte så snyggt utan du kan istället göra
If Not CheckBox4.Checked Then
Sv:5 Tärningar i vb.net
Men istället kan man äntligen skapa dessa dynamiskt på vanligt sätt med new utan att behöva en baskontroll eller createobject.
Skapa en array av Checkboxar och en av Pictureboxar.
Fyll dessa sedan antingen med new och placera ut dem i kod eller designa formen på vanligt sätt och tilldela arrayerna referenser till kontrollerna.
Sedan går själva tärningsslagandet enkelt i en liten loop.
<code>
Public Class Form1
Inherits System.Windows.Forms.Form
Private chkDice(4) As CheckBox
Private picDice(4) As PictureBox
Private WithEvents cmdRoll As Button
Const cDynCtrls As Boolean = True
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
If cDynCtrls Then
' Skapa kontrollerna dynamiskt
Dim iI As Integer
For iI = 0 To 4
chkDice(iI) = New CheckBox
picDice(iI) = New PictureBox
chkDice(iI).Parent = Me
picDice(iI).Parent = Me
chkDice(iI).Left = 20
chkDice(iI).Top = 20 + iI * 80
chkDice(iI).Text = iI + 1
picDice(iI).Height = 50
picDice(iI).Width = 50
picDice(iI).Left = 20
picDice(iI).Top = chkDice(iI).Top + 25
picDice(iI).BorderStyle = BorderStyle.Fixed3D
Next
cmdRoll = New Button
cmdRoll.Parent = Me
cmdRoll.Left = 20
cmdRoll.Top = picDice(4).Top + picDice(4).Height + 10
cmdRoll.Text = "Roll"
Else
' eller använd statiskt skapade kontroller
chkDice(0) = CheckBox1
chkDice(1) = CheckBox2
chkDice(2) = CheckBox3
chkDice(3) = CheckBox4
chkDice(4) = CheckBox5
picDice(0) = PictureBox1
picDice(1) = PictureBox2
picDice(2) = PictureBox3
picDice(3) = PictureBox4
picDice(4) = PictureBox5
End If
End Sub
.
.
.
.
Private Sub Roll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRoll.Click, Button1.Click
Dim iI As Integer
Dim iRes As Integer
For iI = 0 To 4
If Not chkDice(iI).Checked Then
iRes = Int((1 + 6 * Rnd()))
picDice(iI).Image() = System.Drawing.Image.FromFile(iRes.ToString & ".jpg")
End If
Next
End Sub
</code>