CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C#]Interaction entre 2 forms indépendte

dimaster7
dimaster7
Niveau 6
23 septembre 2013 à 23:47:08

Bonjour à tous !

Alors voilà mon problème :
Je crée un jeu textuel basé sur les Forms en C#.

J'ai donc une Form qui se lance ("Maison") et dans le chargement de cette Form, une autre (La "fiche de perso") se lance en parallèle, les 2 s'affichant à l'écran. la 2e reste indéfiniment alors que la 1ere varie suivant ce que fait le joueur.

J'aimerai savoir comment "actualiser" ma Fiche de perso à partir des autres Form.

-> J'ai pensé à garder l'adresse mémoire de "Fiche de perso" dans une variable que je transmettrai, mais C# refuse de la stocker.

Merci à ceux qui me répondront !
-> Si je n'ai pas été assez clair, n'hésitez pas à me le dire :) .

SonyKtamer
SonyKtamer
Niveau 6
24 septembre 2013 à 07:02:28

Tu pourrais écrire un peu de code qui illustre ce que tu veux faire ?
Ca nous aiderait à mieux comprendre ton problème :)

dimaster7
dimaster7
Niveau 6
24 septembre 2013 à 11:56:48

/********** Form Maison *********/

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;
using System.IO;

namespace Arena
{
public partial class Maison : Form
{
public Personnage perso = new Personnage(File.ReadAllText(Environment.GetFolderP
ath(Environment.SpecialFolder.MyDocuments)
+ @"\Arena\pseudo.txt"), 1);

public void setPerso()
{
perso.Lecture();
return;
}

public Personnage getPerso()
{
return perso;
}
public Maison()
{
InitializeComponent();
}

private void Maison_Load(object sender, EventArgs e)
{

string enCours = (Environment.GetFolderPath(Environment.SpecialFold
er.MyDocuments)
+ @"\Arena\pseudo.txt");
Perso frmP = new Perso();

frmP.Show();
perso = new Personnage(File.ReadAllText(enCours), 1);

Accueil.Text = "Vous voilà chez vous, " + perso.getNom() + ".\n\n Que faire?";
}

private void btnExp_Click(object sender, EventArgs e)
{
Entrainement frmEnt = new Entrainement();
frmEnt.Show();
}
}
}

/******** Form Entrainement *********/

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;
using System.IO;

namespace Arena
{
public partial class Entrainement : Form
{
Personnage perso = new Personnage(File.ReadAllText(Environment.GetFolderP
ath(Environment.SpecialFolder.MyDocuments)
+ @"\Arena\pseudo.txt"), 1);

public Entrainement()
{
InitializeComponent();
}

private void btnFini_Click(object sender, EventArgs e)
{
perso.Ecriture();
Maison frmMaison = new Maison();
//frmMaison.Show();
frmMaison.setPerso();
this.Close();
}

private void btnPV_Click(object sender, EventArgs e)
{
if (int.Parse(textPV.Text) <= int.Parse(textExp.Text))
{
perso.setVie((int.Parse(textPV.Text) / 10) + perso.getVie());
perso.setExp(perso.getExp() - int.Parse(textPV.Text));
MessageBox.Show("Vous avez gagné " + int.Parse(textPV.Text) / 10 + " Points de vie.");
textExp.Text = perso.getExp().ToString();
textPV.Text = "";
// réactualiser la fiche de perso
}
else MessageBox.Show("Erreur : Vous n'avez pas assez d'expériene pour cette répartition !");
}

private void Entrainement_Load(object sender, EventArgs e)
{
textExp.Text = perso.getExp().ToString();
}

private void btnF_Click(object sender, EventArgs e)
{
if (int.Parse(textF.Text) <= int.Parse(textExp.Text))
{
perso.setForce((int.Parse(textF.Text) / 10) + perso.getForce());
perso.setExp(perso.getExp() - int.Parse(textF.Text));
MessageBox.Show("Vous avez gagné " + int.Parse(textF.Text) / 10 + " Points de force.");
textExp.Text = perso.getExp().ToString();
textF.Text = "";
// réactualiser la fiche de perso
}
else MessageBox.Show("Erreur : Vous n'avez pas assez d'expériene pour cette répartition !");
}

private void btnE_Click(object sender, EventArgs e)
{
if (int.Parse(textE.Text) <= int.Parse(textExp.Text))
{
perso.setEndu((int.Parse(textE.Text) / 10) + perso.getEndu());
perso.setExp(perso.getExp() - int.Parse(textE.Text));
MessageBox.Show("Vous avez gagné " + int.Parse(textE.Text) / 10 + " Points d'endurance.");
textExp.Text = perso.getExp().ToString();
textE.Text = "";
// réactualiser la fiche de perso
}
else MessageBox.Show("Erreur : Vous n'avez pas assez d'expériene pour cette répartition !");
}
}
}

