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

Langage Delphi Discussion :

Héritage et méthodes


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut Héritage et méthodes
    Bonjour a tous,

    une petite question qui va vous paraitre tres con :

    j'ai par exemple un composant TEdit et je redefinis la methode "OnChange".
    A quel moment se fait l'héritage de OnChange du parent ? en filigrane, je voudrais recuperer la valeur AVANT que l'action se fasse. C'est possible ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Tu n'hérite pas OnChange qui est un évènement, mais DoChange qui est la fonction responsable de l'appel de OnChange

    Ensuite, tu décide à quel moment tu lance l'ancienne méthode via le mot clé inherited

    Maintenant, il faudrait plutôt surchargé le Message WM_KEY_PRESS ...

  3. #3
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut
    Donc si je comprends bien :
    si je mets le code suivant rattache a l'evenement "on change" de mon objet Tedit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Procedure tedit1change(...);
    begin
      s := edit1.text;
      inherited change;
      ss := edit1.text;
    end;
    J'ai bien s qui contient la valeur avant modification et ss qui contient la valeur apres modification c'est ca ?

    D'autre part, l'execution "implicite" du inherited (cad si je ne le mets pas moi meme) est elle faite en debut ou en fin de la procedure ?

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Oulah, tu confonds deux choses, positionner un évènement et redéfinir une méthode d'une classe.

    Lorsque tu positionnes une méthode pour répondre à un évènement tu es hors de la classe, dès lors tu ne peux pas avoir aux champs protégés de la classe ou encore l'inherited.

    Comme ShaiLeTroll tu dois redéfinir la méthode DoChange de la classe TEdit (donc créer une classe qui hérite de TEdit) puis faire le traitement en question avec l'inherited.

    Enfin il n'y a pas d'appel implicite à inherited, c'est toujours explicite

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 874
    Points : 11 363
    Points
    11 363
    Billets dans le blog
    6
    Par défaut
    on peut aussi envisager de dériver le TEdit en ajoutant un champ FPrevious et en affectant une méthode au OnChange, qui stockera le nouveau Text dans FPrevious, sauf si ça ne convient pas

  6. #6
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Je vais faire simpliste, il y a des tutoriels pour ça sur le site :

    Une méthode est comme une procédure.

    Un champ est comme une variable.

    Une propriété est un "raccourci" vers un champ, qui permet de protéger ce champ des manipulations hasardeuses, et d'ajouter des traitements supplémentaires lors de la modification / lecture.

    Un évènement est une propriété particulière, associée à un champ privé d'un des ancêtres, et prévue pour stocker l'adresse d'une méthode d'un autre composant. La définition des évènements est facultative, ils valent nil par défaut (= associé à rien), et sont là seulement pour permettre au développeur d'ajouter des traitements par défaut à certaines occasions (appui sur une touche, déplacement de souris, etc). Et bien entendu, ils ne sont concernés en rien par la notion d'héritage, au sens où les méthodes le sont : mettre inherited devant un appel direct d'évènement est une erreur de syntaxe. Bref.

    Seule la méthode préconisée par tourlourou te permettra de faire ce que tu veux. Et si je peux me permettre, étudie un peu les fondements du langage. Je ne le dis pas pour être désagréable, mais simplement parce que le temps que tu y passeras sera bien employé pour la suite.

  7. #7
    Membre éprouvé

    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2006
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2006
    Messages : 621
    Points : 1 264
    Points
    1 264
    Par défaut
    je vais faire aussi simpliste : je voulais simplement savoir s'il etait possible d'avoir l'ancienne valeur d'un Tedit avant que les methodes declenchees par l'appui d'une touche ne soient invoquees, et ce snas etre oblige de defionir un nouveau composant. Je suis un peu fatigue j'ai aps forcement toujours choisi les bon mots.
    Et les fondements du langage je les connais assez bien, j'ai parfois simplement des interrogations auxquelles je n'ai pas les reponses, pas la peine de me renvoyer dans mes 22 comme ca.

  8. #8
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Soit.

  9. #9
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par CapJack Voir le message
    mettre inherited devant un appel direct d'évènement est une erreur de syntaxe.
    Je sais ça dépend ça dépasse mais pourtant ça dépend. (ici nous avons une référence au 7éme Art pour nous ouvrir vers la culture)

    En fait cela dépend de ta méthode ou plutôt technique d'héritage.
    Si tu déclares une nouvelle classe héritant d'une autre alors je suis d'accord le inherited ne te conduiras nul part.
    Si, par contre, tu crée une fiche ou un datamodule et que tu en hérites une autre de la première alors le inherited te conduiras bien dur le OnChange implémenté dans la fiche parente.

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Si tu veux vraiment récupérer la valeur avant modification, je te conseilles de te brancher sur l'évènement OnKeyPress (ou OnKeyDown) à ce moment là ton TEdit à la valeur avant que l'utilisateur n'appuie sur une touche et le paramètre Key est la touche tapée par l'utilisateur.

  11. #11
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Si, par contre, tu crée une fiche ou un datamodule et que tu en hérites une autre de la première alors le inherited te conduiras bien dur le OnChange implémenté dans la fiche parente.
    Tu peux donner un exemple ? Parce que là, je me trompe certainement, mais dans ce que tu écris, je comprends que tu ne parles pas de l'évènement OnChange du TEdit mais de la méthode Edit1Change(Sender: TObject) implémentée dans la fiche, et affectée à la propriété OnChange, ce qui n'est pas la même chose.. d'ailleurs si on dérive une fiche d'une autre fiche, les valeurs des propriétés - donc des évènements - des composants posés sur ladite fiche restent, évidemment, c'est parfaitement logique, et heureusement d'ailleurs, imaginez que le Edit1 de la fiche descendante se mette à "oublier" les valeurs de ses propriétés, et notamment les adresses des évènements qui lui avaient été attribuées dans la fiche ancêtre ! Mais cela n'a rigoureusement rien à voir avec l'héritage de la propriété en elle-même, tant que le TEdit de la fiche descendante reste un TEdit, il n'y a pas d'héritage du OnChange, seulement conservation d'une valeur (= l'adresse de la méthode associée, qu'elle soit dans la fiche ancêtre, la fiche courante, ou n'importe quel autre composant, ce qui n'a aucune espèce d'importance en la matière, c'est ce qui fait la "magie" de la programmation par composants...) !

    Maintenant, si l'on dérivait une classe de TEdit, on pourrait éventuellement - mais je l'ai omis volontairement, j'ai bien dit que j'étais simpliste - utiliser dans le code du descendant la syntaxe inherited OnChange, comme on peut le faire pour n'importe quelle autre propriété, sauf que c'est purement théorique, on peut en parler au mieux comme un cas d'école : en pratique, je ne vois pas bien où cela pourrait mener, d'autant que dans la VCL, les évènements sont rarement conçus pour pouvoir être surchargés (déclaration des champs et procédures dans la partie private, le plus souvent, et qui plus est méthodes statiques et pas virtuelles, etc.).

Discussions similaires

  1. Héritage de méthodes
    Par lvr dans le forum Langage
    Réponses: 12
    Dernier message: 12/09/2007, 09h20
  2. héritage et méthode abstraite
    Par troussepoil dans le forum C++
    Réponses: 13
    Dernier message: 30/03/2007, 09h51
  3. Exceptions, héritage et méthodes virtuelles
    Par Nuwanda dans le forum C++
    Réponses: 13
    Dernier message: 23/05/2006, 12h06
  4. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  5. [Héritage] Redéfinition méthode
    Par petit-ourson dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2004, 16h06

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