Nebenstehenden Button ermitteln

  • VB.NET
  • .NET (FX) 4.0

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @Hilfe0987 So was:

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
    2. Dim btn = DirectCast(sender, Button)
    3. Dim loc = btn.Location
    4. For Each element In Controls.OfType(Of Button)()
    5. Dim loc2 = element.Location
    6. Console.WriteLine(distance(loc, loc2))
    7. Next
    8. End Sub
    9. Private Function distance(loc1 As Point, loc2 As Point) As Integer
    10. Dim dx = loc1.X - loc2.X
    11. Dim dy = loc1.Y - loc2.Y
    12. Return dx * dx + dy * dy
    13. End Function
    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!
    Hi
    schau' dir mal Array.IndexOf, Button und Plus-und Minus-Rechnung (und die Grundlagen) an. Danach erzeuge ein Array der Buttons und suche im Button.Click-Ereignis über IndexOf im Array nach dem Button, der in sender steht. Dann hast du über + und - die Nachbarn...
    Und schau' dir unbedingt die Grundlagen an. Wenn du bei so einer trivialen Frage Hilfe benötigst und du es nicht schaffst, weil es dir nicht entsprechend serviert wird, weil du nicht einmal die geringste Eigeninitiative zeigst, dann läuft da definitiv was falsch in der Art, wie du es lernst.

    Viele Grüße
    ~blaze~

    Hilfe0987 schrieb:

    nur für die umliegenden...!
    Welche Button sind denn die umliegenden?
    Das musst Du doch wissen. Was ist, wenn es zwei gleich weit entfernte Button gibt?
    Bitte beschreib mal ganz genau: Wozu brauchst Du das?
    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!

    Hilfe0987 schrieb:

    Für ein Spiel.
    Das hab ich mir gedacht.

    RodFromGermany schrieb:

    Bitte beschreib mal ganz genau: Wozu brauchst Du das?
    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!
    Das ist ein Spiel mit Feldern. Wenn du ein Feld anklickst, ändert sich die Farbe. Ab diesem Zeitpunkt kann man nur noch Felder anklicken, die neben einem Feld von einem selbst liegen (deshalb rund herum prüfen, ob ein Feld vom Spieler bereits in der Nähe vorhanden ist, mit backcolor checken).
    Es sollen die Spieler also quasi nur Felder in ihrem "Gebiet" auswählen können!
    :thumbup:
    @Hilfe0987 Völlig falsche Herangehensweise.
    Du musst per Design wissen, welches das benachbarte Feld ist. Die Grundidee bei @~blaze~ .
    Pack die Buttons in ein 2-Dimensionales Array: Dim btns(,) As Button. Nutze die Tag-Property und trag da den x- und y-Index ein. Dann kannst Du per Index-Rechnung Deine Nachbarn bestimmen.
    Feddich.
    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. Private Sub Form13_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. For Each co As Control In Me.Controls
    3. If TypeOf co Is Button Then
    4. AddHandler DirectCast(co, Button).Click, AddressOf Button_Click
    5. co.Tag = co.Location.X & ";" & co.Location.Y
    6. End If
    7. Next
    8. End Sub
    9. Private Sub Button_Click(sender As Object, e As EventArgs)
    10. Dim bt As Button = DirectCast(sender, Button)
    11. MsgBox(bt.Tag)
    12. End Sub


    Das hab ich bis jetzt, ich weiß jetzt welche Koordinaten das angeklickte Feld hat. Und weiter? Kann ich den Button auswählen, indem ich die Koordinaten -die Länge des Feldes rechne und kann ich dann die Eigenschaften des neuen Buttons auslesen?
    :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hilfe0987“ ()

    Hilfe0987 schrieb:

    Und weiter?
    Falsche Herangehensweise.
    Pack Deine Buttons in ein 2-dimensionales Array. Die Indizes laufen von x = 0 bis AnzahlX - 1 bzw. y = 0 bis AnzahlY - 1.
    Die Indizes packst Du in den Tag.
    Beim Klick holst Du die Indizes zaus und hast x +-1 und y +-1 und feddich.
    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!
    @Hilfe0987 Das haben wir Dir doch die ganze Zeit erzählt.
    Eigene Indizes ermitteln, Indizes der Nachbar-Elemente ermitteln, mit eben genau diesen Indizes gehst Du in das 2-Dimensionale Array und hast Deine Objekte und damit deren Eigenschaften.
    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!

    RodFromGermany schrieb:

    Pack die Buttons in ein 2-Dimensionales Array: Dim btns(,) As Button
    Gugst Du hier.
    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!
    prima! :thumbsup:
    Also das ist ein eindimensionales Array, und mit einem Index kann man darin einen Button addressieren:

    VB.NET-Quellcode

    1. Sub ATest()
    2. Dim buttons As Button() = New Button() {Button1, Button2, Button3}
    3. Dim aButton = buttons(0) ' den 1. Button addressieren
    4. aButton = buttons(1) ' der 2. Button
    5. aButton = buttons(2) ' der 3.
    6. End Sub
    Ein 1-D-Array kann man sich wie eine Kette von Elementen vorstellen, eins hinter dem anneren, und mittm Index sucht man eines aus



    Nun ein 2-D-Array - (siehe unbedingt auch Rods Link):

    VB.NET-Quellcode

    1. Private _Buttons As Button(,) = {{Button1, Button2, Button3},
    2. {Button4, Button5, Button6},
    3. {Button7, Button8, Button9},
    4. {Button10, Button11, Button12}}
    Das kannste dir wie eine Tabelle mit Zeilen und Spalten vorstellen.
    (Oder auch wie ein Koordinatensystem mit x- und y-Richtuing. Man kann nämlich ebenso noch weitere Dimansionen hinzufügen: 3-D - Würfel, mit z-Achse, 4-D - ohne räümliche Vorstellbarkeit,...)



    Jdfs 2D heisst 2D, weil man nun zwei Indizees braucht, um ein Element zu addressieren:

    VB.NET-Quellcode

    1. Sub ATest()
    2. Dim bt = _Buttons(3, 1) ' Button in 4.Zeile, 2.Spalte
    3. bt = _Buttons(1, 3) ' Button in 2.Zeile, 4.Spalte - Exception, weil obiges 2D-Array (bitte nochmal gucken) hat nur 3 Spalten
    4. End Sub
    Dabei aber aufpassen, und nicht x- und y- Index verwechseln!



    Dein 2D-Array wird aber noch failen, denn man muss Deklaration und Initialisierung trennen.
    Denn wo das Array deklariert wird, sind die Buttons noch nicht initialisiert, also du würdest ein Array von Buttons erhalten, und alle wären Nothing.
    Die Initialisierung des Arrays darf also erst nach InitializeComponents erfolgen - im frühesten Falle also in Sub New(), (ansonsten halt im Form_Load - das kommt ja kurz darauf).

    VB.NET-Quellcode

    1. Private _Buttons As Button(,) ' Deklaration ...
    2. 'Private _Buttons As Button(,) = {{Button1, Button2, Button3},
    3. ' {Button4, Button5, Button6},
    4. ' {Button7, Button8, Button9},
    5. ' {Button10, Button11, Button12}} ' das hier wäre zu früh - erst muss InitializeComponent() durchgelaufen sein
    6. Public Sub New()
    7. InitializeComponent() ' hier werden die im Designer eingerichteten Controls erstellt - vorher sind sind sie nur deklariert, aber nicht initialisiert, wären also Nothing
    8. ' **danach** erst Initialisierung von _Buttons
    9. _Buttons = {{Button1, Button2, Button3},
    10. {Button4, Button5, Button6},
    11. {Button7, Button8, Button9},
    12. {Button10, Button11, Button12}}
    13. End Sub




    So, nun kannste endlich was damit tun:

    VB.NET-Quellcode

    1. Public Sub ATest()
    2. Dim y = 2, x = 1 ' 3.Zeile,2.Spalte
    3. Dim bt = _Buttons(y, x) ' Button in 3.Zeile,2.Spalte
    4. bt = _Buttons(y - 1, x) ' Button darüber
    5. bt = _Buttons(y + 1, x) ' Button darunter
    6. bt = _Buttons(y, x + 1) ' Button rechts davon
    7. End Sub




    Bitte kopiere die letzten beiden Listings bei dir ein, und überzeuge dich von ihrer Fehlerfreiheit. Und melde zurück, obs geklappt hat.
    Ich bin eiglich ziemlich genervt von Leuten, die mir ausführliche Erklärungen aus den Rippen leiern, und sich dann ühaupt nicht damit beschäftigen, was ich für sie zusammenstelle.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()