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

WinDev Discussion :

Événement sur une méthode de classe


Sujet :

WinDev

  1. #1
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut Événement sur une méthode de classe
    Bonjour,
    Est ce qu'il est possible d'intercepter dynamiquement l'appel d'une méthode de classe ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaClasse est une classe
    FONCTION getId()
    RENVOYER :id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MonObjet est un Maclasse
    MonObjet.getid()
    Au moment de l'appel MonObjet.getid() je souhaite le déclenchement d'un code qui m'informe que la méthode est appelé pareil comme la fonction
    Événement dans Windev.
    l'événement peut être sur un clic d'un bouton et je cherche l’événement sur l'appel d'une méthode ou autre possibilité de le faire

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il n'y a pas d'événements sur l'appel d'une procédure, fonction, méthode ou propriété de classe.

    Donc la seule façon de faire est de modifier la méthode de la classe, ou de la surcharger (via l'héritage de classe).

    Tatayo.

  3. #3
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Il n'y a pas d'événements sur l'appel d'une procédure, fonction, méthode ou propriété de classe.

    Donc la seule façon de faire est de modifier la méthode de la classe, ou de la surcharger (via l'héritage de classe).

    Tatayo.
    Bonjour,
    Merci de m'avoir répondu.
    Mon but est de faire un mouchard sur l'appel de tel ou tel méthode d'une classe, est ce qu'il y a une possibilité de le faire sans
    apporter des modifications à la méthode que je souhaite surveiller ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par tunizar Voir le message
    Mon but est de faire un mouchard sur l'appel de tel ou tel méthode d'une classe, est ce qu'il y a une possibilité de le faire sans
    apporter des modifications à la méthode que je souhaite surveiller ?
    Comment dire...
    Citation Envoyé par tatayo Voir le message
    Donc la seule façon de faire est de modifier la méthode de la classe, ou de la surcharger (via l'héritage de classe).
    Tatayo.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Laos

    Informations forums :
    Inscription : Mars 2003
    Messages : 552
    Points : 1 193
    Points
    1 193
    Par défaut
    Voici un début de solution à optimiser car pas sûr que ça intercepte tous les événements :

    Dans un thread, scruter la pile de débogage (fonction dbginfo()) et lorsqu'on on trouve une occurrence de la méthode à surveiller, on lance un code spécifique....

    Le problème c'est la vitesse de "scrutation" de la pile... si ça se trouve, plusieurs appels passeront à la trappe.....

    Mais de manière efficace et sûr, Tatayo a raison, vous devez modifier vos appels aux méthodes.

  6. #6
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Comment dire...


    Tatayo.
    Et est ce qu'un Thread qui contient les info de debug comme dbginfo peut faire l'affaire ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Je ne sais pas si la pile d'exécution d'un thread secondaire "contient" aussi celle du thread principal. C'est facile à tester.
    Mais comme le dit justement Ry_Yo, il faut scruter en permanence dans une boucle, et si l'appel de la méthode est trop rapide la scrutation peut "passer à côté".
    De plus on ne peut pas savoir s'il y a eut 2 appels, ou si le thread a "intercepté" deux fois le même appel.

    Tatayo.

  8. #8
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Je ne sais pas si la pile d'exécution d'un thread secondaire "contient" aussi celle du thread principal. C'est facile à tester.
    Mais comme le dit justement Ry_Yo, il faut scruter en permanence dans une boucle, et si l'appel de la méthode est trop rapide la scrutation peut "passer à côté".
    De plus on ne peut pas savoir s'il y a eut 2 appels, ou si le thread a "intercepté" deux fois le même appel.

    Tatayo.
    Merci pour l'info
    j'ai vu poste dont tu as participé qui ressemble à ma demande
    http://www.developpez.net/forums/d12...s-d-execution/

  9. #9
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par Ry_Yo Voir le message
    Voici un début de solution à optimiser car pas sûr que ça intercepte tous les événements :

    Dans un thread, scruter la pile de débogage (fonction dbginfo()) et lorsqu'on on trouve une occurrence de la méthode à surveiller, on lance un code spécifique....

    Le problème c'est la vitesse de "scrutation" de la pile... si ça se trouve, plusieurs appels passeront à la trappe.....

    Mais de manière efficace et sûr, Tatayo a raison, vous devez modifier vos appels aux méthodes.
    Bonjour,
    Je viens d'essayer cette solution, mais les informations remontées par dbginfo concernent que le thread lui-même !!

  10. #10
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // code d’initialisation du projet
    GLOBAL	
    	gnNumThread est un entier
    CONSTANT
    	csNomThread = "ThreadBulle"	
    	csNomTestThread = "TestThread"	
    FIN
     
     
    // On exécute le thread
    ThreadExécute(csNomTestThread,threadNormal,PG_MonThread)
    //ThreadAttendSignal()
    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
    29
    30
    31
    32
    33
    34
     
    //Procédure global (ou la méthode ) qui fait le Thread 
     
    // Procédure automatique :
    // La procédure est exécutée manuellement, lors d'un appel dans le code
    // Elle s'exécutera dans un thread (sans avoir besoin d'appeler la fonction ThreadExecute), sans utilisation de HFSQL
    // Elle sera répétée en boucle, en attendant 1 seconde entre chaque appel
    // 
     
    PROCEDURE PG_MonThread()
     
    // On indique que le thread s'est chargé et lancé
    ThreadEnvoieSignal("a")
     
    //
    //// Initialisation du moteur de génération aléatoire
    //InitHasard()
     
    Trace(dbgInfo(dbgTraitement))// Aucun Libellé du traitement en cours d'exécution 
    Trace(dbgInfo(dbgTraitement,dbgTraitementEnCours))// Libellé du traitement en cours d'exécution 
    Trace(dbgInfo(dbgTraitement,dbgTraitementAppelant))// Libellé du traitement appelant 
    Trace(dbgInfo(dbgTraitement,1))// <un entier> Libellé du <entier> traitement appelant 
    Trace(dbgInfo(dbgElément))// Aucun Nom interne complet du traitement en cours d'exécution 
    Trace(dbgInfo(dbgElément,dbgTraitementEnCours)) //Nom interne complet du traitement en cours d'exécution 
    Trace(dbgInfo(dbgElément,dbgTraitementAppelant))// Nom interne complet du traitement appelant 
    Trace(dbgInfo(dbgElément,1))// <un entier> Nom interne complet du <entier> traitement appelant 
    Trace(dbgInfo(dbgLigne))// Aucun Numéro de la ligne en cours du traitement en cours d'exécution. 
    Trace(dbgInfo(dbgLigne,dbgTraitementEnCours))// Numéro de la ligne en cours du traitement en cours d'exécution. 
    Trace(dbgInfo(dbgLigne,dbgTraitementAppelant)) //Numéro de la ligne en cours du traitement appelant. 
    Trace(dbgInfo(dbgLigne,1))// <un entier> Numéro de la ligne en cours du <entier> traitement appelant 
    Trace(dbgInfo(dbgNomCompletComposant))//  Aucun Nom complet du composant en cours d'exécution. Quelques exemples : 
    //Trace(dbgInfo(dbgNomType <Numéro du type> Nom du type en toutes lettres. <Numéro du type> peut être connu : 
    Trace(dbgInfo(dbgPile))// Aucun Pile des appels 
    //Trace(dbgInfo(dbgActiveDumpSystème))// Aucun Active la génération de dump système pour faire parvenir certains problèmes au Support Technique.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     // Valeur des traces
    Procédure globale PG_MonThread
    Procédure globale PG_MonThread
     
     
    Procedures globales de WD Pool de threads.PG_MonThread
    Procedures globales de WD Pool de threads.PG_MonThread
     
     
    24
    25
     
     
     
    Procédure globale PG_MonThread (Procedures globales de WD Pool de threads.PG_MonThread), ligne 30
    Procédure globale PG_MonThread
    Procédure globale PG_MonThread
     
     
    Procedures globales de WD Pool de threads.PG_MonThread
    Procedures globales de WD Pool de threads.PG_MonThread
     
     
    24
    25
     
     
     
    Procédure globale PG_MonThread (Procedures globales de WD Pool de threads.PG_MonThread), ligne 30
    Procédure globale PG_MonThread
    Procédure globale PG_MonThread
     
     
    Procedures globales de WD Pool de threads.PG_MonThread
    Procedures globales de WD Pool de threads.PG_MonThread
     
     
    24
    25
     
     
     
    Procédure globale PG_MonThread (Procedures globales de WD Pool de threads.PG_MonThread), ligne 30
    Procédure globale PG_MonThread
    Procédure globale PG_MonThread
    ça concerne toujours le Thread lui même !

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Quel est le but de tout ça ?
    Si c'est juste de savoir si la méthode est appelée, (à part regarder dans le code), il est possible de tracer l'exécution avec dbgActiveLog().
    On obtient alors un fichier avec tous les appels de procédures, méthodes, fonctions...

    Tatayo.

  12. #12
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    => injection du code

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par tunizar Voir le message
    => injection du code
    C'est à dire ? Injection SQL ?

    Tatayo.

  14. #14
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Bonjour,
    J'ai trouvé la solution
    dans la déclaration de la méthode il faut mettre un paramètre qui lui même une méthode de catch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // la méthode à surveiller
    FUNCTION getId(maMethodeDeSurveillance()):int
    result :id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // La méthode de surveillance
    FUNCTION maMethodeDeSurveillance():array of dynamic object 
    // faire quelque chose qui puisse agir sur l'appelant

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Citation Envoyé par tunizar Voir le message
    Mon but est de faire un mouchard sur l'appel de tel ou tel méthode d'une classe, est ce qu'il y a une possibilité de le faire sans
    apporter des modifications à la méthode que je souhaite surveiller ?
    Donc au final, tu as modifié la méthode à surveiller...

    Tatayo.

  16. #16
    Membre averti Avatar de tunizar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 573
    Points : 427
    Points
    427
    Par défaut
    Bonjour,
    Oui, enfin plus au moins !
    la modification est au niveau de la signature des paramètres, mais je reste toujours preneur d'une solution qui permet de le faire sans modifier ni le corps, ni la signature des paramètres

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/05/2012, 20h58
  2. Réponses: 1
    Dernier message: 29/12/2010, 09h36
  3. Réponses: 2
    Dernier message: 06/07/2009, 09h45
  4. Déclencher un événement sur une propriété de ma classe
    Par Gregory.M dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/06/2009, 16h13
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

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