/********** From Perso (La fiche de perso) *********/

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 Arena
{
public partial class Perso : Form
{

Personnage perso = new Personnage(System.IO.File.ReadAllText(Environment.
GetFolderPath(Environment.SpecialFolder.MyDocument
s)
+ @"\Arena\pseudo.txt"), 1);

public Perso()
{
InitializeComponent();
}

private void Perso_Load(object sender, EventArgs e)
{
this.Left = new Maison().Right + 200;
pseudo.Text=perso.getNom();
textE.Text = perso.getEndu().ToString();
textF.Text = perso.getForce().ToString();
textOr.Text = perso.getOr().ToString();
if (int.Parse(textOr.Text) <= 1) labelOr.Text = "Pièce d'or";
else labelOr.Text = "Pièces d'or";
textPV.Text = perso.getPv().ToString() + "/" + perso.getVie();
textExp.Text = perso.getExp().ToString();

}

private void textF_TextChanged(object sender, EventArgs e)
{

}
}
}

/********/

Voilà :D J'ai juste pas mis les fonctions inutiles de la Form Maison ^^ . Merci :)

Shorinji
Shorinji
Niveau 9
24 septembre 2013 à 12:42:52

Ca veut dire quoi concretement "C# refuse de la stocker?"

Ya une erreur de compile? Une runtime error? Ta variable est null?

dimaster7
dimaster7
Niveau 6
24 septembre 2013 à 13:30:50

Ben en fait si tu veux, dans ma Form Maison, j'ai tenté de faire une Perso frmP = new Perso(); et de faire un pointeur sur frmP pour qu'il stocke l'adresse mémoire, et ça me met une erreur
" Les pointeurs et les mémoires tampons de taille fixe ne peuvent être utilisés que dans un contexte unsafe "

Et ça, je ne sais pas du tout ce que ça veut dire ^^"

Shorinji
Shorinji
Niveau 9
24 septembre 2013 à 13:59:18

Moi j'ai jamais utilise les pointeurs en C#, j'utilise juste les "value type" et "reference type".

Je pense que tu ne dois pas etre familier avec ca sinon tu n'aurais pas le probleme que tu as maintenant.

Un "value type" et un type qui sera passe par valeur. Un "reference type" sera passe par reference. Quasiment tous les types sont des reference type sauf les struct, enum, int, float et double. Tous les autes types (y compris les classes que tu ecris) sont des reference type.

Reference type ca veut dire que quand tu passe une variable de type reference type a une fonction, c'est la reference de la variable qui est passee et non pas la valeur, ca veut dire que tu peux la modifier dans la fonction. De plus, les reference types sont stocke dans le heap et pas dans la stack, ce qui veut dire qu'ils sont gere par le garbage collector (c'est a prendre en compte car quand le garbage collector est actif tu peux perdre des frames dans un jeu).

Donc ce que tu veux c'est un reference type, pas un pointuer, et ca tombe bien car ta classe est un reference type.

C'etait un GROS resume, donc je te conseille de lire la doc sur msdn :
http://msdn.microsoft.com/fr-fr/library/3ewxz6et%28v=vs.90%29.aspx

Et si tu parles englais, j'aime bien cet article la:
http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx

Shorinji
Shorinji
Niveau 9
24 septembre 2013 à 14:01:46

Edit : il manque probablement des types dans ma liste de value type, donc le mieux c'est de se referer a la doc si tu n'es pas sur.

dimaster7
dimaster7
Niveau 6
24 septembre 2013 à 14:25:43

Ok ben je vais lire tout ça, je connaissais pas du tout les value type et ref type ^^ Merci de m'en avoir parlé :) .

dimaster7
dimaster7
Niveau 6
24 septembre 2013 à 14:44:06

Edit : Effectivement j'ai compris bien des choses utiles, cependant mon problème n'est toujours pas résolu. Est-ce qu'il existe un moyen de récupérer les données d'une Form déjà ouverte ? Je pense que si je trouvais ça, je n'aurai plus aucun problème...
En tout cas, merci encore pour les liens :D

urizen45
urizen45
Niveau 5
24 septembre 2013 à 14:59:24

Hello,

Le VB.net etant très proche du C#, je vais essayer de t'aider :)

Essaie plutôt de déclarer tes classes dans un module spécifique.
Tu créés un module par exemple MClasses, tu déclares tes classes par exemple MaClasse dedans en property et ensuite tu devrais pouvoir y accéder de partout comme ceci :

MClasses.MaClasse

A+
Uri

Shorinji
Shorinji
Niveau 9
24 septembre 2013 à 15:54:18

Si tu as une reference a la form en question tu peux acceder aux membres publics de cette classe, mais c'est la base de la programmation objet, tu connais la programmation objet ou tu debutes?

dimaster7
dimaster7
Niveau 6
24 septembre 2013 à 16:12:38

C'est bon ! J'ai réussi à faire ce que je voulais faire :) .

Mes Forms "filles" (sachant que ce ne sont pas vraiment des "filles") ont chacune une variable "Maison", du coup je peux les fermer comme ça (en très résumé ^^)

En fait c'était très simple, je me suis pris la tête pour rien ^^

Merci :D .

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment