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 :

on va appeller ça : externalisation de fonctions [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet Informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 10
    Points
    10
    Par défaut on va appeller ça : externalisation de fonctions
    Bonjour,

    Je vous propose de m'aider à résoudre un problème sur lequel je bloque un peu. donc voici le contexte :

    Je suis en train de développer une application qui va permettre d’exécuter des commandes. Ces commandes sont composées d'une suite ordonnées d'actions.
    par exemple, la commande "mettre à jour" va contenir une première action qui va faire un F5, et une seconde action qui va prononcer "page mise à jour" via la synthèse vocale.
    NB : j'ai donc une FormCommand, et une FormAction dans lesquelles je configure tout ça. elles utilisent une classe "Commands" et une classe "Actions".

    Afin de donner accès à l'utilisateur à un ensemble de fonction déjà toute faite, je lui donne la possibilité de choisir dans une comboBox dans la FormAction
    cette comboBox est alimentée en allant faire la liste des méthodes qui se trouve dans ma classe "Fonctions". Donc dans ma FormAction, j'alimente la comboBox de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                Fonctions MyFonctions = new Fonctions();
                Type oType = MyFonctions.GetType();
     
                MethodInfo[] ListMethods = oType.GetMethods();
     
                comboBox_fonction.Items.Add("None");
                foreach (MethodInfo mi in ListMethods)
                {
                    comboBox_fonction.Items.Add(mi.Name);
                }
    Pour executer une action, j'utilise dans ma classe "Actions" la Reflection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            public string AppelMethode(string strParam)
            {
     
                Fonctions MyFonctions = new Fonctions();
                Type oType = MyFonctions.GetType();    
                string strMask = "";
     
                MethodInfo[] ListMethods = oType.GetMethods();
                object objVal = null;
     
                foreach (MethodInfo mi in ListMethods)
                {
                    if (mi.Name.ToLower().Equals(strMask.ToLower() + strParam.ToLower()))
                    {
                        objVal = mi.Invoke(MyFonctions, null);
                        break;
                    }
                }
     
                return "OK";
            }

    Cela exécute dans mon exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           public void mettre_a_jour()
            {
     
                SendKeys.Send("{F5}");
     
                FormHydra.synthEngine.SpeakAsync("test");
     
            }
    jusque là... ça va ;-)

    maintenant, je voudrais dans ma classe "Fonctions" pouvoir mettre une fonction qui va changer l'apparence de ma FormHydra (form principale)
    exemple (qui ne marche pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public void ChangementModeAffichage()
            {
                int x;
                int y;
                if (FormHydra.Mode == 0)
                {
                    FormHydra.FormBorderStyle = FormBorderStyle.None;
                    Hydra.FormHydra.Opacity = 0.4;
                    Mode = 1;
                    TopMost = true;
                    Width = 445;
                    x = Screen.PrimaryScreen.WorkingArea.Width - Width;
                    y = Screen.PrimaryScreen.WorkingArea.Height - Height;
                    Location = new System.Drawing.Point(x, y);
                }
                else
                {
                    FormBorderStyle = FormBorderStyle.Sizable;
                    Opacity = 1;
                    Mode = 0;
                    TopMost = false;
                    Width = 1150;
                    x = Screen.PrimaryScreen.WorkingArea.Width / 2 - Width / 2;
                    y = Screen.PrimaryScreen.WorkingArea.Height / 2 - Height / 2;
                    Location = new System.Drawing.Point(x, y);
     
                }
            }
    Ce qu'il se passe, c'est que dans ma classe "Fonctions", les objets ne sont pas connus dans cette instance...
    même en mettant le nom FormHydra comme j'ai essayé de le faire sur les premiers.
    j'ai donc le message suivant :

    une référence d'objet est requise pour la propriété la méthode ou le champ non statique.

    comment faire pour que ma FormHydra et tous ces objets et variables soit reconnues et puissent être exploité dans ma classe "Fonctions" ?

    j'ajouterai pour finir que j'ai bien tenté de créer une instance de FormHydra dans cette fonction comme ci dessous, mais certes ça compile cette fois, mais ça bloque lors de l'exécution.
    Impossible de debuger, je perd le curseur lorsque je fais du pas à pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormHydra formHydra = new FormHydra();
    un grand merci d'avance,

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Si dans ta première fonction tu peux accéder à FormHydra.synthEngine.SpeakAsync("test");, c'est que son synthEngine est un static.
    Les autres propriétés étant non static tu ne peux y accéder que par une instance.
    Si tu fais un new FormHydra(), alors tu ne seras de toute facon pas dans la même instance que ton interface.
    Un moyen simple d'arriver à tes fins et de passer par un singleton sur ta FormHydra afin de pouvoir y accéder depuis tes méthodes de Fonction.
    Du coup tu auras un truc dans le style FormHydra.Instance.xxxxxx .

    Enfin je suis pas tout à fait sur parce que le message d'erreur ne colle pas, tu pourrais peut être montrer plus de code.

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

Discussions similaires

  1. Appel periodique d'une fonction
    Par Nowoday dans le forum C++
    Réponses: 9
    Dernier message: 10/07/2008, 22h05
  2. appel de pointer sur fonction?
    Par dietrich dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 28/09/2007, 18h39
  3. Appel automatique d'une fonction au lancement
    Par greg2 dans le forum C++
    Réponses: 3
    Dernier message: 10/07/2007, 09h04
  4. Réponses: 8
    Dernier message: 02/02/2006, 18h13
  5. Réponses: 4
    Dernier message: 01/07/2004, 19h15

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