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 :

Polymorphisme OnChange : Problème entre code commun dans la classe et ses instances


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Points : 32
    Points
    32
    Par défaut Polymorphisme OnChange : Problème entre code commun dans la classe et ses instances
    Bonjour,

    J'utilise un composant dérivé d'un TEdit qui surcharge la méthode "Change" pour n'accepter que les valeurs numériques, jusque là rien d'extraordinaire. Par contre, quand j'affecte une procédure à l'évènement OnChange des instances de cette classe, ça n'appelle plus la version surchargée de "Change" qui n'accepte que les valeurs numériques. J'ai bien entendu pensé à utiliser "inherited", mais ça ne fait rien et pas moyen de mettre un point d'arrêt dessus, le compilateur doit surement le faire sauter car il ne sert à rien.

    Donc comment doit-on faire normalement pour surcharger la méthode OnChange des TEdit pour mettre du code en commun, tout en gardant la possibilité de mettre du code propre à chaque instance dans l'évènement OnChange ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    pê comme ceci ?

    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
     
    TMyEdit.Create;
    begin
      inherited;
      OnChange:=OnMyChange;
    end;
     
    TMyEdit.OnMyChange
    begin
      // blabla
      SpecificChange; 
    end;
     
    TMyEdit.SpecificChange;
    begin
      Inc(X);
    end;
     
    TMyDerivedEdit.SpecificChange;
    begin
      Dec(X);
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Peux-tu montrer le code concerné ?

    Et aussi : es-tu sur d'avoir bien spécifié override lorsque tu as surchargé la méthode Change, car ce pourrait être une cause du problème.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Je viens d'éditer mon message original, je m'étais mal exprimé, je veux juste avoir une seule classe dérivée, et ensuite créer des composants de cette classe dérivée et leur affecter une procédure particulière à chacun via l'EDI, tout en appelant quand même le code en commun écrit dans la surcharge de la méthode Change.

    Déjà merci Tourlourou pour ta réponse mais si je fais ça, il faudrait que je crée une classe dérivée à chaque fois que je veux rajouter un composant dans ma fenêtre.

    Pour le code c'est vraiment minime, mais le voici quand même (et oui j'avais pensé à override)

    Pour le composant TMyEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    TMyEdit = class(TEdit)
    protected
      procedure Change; override;
    end;
     
    [...]
     
    procedure TMyEdit.Change;
    begin
      ShowMessage('Si tu lis ça c''est que ça marche');
    end;
    Pour une fenêtre quelconque contenant un composant visuel TMyEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TfrmMollierDiagram = class(TForm)
      MyEdit: TMyEdit;
      procedure MyEditChange(Sender: TObject);
    end;
     
    [...]
     
    procedure TForm1.MyEditChange(Sender: TObject);
    begin
      inherited; //Ne fonctionne malheureusement pas, ça devrait appeler le message disant que c'est ok
     
      ShowMessage('Je suis le seul message qui va apparaître si on modifie le texte de Sender');
    end;

    Voilà, je pense que ce sera plus clair comme ça. A mon avis c'est juste un truc tout bête dont je n'ai pas connaissance, je n'ai pas l'habitude de faire ce genre de choses en Delphi.

    En tout cas merci d'avance pour toute info !

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Supprime le inherited dans le OnChange : il n'a pas sa place là. On n'utilise inherited dans un gestionnaire d'événement que lorsque la fenêtre a été créée par dérivation d'une autre fenêtre du projet. C'est un cas super rare, et je considère d'ailleurs cela comme une astuce du langage permettant de supporter les fenêtres dérivées de Delphi.

    Par contre, ajoute un inherited dans le Change de ton TMyEdit. Là tu en auras besoin.

    Cela dit, tu peux tester ainsi mais ce ne devrait pas résoudre le problème
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    et comme ceci ?

    schématiquement, hors delphi...
    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
     
    type
      TMyEdit=class(TEdit)
      private
        FMyChange: procedure of object;
      public
        procedure Change; override;
      end;
     
    procedure TMyEdit.Change; 
    begin
      inherited;
      // blabla commun
      if Assigned(FMyChange) then FMyChange(Sender);
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Tourlourou, ta méthode fait l'inverse en fait, à savoir que dans mon cas la méthode TMyEdit.Change n'est jamais appelée si le OnChange de l'instance est assigné, donc il faudrait plutôt que ce soit OnChange qui appelle Change, mais en faisant ça (donc en passant Change en public), on se retrouve avec une boucle infinie vu qu'ils s'appellent l'un l'autre. Donc en fait j'ai créé une fonction publique membre de TMyEdit, appelée automatiquement par Change, et appelée manuellement dans le OnChange des instances dont le OnChange est assigné.

    Je pensais qu'il y aurait une manière plus propre de le faire mais apparemment non en fait. Merci quand même pour vos conseils et remarques, ça m'aura permis de faire évoluer ma réflexion vers cette solution qui est suffisamment satisfaisante pour mes besoins.

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

Discussions similaires

  1. [XL-2007] Problème avec code placé dans "ThisWorkbook"
    Par Fred4345 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/02/2012, 17h41
  2. Problème affichage code html dans textEdit
    Par mercure07 dans le forum Qt
    Réponses: 5
    Dernier message: 10/09/2009, 10h59
  3. Réponses: 4
    Dernier message: 20/07/2007, 03h49
  4. Réponses: 9
    Dernier message: 19/05/2007, 15h28
  5. Réponses: 2
    Dernier message: 17/01/2007, 11h20

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