Per Code erzeugte Pictureboxen in einem TableLayoutPanel *ähh* wiederfinden?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von bondi.

    Per Code erzeugte Pictureboxen in einem TableLayoutPanel *ähh* wiederfinden?

    Moin Forum,

    mein Posting von Ende Mai hatte ich leider übereilt als "Erledigt" markiert. Seit dem google, lese und teste ich, ohne auf einen "grünen Zweig zu kommen". Erschwerend kommt hinzu, dass ich nur sehr rudimentäre Englisch-Kenntnisse besitze.

    Mein Formular enthält in einem SplitContainer (splSpielfeld) u. a. ein TableLayoutPanel (tblSpielfeld) mit 17 Zeilen und Spalten. Die äußeren vier Zeilen und Spalten werden benötigt, um gültige Züge und Kombinationen ermitteln zu können. Der sichtbare Bereich des TableLayoutPanel beträgt demnach nur neun Zeilen und Spalten.

    Der folgende Code erzeugt für jede Zelle des TableLayoutPanel eine Picturebox (pbxSpielstein), die - im sichtbaren Bereich - als Spielstein mit unterschiedlichen Motiven (imgSpielstein) darstellt wird. Das Array intSpielfeld enthält die dafür notwendigen numerischen Werte.

    Visual Basic-Quellcode

    1. Public Class frmSpielfeld
    2. ' datenfelder dimensionieren
    3. Dim intSpaltenversatz(3) As Integer
    4. Dim intSpielfeld(17, 17) As Integer
    5. Dim pbxSpielstein(17, 17) As PictureBox
    6. Dim intZeilenversatz(3) As Integer
    7. ' konstanten dimensionieren
    8. Const conSpiel_Dauer As Integer = 300
    9. Const conZelle_Unsichtbar As Integer = 99
    10. ' objekte dimensionieren
    11. Dim imgSpielstein As New Dictionary(Of Integer, Image)
    12. ...

    Visual Basic-Quellcode

    1. Private Sub Spielsteine_Generieren()
    2. ' variablen dimensionieren
    3. Dim intSpalte As Integer
    4. Dim intZeile As Integer
    5. ' alle zellen des spielfeldes durchlaufen
    6. For intSpalte = 1 To 17
    7. For intZeile = 1 To 17
    8. ' picturebox erzeugen
    9. pbxSpielstein(intSpalte, intZeile) = New PictureBox
    10. With pbxSpielstein(intSpalte, intZeile)
    11. ' pruefen, ob die aktuelle zelle des spielfeldes als unsichtbar gekennzeichnet ist
    12. If intSpielfeld(intSpalte, intZeile) = conZelle_Unsichtbar Then
    13. ' ja, daher eine unsichtbare picturebox generieren
    14. .AllowDrop = False
    15. .Height = 0
    16. .Tag = conZelle_Unsichtbar
    17. .Visible = False
    18. .Width = 0
    19. Else
    20. ' nein, daher eine sichtbare picturebox generieren
    21. .AllowDrop = True
    22. .Cursor = Cursors.Hand
    23. .Height = 72
    24. .Image = imgSpielstein(intSpielfeld(intSpalte, intZeile))
    25. .SizeMode = PictureBoxSizeMode.CenterImage
    26. .Tag = intSpielfeld(intSpalte, intZeile)
    27. .Visible = True
    28. .Width = 64
    29. ' addhandler hinzufuegen
    30. AddHandler .MouseDown, AddressOf Spielstein_MouseDown
    31. End If
    32. End With
    33. ' picturebox der aktuellen zelle des tablelayoutpanel hinzufuegen
    34. tblSpielfeld.Controls.Add(pbxSpielstein(intSpalte, intZeile), intZeile - 1, intSpalte - 1)
    35. Next
    36. Next
    37. End Sub

    Die Anzeige der generierten Pictureboxen funktioniert einwandfrei. Ich bin mir allerdings nicht sicher, ob der Code auch DragAndDrop-Geeignet ist. Wer mag ein oder zwei Auge(n) darauf werfen?

    Per DragAnd Drop sollen zwei Spielsteine ihre Plätze tauschen. Und damit kommen wir zu meinem Problem ...

    In der Sub Spielstein_MouseDown (Zeile 357) möchte ich u.a. die Koordinaten eines Spielsteines ermitteln. Mittlerweile bin ich von der Vielfalt der Fehlermeldungen regelrecht *hust* fasziniert. Ich habe leider nach wie vor keine Vorstellung, wie ich z. B. GetCellPosition, GetColumn, GetPositionFromControl oder auch GetRow mit - per Code erzeugten - Pictureboxen anwenden muss. Und es wird für mich auch nicht einfacher, wenn nach einem "tblSpielfeld.GetRow( )" bzw. einem " ... wurde kein Argument angegeben" u. a. auch ein AudioPlayMode in der Aufzählung enthalten ist.

    Ich gehe einfach einmal davon aus, dass ich z.B. ein "GetRow" auch ohne ein explizites "SetRow" nutzen kann. Schließlich gebe ich ja in der Zeile 361 auch die Koordinaten an.

    Wer mag etwas zu meiner Erleuchtung beitragen? *knicksmach*

    Gruß Peter
    Hmm? Ist das ein erster Funke zur Erleuchtung?

    Visual Basic-Quellcode

    1. Private Sub Spielstein_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    2. If e.Button = Windows.Forms.MouseButtons.Left Then
    3. Dim t1, t2 As Object
    4. t1 = tblSpielfeld.GetChildAtPoint(e.Location)
    5. Debug.Print(t1.ToString)
    6. t2 = tblSpielfeld.GetCellPosition(CType(t1, Control))
    7. Debug.Print(t2.ToString)
    8. End If
    9. End Sub

    t1 = System.Windows.Forms.PictureBox, SizeMode: CenterImage
    aber
    t2 = (immer) 4, 4 ... ganz egal, auf welche Picturebox ich klicke! *kopfkratz*

    bondi schrieb:

    Dim t1, t2 As Object
    Ich empfehle Dir, Dich mal mit Option Strict On auseinanderzusetzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Dim t1, t2 As Object
    Danach hatte ich eigentlich einen Bindungsfehler erwartet, der kommt aber nicht. :S
    Ich empfehle Dir allerdings, Variablen mit dem richtigen Typ zu verwenden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!