Laden...

Arrayinhalt zeichnen in Windows Forms

Letzter Beitrag vor 7 Jahren 16 Posts 3.279 Views
Arrayinhalt zeichnen in Windows Forms

Hallo zusammen,

ich würde gerne den Inhalt meines Arrays mit DrawString in einer Windows Forms Anwendung zeichnen. Das Array wird beim Programmaufruf durch lesen einer .dat Datei gefüllt. Folgendes habe ich bereits:

using System;
using System.Windows.Forms;
using System.Drawing;
public class MyForm : Form
{
    
    public MyForm()
    {
        Text = "Labyrinth";        
    }
    
    public static void Main(string[] args)
    {

        int spalten, zeilen;

        spalten = Int32.Parse(Console.ReadLine());
        zeilen = Int32.Parse(Console.ReadLine());

        char[,] labyrinth = new char[zeilen, spalten];

        for (int i = 0; i < zeilen; i++)

        {
            for (int j = 0; j < spalten; j++)
            {
                labyrinth[i, j] = (char)Console.Read();
                Console.Write(labyrinth[i, j]);
            }
        }
        Application.Run(new MyForm());
    }

    protected override void OnPaint(PaintEventArgs e)
    {

        e.Graphics.DrawString("inhalt vom array soll gezeichnet werden", Font,
            new SolidBrush(Color.Black), ClientRectangle);
    }
}

wie kann ich mein Array in der DrawString Methode angeben? Ist das so überhaupt möglich wie ich es mir vorstelle?

Beste Grüße

Klar ist sowas möglich.
Zuerst mußt du das Array als Klassenmember anlegen und dann kannst du in der OnPaint-Methode das Array mit 2 verschachtelten Schleifen durchlaufen und jeweils passend ein Rechteck (oder sonstige Grafiken oder Zeichen) zeichnen.

PS: Die Main-Methode sollte am besten in einer eigenen Klasse (und Datei z.B. "Program.cs") stehen.

Weeks of programming can save you hours of planning

Das ist eben mein Problem das ich nicht weiß wie ich das Array anlegen muss. Was heißt als Klassenmember?

Sorry ich bin absoluter Anfänger. Vielleicht bin ich hier falsch?!

Du musst Deiner MyForm-Klasse in irgendeiner Form das Array übergeben. Deine Main-Methode hat da wo sie jetzt steht nichts zu suchen, die gehört in eine separate Klasse (i.d.R. Program(.cs)). Ausserdem fehlt in Deinem Code der NameSpace.

using System;

namespace MeineApp
{
   public static class Program
   {
       public static void Main(string[] args)
       {

           int spalten, zeilen;

           spalten = Int32.Parse(Console.ReadLine());
           zeilen = Int32.Parse(Console.ReadLine());

           char[,] labyrinth = new char[zeilen, spalten];

           for (int i = 0; i < zeilen; i++)
           {
               for (int j = 0; j < spalten; j++)
               {
                   labyrinth[i, j] = (char)Console.Read();
                   Console.Write(labyrinth[i, j]);
               }
           }

         
           Application.Run(new MyForm() { Labyrinth = labyrinth });
       }
   }
}


using System.Windows.Forms;
using System.Drawing;

namespace MeineApp
{
   public class MyForm : Form
   {

       public MyForm()
       {
           Text = "Labyrinth";
       }

       public char[] Labyrinth { get; set; }

       protected override void OnPaint(PaintEventArgs e)
       {
           // hier mit Deinen zwei for-Schleifen das zeichnen implementieren
           for (int i = 0; i < Labyrinth.GetLength(0); i++)
           {
               for (int j = 0; j < Labyrinth.GetLength(1); j++)
               {
                    // das eigentliche zeichnen...
               }
           }


           //e.Graphics.DrawString("inhalt vom array soll gezeichnet werden", Font,
           //    new SolidBrush(Color.Black), ClientRectangle);
       }
   }
}

Hey danke schon mal für die Antwort. Ich bekomme jetzt folgende Fehlermeldung:

Der Typ char[,] kann nicht implizit in char[] konvertiert werden. Im Anhang ist die genaue Fehlermeldung.

Warum wird hier versucht char in char zu konvertieren? Was kann ich dagegen tun?

char[,] labyrinth = new char[zeilen, spalten];  
public char[] Labyrinth { get; set; }  

Weil die Property und das Feld eben diese unterschiedlichen Datentypen haben.
Vermutlich hat wcseller den Code einfach im Browser getippt, da kann das schon mal passieren.
Du kannst den Datentyp der Property einfach entsprechend anpassen.

[FAQ] Wie finde ich den Einstieg in C#?

Okay danke das hab ich gemacht, jetzt meckert er hier nicht mehr. Jetzt hab ich aber wieder ein Konvertierungsproblem. Funktioniert hier die DrawString Methode nicht?

Wenn du an einem Kassenautomat stehst wunderst du dich dann auch, wenn du in den Schlitz für Geldscheine versuchst Münzen einzuführen?

Exakt das Gleiche passiert hier auch. Ein String besteht aus vielen Chars, aber ein Char macht noch keinen String und die Methode schreit ganz laut, dass sie mit String arbeitet.

Ich glaube das Problem erstmal gelöst zu haben. Habe Char.ToString eingebaut.
Wenn ich das Programm jetzt starte und die Datei einlese erhalte ich folgende Ausgabe:
Wieso erhalte ich hier nur das erste Zeichen? Dachte die for Schleife arbeitet es bis zum Ende ab?!

Danke schon mal für eure Hilfe

Hast du dir die Abarbeitung der Schleife schon mal im Debugger angesehen?

Nein, dann mach das bitte

Okay werde ich machen. Kann mir noch jemand sagen wie ich Debuggen kann wenn das Programm wie in diesem Fall eine Datei bzw. Argument beim starten erwartet? Aktuell geht es natürlich beim debuggen bei der Console.ReadLine nicht weiter, gibt ja nichts zu lesen.

Projekteigenschaften -> Debuggen -> Befehlszeilenargumente.

Noch ein Hinweis zum Zeichnen: du zeichnest innerhalb der Schleifen immer an die gleiche Stelle. Du musst zum Zeichnen des Labyrinths natürlich die Koordinaten an denen das Zeichen gezeichnet wird anpassen.

Hallo und danke für die Antwort. Das mit dem auf einer Stelle zeichnen hab ich auch bemerkt, hab allerdings noch keine Lösung dafür. Kannst du mir hier ein Beispiel geben?

Der letzte Parameter von DrawString ist ein Rectangle, dass den Bereich beschreibt, in dem gezeichnet wird. Diesen Bereich musst Du in der Schleife berechnen...

Hi PeterVoss,

hier noch ein paar Links, damit du nicht wegen jeder Kleinigkeit hier nachfragen mußt:
[FAQ] Wie finde ich den Einstieg in C#?
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Und das OpenBook vom Rheinwerk-Verlag: 🛈

Und bitte beachte zukünftig [Hinweis] Wie poste ich richtig?, besonders Punkt 1.1 und 6.

Weeks of programming can save you hours of planning