Question idiote mais question comme même ... [Résolu]

Signaler
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010
-
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010
-
Bonjour tout le monde,

Le titre de mon sujet n'est pas des plus explicites, certes, et mon sujet n'est surement pas placé au meilleur des endroit ...

Je suis débutant dans le C#, j'ai pas mal de connaissance en C/C++, et je suis entrain de développer une appli SIG avec un ami dans le cadre d'un projet étudiant.

Nous codons depuis plusieurs semaines, et nous sommes confrontés à des problèmes de "partage" de variables entre plusieurs formes.

La question que je me suis alors posé est la suivante :
Le code principale qui va gérer l'application, doit-il être écrit dans la fonction Main de program.cs (comme en C++), ou alors doit il être géré dans la forme1 (forme principale) ?

De plus, dans le Maint, il y a la ligne suivante :
Application.Run(new Form1());


De cette manière, il n'y a donc aucune possibilité de revenir sur l'objet créé par l'instruction, puisque l'objet n'est pas référencé dans une variable comme dans cet exemple :
Form1 f1 = new Form1();

L'objet est donc comme invisible, et ses propriétés et données restent alors inaccessibles ?

Ces questions peuvent pour paraitre idiote, mais je n'ai pas encore réellement saisi comment gérer un projet C#.

Merci d'avance pour vos réponses.

Julien.

13 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut

Tout d'abord, tu as fait une petite erreur pour le deuxième exemple : tu as laissé le "static" ;)

En ce qui concerne l'export, le xml est très bien, surtout que tu as des classes faites exprès pour la lecture et l'écriture. Cependant, pour enregistrer/lire 2-3 valeurs, c'est peut-être une perte de temps.
Le csv n'a pas grand intérêt excepté sa compatibilité. Mais si tu ne cherches à utiliser le fichier qu'avec ton programme, là encore, ça n'a pas d'intérêt.
En gros, tu peux faire le fichier comme ça t'arrange. C'est vrai, par exemple, que le CSV te permettra d'obtenir tes valeurs en 2 lignes :
string ligne = monStreamReader.ReadLine();
string[] valeurs = ligne.Split(";");

et après, tes valeurs seront dans valeurs[0], valeurs[1]...

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
5
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 octobre 2010

As-tu déjà essayer de déclarer dans une module en tant que friend ou public?

Chaudhary
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut.

Sous Winform, tu utilises de la programmation événementielle. Donc logiquement, tu n'as rien à mettre dans la méthode main (excepté, si nécessaire, la gestion des arguments de la ligne de commande). Pour cette raison, il n'est - généralement - pas nécessaire de modifier Application.Run(new Form1());.
Cependant, rien ne t'empêche de faire
Form1 form1 = new Form1();
Application.Run(form1);


Ton code sera donc placé soit dans le constructeur de Form1 (après la méthode InitializeComponent()) s'il s'agit de code directement en rapport avec ta fenêtre, soit dans des méthodes de différentes classes appelées lors de différents événements.

Quant au "partage" des variables, tu as plusieurs solutions :
- transmission de tes variables à l'autre objet (constructeur ou propriété)
// Constructeur
Form2 f = new Form2(monObjet); // voire même new Form2(this);
f.Show();

// Propriété
Form2 f = new Form2();
f.MaPropriete = monObjet;
f.Show();


- utilisation de variables statiques
public static class MaClasse
{
    public static object monObjet;
}

// dans ta méthode de Form1 :
MaClasse.monObjet = monObjet;
Form2 f = new Form2();
f.Show();

// dans Form2
MessageBox.Show(MaClasse.monObjet.ToString());


- utilisation d'un singleton
public class MonSingleton
{
    private static MonSingleton instance = null;
    private MonSingleton() { }
    public static Instance
    {
        get
        {
            if(instance null) instance new MonSingleton();
            return instance;
        }
    }
    public object monObjet;
}

// Dans ta méthode de Form1 : 
MonSingleton.Instance.monObjet = monObjet;
Form2 f = new Form2();
f.Show();

// Dans form2
MessageBox.Show(MonSingleton.Instance.monObjet.ToString());


PS : Tu aurais effectivement dû choisir un titre plus explicite...

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
18
Bonjour,

Tout d'abord, sache qu'aucune question n'est idiote et j'en connais un bout sur le sujet
L'idiotie, c'est plutôt ne pas poser une question que l'on se pose !

Concernant le partage de variable, tu as plusieurs solutions dépendant de ton besoin.
- Tu peux d'abord déclarer des membres dans ta Form1 avec des propriétés publiques. Ainsi, dans le constructeur de ta Form2, tu demande le Form1 parent. Et tu auras accès à tous les membres. Perso, j'aime pas trop cette méthode car ta Form2 va dépendre d'une autre Form (la Form1) et c'est pas trop cool.
A la limite, que ta Form1 construise une Form2 et accède à des propriétés publiques de la Form2, ok...
Mais bon, mieux vaut passer les paramètres nécessaires dans le constructeur de ta Form2.

- Une autre solution de partage de paramètre réside dans l'utilisation d'un singleton: http://odalet.wordpress.com/2006/06/20/pattern-singleton-thread-safe-en-c-cest-facile/. Le singleton te permet de partager un objet (thread-safe) dans tout ton projet qui sera unique (instancié une seule fois). Il sera accessible de la forme:
MySingleton.Instance...;//si on suit le lien que j'ai mis


- Ensuite, tu peux faire un truc plus simple. Une classe statique avec des membres statiques.
public static Class1{
public static int Age;
}
//Accès avec
Class1.Age

- Ensuite tu peux partager des données avec le fichier de configuration ou des fichiers Settings (je te laisse chercher sur le net).

- Ou sinon, tu peux passer des paramètres entre Forms avec les solutions du tutorial de Bidou: http://www.csharpfr.com/codes/PASSAGE-PARAMETRES_26735.aspx

- Et j'ai du oublier d'autres solutions...

A toi de choisir...

Bon développement,

Billou_13

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
18
@krimog: Oups, doublon... désolé !
Bon, on a eu les mêmes idées au même moment...

Comme on dit, "les grands esprits se rencontrent"

Billou_13

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Bonjour,

Merci pour vos réponses, je vais essayer avec vos méthodes dès ce matin.
Par contre, j'avais essayer avec les variables statiques. J'avais déclaré un ActiveX présent dans la forme1 avec les attributs public static, et j'ai essayé de l'utiliser dans une seconde classe (hors de la forme1). J'avais alors un problème avec l'instanciation de l'ActiveX ...

Bonne journée !

Julien040807.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
J'avais alors un problème avec l'instanciation de l'ActiveX ...
Tu peux être plus précis s'il te plaît ?

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Oui pas de soucis, et désolé

En fait je déclare mon ActiveX de telle manière dans Form1.Designer.cs :
public AxMapPoint.AxMappointControl axMappointControl1;


Puis je remplace dans toutes les lignes où se trouvent ma variable, this par Form1 pour résoudre les erreurs que me recensent le compilateur. Exemple :
this.axMappointControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
this.axMappointControl1.Enabled = true;
this.axMappointControl1.Location = new System.Drawing.Point(126, 27);
this.axMappointControl1.Name = "axMappointControl1";

Devient :
Form1.axMappointControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
Form1.axMappointControl1.Enabled = true;
Form1.axMappointControl1.Location = new System.Drawing.Point(126, 27);
Form1.axMappointControl1.Name = "axMappointControl1";


Après cela, quand j'utilise axMappointControl1 dans une autre classe (hors de la Form1), j'ai d'autre problème avec les opérateurs new ... bref, tout un engrenage que j'ai du mal à maitriser, donc je vais plutôt voir dans les autres solutions que vous me proposez ...

Merci pour l'aide que vous m'apportez !

Julien040807
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Enfaite j'ai compris l'utilisation du mot clef static en C# !!

Public Class Toto
{
Public static void fonction(){…};
}


L'appel de la fonction se fera de cette façon :
Toto.fonction


Et si on écrit :
Public Class Toto
{
Public static void fonction(){…};
}


L'appel de la fonction se fera de cette façon :
Toto Test = new Toto();
Test.fonction


Mais j'ai encore une autre question, je souhaite enregistrer des informations de connexion à un serveur FTP dans un fichier. Je saisi donc ces informations dans des textbox, j'ai trois fonction, que j'ai pris sur le site csharp, une pour lire des informations, une pour écrire dans le fichier, la dernière pour modifier le fichier. La fonction qui me modifie mon fichier ne fonctionne pas correctement, mais je voulais savoir si il était plus simple d'écrire ce genre d'informations dans un fichier texte, dans un fichier csv, dans un fichier xml, ... ??

Merci d'avance pour vos réponses !
Bonne journée !
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Oui, je me suis trompé dans mon second exemple... j'ai voulu faire trop vite

Merci pour ta réponse ! Je pars surement sur le csv alors ...
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Bonjour,

J'ai pas encore fini de vous embêter

J'ai décidé d'enregistrer mes 4 valeurs dans un fichier csv.
J'ai pas de soucis pour ma fonction qui lit le fichier, mais la fonction qui modifie une valeur (chaine de caractères) me pose encore problème ...

Voici mes deux fonctions :

