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"?
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"?
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.
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
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
Cherche "Custom Containers Pack", ou CCPack.
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
Voilà
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;
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
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.
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?
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;
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.
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:
le code a été retapé donc il peut y avoir des fautes de frappe.
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; ...
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
une idée à reformulé bine sûr , crée un événement, surtout que tu veux que ton super composant soit indépendant
merci à olivier Dahan et Paul Toth,(voir Delphi 7 page 791)
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, je pense que cela devrais faire l'affaire.
Je m'y attèle de suite.
Bonne continuation
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
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.)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager