IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Structurer correctement un programme


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Structurer correctement un programme
    re-bonjour!

    Je débute en C# (mon 1er langage orienté objet), et j'ai encore du mal à structurer mon code..

    Je cherche à faire une appli "Windows Forms".

    J'ai compris qu'on pouvait mettre une action derrière chaque élément de la Form...
    Ce que je ne comprends pas, par contre, c'est où placer les actions à ne faire qu'une fois..

    Par ex:
    - où placer une ouverture de fichier via File.Create pour remplir par exemple le fichier de l'heure à chaque clic sur un bouton?
    - si l'on veut laisser à l'utilisateur de l'appli la possibilité de déplacer un bouton ou un panel, où placer la commande, puisque, si j'ai bien compris, ce n'est pas à mettre dans la méthode panel_MouseMove?
    - est-ce que placer les variables globales juste sous la déclaration du Form est une manière "propre" de faire les choses ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public partial class Graph : Form
        {
            private static int mar_var_globale = 0;
    Ces questions sont certainement triviales, et je sais que je vais me prendre des et des .. Mais bon.. Je tente quand même.. Parceque là, j'ai beau essayer, j'arrive pas à avoir les idées claires là-dessus...

    Merci par avance!

    ZB

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour le placement de ton file.Create, c'est toi qui voit
    sur chaque controle il y a des evenements, form est un control
    form possède un évènement Load qui est déclenché une seule fois au chargement du form

    pour que l'utilisateur puisse déplacer des controles, il faut gérer mousedown et mousemove
    sur mousedown tu enregistres l'endroit cliqué
    sur mousemove si le bouton gauche est enfoncé tu déplace le controle de nouvelles coordonnées du pointeur - anciennes coordonnées (coordonnées trouvables dans la variable e de l'event)

    et pour tes variables, ca depend à quoi elles servent
    si c'est des variables pour le form, tu les mets en non static dans la classe du form
    si c'est des variables globales pour l'appli tu les mets en static dans une classe à part par exemple

  3. #3
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Je te conseillerais aussi de ne mettre dans ton code-behind que ce qui concerne les événements eux-mêmes et ce qui concerne les liaisons composants-modèle du genre MaTxtBox.Text = monObjet.Prop (et inversement).

    Pour tout le reste, c'est à dire les traitements logiques, mets les dans une autre couche de ton appli, de cette manière, tu peux changer d'ihm sans changer les traitements logiques. Si ton appli est en winform et que tu changer pour faire du WPF ou du web, alors tu n'auras qu'à redévelopper l'ihm et aucun traitements liés au coeur de l'appli

  4. #4
    Membre actif Avatar de el_pedro
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 200
    Points : 236
    Points
    236
    Par défaut
    Salut ZeBen.

    Si j'ai bien compris, tu début en objet.

    Si tu à déjà commencé à regarder la structure d'un objet, tu as dût la voir comme ceci :
    - Propriétés
    - Constructeur
    - Méthodes

    Une form n'est rien d'autre qu'un objet et suit donc ce schéma. Tu retrouve de base ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Form1(){
     InitializeComponent();
    }
    C'est le constructeur de ta classe (de ta form).

    Si tu regarde la structure que je t'ai donnée, tu verra que les variables globales à toute ta form sont tout en haut et donc en effet juste sous la déclaration de ta classe (ça n'est pas obligatoire mais c'est un standard). Si ces variables ne concernent pas que ta form (si elles sont utilisées ailleur), je te conseil de les stocker ailleur.

    En ce qui concerne ton File.Create, comme dit Pol63, c'est à toi de voir. Si ce fichier est nécessaire dans plusieurs méthodes et évènements de ta form, tu ferai en effet bien de le mettre dans le Load ou dans le constructeur de ta classe. Si au contraire, tu l'utilise à un endroit précis, autant ne créer ce fichier qu'au moment de l'utiliser.

    pour que l'utilisateur puisse déplacer des controles, il faut gérer mousedown et mousemove
    sur mousedown tu enregistres l'endroit cliqué
    sur mousemove si le bouton gauche est enfoncé tu déplace le controle de nouvelles coordonnées du pointeur - anciennes coordonnées (coordonnées trouvables dans la variable e de l'event)
    Pas mieux.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Yop!

    Bon.. Je vous préviens: vous avez été prolixes, alors moi zossi! na!

    @Pol63:
    - pour la création de fichier, je ne savais pas qu'il y avait un évènement "Load".. Mais si ce n'est déclenché qu'une fois (question: ce n'est déclenché qu'une fois, MÊME SI on fait des "Panel.Refresh()"?? ), c'est exactement ça que je cherchais.. merci!
    - pour le déplacement des contrôles, en fait, je galère en fait pour l'instant surtout dans la gestion de l'appartenance des variables, et sur la manière de garder une variable en mémoire après l'exécution d'un évènement..
    - pour tes conseils sur la gestion des variables, je vais essayer d'appliquer ça..

    @kheironn: merci beaucoup pour ces précieux conseils.. Par contre, si, pour l'avoir lu un peu partout, je suis complètement d'accord et ai complètement intégré la philosophie de dev que tu décris, j'ai vraiment du mal à voir ce à quoi correspond "dans la pratique" de mettre une autre couche dans l'appli.. Ca veut dire quoi?? Développer ça dans un .cs à part? dans une classe à part?

    @el_pedro: Je commence effectivement en objet, et ai encore du mal à jongler avec aisance avec les notions de Propriétés, Constructeur et Méthodes.. Mais ça commence à rentrer.. Je vais suivre avec méthode tout ce que tu me conseilles..

    et puis, @vous trois, quoi dire de plus que et !!!
    (à savoir, d'une part pour ces précieux conseils, et d'autre part pour votre indulgence vis à vis d'un p'tit bleu )

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    load n'est déclenché qu'une fois par form

    les .refresh sur les form et les controls, oublie, cette méthode ne sert strictement à rien, tout se rafraichit automatiquement (on est pas en web)

    et sinon le mieux c'est encore de regarder ans le combobox en haut tous les évènements et ce qu'ils font (qui doit etre écrit en infobulle)
    avec l'intellisense tu peux aussi parcourir tous les membres de tes variables et voir ce qu'on peut faire dessus




    pour les couches dans une appli par un exemple simple :

    un développeur de base va faire dans le form load
    execution d'une requete pour select nom from client
    pour chaque ligne il va créer un label avec le retour de requete, l'ajouter sur le form dans un listbox

    avec une couche de plus, on créé une classe client, avec une propriété nom et une fonction static GetClients, et dans le form load tu parcours getclient pour créer les labels, comme ca ta requete reste dans la classe métier, et le code d'interface reste dans le code d'interface, donc plus simple à débugger ou à faire évoluer

    après on peut aller plus loin style MVVM avec une classe client, une classe qui code l'affichage d'un client et la classe d'interface qui demande à la classe d'affichage la liste des controls, peu importe ce qu'ils sont
    comme ca si tu veux changer ton label en textbox, tu ne modifies que la classe intermédiaire, la classe d'interface sert à dire que tu veux afficher des clients
    et si tu veux afficher des lapins à la place, tu ne changes que la ligne de code dans la classe d'interface qui disait que tu voulais voir les clients

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    rhooooo... C'est beau le Form_Load!!! et en plus ça marche!!!! Merci, m'sieur!

    En fait, à propos du .refresh, je cherchais (en exercice) à tracer un trait entre les deux dernier clics sur mon panel... Et rajouter un .refresh à la fin de mon Panel_MouseClick est la seule solution que j'ai trouvée pour que ces traits soient affichés... Si tu as mieux, je suis preneur..

    Et je vais me pencher sur ton histoire de ComboBox.. Thx! Par contre, l'intellisense aide, mais n'est pas non plus toujours évidente à utiliser si on ne sait pas que ce dont on a besoin existe.. C'est toujours pareil.. On trouve toujours plus facilement quelque chose dont on connaît l'existence!

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    oui bon le .refresh peut servir alors ...

    sinon le truc à faire c'est de lire des tutos et/ou de parcourir toutes l'intellisense (au moins les namespace et les classes) pour voir un peu ce qui existe
    parce qu'il y a quand meme pas mal de choses, et souvent on réinvente la roue ...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    et souvent on réinvente la roue ...
    Oui.. C'est le drame de ma vie!!! (je ne compte même plus les "D'oh!" poussés dans ce contexte)

  10. #10
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    sinon le truc à faire c'est de lire des tutos et/ou de parcourir toutes l'intellisense (au moins les namespace et les classes) pour voir un peu ce qui existe
    parce qu'il y a quand meme pas mal de choses, et souvent on réinvente la roue ...
    Sinon, il faut être multi-certifié crosof (et là tu connais bien le framework). La certification c'est comme un contrôle où tu récites tes leçons

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    on peut s'en sortir sans je pense ^^

  12. #12
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par ZeBen Voir le message
    En fait, à propos du .refresh, je cherchais (en exercice) à tracer un trait entre les deux dernier clics sur mon panel... Et rajouter un .refresh à la fin de mon Panel_MouseClick est la seule solution que j'ai trouvée pour que ces traits soient affichés... Si tu as mieux, je suis preneur..
    Apriori il faudrait utiliser paint pour faire ca.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par xian21 Voir le message
    Apriori il faudrait utiliser paint pour faire ca.
    C'est ce que j'ai fait.. Mais sans Panel.Refresh(); à la fin de mon contrôle Panel_MouseClick, rien n'est affiché..

    PS@el_pedro: "Panel_MouseClick", c'est bien ce qu'on appelle un "contrôle" ou ça porte un autre nom?

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour les dessins, si on a besoin de performance, on passe par un bufferedgraphics, et on buffer.render au lieu de ctrl.Refresh, pour ca que je disais que .refresh n'était pas utile
    mais pour 2 lignes c'est pas la peine de déployer l'artillerie lourde ^^

    Panel_Mouseclick c'est le nom de la sub
    handles Panel.Mouseclick signifie que la sub est appelée par l'évènement Mouseclick de l'instance Panel, Panel étant ici une variable de type control, mais une classe non graphique peut aussi avoir des évènements

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Panel.Refresh();
    Quand la méthode Invalidate existe, l'utiliser de préférence à Refresh(), sauf dans le cas particulier où le contrôle doit être redessiné de suite avant de poursuivre la méthode en cours d'exécution.

    Invalidate indique que le contrôle doit être rafraîchit dès que c'est pertinent, alors que Refresh force le rafraîchissement immédiatement même si ça n'a pas de sens réel.

    A+
    Claude

  16. #16
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par ZeBen Voir le message
    "Panel_MouseClick", c'est bien ce qu'on appelle un "contrôle" ou ça porte un autre nom?
    Vu le nom, je dirais plutôt que c'est un événement...
    Un contrôle, c'est soit un composant, soit du code permettant de contrôler la validité d'un objet par exemple.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Une fois de plus, pour vos réponses...

    - le Form_Load() marche à merveille pour tout initialiser (notamment, créer (ou vider s'il existe) mon fichier de Log)
    - mon problème de variables globales venait du fait que je n'utilisais pas la bonne syntaxe, ce qui fait que je créais dans ma méthode une nouvelle variable (donc locale) avec le même nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public partial class maForm : Form
        {
            private string filename = "";
            private void maForm_Load(object sender, EventArgs e)
            {
                string filename = chemin + @"\" + fichier;
            }
        }
    au lieu d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public partial class maForm : Form
        {
            private string filename = "";
            private void maForm_Load(object sender, EventArgs e)
            {
                filename = chemin + @"\" + fichier;
            }
        }
    Forcément, quand je voulais l'utiliser dans une autre méthode, filename valait toujours ""

    - @kheironn: merci pour la précision.. Une fois de plus, c'est assez chaud de choper le bon vocabulaire...
    - @ClaudeBg: merci pour le tuyau.. je vais essayer de voir comment utiliser Invalidate..

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bon.. Vue la qualité des réponses que j'ai eues ici, j'allais mettre ce thread en "Résolu", mais, visiblement, un GA (pour Gentil Admin) s'en est chargé..
    Merci à lui (et à vs tous)
    ZB

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    ca devait être un GM plutôt ^^ (gentil modérateur)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [STRUCTURE] Structure d'un programme JAVA
    Par pflany dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2020, 22h05
  2. Réponses: 18
    Dernier message: 04/06/2007, 00h55
  3. Apprendre la structure d'un programme en Prolog
    Par minen dans le forum Prolog
    Réponses: 3
    Dernier message: 26/02/2007, 09h48
  4. Correction de programme
    Par Thesilverking dans le forum Assembleur
    Réponses: 4
    Dernier message: 09/09/2006, 04h07
  5. [debutant] structure d'un programme
    Par poukill dans le forum Débuter
    Réponses: 17
    Dernier message: 19/05/2006, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo