C# Ein Object auf mehreren Formen nutzen

Geck0

Cadet 4th Year
Registriert
Okt. 2007
Beiträge
116
Hi CBler,
mein Problem besteht darin, dass ich ein Object nicht auf mehreren Formen nutzen kann.


Die Klasse:
Code:
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Strategie_War
{

    class Spieler
    {
        private int Spielernummer;
        public String Name;
        public String Reich;
        private int arb_anz;
        private int krieg_anz;
        private bool Leben;

//----------------------------------------------------------------------------------------

        public void Set_arb_anz(String x)
        {try{
            arb_anz=Convert.ToInt32(x);
        }
            catch (Exception exb)
        {
            MessageBox.Show(exb.Message);
 
            }
        }

        public int get_arb_anz()
        {
            return arb_anz;
        }

//----------------------------------------------------------------------------------------
        public void Set_krieg_anz(String z)
        {
            try
            {
                krieg_anz=Convert.ToInt32(z);
            }
            catch(Exception exb)
            {
                MessageBox.Show(exb.Message);
             }
        }

        public int get_krieg_anz()
        {
            return krieg_anz;
        }


//----------------------------------------------------------------------------------------



        public void Verlieren()
        {
            Leben = false;
        }
//----------------------------------------------------------------------------------------

        public Spieler() { }
        public Spieler(String Name, String Reich) {}
    } 
}


Die eine Form:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Strategie_War
{
    public partial class Spielerinformationen : Form
    {

        public Spielerinformationen()
        {
            InitializeComponent();
        }

        private void B_Spielen_Click(object sender, EventArgs e)
        {
            Spieloberfläche Form = new Spieloberfläche();
            Spieler Spieler1 = new Spieler(S1_Name.Text, S1_Reich.Text);
            Spieler Spieler2 = new Spieler(S2_Name.Text, S2_Reich.Text);
            Form.Show();
            Close();
            
        }
    }
}

und die andere:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Strategie_War
{
    public partial class Spieloberfläche : Form
    {
        int i = new int();
       
        
        public Spieloberfläche()
            
        {
            i = 1;
            InitializeComponent();
        }

        private void nextzug_Click_1(object sender, EventArgs e)
        {
            if (i != 1)
            {
                pictureBox1.Load("Resources\\Spieler 1.jpg");
                i = 1;
            }
            else
            {
                pictureBox1.Load("Resources\\Spieler 2.jpg");
                i = 0;
            }
        }

        private void Spieloberfläche_FormClosing(object sender, FormClosingEventArgs e)
        {
            Application.Exit();
        }


       
    }
}

das Problem Besteht darin, dass ich nicht auf die Objecte Spieler1 und Spieler2 zugreifen kann.

Bitte um Hilfe

Gruß Geck0
 
also soll ich eine weitere Form mit nur Code erzeugen oder die beiden voneinander abhängig machen?

Gruß Geck0
 
Hallo,

1. bitte gib deiner instance einen anderen namen als "Form", kann probleme verursachen, da Form auch der name der Basisklasse ist.
2. variablen immer mit einem kleinen buchstaben beginnen (damit du proberties erzeugen kannst ;) )
3. umlaute weglassen (kann zu probblemen fuehren)

Code:
namespace Strategie_War
{
    public partial class Spielerinformationen : Form
    {
Spieler spieler1 = null;
 Spieler spieler2 = null;

 public string Spieler1 
            {
                get { return spieler1 ; }
                set { spieler1 = value; }
            }
 public string Spieler2 
            {
                get { return spieler2 ; }
                set { spieler2 = value; }
            }


        public Spielerinformationen()
        {
            InitializeComponent();
        }

        private void B_Spielen_Click(object sender, EventArgs e)
        {
            Spieloberflaeche Form = new Spieloberflaeche();
            spieler1 = new Spieler(S1_Name.Text, S1_Reich.Text);
            spieler2 = new Spieler(S2_Name.Text, S2_Reich.Text);
            Form.Show();
            Close();
            
        }
    }
}

EDIT: Nun variablen ohne access modifer sind private, klassen ohne modifier sind internal (innerhalb des Assemblies public, sonst private)

Ich weis nicht welche .net Version du verwendest min. 2.0 (alles andere macht keinen Sinn) oder doch schon 3.5? In 3.5 kannst du auch auto implemented properties verwenden
Code:
 public double TotalPurchases { get; set; }
    public string Name { get; private set; } // read-only
dann sparst dir die declaration

EDIT2:
int i = new int();
da reicht es
int i = 0; zu schreiben ;)

EDIT#;

Ist ja furchtbar, sry.

public void Set_krieg_anz(String z)
{
try
{
krieg_anz=Convert.ToInt32(z);
}
catch(Exception exb)
{
MessageBox.Show(exb.Message);
}
}

public int get_krieg_anz()
{
return krieg_anz;
}

-> Bitte unbedingt das durcharbeiten

Wenn du die attribute mit einem kleinbuchstaben beginst, kannst du mit dem kontextmenue das property automatisch erstellen lassen.

EDIT4: So ganz verstanden habe ich deinen code nicht. Nun aber ich wurde auf jeden fall ein form machne das ein Panel hat (die spieloberflaeche) . Und warum ist die Spielerinformation eine Form ?
Also bitte, schau dir die Grundlagen .net mal an und arbeite diese durch. Du wirst dir viel leichter tun. Weil bei deinem Code kann men leicht zustaende bekommen.

EDIT5: Bevor ich es noch vergesse. Schau dir unbedingt die lebensdauer von variablen an
 
Zuletzt bearbeitet:
also danke erstmal

Die Spielerinformationen ist eine Form wo der spieler seine daten eingibt.

Dass es noch nicht wirklich annehmlich ist weis ich auch. Leider hatten wir letztes Jahr sogut wie keinen Programmierunterricht, dieses Jahr nur Datenbanken und jetzt sollen wir so ein Projekt machen.

Gruß Geck0

Edit:
also unser Lehrer hat gesagt wir sollen zu jeder private Variable ne get und set Methode schreiben und int immer private machen.
.Net is 3.5
 
Zuletzt bearbeitet:
Geck0 schrieb:
also danke erstmal

Die Spielerinformationen ist eine Form wo der spieler seine daten eingibt.

Mach eine Klasse Spielerinformationen und nimm eine Generic Class zum speichern.

Geck0 schrieb:
also unser Lehrer hat gesagt wir sollen zu jeder private Variable ne get und set Methode schreiben und int immer private machen.
.Net is 3.5

da hat er recht, nur das im .net dafuer die Proberties da sind ;). Allerdings ist die aussage int immer private zu machen so nicht richtig.
Generell gillt alle Attribute einer Klasse sind private! Nur wenn von aussen ein Zugriff erfolgen soll/muss, wie beim Spieler, nimmt man das Property das ein get und ein set hat.

Soll nur lesend darauf Zugegriffen werden, implementiert man nur das get des Property.


Also bitte variablen mit einem Kleinbuchstaben beginnen und dann properties benutzen, bsp. habe ich dir ja schon gegeben. ;) Nimm am besten die "alte" schreibweise.

Das es .net 3.5 ist haette ich auch sehen koennen, am "using System.Linq;" naja, was solls.

lg

kreadon
 
Zuletzt bearbeitet:
Die Teile heißen Properties ;D
Und diese Variablen soll er nicht mit einem Kleinbuchstaben beginnen, weil er dann Properties erzeugen kann, sondern vor allem deswegen, weil man private Member nunmal mit Kleinbuchstaben beginnt.
 
carom schrieb:
Die Teile heißen Properties ;D
Wow, hast du meinen text ueberhaupt zu ende gelesen? habe es auch mal richtig geschrieben ;) (Ich schreibe viel denglisch und bringe die Buchstaben dann gerne durcheinander). Aber es ist wichtig lektoren zu haben


carom schrieb:
weil man private Member nunmal mit Kleinbuchstaben beginnt.
, genau. Weil sonst das Property nicht den gleichen namen haben kann wie das Attribute.

Und die Namensgleichheit von Attribute und Property tragen zur lesbarkeit des codes bei.
(Wobei MS sich selbst nicht daran haelt, z.B. bei mittels XSD.exe generierter klassen aus XML Dateien. Da hat das Property den Namen des Attributes, das Attribute noch den zusatz "Field")
 
HI TE,

wie kommst voran. Hoffe wir haben Dich nicht verscheucht, wollen nur helfen.

Meld dich doch bitte und gib und einen Status.

lg

kreadon
 
Zurück
Oben