Hallo,
ich habe einen Code der ausgeführt wird, aber die OnPaint-MEthode wird nicht beim Start der Form ausgelöst. Ich habe die FAQ dazu schon angeschaut, finde aber den Fehler nicht.
using System;
using System.Windows.Forms;
using System.Drawing;
namespace labyrinth
{
public class Program:Form
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Labyrinth lab = new Labyrinth();
lab.ReadFile();
lab.Print();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Console.WriteLine("Test: " + lab.maze[0,1]);
Application.Run(new Form());
}
override protected void OnPaint(PaintEventArgs e){
try{
//Initalisieren der Farben
Labyrinth lab = new Labyrinth();
base.OnPaint(e);
SolidBrush Green = new SolidBrush(Color.Green);
SolidBrush Red = new SolidBrush(Color.Red);
SolidBrush Blue = new SolidBrush(Color.Blue);
//Initalisieren der Schrift
Font font = new Font("Arial",20);
StringFormat stringF = new StringFormat();
stringF.Alignment = StringAlignment.Center;
stringF.LineAlignment = StringAlignment.Center;
//Initialiesieren der Graphik
Graphics g = e.Graphics;
Console.Write("Der Wert ist :" + lab.maze[0,0]);
Point point = new Point(20,20);
for (int i=0; i<lab.row; i++){
for (int j=0; j<lab.coloumn; j++){
if (lab.maze[i,j] == '#'){
g.DrawString(Char.ToString(lab.maze[i,j]), font, Green, point, stringF);
point.Offset(20,0);
//Console.WriteLine("{0}\n{1}",point.X, point.Y);
}
else if (lab.maze[i,j] == '.'){
lab.maze[i,j] = '°';
g.DrawString(Char.ToString(lab.maze[i,j]), font, Blue, point,stringF);
point.Offset(20,0);
Console.WriteLine("{0}\n{1}",point.X, point.Y);
}
else if (lab.maze[i,j] == '@') {
g.DrawString(Char.ToString(lab.maze[i,j]), font, Red, point,stringF);
point.Offset(20,0);
Console.WriteLine("{0}\n{1}",point.X, point.Y);
}
}
point.Offset(0,25);
point.X = 20;
}
}
catch( Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
public class Labyrinth
{
public int coloumn, row;
public char[,] maze = null;
//public Point aktuellePosition = new Point();
public void ReadFile()
{
try
{
row = Convert.ToInt32(Console.ReadLine());
coloumn = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException fe)
{
Console.WriteLine(fe.Message);
return;
}
maze = new char[row, coloumn];
try{
for(int j=0; j<coloumn; j++){
string sLine = Console.ReadLine();
for(int i=0; i<row; i++){
maze[i,j] = sLine[i];
//Console.WriteLine(sLine[i]);
}
}
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
public void Print(){
try{
Console.WriteLine("{0}\n{1}",row, coloumn);
for(int k =0; k<row; k++){
for(int m=0; m<coloumn; m++){
Console.Write(" {0}",maze[k,m]);
}
Console.Write("\n");
}
}
catch (Exception ex)
{Console.WriteLine(ex.Message);}
}
}
Ich würde tippen, dass dein Form überhaupt nicht aufgerufen wird.
Du instanziierst ja nicht deine Form, sondern dessen Basisklasse.
Ich habe auch noch nie gesehen, dass man die Klasse Program von Form erben lässt. Alleine vom Gefühl würde ich das trennen.
Hi Papst,
die Form wird aufgerufen und angezeigt.
Wie sollte ich das trennen?
Sry bin da noch nicht so ganz fit.
Gruß Freakontour
Der Name der Klasse deines Form, bei dem du OnPaint überschreibst, ist Program. Zumindest nach dem Codeschnipsel dort.
Du erstellst allerdings eine Instanz der Klasse Form:
Application.Run(new Form());
Edit:
Richtiger wäre: Eine neue Klasse (form) zu erzeugen, diese LabyrinthForm zu nennen und darin OnPain zu überschreiben. Danach erzeugst du dann in der Zeile mit Application.Run dein neues Form.
Ah, danke.
Manchmal sieht man den Wald vor Bäumen nicht.
Klar ich lade einfach nur ne leere Form.
Außerdem erzeugst du in der OnPaint
ein neues Labyrinth
-Objekt, das nichts mit dem Labyrinth
-Objekt in der Main
-Methode zu tun hat!
Und der Kommentar (an der falschen Stelle)
//Initalisieren der Farben
Labyrinth lab = new Labyrinth();
base.OnPaint(e);
SolidBrush Green = new SolidBrush(Color.Green);
// ...
zeigt, daß du den restlichen Code wohl einfach nur kopiert hast (denn Testen konntest du diesen aufgrund der Angabe der falschen Form-Klasse ja bisher nicht).
Und dann noch das Mischen von Console
und Form
(GUI) wird auch nicht (so) funktionieren...
Vllt. solltest du erst einmal ein reines Konsolenprojekt daraus erzeugen und dann dafür eine Trennung von Ein-/Ausgabe und Logik programmiieren (auch wenn du bisher noch fast keine Logik in deinem Code hast). Danach kannst du den Logikteil für ein WinForms-Projekt übernehmen und dort dann die Ein-/Ausgabe passend ausprogrammieren.