none
Problem mit Programmstrukturen RRS feed

  • Frage

  • Hallo zusammen, ich bin nicht gerade der Typ von Mensch der schon mehrere Jahre Erfahrung in VB hat, insgesamt hab ich schon nen rechner und einen editor programmiert, mithilfe von 2 Büchern.

    Nun wollte ich mich an etwas neues wagen. Mein Ziel ist es ein Schiffe versenken zu programmieren. Nun habe ich mehrere Probleme. Statt sie alle gleich rein zu posten, beginn ich mal mit dem ersten:

    Also, der User soll in Textboxen angeben wo er seine Schiffe platziert, dazu gibt er Zahlen von 1-25 ein. nun möchte ich die folgendermassen verbinden:

     

        Dim Gewinnzustand As Boolean
        Dim Looserzustand As Boolean
        Dim erstesSchiff As Integer
        Dim zweitesSchiff As Integer
        Dim drittesSchiff As Integer
        TextBox1.Text = erstesSchiff
        TextBox2.Text = zweitesSchiff
        TextBox3.Text = drittesSchiff
    
    
    
        Do While Gewinnzustand = True
    
         
    
          If CheckBox7.CheckState = CheckState.Indeterminate Then
            If CheckBox16.CheckState = CheckState.Indeterminate Then
              If CheckBox21.CheckState = CheckState.Indeterminate Then
                Gewinnzustand = True
              End If
            End If
          End If
    
          If CheckBox(erstesSchiff).CheckState = CheckState.Indeterminate Then
            If CheckBox(zweitesSchiff).CheckState = CheckState.Indeterminate Then
              If CheckBox(drittesSchiff).CheckState = CheckState.Indeterminate Then
                Looserzustand = True
              End If
            End If
          End If
    
          If Looserzustand = True Then
            Exit Do
          End If
    
    

    ihr seht die zweite if-abfrage ist ein wenig seltsam. Wenn der user die zahlen eingibt sollen diesen angeben welche checkbox gecheckt werden muss um zu verlieren.

    erstesSchiff, steht für den Standort.

    gibt der user also 15 in die erste checkbox ein so sollte es nachher so sein:

    checkbox(15), aber wie kann ich das checkbox element und die Variable verbinden???

    Mittwoch, 20. Oktober 2010 08:05

