Utilisation de la classe courante partout

[Résolu]
Signaler
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
-
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
-
Bonjour,
Je débute en c# et j'ai un souci concernant l'utilisation des classes.
Je déclare une classe que j'instancie sur une form qui en appele d'autre.
Je voudrais que les autres forms appelés puissent utiliser la classe déclarée dans la première fenêtre(càd la classe en cours sans en instancier une autre dans cette nouvelle fenêtre.)
J'essaye de leur passer en paramètre la classe mais j'ai une erreir de type system.stack.overflow

Merçi.

18 réponses

Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
De tout façon de part ton titre je pense que ce que tu veux faire c'est un singleton.

Creer ta classe et rajoute çà dedans :

private static MaClass _instance;

internal MaClass Instance
{
get
{
if (_instance== null)
_instance = new MaClass();

return _instance;
}
}

Ensuite tu accèdes à ta classe de partout en faisant MaClass.Instance.MaFunction.

::|The S@ib|::
MVP C#.NET
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
private system.Int32 _typeconnex=0;

Définition de la propriété :

public system.Int32 TypeConnex
{
get
{
return _typeconnex;
}
set
{
_typeconnex = value;
}
}

Et tu y accedes :
Maclasse.Instance.TypeConnex = 0;
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Salut,

Comment fait tu ce passage en paramètre ?

/*
coq
MVP Visual C#
*/
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
salut,

exemple de code

1. Dans Ma feuille maître

public class maclasse;

et lors de l'appel de ma feuille

je fais

f mafeuille;
f=new mafeuille(maclasse);
f.showdialog();

2. dans ma fuielle 2

private class cls

public mafeuille_load(class cls1)
cls1=cls;
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Hum...rien compris.
Tu peux le refaire en vrai code l'exemple stp ?

/*
coq
MVP Visual C#
*/
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
Sachant que la classe a déjà été écrite avec ses propriétés et ses méthodes et s'appelle classedebase dans le même namespace.
/////////////////////////////////////////////////
fenêtre Maître
Réferencement de la classe
public classedebase clsbase;

Reste du code de la fenêtre ........................

/////////////////////////////////////////
Code de l'événement de l'appel de la fenêtre


frmprmdta mdta;


mdta=
new frmprmdta(clsbase);


mdta.ShowDialog();



//////////////////////////////////////////////
Code pour la fenêtre qui doit être appelée
private classedebase cls
public frmprmdta(Classdebase cls1)
// en paramètre la classe de base


{



//



// Requis pour la prise en charge du Concepteur Windows Forms



//


InitializeComponent();



//



// TODO : ajoutez le code du constructeur après l'appel à InitializeComponent



//


cls1=cls;
}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Déjà :
cls1=cls; => this.cls = cls1;

/*
coq
MVP Visual C#
*/
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
Salut,

D'accord, c'est ce que je fais déjà, mais ça plante
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Oui mais je ne vois aucune raison d'avoir une StackOverflowException dans ce code là.
Le problème est sans doute ailleurs.
Tu fais une opération récursive quelquepart ? Une boucle infinie ?
Avoir le restant des informations de l'exception nous aidera probablement à y voir plus clair, et elle te donne surtout l'endroit exact du code où il y a eu le problème.

/*
coq
MVP Visual C#
*/
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Hello,

Est-ce que par hasard, tu n'aurait pas une propriété dans ce style :


public
Classdebase cls
{
g
et{
return cls;}

set{cls=
value;}
}

au lieu de

private Classdebase _cls;
public
Classdebase cls
{
get{return _cls;}
set{_cls=value;}
}

Amicalement, SharpMao
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
public frmprmdta(Classdebase cls1)
// en paramètre la classe de base
{


InitializeComponent();





cls1=cls;
}

C'est pas l'inverse que tu voudrais faire ?

cls = cls1 ?

::|The S@ib|::
MVP C#.NET
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Pfff
Arrête de regarder sur la copie du voisin
;-)

/*
coq
MVP Visual C#
*/
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
Salut,
Merci pour l'avancement du débat mais le souci persiste même en créant le singleton.
En effet, le message apparait topujours quand j'essaye de modifier la valeur d'une propriété par la biais de l'objet de la deuxième ênêtre.

Le code est Maclasse.Instance.fields= (int) 0;

Le fields dans maclasse est :

private system.Int32 typeconnex=0;

Définition de la propriété :

public system.Int32 _itypeconnex
{
get
{
return typeconnex;
}
set
{
_typeconnex=value;
}
}
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Eh ouais,

A peu de choses près ce que j'avais dit.

Amicalement, SharpMao
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
Salut,

Décidement, la programmation objet me fera toujours bondir.
Ceci fonctionne, merci à tous pour votre participation.

A+
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
accepte les réponses.
Messages postés
31
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
15 mars 2015
1
Salut,

excuse-moi, c'est que j'étais pressé d'avancer dans le prog.

Une chose.

L'utilisation de la classe depuis d'autres fenêtres que là où elle a été declarée peut se faire aussi de cette manière :

1 Sur la fenêtre où on déclare la classe il faut que la variable soit en static.

Par la suite on peut fvaire : mafeuille.mavariable.methode ou propriété.

Sinon l'idée du singleton aussi fonctionne très bien.

A+
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
21
CElà revient au même mise a part que le singleton est plus propre.

::|The S@ib|::
MVP C#.NET