Stig Jøran Skrevet 20. februar 2008 Skrevet 20. februar 2008 (endret) Heisann! Kom over et "lite" problem her. I VB.NET gjør jeg følgende: Jeg har en from som fungerer som Meny, hvor følgende skjer når jeg lukker den og laster en ny "hoved" form: frmMain.Show() Me.Hide() Og i frmMain Load så skjer dette: Population = frmMenu.TxtPopulation.Text Altså data hentes fra frmMenu og lastes i en String i frmMain. Så kommer problemet, jeg vil gjerne gjøre dette i C#. Ved å feks ha en hovedform, og jeg åpner da en "settings" form hvor jeg forandrer på Variabler som er i hovedformen. Håper noen skjønner dette og kan hjelpe meg Endret 21. februar 2008 av Stig Jøran
Spartakus Skrevet 20. februar 2008 Skrevet 20. februar 2008 Du kan feks lagre verdiene i public variabler i "settings form" og etter at du har lukket denne formen (OK-knapp), så henter du ut verdiene fra settings form-objektet via public-variablene. Easy-peasy
Stig Jøran Skrevet 20. februar 2008 Forfatter Skrevet 20. februar 2008 (endret) Du kan feks lagre verdiene i public variabler i "settings form" og etter at du har lukket denne formen (OK-knapp), så henter du ut verdiene fra settings form-objektet via public-variablene. Easy-peasy Men hvordan vet formen når jeg lukker settings formen? Må jo være en måte i C# å gjøre slik som i VB. Og feks når jeg har et Object: public partial class frmMain : Form { // New Object, player. Player Human = new Player(); } Så kan jeg ikke få tilgang til det annet enn via frmMain. Kan noen hjelpe meg med å forstå hvorfor? Endret 20. februar 2008 av Stig Jøran
hockey500 Skrevet 20. februar 2008 Skrevet 20. februar 2008 Skal du da ha tilgang til Human må den for det første være public. fra en annen klasse må du da instansiere frmMain for å få tilgang til Human, hvis du ikke definerer den som static. dette funker: class Class1 { public static string Var = "Hello World!"; } class Class2 { static void Main() { Console.WriteLine(Class1.Var); } } eller dette: class Class1 { public string Var = "Hello World!"; } class Class2 { static void Main() { Class1 c1 = new Class1(); Console.WriteLine(c1.Var); } }
Stig Jøran Skrevet 20. februar 2008 Forfatter Skrevet 20. februar 2008 (endret) class Class1 { public string Var = "Hello World!"; } class Class2 { static void Main() { Class1 c1 = new Class1(); Console.WriteLine(c1.Var); } } Det får jeg til, men når jeg da har en til form, som skal accesse c1 som ble "laget" i den andre formen får jeg det ikke til. Alle mine verdier i Player.cs er public: public UInt32 Cash { set { _cash = value; } get { return _cash; } } Men i hoveformen min har jeg følgende kode som lager et objekt av klassen min: namespace LifeBiz { public partial class frmMain : Form { // New Object, player. Player Human = new Player(); } } Så skal jeg da ha noe i en annen form: public partial class frmMenu : Form { private void frmMenu_Load(object sender, EventArgs e) { // Her skulle jeg gjerne hatt tilgang til det objektet som ble laget i frmMain. } } Endret 20. februar 2008 av Stig Jøran
Spartakus Skrevet 20. februar 2008 Skrevet 20. februar 2008 (endret) Legg player-objektet ved i konstruktøren til frmMenu-klassen public partial class frmMenu : Form { Player player; public frmMenu(Player player) { this.player = player; } private void frmMenu_Load(object sender, EventArgs e) { // Nå har du tilgang til player-objektet } } Endret 20. februar 2008 av Spartakus
Stig Jøran Skrevet 20. februar 2008 Forfatter Skrevet 20. februar 2008 (endret) Det funker delvis, men får ikke hentet noe ut av objektet. MessageBox.Show(player.Age.ToString()); "Object reference not set to an instance of an object." " Use the new keyword to create an instance" Men problemet da er at da er vil tilbake på det at et nytt objekt blir laget. Og det gamle Human objektet som jeg skulle ha hentet ut Alderen på går ikke Slenger med et eksempel på hva jeg prøver å få til. Åpnes i VC# 2008 Exp. WindowsFormsApplication1.zip Endret 20. februar 2008 av Stig Jøran
GeirGrusom Skrevet 21. februar 2008 Skrevet 21. februar 2008 Det er nå du burde lære deg å debugge programmet Velg linjen med messagebox eller der det stopper, og trykk F9 Trykk deretter på F5 Når du nå kommer til punktet der programmet kræsjer, vil Visual Studio istedet pause programmet, og du kan se hva innholdet i variablene er ved å holde over dem. Hvis en av de er null (Det er det "object reference not set to an instance of an object" betyr), har du funnet problemet ditt.
Stig Jøran Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 (endret) Det er nå du burde lære deg å debugge programmet Velg linjen med messagebox eller der det stopper, og trykk F9 Trykk deretter på F5 Når du nå kommer til punktet der programmet kræsjer, vil Visual Studio istedet pause programmet, og du kan se hva innholdet i variablene er ved å holde over dem. Hvis en av de er null (Det er det "object reference not set to an instance of an object" betyr), har du funnet problemet ditt. Ja det er vel fordi at : Player player; public frmMenu(Player player) { this.player = player; } Henviser til player.cs (classen)? Og ikke selveste objektet som ble "new" i hovedformen? Kan jeg få den til å henvise til objektet Human som faktisk eksisterer? EDIT; Men hvis du ser på eksemplet jeg la med i posten ovenfor, så viser det problemet bedre. Fordi jeg vet ikke om jeg forklarer godt nok hva jeg mener. :S Endret 21. februar 2008 av Stig Jøran
GeirGrusom Skrevet 21. februar 2008 Skrevet 21. februar 2008 Du lager en variabel som heter player av typen Player (som du vet, gjør C# forskjell på stor og små bokstaver) Men jeg kan ikke se hvor du setter en verdi til player. Så lenge player er null, kan du heller ikke endre noen verdier, da null er et ugyldig minneområde.
Stig Jøran Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 (endret) Du lager en variabel som heter player av typen Player (som du vet, gjør C# forskjell på stor og små bokstaver)Men jeg kan ikke se hvor du setter en verdi til player. Så lenge player er null, kan du heller ikke endre noen verdier, da null er et ugyldig minneområde. Nei, Player er en class Player.cs, og i hovedformen så gjøres dette: namespace LifeBiz { public partial class frmMain : Form { // New Object, player. Player Human = new Player(); } } Altså Human er det nye objektet, fra playerclassen(Player.cs). Og problemet er å få skrive/lese tilgang til Human utenfor frmMain. Innenfor kan jeg få tilgang til alle de forskjellige variablene som er i Human objektet. Hvis jeg bruker Player Human2 = new Player(); Så lager den et nytt objekt, og jeg får tilgang til det. Men jeg vil ha tilgang til det som ble laget først. Hvordan kan det gjøres? Endret 21. februar 2008 av Stig Jøran
hockey500 Skrevet 21. februar 2008 Skrevet 21. februar 2008 som jeg sa, static. public static Player Human = new Player(); da kan du få tilgang til den fra hvor som helst med LifeBiz.frmMain.Human
GeirGrusom Skrevet 21. februar 2008 Skrevet 21. februar 2008 Eller mer korrekt: properties namespace LifeBiz { protected Player m_human; public partial class frmMain : Form { // New Object, player. m_human = new Player(); } // Read only property Human public Player Human { get { return m_human; } } }
Stig Jøran Skrevet 21. februar 2008 Forfatter Skrevet 21. februar 2008 Se derja. Nå skjønnte jeg det. Takker!
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå