Wie das Click Ereignis feststellen?

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Vatter.

    Wie das Click Ereignis feststellen?

    Also, ich habe mit folgendem Code eine Art Spielfeld von 20 mal 20 Pictureboxen ausgegeben, soweit, so gut. Aber wie muss ich jetzt vorgehen, wenn ich z.B. eine der PictureBoxen anklicke, dass ich dann erfahre, welchen Index die hat? Also ich klicke Zeile 2, Kästchen 2 an und würde dann gerne irgendwie erfahren, das es a) angeklickt wurde, sowie b) es sich dabei um Kästchen 21 handelt.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim xPos, yPos As Integer
    3. Dim myLevel(399) As PictureBox
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. yPos = 10
    6. xPos = 10
    7. For i As Integer = 0 To 399
    8. myLevel(i) = New PictureBox
    9. myLevel(i).Image = PictureBox1.Image
    10. myLevel(i).Left = xPos
    11. myLevel(i).Top = yPos
    12. myLevel(i).Height = 25
    13. myLevel(i).Width = 25
    14. myLevel(i).SizeMode = PictureBoxSizeMode.Zoom
    15. xPos = xPos + 25 : If xPos >= 500 Then xPos = 10 : yPos = yPos + 25
    16. Controls.Add(myLevel(i))
    17. Next
    18. End Sub
    19. End Class
    da würd ich an deiner stelle erst zusätzlich einen namen übergeben

    VB.NET-Quellcode

    1. myLevel(i).Name = i.ToString


    danach eine funktion erstellen, die aufgerufen wird, wenn das click-event ausgelöst wird

    VB.NET-Quellcode

    1. Private Sub PicBox_Click(ByVal sender As Object, ByVal e As EventArgs)
    2. MessageBox.Show(DirectCast(sender, PictureBox).Name.ToString)
    3. End Sub


    und als letztes den ganzen PictureBoxes sag, was sie tun sollen, wenn ein bestimmtes event ausgelöst wird (hier "click")

    VB.NET-Quellcode

    1. AddHandler myLevel(i).Click, AddressOf PicBox_Click


    damit bekommst du dann jeweils den namen (also den index) der entsprechenden PicBox ausgegeben.
    Alternativ zu Lordknoblauch löse ich sowas immer mit einer Klasse "Spielfeld". Diese würde bei dir von Picturebox erben. Beim Erzeugen der Instanz würde ich 2 geschachtelte For-Schleifen verwenden (Zeile und Spalte) und diese Numerierung als Property dem Spielfeld übergeben. Das kann dann die Location an Hand Spalte*Breite und Zeile*Höhe allein ausrechnen (evtl. einen kleinen Abstand einbeziehen).
    Später hast du dann die Positionsproperty als Eigenschaft auch im Clickevent zu deiner Verfügung. Außerdem kannst du dieser Klasse weitere Eigenschaften geben, die dein Spielfeld alleine verwaltet. Die Form brauch sich dann um sowas nich mehr zu kümmern.
    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Mkay, mit der Antwort von lordknoblauch kann ich schon was anfangen. Danke dafür.. ^^

    Aber was Vatter mir zu sagen versucht, entzieht sich mir leider völlig. Ich bezweifle zwar nicht, das du mit der beschriebenen Vorgehensweise eine gute Antwort gegeben hast, aber würdest du dir eventuell die Mühe machen, mir das detaillierter, also quasi Step für Step zu erklären? Oder mir vielleicht einen Tipp geben, wo ich diese Techniken verständlich nahegebracht bekommen kann?

    Ich mein, ich werd jetzt nicht wegen jedem Kram im Forum fragen, bin ja durchaus lernfähig und Ideenreich, aber hier habe ich allenfalls eine vage Ahnung wovon du sprichst und garkeine, wie ich es umsetzen soll. ;(

    MfG Unwesen
    OK,
    werd ich gern versuchen.
    -Also eine neue Klasse mit Namen "Spielstein" anlegen. das ist nachher deine Picturebox auf deinem Spielfeld.
    -mit Inherits von Picturebox erben. Damit verfügt deine Klasse über alle Member der Picturebox, kann aber erweitert werden.
    -Propertys anlegen: Also Public Property Position as Point()... Hier schreibst du die Spalte und Zeile (X,Y) rein.
    -In der Sub new des Spielsteines kannst du mit Hilfe der Größe der Basisklasse Picturebox multipliziert mit Spalte bzw. Zeile die Location der Picturebox ausrechnen. Sollte sich während des Spiels die Position ändern, kannst du die Rechnerei in eine Sub Refresh oder so auslagern.

    Ein weiterer Vorteil dieser Methode besteht darin, dass du nun weitere Eigenschaften deiner Klasse hinzufügen kannst. So bringst du z.B. das Bewegen der Location ganz vorteilhaft hier unter. Deine Form muß sich so nicht mit diesen Berechnungen herumschlagen, was deutlich übersichtlicher wird.

    Nun zum Erzeugen:
    Zunächst ein globalesArray Spielsteine(X,Y) as Spielstein anlegen.
    In FormLoad:
    Eine For-Schleife mit zB. X als Spaltenzähler und innerhalb dieser Schleife eine weitere mit Y als Zeilenzähler. Dann Spielsteine(X,Y) = new Spielstein(X,Y), Spielstein(X,Y).Image=Bla usw.
    Den Rest mit Addcontrol und Addhandler haste ja schon.
    Als Lektüre für Klassendesign empfehle ich dir das hier.
    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: