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

Composants VCL Delphi Discussion :

Création d'un Composant formé de plusieurs Autres


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Création d'un Composant formé de plusieurs Autres
    Est il possible de créer un composant Delphi, en y intégrant d'autre composants (personnels en l'occurrence) afin de créer un "Méta composant"?

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    Je ne vois pas trop ce que tu veux dire mais si tu fais illusion à une forme qui contient toute sorte de composant afin de la réutiliser dans plusieurs projets tu peux l'enregistrer comme modèle dans le révérenciel. D'ailleurs les assistants Delphi sont la preuve.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut merci je vais regarder ça
    Ok je te remercie, je vais regardé ça.

    Pour info, je vais essayer de me re expliquer plus clairement:

    J'ai par exemple 5 composants (de base) qui héritent de TGraphicControl

    Moi ce que je voudrais faire, c'est un nouveau composant, (TGraphicControl aussi) dans lequel je puisse instancier mes 5 premiers composants.

    par exemple si les 5 composants sont des voyants de 5 couleurs, bha je veux créer un gros composant qui intègre ces 5 voyants directement au lieux de devoir placer les 5 composants sur une fiche.

    Ai-je été plus clair?

    Merci encore

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    En fait ce que je souhaite faire s'apparente à un grouper sous la tableur de microsoft. J'ai bien essayé de mettre les composants dans un Frame, de l'ajouter à la palette puis de le placer dans une form, mais je perd toutes les propriétés des différents éléments

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Cherche "Custom Containers Pack", ou CCPack.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Cherche "Custom Containers Pack", ou CCPack.
    Ok merci, je vais voir ça

  7. #7
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Si j'ai bien compris tu souhaites intégrer 5 composants TGraphicControl dans un seul composant conteneur, c'est bien ça ?
    Dans ce cas le composant conteneur doit être du type TCustomControl, voire TCustomPanel... tu crées tes 5 GraphicControl dans le Constructor de ton "super composant", et le tour est joué !

    Voici un exemple:
    J'ai créer une CheckGroupBox, j'ai donc céer une checkbox sur mon TCustomPanel

    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
     
      TCheckGroupBox = class(TCustomPanel)
     
    //...
     
    constructor TCheckGroupBox.Create(AOwner: TComponent);
    begin
       inherited Create(AOwner);
       FCheckBox := TCheckBox.Create(Self);
       with FCheckBox do
       begin
          Parent := Self;
          OnClick := CheckBoxClick;
          Checked := True;
          Left := 10;
          Width := 18;
          inherited Top := 0;
       end;
    end;
    Voilà

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Resolu
    Excellent, c'est exactement ça. C'est le genre de chose que je faisais en Java sans réfléchir, et la je ne savais pas trop par ou farfouiller alors qu'en fait c'est sensiblement la même chose dans les grandes lignes.

    Merci en tout cas, plus qu'a classer le sujet dans les résolu. et merci pour le petit exemple, ça ne fait jamais de mal


    Citation Envoyé par petitprince Voir le message
    Si j'ai bien compris tu souhaites intégrer 5 composants TGraphicControl dans un seul composant conteneur, c'est bien ça ?
    Dans ce cas le composant conteneur doit être du type TCustomControl, voire TCustomPanel... tu crées tes 5 GraphicControl dans le Constructor de ton "super composant", et le tour est joué !

    Voici un exemple:
    J'ai créer une CheckGroupBox, j'ai donc céer une checkbox sur mon TCustomPanel

    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
     
      TCheckGroupBox = class(TCustomPanel)
     
    //...
     
    constructor TCheckGroupBox.Create(AOwner: TComponent);
    begin
       inherited Create(AOwner);
       FCheckBox := TCheckBox.Create(Self);
       with FCheckBox do
       begin
          Parent := Self;
          OnClick := CheckBoxClick;
          Checked := True;
          Left := 10;
          Width := 18;
          inherited Top := 0;
       end;
    end;
    Voilà

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Une extension de topic
    J'ai remis le Sujet à "Non résolu" ne sachant pas si il serait encore lu.
    J'ai en effet une autre question relative au même sujet

    J'ai réussi à créer mon "super composant" contenant des sous composants.

    Dans certain de ces sous composant, un click permet de renvoyer une valeur (integer). Du Genre: dépendant de la zone de click, la valeur renvoyée est différente, ce qui permet de localiser le click pour des traitements).

    J'aimerais laisser passer les événements (clique, clavier, ...) qui arrivent sur le "Super composant" vers les sous composant, afin que chacun puisse faire son petit business.

    pour clarifier: si un click survient sur mon sous composant 1 de mon super composant, alors, que la procédure du sous composant 1 soit appelée.

    Je pense qu'il faut gérer chaque événement dans le super composant, puis dépendant de la zone, appeler la procédure qui va bien, mais je pense également qu'il doit y avoir un moyen plus "propre" ou plus directe pour une gestion moins "manuelle".

    Voila merci de votre lecture

    PS:

    Lorsque l'on écrit des property d'objets (perso ou non), on retrouve une arborescence des palettes de propriétés des objets dans l'objet parent.
    (dans la palette du super composant, on a les palettes des sous composants).

    Je voudrais avoir en plus la partie des événements des sous composants, et pas seulement les propriétés. Enfin si c'est faisable.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Bon j'ai réussi à avancer.

    Je gère les événements qui surviennent sur mon "super composant". j'utilise principalement OnMouseDown et OnKeyPress.

    Lorsqu'un événement survient sur le super composant, pas de problème, ca fonctionne. Par contre les évenements qui arrivent sur les sous composants doivent être interceptés car je ne peut pas les gérer. (Il "disparaissent").

    J'ai vu a priori un rapport avec la propriété KeyPreview pour les KeyPress.

    Avez vous une idée?

  11. #11
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Salut,

    PetitPrince n'avait il pas répondu à ça avec l'affectation des événements sur les composants sous-jacents ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FCheckBox := TCheckBox.Create(Self);
       with FCheckBox do
       begin
          Parent := Self;
          OnClick := CheckBoxClick;
          Checked := True;
          Left := 10;
          Width := 18;
          inherited Top := 0;
       end;

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    En effet, j'avais vu sans voir.

    Cependant j'ai essayé cette affectation et n'ai pas réussi à faire effectuer d'événement. Il y a toujours ce problème (surement lié) de "disparition" de l'événement si je peux me permettre cette simplification.

    Je vais réessayer en vérifiant que je n'ai rien omis, et je reviens.

    Merci et à la semaine prochaine.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par HumanTool Voir le message
    Salut,

    PetitPrince n'avait il pas répondu à ça avec l'affectation des événements sur les composants sous-jacents ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FCheckBox := TCheckBox.Create(Self);
       with FCheckBox do
       begin
          Parent := Self;
          OnClick := CheckBoxClick;
          Checked := True;
          Left := 10;
          Width := 18;
          inherited Top := 0;
       end;
    Du coup j'ai revérifié à tête reposée et je pense que ce que je souhaite faire est légèrement différant.

    Dans l'exemple de petit prince, on effecte au sous composant la procédure de click qui devrait être implémentée dans la classe qui instancie le composant dérivant de TCustomControl. Est ce bien ça?
    FCheckBox.OnClick := CheckBoxClick;

    Si c'est cela, moi ce que je souhaite faire est un peu différant.

    Dans mes sous composants (dans leur code) je "override" les MouseDown.
    Cela afin de renvoyer un entier différant en fonction de la position du click sur le composant: ex si click en haut à gauche alors la variable ValeurClick := 1 et si click en bas à droite alors ValeurClick := 2.

    La question est Est ce que si je fait comme PetitPrince m'indique, je vais bien récupérer ces valeurs du sous composant, lorsque un click surviendra sur le composant conteneur?

    Sinon je pense que j'ai fait une erreur dans mon code (évidement sinon ça marcherai) car le compilateur m'indique une différence de type entre ma méthode OnMouseDown de mon sous composant et ma méthode MouseDown de mon Composant TCustomControl.

    Voici mes déclaration dans le TCustomControl:

    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
    ...
    FDefaut : TEtatBinaire; //mon type perso
    ...
    protected
      procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override;
    ...
    public
      Constructor Create(AOwner: TComponent); Override;
    ...
    implementation
     
    Constructor TAnalogique.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FDefaut := TEtatBinaire.Create(Self);
      With FDefaut Do
      begin
        Parent := Self;
        OnMouseDown := MouseDown;
        _Largeur := 35;
        _Hauteur := 65;
        Left := 70;
        Top := 85; // si inherited, le top n'est pas pris en compte
      end;
    end;
    ...
    le code a été retapé donc il peut y avoir des fautes de frappe.

    l'erreur générée est: Types incompatibles: 'TObject' et 'TMouseButton'

    En espérant avoir été un peut plus clair, Je pense que cela doit vous paraitre un peut tordu.

    Merci

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    une idée à reformulé bine sûr , crée un événement, surtout que tu veux que ton super composant soit indépendant
    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
     
    Type
       TMouseDown=procedure (Button: TMouseButton; Shift: TShiftState; X,Y: Integer)  of object;
     
    .....
    FMouseDown:TMouseDown;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
    ...
    FDefaut : TEtatBinaire; //mon type perso
    ...
    protected
      procedure MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    ...
    public
      Constructor Create(AOwner: TComponent); Override;
      property OnMouseDown_:TMouseDown read FMouseDown write FMouseDown;
    ...
    implementation
     
    Constructor TAnalogique.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FDefaut := TEtatBinaire.Create(Self);
      With FDefaut Do
      begin
        Parent := Self;
        OnMouseDown := MouseDown;
        _Largeur := 35;
        _Hauteur := 65;
        Left := 70;
        Top := 85; // si inherited, le top n'est pas pris en compte
      end;
    end;
    Procedure TAnalogique.MouseDown;
    begin
           if Assigned(FMouseDown) then
              FMouseDown(Button, Shift, X, Y);
    end;
    merci à olivier Dahan et Paul Toth,(voir Delphi 7 page 791)

  15. #15
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut Vive les citées d'or
    Merci, je pense que cela devrais faire l'affaire.

    Je m'y attèle de suite.

    Bonne continuation

  16. #16
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Bonjour,

    quand j'ai débuté sous Delphi j'avais tendance à faire des composants pour tout...par exemple mon jeu du memory est un composant TMemoryGame.

    avec le temps je me rend compte qu'il est bien plus pratique d'éviter cela, notamment quand on change de version de Delphi, quand on réinstalle un PC, quand on change de machine de développement...on est obligé de passer par l'étape installation des composants avant de pouvoir bosser. je suis donc passé à l'excès inverse ou je ne crée plus que du code dynamique

    ceci dit, pour le cas de ton super-composant, bien souvent TFrame permet de gérer cela de façon très efficace sans avoir à rien installer

  17. #17
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Ok je prend note. Merci de l'info, car c'est vrai que ce genre de comportement peux nous faire perdre du temps, après coup.

    Je prend personnellement en compte ce que tu dit, cependant étant donné que je réalise des applications intégrant ces composants, et que je devrais réutiliser (moi ou un autre moins "développeur") ces composants, je pense que pour ce cas précis les composants sont plus adaptés.

    (on réintègre les composants sur des images de fond différentes, et elle interagissent avec un fichier Excel en fonction de leur Tag.)

  18. #18
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par edam Voir le message
    une idée à reformulé bine sûr , crée un événement, surtout que tu veux que ton super composant soit indépendant
    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
     
    Type
       TMouseDown=procedure (Button: TMouseButton; Shift: TShiftState; X,Y: Integer)  of object;
     
    .....
    FMouseDown:TMouseDown;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
    ...
    FDefaut : TEtatBinaire; //mon type perso
    ...
    protected
      procedure MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    ...
    public
      Constructor Create(AOwner: TComponent); Override;
      property OnMouseDown_:TMouseDown read FMouseDown write FMouseDown;
    ...
    implementation
     
    Constructor TAnalogique.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FDefaut := TEtatBinaire.Create(Self);
      With FDefaut Do
      begin
        Parent := Self;
        OnMouseDown := MouseDown;
        _Largeur := 35;
        _Hauteur := 65;
        Left := 70;
        Top := 85; // si inherited, le top n'est pas pris en compte
      end;
    end;
    Procedure TAnalogique.MouseDown;
    begin
           if Assigned(FMouseDown) then
              FMouseDown(Button, Shift, X, Y);
    end;
    merci à olivier Dahan et Paul Toth,(voir Delphi 7 page 791)
    Bon du coup ça gère, cela fonctionne correctement (enfin comme je le souhaitais).

    Merci bien en tout cas pour votre aide à tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/06/2014, 17h09
  2. Envoyer les données de plusieurs forms avec un autre formulaire
    Par malgache dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/10/2011, 17h15
  3. Plusieurs PictureBox dans un Forms depuis une autre Forms
    Par grandthor dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/07/2009, 16h10
  4. Réponses: 6
    Dernier message: 15/03/2009, 12h36
  5. Création d'un objet d'un form a l'autre
    Par Argonz dans le forum C++Builder
    Réponses: 12
    Dernier message: 03/03/2004, 10h23

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