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

Delphi Discussion :

Héritage de la propriété "Enabled"


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut Héritage de la propriété "Enabled"
    Salut à tous,

    J'ai un petit soucis.

    Je souhaite piloter la propriété "Enabled" d'un ensemble de composants (bouton, edit, checkbox, ...).

    Pour cela, j'ai mis cet ensemble sur un panel (ou un pagecontrol suivant le cas) dont je maîtrise cette propriété. En gros, je voudrais utiliser l'héritage de propriétés du memo sur ses descendants.

    Ça fonctionne très bien à un petit détail près :
    Certes, quand le mémo est en Enabled = False, ses enfants le sont aussi (et vice versa) mais je n'ai pas d'aperçu visuel de cet état de verrouillage des composants.

    En gros, je voudrais que les composants impactés passent en "grisâtre" quand je mets le memo.enabled := False;

    Est-ce un bogue du compilateur ? de Windows ? ou y a t'il quelque chose de simple à faire pour y remédier ?

    Merci beaucoup.

    Naga

    PS : Pour info, j'utilise la version XE2 du compilateur d'Embarcadero avec le SP3.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Il ne s'agit pas d'héritage mais de parenté. Il te suffit de surcharger SetEnable du panel et d'énumérer les contrôles enfants pour forcer leur état.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Salut Andnotor,

    Merci pour ta répons, mais qu’entend tu par surcharger le "SetEnable" du panel ?
    J'en entend souvent parlé mais je n'ai jamais vraiment compris ce concept.

    Quand à énumérer les contrôles des composants fils je suppose qu'il s’agit de les mettre en "xxx.Enable := False;" composant par composant ?
    Dans ce cas, je perds tout l'avantage de la parenté.
    C'est en effet ce que je faisais.

    C'est étonnant car l'effet du "Enabled" fonctionne sur les enfants mais pas l'aspect visuel. Je me dis que cela doit être un bogue du compilateur ou de Windows (je ne sais pas qui gère la parenté dans un EXE).

    Quelle est la différence entre l'héritage et la parenté ?

    Naga

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Naga2 Voir le message
    Merci pour ta répons, mais qu’entend tu par surcharger le "SetEnable" du panel ?
    J'en entend souvent parlé mais je n'ai jamais vraiment compris ce concept.
    C'est dériver une nouvelle classe (on parle bien ici d'héritage) pour pouvoir modifier ses méthodes. Les méthodes surchargeables doivent être déclarées virtual.

    Citation Envoyé par Naga2 Voir le message
    Quand à énumérer les contrôles des composants fils je suppose qu'il s’agit de les mettre en "xxx.Enable := False;" composant par composant ?
    En gros, oui ! Mais sans nommer les composants. On boucle sur les éléments possédés : les enfants.

    Citation Envoyé par Naga2 Voir le message
    C'est étonnant car l'effet du "Enabled" fonctionne sur les enfants mais pas l'aspect visuel.
    Non, le parent est disabled, pas les enfants. Mais puisque le parent n'autorise plus d'interaction...

    Citation Envoyé par Naga2 Voir le message
    Quelle est la différence entre l'héritage et la parenté ?
    L'héritage est une notion de POO : une classe dérivée d'une autre. La parenté est la hiérarchisation des composants visuels, un contrôle contenu dans un autre.

    La surcharge de SetEnabled donne 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
    type
      TPanel = class(Vcl.ExtCtrls.TPanel)
      protected
        procedure SetEnabled(Value: Boolean); override;
      end;
     
    implementation
     
    procedure TPanel.SetEnabled(Value: Boolean);
    var
      i :integer;
    begin
      inherited;
     
      for i := 0 to ControlCount -1 do
        Controls[i].Enabled := Value;
    end;
    Tu n'agis ensuite plus que sur Enabled du panel, sur autant de panels que tu veux. Les panels imbriqués sont aussi affectés, il n'y a pas besoin de récursivité.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Super,

    Je vais tester ça, merci pour le coup de pouce Andnotor.

    Je suis autodidacte sur Delphi mais le problème c'est qu'il me manque pas mal de notions d’où mes lacunes.

    Naga

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Il faudrait quand même préciser qu'il s'agit de VCL (le mieux eut été d'indiquer la version de Delphi également).
    En effet j'ai fait le test avec FMX désactiver un Panel ou un TLayout rend inopérant tout enfant de ces derniers (contrairement à VCL) sans toutefois changer la propriété Enabled
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Oui il s'agit de VCL, je vais tester cette astuce ce WE je pense et je te tiens au courant.

    Merci

    Naga

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    L'approche par SetEnabled est assez sympathique, c'est chiant que l'on doivent dupliquer la classe TPanel, quoi que faudrait essayer via un $i .intf.INC et $i .impl.INC


    AndNotOr a évoqué une fonction récursive comme par exemple celle que j'ai publié nommé SetEnabledControlRecursive

    Via SetEnabledControlRecursive, tu as une récursivité explicite
    Via TPanel.SetEnabled, tu as une récursivité implicite grâce aux polymorphisme de la méthode virtuelle SetEnabled du TControl mais ça tu le comprendras plus tard

    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
     
    //------------------------------------------------------------------------------
    class procedure TControlSLTToolHelp.SetEnabledControlRecursive(AParentControl: TControl; AEnabledControl: Boolean; AIgnoreActionableControl: Boolean = False);
    var
      I: Integer;
      lChildControl: TControl;
    begin
      AParentControl.Enabled := AEnabledControl;
      // "is" renvoie True si ParentControl est un TWinControl ou un Objet d'une Classe dérivée
      if AParentControl is TWinControl then
      begin
        // La liste Controls contient les Objets dépendant visuellement (imbrication) de leur parent
        // La liste Components contient les Objets dépendant logiquement (mémoire) de leur propriétaire (Owner)
        for I := 0 to TWinControl(AParentControl).ControlCount - 1 do
        begin
          lChildControl := TWinControl(AParentControl).Controls[i];
          // Les contrôles avec Action sont déjà gérés par leur action
          // Les contrôles chargés par le Flux normalement on tous le même Owner, c'est à dire la TForm !
          // Les contrôles avec un Owner particulier sont problablement des contrôles internes, je préfère ne pas y toucher !
          if (not AIgnoreActionableControl or not Assigned(lChildControl.Action)) and (lChildControl.Owner = AParentControl.Owner) then
            SetEnabledControlRecursive(lChildControl, AEnabledControl);
        end;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par ShaiLeTrollShaiLeTroll
    ... mais ça tu le comprendras plus tard
    Salut ShaiLeTroll,

    C'est la seule chose que j'ai compris ^^

    Naga

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est dériver une nouvelle classe (on parle bien ici d'héritage) pour pouvoir modifier ses méthodes. Les méthodes surchargeables doivent être déclarées virtual.



    En gros, oui ! Mais sans nommer les composants. On boucle sur les éléments possédés : les enfants.



    Non, le parent est disabled, pas les enfants. Mais puisque le parent n'autorise plus d'interaction...



    L'héritage est une notion de POO : une classe dérivée d'une autre. La parenté est la hiérarchisation des composants visuels, un contrôle contenu dans un autre.

    La surcharge de SetEnabled donne 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
    type
      TPanel = class(Vcl.ExtCtrls.TPanel)
      protected
        procedure SetEnabled(Value: Boolean); override;
      end;
     
    implementation
     
    procedure TPanel.SetEnabled(Value: Boolean);
    var
      i :integer;
    begin
      inherited;
     
      for i := 0 to ControlCount -1 do
        Controls[i].Enabled := Value;
    end;
    Tu n'agis ensuite plus que sur Enabled du panel, sur autant de panels que tu veux. Les panels imbriqués sont aussi affectés, il n'y a pas besoin de récursivité.
    Merci Andnotor,

    J'ai implémenté ton exemple dans mon projet et c'est tout bon. Une solution simple et efficace.

    J’ignorais que l'on pouvait lister les enfants d'un objet. C'est une notion dont je n'avais aucune idée.

    Encore merci

    Naga

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

Discussions similaires

  1. [MOSS 2007]Recherche avancée : proprité avec un quote
    Par royto dans le forum SharePoint
    Réponses: 6
    Dernier message: 14/09/2007, 14h43

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