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

Lazarus Pascal Discussion :

Affichage conditionnel de propriétés dans l'inspecteur d'objets


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Affichage conditionnel de propriétés dans l'inspecteur d'objets
    Bonjour à toutes et à tous,

    Je suis en train de créer un composant dans lequel certaines propriétés sont optionnelles, du genre : si échelle automatique, je me fo... des valeurs Min et Max et donc je souhaite que si je choisis "Auto", les propriétés "Min" et "Max" ne s'affichent pas ou pour le moins, qu'elles soient désactivées.

    Est-ce possible avec Lazarus, et si oui, comment fait-on ?

    Merci de votre aide.

    Pïerre

  2. #2
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    non impossible comme cela.

    une classe ne peut pas cacher ses propriétés ou méthode de façon dynamique encore moins dans l'IDE.

    tout ce qui est published l'est définitivement.

    par contre, tu peux tester 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    interface
     
    type
      TCustomComponent = class(TComponent)
      private
        fAuto : boolean;
        fPropA : integer;
        fPropB : integer;
      protected
        property PropA : integer read fPropA write fPropA;
        property PropB : integer read fPropB write fPropB;
      public
        constructor Create(AOwner: TComponent; const IsAuto: boolean); override;
      end;
     
      TAutoComponent = class(TCustomComponent)
      published
        property PropB;
      public
        constructor Create(AOwner: TComponent); reintroduce; 
      end;
     
      TNormalComponent = class(TCustomComponent)
      published
        property PropA;
      public
        constructor Create(AOwner: TComponent); reintroduce;
      end;
     
     
    implementation
     
    constructor TCustomComponent.Create(AOwner: TComponent; const IsAuto: Boolean);
    begin
      case IsAuto of
        false : result := TNormalComponent.Create(AOwner);
        true  : result := TAutoComponent.Create(AOwner);
      end;
    end;
     
    constructor TAutoComponent.Create(AOwner: TComponent);
    begin
      inherited;
      fAuto := true;
    end;
     
    constructor TNormalComponent.Create(AOwner: TComponent);
    begin
      inherited;
      fAuto := false;
    end;
     
    end.

    et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      AC : TCustomComponent;
      NC : TCustomComponent;
    begin
      AC := TCustomComponent.Create(Self, true);
      NC := TCustomComponent.Create(Self, false);
    end;

    j'espere que je ne me suis pas trompé sur le sélécteur de classe à créé, c'est une technique que j'ai vus il y'a longtemps...
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Dr.Who pour cette proposition.

    J'ai essayé de créer un composant avec ton code. A la compilation, il y a des problèmes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor Create(AOwner: TComponent; const IsAuto: boolean); override;
    --> la classe ancètre TComposent ne dispose pas d'un tel constructeur. Donc, override ne peut être appliqué

    Dans l'implémentation de ce constructeur, tu évoques la variable "result". Il n'y a pas de telle variable dans un constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TCustomComponent.Create(AOwner: TComponent; const IsAuto: Boolean);
    begin
      case IsAuto of
        false : result := TNormalComponent.Create(AOwner);
        true  : result := TAutoComponent.Create(AOwner);
      end;
    end;
    Je ne suis pas allé plus loin.

    Mais pour autant que ces problèmes se résolvent, est-ce que je verrai soit l'une soit l'autre propriété dans l'inspecteur d'objet en créant l'un ou l'autre des composants Auto ou Normal ?

    Cordialement.

    Pierre

  4. #4
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut Solution
    Salut,

    Pour faire ce genre de choses

    Il faut créer une propriété générique(Type d'affichage par exemple : Date,Currency,text) servant uniquement a appeller un éditeur de propriété de votre cru. En suite dans celui ci et en fonction de ce que vous voulez faire et du type, vous pourrez afficher les champs (ceux de la form de l'editeur) en fonction. Vous pourrez même piloter les autres propriété du composant

    Je ne connais pas d'autre méthode mais en attendant, celle ci fonctionne

  5. #5
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    oui désolé, j'ai pas tester l'implémentation.

    en fait, il s'agit plus précisement de la stategie Design pattern.

    par contre, je ne connais pas assé le concept pour dire s'il peu s'appliquer au objet.

    mais le principe étant :

    ObjetDeBase -> ObjA, ObjB
    ObjetCreateur -> selon parametre propriété Obj = ObjA ou ObjB



    sinon, question qu'on n'a pas posé, quel est le besoin réel ?
    c'est a dire la finalité du composant ?
    peut être y'a t'il d'autre solution qu'une implementation alambiqué.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    ... sinon, question qu'on n'a pas posé, quel est le besoin réel ?
    c'est a dire la finalité du composant ?
    peut être y'a t'il d'autre solution qu'une implementation alambiqué.
    C'est une bonne question. Cependant, peu importe la finalité du composant. Le but recherché était de faire comme cela existe dans certain logiciel au niveau des menus, c'est-à-dire de spécialiser celui-ci en fonction d'un choix en amont.

    Mais bon, je ne vais pas retourner ciel et terre pour y parvenir. Je voulais simplement savoir si une solution simple existait.

    Cordialement.

    Pierre

  7. #7
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par chris37 Voir le message
    ... Je ne connais pas d'autre méthode mais en attendant, celle ci fonctionne ...
    Merci Chris pour ces précisions. Mais je ne vais pas en plus me lancer dans la création d'un éditeur spécialisé.

    Cordialement.

    Pierre

  8. #8
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Bonsoir Pierre,

    C'est vraiment tout balo, je peux t'aider si tu veux. Tu serais surpris de la simplicité de la choses.

    Bonne soirée à tous

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/12/2013, 23h54
  2. Réponses: 7
    Dernier message: 01/03/2013, 00h50
  3. Réponses: 1
    Dernier message: 20/06/2011, 16h50
  4. Problème d'affichage de Propriété dans l'inspecteur d'objet
    Par saidus dans le forum Composants VCL
    Réponses: 8
    Dernier message: 06/04/2008, 17h36
  5. Réponses: 19
    Dernier message: 29/05/2007, 16h21

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