public string LireCsv(string strFichier, TypeVal tvType)
        {
            string strRetVal="";
            FileInfo fiMonFileInfo = new FileInfo(strFichier);

            if (fiMonFileInfo.Exists) //On vérifie si le fichier existe
            {
                StreamReader strMonStreamReader = new StreamReader(strFichier);
                //
                //On stocke le contenu du fichier dans une variable
                //
                string strContenuFichier = strMonStreamReader.ReadToEnd();
                strMonStreamReader.Close();
                //
                //On range les chaines de caractères séparées par un '\n' dans un tableau
                //
                string[] strTableauValeur = strContenuFichier.Split('\n');
                int iType = (int)tvType;
                strRetVal = strTableauValeur[iType];
            }
            else
                strRetVal = "Le fichier n'existe pas";
            
            return strRetVal;
        }



public void ModifierCsv(string strFichier, TypeVal tvType, string strValeur)
        {
            FileInfo fiMonFileInfo = new FileInfo(strFichier);

            if (fiMonFileInfo.Exists) //On vérifie si le fichier existe
            {
                StreamReader strMonStreamReader = new StreamReader(strFichier);
                //
                //On stocke le contenu du fichier dans une variable
                //
                string strContenuFichier = strMonStreamReader.ReadToEnd();
                strMonStreamReader.Close();
                //
                //On range les chaines de caractères séparées par un '\n' dans un tableau
                //
                string[] strTableauValeur = strContenuFichier.Split('\n');

                StreamWriter strMonStreamWriter = new StreamWriter(strFichier);
                

                int iType = (int)tvType;
                strTableauValeur[iType] = strValeur; 
                strMonStreamWriter.Write(strTableauValeur);
                strMonStreamWriter.Close();

            }
        }


Quand je lance ma fonction modifier, mon fichier se retrouve vide ...

Je ne vois pas trop comment procéder pour résoudre se problème

Bonne journée.

Julien040807
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Enfaite j'ai eu un petit flash ... j'ai rajouté une boucle dans ma fonction modifierCSV et ça donne ça :

Niveau code :
public void ModifierCsv(string strFichier, TypeVal tvType, string strValeur)
        {
            FileInfo fiMonFileInfo = new FileInfo(strFichier);

            //if (fiMonFileInfo.Exists) //On vérifie si le fichier existe
            {
                StreamReader strMonStreamReader = new StreamReader(strFichier);
                //
                //On stocke le contenu du fichier dans une variable
                //
                string strContenuFichier = strMonStreamReader.ReadToEnd();
                strMonStreamReader.Close();
                //
                //On range les chaines de caractères séparées par un '\n' dans un tableau
                //
                string[] strTableauValeur = strContenuFichier.Split('\n');

                StreamWriter strMonStreamWriter = new StreamWriter(strFichier);
                

                int iType = (int)tvType;
                strTableauValeur[iType] = strValeur;
                for (int i = 0; i < 4; i++)
                {
                    strMonStreamWriter.WriteLine(strTableauValeur[i]);

                }
                //strMonStreamWriter.Write(strTableauValeur);
                strMonStreamWriter.Close();

            }
        }


Et dans mon fichier CSV je retrouve cela :
test



a1765516



tonton

totuto.txt



J'ai plus qu'à régler mon soucis avec les sauts de lignes, mon résultats souhaité serait :
test
a1765516
tonton
totuto.txt


Si vous avez une idée ...
Messages postés
16
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
18 mai 2010

Bon je me suis précipité sur le forum tout à l'heure, désolé, mon erreur était toute bête, j'ai mis writeline, du coup le saut de ligne était automatique ...

du coup ma fonction donne cela :
public void ModifierCsv(string strFichier, TypeVal tvType, string strValeur)
        {
            FileInfo fiMonFileInfo = new FileInfo(strFichier);

            //if (fiMonFileInfo.Exists) //On vérifie si le fichier existe
            {
                StreamReader strMonStreamReader = new StreamReader(strFichier);
                //
                //On stocke le contenu du fichier dans une variable
                //
                string strContenuFichier = strMonStreamReader.ReadToEnd();
                strMonStreamReader.Close();
                //
                //On range les chaines de caractères séparées par un '\n' dans un tableau
                //
                string[] strTableauValeur = strContenuFichier.Split('\n');

                StreamWriter strMonStreamWriter = new StreamWriter(strFichier);
                

                int iType = (int)tvType;
                strTableauValeur[iType] = strValeur;
                for (int i = 0; i < 4; i++)
                {
                    strMonStreamWriter.Write(strTableauValeur[i]);
                    strMonStreamWriter.Write("\n");
                }
                strMonStreamWriter.Close();

            }
        }