Autor Beitrag
DonKannallie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 12:48 
Guten Tag Com.

Ich habe eine Funktion geschrieben in dem ich Panels erstelle die eine Click funktion haben. Jedoch habe ich das sehr umstennlich geschrieben und habe mehr oder weniger das gleiche 20x geschrieben was ich mit einem Array ändern möchte

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
            for (int ebene1 = anzahl; ebene1 < anzahlmax; ebene1++)
            {
                panel.Add(new Panel());

                panel[ebene1].Location = new Point(10 + (ebene1 * 21), hoch);
                panel[ebene1].Size = new System.Drawing.Size(2020);
                panel[ebene1].Name = "Panel" + ebene1;
                panel[ebene1].BackColor = System.Drawing.Color.White;
                panel[ebene1].MouseClick += Klicken;
                this.Controls.Add(panel[ebene1]);
                panel[ebene1].TabIndex = ebene1;

               
            }




mit dieser Funktion erstelle ich mehrere Panels neben einander.
Jedoch möchte ich ,dass die Panels auch unter einander sind d.h. das in einer reihe ca. 30 Panels und in der tiefe 60 Panels sind.


Folgendes Problem:

Ich habe ein bischen über Array gelesen (in meinem Buch und im Internet) , weis aber nicht wie ich die beiden sachen mit einander verbinden kann
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 29.08.14 13:18 
Jetzt erzeugst du ja schon die Panels in einer Schleife und weißt sie der ControlsCollection zu. Auf der Form werden die somit funktionieren und wenn du die Location richtig berechnest hast werden die auch da liegen wo du die haben willst.

Für welche Aufgabe möchtest du dann jetzt noch das Array verwenden?
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 13:27 
Für die tiefe , sodass ich einen rechteck mit panels habe

ich habe dafür schon versucht eine "if" bedingung zu benutzen aber aus irgent einem grund hat der bestimmt variabeln nicht mehr benutzt sodass es nicht so funktioniert hat wie ich es wollte.

ein freund(Java user) von mir meinte ich solle es mit einem Array probieren
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 29.08.14 13:39 
Du mußt nur die Location richtig berechnen.
Beispiel für ein (farbloses) Schachbrett mit 20*20 Pixel Feld Größe.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    int Anzahl = 64;
    int panelPerRow = 8;            

    for (int i = 0; i < Anzahl; i++)
    {
        var panel = new Panel();
        panel.Location = new Point(i % panelPerRow * 20, i / panelPerRow * 20);
        panel.Size = new System.Drawing.Size(2020);                
        this.Controls.Add(panel);
    }
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 13:52 
Sorry aber ich kann dir nicht ganz folgen was deine Location berechnung angeht
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 29.08.14 14:09 
Erinnere dich an simple Ganzzahldivision aus deiner Grundschulzeit. Stell die vor alle Panels von links oben nach rechts unten durchzunummerieren.

Als Beispiel nehmen wir jetzt das 15.te Panel(da alles 0. basiert ist hat dieses Panel den gedachten Index 14). Auf einem Schachbrett wäre es in der 2.ten Reihe an der 7.ten Spalte. Wie bekomme ich die Reihe raus in die das Panel gehört? Man teilt durch die Panelbreite also 14 : 8 = 1 Rest 6. Da alles 0.basiert entspricht 1 der 2.ten Reihe und 6 der 7 Spalte. Voila.

Die x Position ist also der Rest der Ganzzahldivision (% ist der Modulo Operator also der Divisionsrest). Für eine sinnvolle Spaltenbreite multiplizieren wir das noch mit der Panelbreite also
(Index % AnzahlSpalten) * Spaltenbreite
Die y Position ist der normale Ganze Anteil der Ganzzahldivision wiederum multipliziert mit der Zeilenhöhe. Also
(Index / AnzahlSpalten) * Spaltenbreite

Und x,y schmeißt man dann halt in einen Point und weißt den der Location zu.

Für diesen Beitrag haben gedankt: DonKannallie
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 14:29 
Aso , verstehe - vielen dank!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 29.08.14 14:32 
Die andere Möglichkeit wäre ein zweidimensionales (rectangle) Array:
ausblenden C#-Quelltext
1:
Panel[,] panels = new Panel[MaxX, MaxY];					

Und dann mit zwei ineinander verschachtelten Schleifen für x und y die Panels erzeugen.

Die Frage, welche Version besser ist, hängt dann damit zusammen wie man die Panels indizieren möchte (also eindimensional oder zweidimensional).

Für diesen Beitrag haben gedankt: DonKannallie
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 15:43 
Jetzt stellt sich die frage für mich (bei Ralf Jansen's version)

wie kann ich ein einzelnen Panel ansprechen?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 29.08.14 15:56 
Zitat:
wie kann ich ein einzelnen Panel ansprechen?


Warum? Ohne kann man nicht wirklich was sinnvolles raten. Das hat ja eventuell schon bei meiner letzten Rückfrage nach "Für welche Aufgabe" nicht funktioniert.
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 16:43 
Ich will den Panels bestimmte farben zuweisen

Das Programm soll eine hilfe für ein Spiel sein was ich derzeitig spiele - mit den Panels soll man einen weg machen welche monster durch rennen müssen dabei gild es den weg möglichst lang zumachen auf eine bestimmt fläche

mit den färbungen möchte den anfang und das ende des bau bereiches zeigen
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 29.08.14 17:17 
Okay dann alles zurück auf 0 ;)