Antworten

  • Hallo,

    Nun wollte ich mich an etwas neues wagen. Mein Ziel ist es ein
    Schiffe versenken zu programmieren.
    Nun habe ich mehrere Probleme.
    Statt sie alle gleich rein zu posten, beginn ich mal mit dem ersten:

    Also, der User soll in Textboxen angeben wo er seine Schiffe platziert,
    dazu gibt er Zahlen von 1-25 ein.

    Die Beschreibung einer Position mit einfachen Zahlen ist eher
    etwas ungewöhnlich. Üblicherweise gibt man Position in einem
    X-Y-Koordinatensystem an, also z.B.

        X = Spalte_4
        Y = Zeile_B

    nun möchte ich die folgendermassen verbinden:

       Dim Gewinnzustand As Boolean
       Dim Looserzustand As Boolean
       Dim erstesSchiff As Integer
       Dim zweitesSchiff As Integer
       Dim drittesSchiff As Integer
       TextBox1.Text = erstesSchiff
       TextBox2.Text = zweitesSchiff
       TextBox3.Text = drittesSchiff

       Do While Gewinnzustand = True

    Wo ist das zugehörige Loop?

         If CheckBox7.CheckState = CheckState.Indeterminate Then
           If CheckBox16.CheckState = CheckState.Indeterminate Then
             If CheckBox21.CheckState = CheckState.Indeterminate Then
               Gewinnzustand = True
             End If
           End If
         End If

         If CheckBox(erstesSchiff).CheckState = CheckState.Indeterminate Then
           If CheckBox(zweitesSchiff).CheckState = CheckState.Indeterminate Then
             If CheckBox(drittesSchiff).CheckState = CheckState.Indeterminate Then
               Looserzustand = True
             End If
           End If
         End If

         If Looserzustand = True Then
           Exit Do
         End If

     ihr seht die zweite if-abfrage ist ein wenig seltsam.
    Wenn der user die zahlen eingibt sollen diesen angeben
    welche checkbox gecheckt werden muss um zu verlieren.

    Die Logik, welche hinter Deinen Checkboxen steckt, verstehe ich zwar
    nicht, aber ich vermute mal, dass es 25 CheckBoxen (CheckBox1 ...
    CheckBox25) auf Deiner Form gibt.

    Wenn Du diese nun über einen Index (1 ... 25, bzw. besser 0 ... 24)
    ansprechen willst, kannst Du Deine Checkboxen in eine ListOf(CheckBox)
    packen.

    erstesSchiff, steht für den Standort.

    gibt der user also 15 in die erste checkbox ein so sollte es
    nachher so sein:

    checkbox(15), aber wie kann ich das checkbox element und die
    Variable verbinden???

    Kopiere das nachfolgende Beispiel in ein leeres Formmodul (Form1.vb)

    ' / / /  Code in Form1.vb
    Public Class Form1
        Private CBoxList As List(Of CheckBox)
        Private WithEvents TextBox1 As TextBox
        Private WithEvents btnClear As Button
        Private mCBName As String

        Private Sub Form1_Load _
                    (ByVal sender As System.Object, _
                     ByVal e As System.EventArgs _
                    ) Handles MyBase.Load

            CreateControls()
        End Sub

        Private Sub CreateControls()
            CBoxList = New List(Of CheckBox)
            Dim i As Integer
            Dim CB As CheckBox = Nothing
            Dim Fnt As New Font("Arial", 12)
            Dim Top As Integer = 10
            Dim Left As Integer = 10
            mCBName = "CheckBox"
            For i = 1 To 25
                CB = New CheckBox
                With CB
                    .Name = mCBName & i.ToString
                    .Font = Fnt
                    .ThreeState = True
                    .CheckState = CheckState.Unchecked
                    .AutoSize = True
                    .Text = i.ToString.PadLeft(2, "0"c)
                    .CheckAlign = ContentAlignment.TopCenter
                    .Location = New Point(Left, Top)
                    If i Mod 5 = 0 Then
                        Top += 50
                        Left = 10
                    Else
                        Left += 50
                    End If
                End With
                Me.Controls.Add(CB)

                ' Checkbox der CBoxList hinzufügen
                CBoxList.Add(CB)
            Next

            TextBox1 = New TextBox
            With TextBox1
                .Name = "TextBox1"
                .Font = Fnt
                .TextAlign = HorizontalAlignment.Right
                .SetBounds(10, CB.Bottom + 20, 40, .Height)
            End With
            Me.Controls.Add(TextBox1)

            Me.ClientSize = _
                    New Size _
                    (CBoxList(4).Right + 10, _
                     TextBox1.Bottom + 10)

            Me.FormBorderStyle = _
                    Windows.Forms.FormBorderStyle.Fixed3D

            btnClear = New Button
            With btnClear
                .Name = "btnClear"
                .Font = New Font("Arial", 8)

                .SetBounds _
                        (Me.ClientSize.Width - 70, _
                         TextBox1.Top, _
                         60, _
                         TextBox1.Height)

                .Text = "Clear"
            End With
            Me.Controls.Add(btnClear)

        End Sub

        Private Sub TextBox_KeyPress _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.KeyPressEventArgs _
                ) Handles TextBox1.KeyPress

            If e.KeyChar = Chr(13) Then
                e.Handled = True
                SetCB(DirectCast(sender, TextBox))
            End If

        End Sub

        Private Sub SetCB(ByVal TB As TextBox)
            Dim Idx As Integer
            Dim CBox As CheckBox
            If Integer.TryParse(TB.Text, Idx) Then
                ' TB.Text enthält eine Zahlendarstellung (Integer).

                Select Case Idx
                    Case 1 To 25
                        ' gültige Nummern 1 ... 25

                        Idx -= 1
                        CBox = CBoxList(Idx)
                        If CBox.CheckState <> CheckState.Indeterminate Then
                            ' Checkbox hat noch nicht den Zustand .Indeterminate
                            CBox.CheckState = CheckState.Indeterminate
                            TB.SelectAll()
                            Exit Sub
                        End If
                End Select

            End If

            ' TB.Text enthält keine Zahlendarstellung (Integer)
            ' oder eine Zahl ausserhalb des Bereiches 1 ... 25
            ' oder hat bereits CheckState = Indeterminate
            TB.Text = ""
            Beep()
        End Sub

        Private Sub btnClear_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles btnClear.Click

            Dim CB As CheckBox
            For Each CB In CBoxList
                CB.CheckState = CheckState.Unchecked
                CB.Tag = Nothing
            Next
            TextBox1.Clear()
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit 25 CheckBoxen
    sowie einer Textbox (links unten) und einem Button "Clear" (rechts unten).

    Trage in die TextBox Zahlen im Bereich 1 ... 25 ein und drücke
    anschliessend die Eingabetaste. Die entsprechende Textbox
    wird damit auf CheckState = Indeterminate gestellt.

    Mit einem Klick auf den Button "Clear" werden alle Checkboxen
    wieder in den Zustand CheckState = UnChecked versetzt.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 20. Oktober 2010 14:26

