mittels schleife viele Labels un-/sichtbar bedingt sichtbar machen

  • VB.NET

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

    mittels schleife viele Labels un-/sichtbar bedingt sichtbar machen

    Hallo,
    wie kann ich rd. 700 Bottums abhängig von einen Array sichtbar bzw. unsichtbar schalten?
    eine Zuweisung klappt ja nicht weil ja sie alle einen anderen Namen haben.
    Bottum1.visible = array(1)
    Bottum2.visible = array(2)
    Bottum3.visible = array(3) usw 700x


    Habe bisher nichts richtiges gefunden, vielleicht falsche Suchbegriffe :?:

    Gruß
    Oschgar
    rd. 700 Bottums


    please what.

    700 Bottums/Labels/whatever halte ich für nicht gerechtfertigt. Was hast du vor? Ich bin mir sicher, dass es dafür einen besseren Weg gibt.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Eigentlich fast ganz einfach. Sudoku.
    Will 3x3 Felder (Ziffern 1-9 zum klicken bzw. farblich als Hilfe) unter ein Feld legen welches dann die gültige Ziffer enthält. Und das Ganze eben mit 81 Feldern mal den 9 Hilfsfeldern.
    Gruß
    Oschgar
    So kannst du alle durchgehen:

    VB.NET-Quellcode

    1. For Each cl As Control In me.Controls
    2. If TypeOf cl Is Button Then
    3. cl.Visible = visibleArray(counter)
    4. counter += 1
    5. End If
    6. Next


    Die Reihenfolge hängt vom TabIndex ab.
    Anfangen tut es mit dem höchsten TabIndex.
    Das gibt trotzdem niemals 700 Controls...
    Außerdem als kleiner Tipp falls du mal etwas Abwechslung willst könntest du das auch in WPF machen da geht sowas viel einfacher als mühselig Labels erstellen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich weis nicht ob das so performant ist, wenn man 729 Buttons auf einer Form hat.
    Alternativ Ideen:

    1. Buttons für Zahlen von 1-9 erstellen und dann einfach das Packet aus 9 Buttons dahin schieben wo sie gebraucht werden. Beim Klicken auf die Button muss dann je nach Position (Feld 1-81) was anderes passieren (sollte leicht machbar sein).

    2. Buttons zur Laufzeit dynamisch erstellen. Nicht vergessen hier das Clickevent zu erstellen bzw. mit

    VB.NET-Quellcode

    1. AddHandler Button1.Clicked, AddressOf name_der_sub

    den Handler hinzuzufügen

    Diese beiden Ideen sind natürlich nur dann brauchbar, wenn du nicht alle 729 gleichzeitig sehen willst.
    Pack alle die Labels in en Panel und schalte lediglich das Panel auf Visible = False / True.
    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!
    Ich würde zu GDI+ greifen: Ein zweidimensionaler Array stellt das Spielfeld dar. Dieses Spielfeld kannst du im Paint-Event deiner Form/eines Panels zeichnen lassen. Sieht schon gleich besser und professioneller aus als zehntausend Buttons.
    Großer Programmiervorteil: du klickst auf ein Feld. Die Maße eines jeden Feldes sind gleich und bekannt, du kannst also berechnen welches Spielfeld angeklickt wurde:

    X = MausX / FeldBreite

    In verbesserter Version:

    X = (MausX - Feldbreite/2) / Feldbreite

    gleiches gilt für die Y-Komponente. Du hast also einen Mausklick, wertest diesen aus und weißt: Es wurde auf Array(x,y) geklickt.
    Hallo,
    vielen Dank für die Antworten. Die Anregungen sind interessant und vielversprechend. Ich werde sie nutzen müssen. Denn es gibt ernsthafte Schwierigkeiten mit meiner Lösung.
    Aber erst mal kurz zu mir.
    -Ist mein 1. eigenes VB-Programm, habe vor 25 Jahren Basic und TP6 gemacht. Seitdem eigentlich nichts mehr
    -Bin im Urlaub und habe keine Bücher mit - das Wetter war ja nicht geplant.

    Meine Lösung hat jetzt schon große Performanceproblem (beim Starten). Habe 810 Buttoms.
    Ich kann doch nicht 729 Clickereignisse erstellen siehe hier ?(

    VB.NET-Quellcode

    1. Private Sub Button79_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button79.Click
    2. Button70.Text = 9
    3. Button70.Visible = True
    4. End Sub
    5. Private Sub Button81_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button81.Click
    6. Button80.Text = 1
    7. Button80.Visible = True
    8. End Sub
    9. Private Sub Button82_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button82.Click
    10. Button80.Text = 2
    11. Button80.Visible = True
    12. End Sub

    Das mit dem GDI klingt für mich logisch, habe aber gar keine Ahnung vom Handling (kl. Ziffern erstellen, gr. Ziffern erstellen, akt. Zahl darstellen usw.)

    Das mit dem Paket schieben wo es gebraucht wird verstehe ich nicht ganz. In einen leeren Sudoku sind 81 Felder und in jedem Feld die Zahl 1-9 möglich. Also muß ich am Anfang 729 kleine Felder sehen bzw müssen diese aktivierbar sein.

    Wie funktioniert das mit dem dyn. Erstellen? Und was ist WPF?

    Danke
    Oschgar

    Oschgar schrieb:

    Meine Lösung hat jetzt schon große Performanceproblem (beim Starten). Habe 810 Buttoms.
    Ich kann doch nicht 729 Clickereignisse erstellen siehe hier ?(

    Du könntest jedem Button das selbe Clickereignis zuweisen (AddHandler Button.Click(), Adressof DeineSub) und dann in der Sub abfragen welcher Button gedrückt wurde.

    Oschgar schrieb:

    Das mit dem GDI klingt für mich logisch, habe aber gar keine Ahnung vom Handling (kl. Ziffern erstellen, gr. Ziffern erstellen, akt. Zahl darstellen usw.)

    Würd ich dir dringendst empfehlen es macht keinen Sinn 800 Buttons zu erstellen.
    Im Forum gibt es genug Tutorials dazu.

    Oschgar schrieb:

    Wie funktioniert das mit dem dyn. Erstellen?

    VB.NET-Quellcode

    1. dim Btn as new Button
    2. Btn.Eigenschaft = Wert
    3. AddHandler Btn.Click(), Adressof DeineSub
    4. DeinControl.add(Btn)

    Das ganze in einer Schleife verpackt.

    Oschgar schrieb:

    Und was ist WPF?

    WPF ist das "neue" Konzept was WinForms ablösen soll wenn ich mich nicht irre.
    Bei WPF wird das GUI in einer eigenen Sprache XAML erstellt.
    Womit man Das GUI besser vom Code trennt.

    Ich würd dir aber auf jeden Fall GDI+ empfehlen!

    mfg.skyscater
    Das mit dem dyn. Erstellen ist vielleicht auch nicht einfacher? Da muß ich ja 729 Positionen, 729x Namen, 729 Texte usw. eingeben. Das ist auch nicht weniger Arbeit.

    Das ist mit dem Clickereignis in den Buttom legen ist eine gute Idee. Ideal wäre wenn man 2 Ereignisse reinlegen könnte. Einmal die Ziffer (1..9) und einmal die Position (1..81) . Jetzt habe ich sie fortlaufend organisiert, z.B. Btn110 = großer (12.) Buttom Btn111 = Nr 1 im großen Buttom (12.)
    Geht das?
    Oder kann man den Buttomnamen dafür benutzen?

    Gruß
    Oschgar
    Kannst Du mal was zur Philosophie Deines Programms sagen?
    Wer soll sich 810 Button ansehen, um dann den richtigen zu klicken?
    Und sag jetzt nicht, dass 99,7% davon stets unsichtbar sind.
    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!
    ein Sudoku - egal, in welcher Ausführung (Sudokus generieren? Sudokus lösen? Sudoku spielen?) - ist eine sehr Anspruchsvolle Anwendung.
    Dafür muß zunächst mal ein Datenmodell konzipiert werden, welches die Beziehungen der Felder untereinander wiederspiegelt.
    Und dann ist dafür auch noch eine Oberfläche zu schreiben, weil wirklich geeignete Controls dafür gibts nicht.
    Man kann was basteln mit OwnerDrawing, vlt. auch mit 9 DatagridViews mit Ownderdrawing, aber die Oberfläche allein wird schomal saukompliziert.

    Als Anfänger kannstedas schlicht vergessen.

    Nur soviel: Buttons generieren ist nach meiner Erfahrung immer ein Holzweg.

    Man könnte vlt. dem OwnerDrawing entgehen, wenn man UserControls bastelt, mit je 9 Buttons, und davon 9 Stck nimmt. Aber damit hat man die Frage nach dem Datenmodell, und wie das datenmodell mit der Oberfläche verknüpfen, noch nichtmal berührt.

    FreakJNS schrieb:

    Ich würde zu GDI+ greifen: Ein zweidimensionaler Array stellt das Spielfeld dar. Dieses Spielfeld kannst du im Paint-Event deiner Form/eines Panels zeichnen lassen. Sieht schon gleich besser und professioneller aus als zehntausend Buttons.
    Großer Programmiervorteil: du klickst auf ein Feld. Die Maße eines jeden Feldes sind gleich und bekannt, du kannst also berechnen welches Spielfeld angeklickt wurde:

    X = MausX / FeldBreite

    In verbesserter Version:

    X = (MausX - Feldbreite/2) / Feldbreite

    gleiches gilt für die Y-Komponente. Du hast also einen Mausklick, wertest diesen aus und weißt: Es wurde auf Array(x,y) geklickt.


    Wie wärs mit etwas mehr OOP?!
    @rinecamo
    knapp 1000 buttons sind mehr oop als diese rechnung um mauskoordinaten in arraypositionen umzurechnen?
    wie würde das ganze oop aussehen? Jedes Feld weiß, wo es ist oder was? Halte ich in diesem fall für blödsinn...

    @ TE
    ich würde mir gedanken über die Spielbarkeit machen: jedes Feld hat wiederum 10 felder, damit man die Zahl wählen kann?? Ich glaube, dass wird sehhhr unübersichtlich.
    Das ganze mit GDI+ zu lösen - hier bietet es sich sogar an ein eigenes Control zu schreiben! - ist nicht leicht.

    Zum Thema Spielmechanik: ich würde das ganze so programmieren, dass der Spieler ein Feld anklickt und dieses dann markiert ist. Nun hat er die Möglcihkeit eine Zahl (per Tastatur z.b.) einzugeben und dem markierten Feld zuzuweisen.
    Dann brauchst du theoretisch nur noch einen Algortihmus, der prüft ob alle eingaben zueinander passen. Du muss also jeden Block/jede zeile durchgehen und prüfen ob alle zahlen von 1-10 vorhanden sind. wenn nicht, dann ist das Spiel nicht gelöst

    FreakJNS schrieb:

    knapp 1000 buttons sind mehr oop als diese rechnung um mauskoordinaten in arraypositionen umzurechnen?

    Habe ich nie gesagt.

    Was ich eigentlich damit sagen wollte, sind 2 Dimensionen denn so unbedingt nötig? ;)
    @ rinecamo
    das vereinfacht eben vieles^^ Alternativ könnte man natürlich eine ListOf verwenden und per extension die Funktion GetField(byval x as integer, byval y as integer) hinzufügen. Oder noch besser eine Klasse schreiben die das Spielfeld als ListOf enthält und entsprechende Methoden wie .getfield bietet...

    Aber ist ein 2dim-Array wirklich so schlecht??
    Ich hab vor kurzem ein kleines Bomberman gemacht, mit einem zweidimensionalen Array. Am Ende ist mir dann aufgefallen das ich mir nur unnötig Arbeit gemacht habe. Mit einer extra Klasse, wäre es viel übersichtlicher und und vom Code her "kürzer" geworden.