Du beginnst dein Spiel von der visuellen Anzeige zu denken das ist problematisch.
Beginne mit der Spiellogik also mit einer Datenstruktur die die aktuelle Situation beschreibt.
Wenn du diese Struktur hast dann überlege dir wie du die auf den Bildschirm bekommst.

Diese Struktur könnte im einfachsten Fall auf ein Array hinauslaufen. 2-Dimensional um jede Spielfläche zu beschreiben. In den Zellen wären aber keine Panels. Sondern etwas das den Zustand diese Fläche beschreibt. Also so Infos wie "ist ein Weg", "ist eine Mauer", "ist der Anfang", "ist das Ende", "hier befindet sich ein Spieler", " hier befindet sich ein Monster" oder was auch immer und irgendwelche weiteren Information die man zur Logik des Spiels braucht. Wenn du die hast dann kannst dir das Mapping dieser Struktur auf den Bildschirm überlegen. Z.B. mit einer adäquaten Matrix von Panels. Wobei 30 * 60 Panels grenzwertig ist. Window Handles sind eine knappe Resource und jedes Panel braucht eine. Wenn man die zu verschwenderisch benutzt zeichnet irgendwann deine Anwendung nicht mehr weil Handles aufgebraucht sind. Wenns dumm läuft zeichnet nicht nur nicht mehr deine Anwendung sondern kein Prozess mehr.
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 29.08.14 17:49 
okay ich glaube du hast ich faltsch verstaden :D

so weit wollte ich nicht gehen

nochmal von vorn mit details


Das spiel ist ein Tower Defense spiel - da ich es mit mehreren leuten spiele und man nur wenig zeit hat um die Tower zubauen muss man sich schon im klaren sein wie man seine "maze" bauen möchte

dieses Programm soll helfen damit man vor dem spiel und auch in späteren spielen sich richtig drauf vorbereiten kann - ob sie letzt endlich auch sehr wirklich erweist ist dem überlassen der sie baut


ich habe ca. >1000 Panels , ich habe eine version des Programms schon fertig wo alles tiptop läuft jedoch gefällt es mir von der programmieren nicht da ich nur mit unnötiger mühe änderungen dran vornehmen kann , daher auch die frage nach dem Array :D
hekolliko
Hält's aus hier
Beiträge: 4
Erhaltene Danke: 2



BeitragVerfasst: Mo 01.09.14 16:55 
Wow du nimmst dir ja einiges vor ... :D Aber .. gute Frage, bin gespannt auf den Lösungsansatz!
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Di 02.09.14 15:08 
naja eig. ist es relativ einfach wenn man mehr anhnung hat als ich aber danke :D
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.09.14 15:59 
naja wir würden auch helfen wenn wir das Problem verstehen würden :(
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Di 02.09.14 17:29 
Würde es helfen wenn ich das Programm irgentwie hochladen würde?


wenn ja wo kann man das den machen? :D
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.09.14 17:45 
Deinen Project Ordner einfach zippen, vorher den bin und object Ordner löschen wir brauchen ja nur die Sourcen, und hier anhängen.

Es würde aber auch reichen wenn du erklärst was dein Programm tun soll. Du bist leider nicht genauer geworden als das du du eine Matrix von Panels hast die dir irgendwie bei der Planung für ein Spiel helfen soll.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Di 02.09.14 22:24 
Hmm. Also wenn ich dich richtig verstehe, dann willst du so eine Art "Paint für Arme". Ich hab mal selber ein bisschen gecoded und das Projekt in den Anhang gehängt.

Mit der linken Maustaste wird das Feld mit der entsprechenden Farbe markiert und mit der Rechten wieder gelöscht.

EDIT
Hab noch eine zweite Version gemacht. Die erste Version arbeitet mit Panels, die zweite hingegen arbeitet mit Graphics (finde ich die bessere Lösung) und hat noch ein extra Feature. Vergleiche mal die beiden Versionen.
Einloggen, um Attachments anzusehen!
_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler

Für diesen Beitrag haben gedankt: DonKannallie
DonKannallie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mi 03.09.14 14:13 
Hmm ich wüsste jetzt auch nicht genau was es da noch mehr zu erklähren gibt.


aber gut , auf ein neuen versuch :P

das programm hat die panel matrix.
wenn ich auf ein panel klicke , soll sich die farbe des angeklickten panels ändern:

Links klick : Schwarz
Mausrad klick : Rot
Rechts klick : weiß

es gibt 2 anfänge und 1 ende (man kann sich das feld wie ein gedrehtes "T" vorstellen

ich möchte gerne die anfänge und das ende makieren.

Problem :

Ich habe die Panels Dynamisch erstellt aber weis nicht genau wie ein Panel sagen kann das es keine funktion und nur die farbe blau haben soll.



danke C# du hast eine weitere lösung in deinem Programm. Ich wollte als nächsten schritt das Speichern ermöglichen wusste aber noch nicht genau wie ich dass anstellen - leider reicht mein wissen bei weitem nicht das zu verstehen was du da "gezaubert" hast


hier ist mein Projekt - vl. hilft es auch noch weiter
Einloggen, um Attachments anzusehen!