Alle Antworten

  • Hallo,

    Nun wollte ich mich an etwas neues wagen. Mein Ziel ist es ein
    Schiffe versenken zu programmieren.
    Nun habe ich mehrere Probleme.
    Statt sie alle gleich rein zu posten, beginn ich mal mit dem ersten:

    Also, der User soll in Textboxen angeben wo er seine Schiffe platziert,
    dazu gibt er Zahlen von 1-25 ein.

    Die Beschreibung einer Position mit einfachen Zahlen ist eher
    etwas ungewöhnlich. Üblicherweise gibt man Position in einem
    X-Y-Koordinatensystem an, also z.B.

        X = Spalte_4
        Y = Zeile_B

    nun möchte ich die folgendermassen verbinden:

       Dim Gewinnzustand As Boolean
       Dim Looserzustand As Boolean
       Dim erstesSchiff As Integer
       Dim zweitesSchiff As Integer
       Dim drittesSchiff As Integer
       TextBox1.Text = erstesSchiff
       TextBox2.Text = zweitesSchiff
       TextBox3.Text = drittesSchiff

       Do While Gewinnzustand = True

    Wo ist das zugehörige Loop?

         If CheckBox7.CheckState = CheckState.Indeterminate Then
           If CheckBox16.CheckState = CheckState.Indeterminate Then
             If CheckBox21.CheckState = CheckState.Indeterminate Then
               Gewinnzustand = True
             End If
           End If
         End If

         If CheckBox(erstesSchiff).CheckState = CheckState.Indeterminate Then
           If CheckBox(zweitesSchiff).CheckState = CheckState.Indeterminate Then
             If CheckBox(drittesSchiff).CheckState = CheckState.Indeterminate Then
               Looserzustand = True
             End If
           End If
         End If

         If Looserzustand = True Then
           Exit Do
         End If

     ihr seht die zweite if-abfrage ist ein wenig seltsam.
    Wenn der user die zahlen eingibt sollen diesen angeben
    welche checkbox gecheckt werden muss um zu verlieren.

    Die Logik, welche hinter Deinen Checkboxen steckt, verstehe ich zwar
    nicht, aber ich vermute mal, dass es 25 CheckBoxen (CheckBox1 ...
    CheckBox25) auf Deiner Form gibt.

    Wenn Du diese nun über einen Index (1 ... 25, bzw. besser 0 ... 24)
    ansprechen willst, kannst Du Deine Checkboxen in eine ListOf(CheckBox)
    packen.

    erstesSchiff, steht für den Standort.

    gibt der user also 15 in die erste checkbox ein so sollte es
    nachher so sein:

    checkbox(15), aber wie kann ich das checkbox element und die
    Variable verbinden???

    Kopiere das nachfolgende Beispiel in ein leeres Formmodul (Form1.vb)

    ' / / /  Code in Form1.vb
    Public Class Form1
        Private CBoxList As List(Of CheckBox)
        Private WithEvents TextBox1 As TextBox
        Private WithEvents btnClear As Button
        Private mCBName As String

        Private Sub Form1_Load _
                    (ByVal sender As System.Object, _
                     ByVal e As System.EventArgs _
                    ) Handles MyBase.Load

            CreateControls()
        End Sub

        Private Sub CreateControls()
            CBoxList = New List(Of CheckBox)
            Dim i As Integer
            Dim CB As CheckBox = Nothing
            Dim Fnt As New Font("Arial", 12)
            Dim Top As Integer = 10
            Dim Left As Integer = 10
            mCBName = "CheckBox"
            For i = 1 To 25
                CB = New CheckBox
                With CB
                    .Name = mCBName & i.ToString
                    .Font = Fnt
                    .ThreeState = True
                    .CheckState = CheckState.Unchecked
                    .AutoSize = True
                    .Text = i.ToString.PadLeft(2, "0"c)
                    .CheckAlign = ContentAlignment.TopCenter
                    .Location = New Point(Left, Top)
                    If i Mod 5 = 0 Then
                        Top += 50
                        Left = 10
                    Else
                        Left += 50
                    End If
                End With
                Me.Controls.Add(CB)

                ' Checkbox der CBoxList hinzufügen
                CBoxList.Add(CB)
            Next

            TextBox1 = New TextBox
            With TextBox1
                .Name = "TextBox1"
                .Font = Fnt
                .TextAlign = HorizontalAlignment.Right
                .SetBounds(10, CB.Bottom + 20, 40, .Height)
            End With
            Me.Controls.Add(TextBox1)

            Me.ClientSize = _
                    New Size _
                    (CBoxList(4).Right + 10, _
                     TextBox1.Bottom + 10)

            Me.FormBorderStyle = _
                    Windows.Forms.FormBorderStyle.Fixed3D

            btnClear = New Button
            With btnClear
                .Name = "btnClear"
                .Font = New Font("Arial", 8)

                .SetBounds _
                        (Me.ClientSize.Width - 70, _
                         TextBox1.Top, _
                         60, _
                         TextBox1.Height)

                .Text = "Clear"
            End With
            Me.Controls.Add(btnClear)

        End Sub

        Private Sub TextBox_KeyPress _
                (ByVal sender As Object, _
                 ByVal e As System.Windows.Forms.KeyPressEventArgs _
                ) Handles TextBox1.KeyPress

            If e.KeyChar = Chr(13) Then
                e.Handled = True
                SetCB(DirectCast(sender, TextBox))
            End If

        End Sub

        Private Sub SetCB(ByVal TB As TextBox)
            Dim Idx As Integer
            Dim CBox As CheckBox
            If Integer.TryParse(TB.Text, Idx) Then
                ' TB.Text enthält eine Zahlendarstellung (Integer).

                Select Case Idx
                    Case 1 To 25
                        ' gültige Nummern 1 ... 25

                        Idx -= 1
                        CBox = CBoxList(Idx)
                        If CBox.CheckState <> CheckState.Indeterminate Then
                            ' Checkbox hat noch nicht den Zustand .Indeterminate
                            CBox.CheckState = CheckState.Indeterminate
                            TB.SelectAll()
                            Exit Sub
                        End If
                End Select

            End If

            ' TB.Text enthält keine Zahlendarstellung (Integer)
            ' oder eine Zahl ausserhalb des Bereiches 1 ... 25
            ' oder hat bereits CheckState = Indeterminate
            TB.Text = ""
            Beep()
        End Sub

        Private Sub btnClear_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles btnClear.Click

            Dim CB As CheckBox
            For Each CB In CBoxList
                CB.CheckState = CheckState.Unchecked
                CB.Tag = Nothing
            Next
            TextBox1.Clear()
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit 25 CheckBoxen
    sowie einer Textbox (links unten) und einem Button "Clear" (rechts unten).

    Trage in die TextBox Zahlen im Bereich 1 ... 25 ein und drücke
    anschliessend die Eingabetaste. Die entsprechende Textbox
    wird damit auf CheckState = Indeterminate gestellt.

    Mit einem Klick auf den Button "Clear" werden alle Checkboxen
    wieder in den Zustand CheckState = UnChecked versetzt.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 20. Oktober 2010 14:26
  • Hallo nochmal,

    im vorigen Posting muss es statt

        Trage in die TextBox Zahlen im Bereich 1 ... 25 ein und drücke
        anschliessend die Eingabetaste. Die entsprechende Textbox
        wird damit auf CheckState = Indeterminate gestellt.

    natürlich

        Trage in die TextBox Zahlen im Bereich 1 ... 25 ein und drücke
        anschliessend die Eingabetaste. Die entsprechende CheckBox
        wird damit auf CheckState = Indeterminate gestellt.

    heissen.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 20. Oktober 2010 14:44
  • Hallo Herr Götz erst einmal danke für die Hilfe, ich bin völlig beindruckt wie Sie das so schnell gemacht haben, jedenfalls habe ich keine Ahnung wie ich sonst darauf gekommen wäre.

    Ich hab zwar mit 2 Büchern( vb für dummies/ eine studienausgabe) das wichtigste erlernt, aber so wie ich das sehe komme ich mit denen nicht weiter. Deshalb die Frage: Wie kann ich sonst so etwas erlernen. Tutorials im Internet sind zwar gut und recht, doch auch durch sie erlerne ich nicht die Kunst von Visual Basic- Programmierung. Kein Mensch den ich kenne hat irgendwie ahnung von visual basic, meine mutter hat monatelang gedacht, visual basic sei bildbearbeitung. ich komme so nicht weiter..

    Bitte helfen sie mir, wie kann ich wirklich vb lernen??

     

    Hochachtungsvoll

    Joel Frischknecht

    Donnerstag, 21. Oktober 2010 11:25
  • http://openbook.galileocomputing.de/visualbasic_2008/

    Hallo Joel,

    Buchtip von mir.

    schöne Grüße Ellen

     

     

     


    Ich benutze/ I'm using VB2008 & VB2010
    Donnerstag, 21. Oktober 2010 12:00
  • Hallo Joel,

    Hallo Herr Götz erst einmal danke für die Hilfe,

    Bitteschön, freut mich, wenn ich helfen konnte.

    ich bin völlig beindruckt wie Sie das so schnell gemacht
    haben, jedenfalls habe ich keine Ahnung wie ich sonst
    darauf gekommen wäre.

    Mit ein wenig Erfahrung ist das wirklich nur eine Sache
    von wenigen Minuten.

    Ich hab zwar mit 2 Büchern( vb für dummies/ eine studienausgabe)
    das wichtigste erlernt, aber so wie ich das sehe komme ich
    mit denen nicht weiter. Deshalb die Frage: Wie kann ich sonst
    so etwas erlernen.

    MSDN, also die Online-Hilfe zu VS.net ist "die" umfassende
    Informationsquelle (auch für mich).
    Die von Dir genannten Bücher kenne ich nicht und kann mir
    deshalb darüber kein Urteil erlauben.

    Für den Einstieg kann ich auf die Bücher von Klaus Löffelmann,
    die bei Microsoft Press erscheinen, verweisen. Das

        Entwicklerbuch
        Microsoft
        Visual Basic 20..
        Grundlagen, Techniken, Profi-Know-how

    gibt es z.B. für Visual Basic 2010 und auch frühere Versionen
    von VB.net. Die Anwendung der wichtigsten Objekte des .net-
    Frameworks wird darin an einfachen, gut überschaubaren
    Beispielen gezeigt und es wird auch vermittelt, wie Objekt-
    orientierung und Ereignissteuerung in eigenen Projekten zur
    Anwendung kommen sollten.

        Microsoft Visual Basic 2005 - Das Entwicklerbuch

    gibt es z.B. auch als kostenlosen Download unter
    http://www.microsoft.com/germany/msdn/aktuell/news/microsoftvisualbasic2005dasentwicklerbuch.mspx

    auch das Buch für die Version 2008

        Visual Basic 2008 - Das Entwicklerbuch

    gibt es als kostenlosen Download unter
    http://www.microsoft.com/germany/msdn/aktuell/news/microsoftvisualbasic2008dasentwicklerbuch.mspx

    Ansonsten ist es immer gut, wenn man jemanden hat, der
    einen beim Einstieg in die Programmierung bei der Hand
    nimmt.

    Tutorials im Internet sind zwar gut und recht,

    Ja, es gibt solche, die "gut und recht" sind, aber das muss man
    leider auch wissen, es gibt viele, denen man dieses Attribut
    eher nicht verleihen möchte.

    doch auch durch sie erlerne ich nicht die Kunst von Visual Basic-
    Programmierung.

    Na ja, als "Kunst" würde ich das dann doch nicht gleich
    bezeichnen wollen. Es ist ein Handwerk wie viele andere
    auch und man muss es eben von Grund auf erlernen, was
    ja auch für jedes andere Handwerk zutrifft.

    Kein Mensch den ich kenne hat irgendwie ahnung von visual basic,

    Dann kennst Du offenbar nicht die richtigen Menschen. ;-)

    In diesem und in anderen Foren und/oder Newsgroups zum
    Thema Visual Basic gibt es eine Menge Leute, die ihr über
    Jahre erworbenes Wissen gerne an andere weiter geben.

    meine mutter hat monatelang gedacht, visual basic sei
    bildbearbeitung.

    So ganz falsch liegt sie damit doch gar nicht. Zumindest
    hat sie schon mal die Idee, dass VB was mit Datenverarbeitung
    zu tun hat. ;-)

    ich komme so nicht weiter..
    Bitte helfen sie mir, wie kann ich wirklich vb lernen??

    Wie schon oben erwähnt, ist die wichtigste Informationsquelle
    hierfür die MSDN-Library, die auch die Grundlage für die
    Online-Hilfe zum Visual Studio ist. Neben der detaillierten
    Dokumentation aller Objekte aus dem .net-Framework findet
    man darin auch jede Menge an Codebeispielen, die einem
    die Verwendung dieser Objekte mit ihren Eigenschaften und
    Methoden nahebringen.

    Man darf nur nicht glauben, man könnte VB.net oder irgendeine
    andere Programmiersprache in wenigen Tagen oder gar Stunden
    erlernen. Im .net-Framework gibt es viele tausend Objekte mit einer
    Vielzahl von Eigenschaften und Methoden. Dies alles kennenzulernen
    braucht nun mal seine Zeit. Selbst ein sehr erfahrener Entwickler
    wird kaum von sich behaupten können, auch nach Jahren schon
    alle Objekte des .net-Frameworks umfassend zu kennen.

    Hier im Forum hast Du ja schon mal eine Stelle gefunden, an der
    Du Deine Fragen zum Thema VB.net loswerden kannst und ich
    bin hier nicht einzige, der Dir gerne weiterhilft. Die meisten MVPs,
    die hier im Forum Fragen beantworten, betreiben auch eigene
    Web-Sites, auf denen Du weitere Informationen zum Thema VB.net
    findest. So z.B. auf meiner Internetpräsenz

        www.gssg.de
        -> Visual Basic

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 21. Oktober 2010 12:12
  • ok vielen dank

     

    hab die 2008er version des buchs schon runtergeladen, freue mich bereits auf das "Studium"

     

    lg Joel Frischknecht

    Donnerstag, 21. Oktober 2010 12:39
  • Hallo Joel,

    hab die 2008er version des buchs schon runtergeladen,
    freue mich bereits auf das "Studium"

    Es empfielt sich evtl. auch die 2005er Version zu lesen,
    darin gibt es div. Hinweise für den Umstieg von VBclassic
    (V65/6) nach VB.net, die in der 2008er Version nicht mehr
    enthalten sind.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Donnerstag, 21. Oktober 2010 16:00