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 :

Creation de composant Les choix qui s'imposent


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 117
    Par défaut Creation de composant Les choix qui s'imposent
    SAlut
    Voila je debut dans la création de composant, par besoin et par envi aussi un peu . J'utilise Delphi 2005 Perso.

    Pour commencer voila a quoi ca ressemble (Fichier joint - CompoEtape.Jpeg)
    Il me servira a terme a pointé sur un schema contenu dans un TImage un appareillage electrique en tracant une fleche (ci besoin), un cercle contenant le numero d'etape et enfin un petit pictogramme (ici un cadenas).
    Actuellement j'ai fait mon code en utilisantles procedure du TImage (MouseDown, MouseMove).
    1er click le bout de la fleche apparait et le vecteur se dessine en suivant les mouvement de ma souris.
    2eme click le vecteur se fige, le cercle apparait et pivot sur le bout du vecteur en respectant des angles maximums.
    3eme click le cercle se fige et le pictogramme apparait, il tourne librement autour du cercle a une distance defini.
    4eme click le picto se fige.

    Le but du jeu est de remplacer ce qui est dessiné "en volatile" sur mon TImage.Canvas en un composant pouvant recevoir le focus et peut etre meme pouvant etre modifier (position, longueur du vecteur ...), que je puisse changer le contenu du cercle en y mettant une valeur (ca je pense deja savoir pas de probleme ici).

    J'ai donc lu 2 tuto de création de composant delphi et je me pose la question suivante, comment organiser mon composant.
    Sachant que je souhaite optenir une information de focus je me suis orienté vers une derivation de TCustomControl.
    Est ce que je dois faire une classe TEtape(derivé de TCustomControl) contenant 3 autres class (TVecteur, TCercle, Tpicto) ou tout gerer a partir d'une seul classe TEtape ?

    J'avoue ne pas pas trop avoir reussi a saisir les interactions entre les differentes classes contenu dans un composant, si vous avez des liens a me proposer je suis preneur, perso j'ai deja lu celui la:

    http://sjrd.developpez.com/delphi/tutoriel/composants/

    Et je viens de telecherger
    http://llb.developpez.com/compo_dyn/
    http://llb.developpez.com/composants/
    que je vais regarder ce WE.
    Merci a ceux qui prendront 5 min pour me repondre.
    A+
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    2 Proposition : Soit un Derivé de TControl (ou TCustomControl) pour avoir la property Canvas sur lequel tu dessines (surcharge methode paint) ce qu'il te faut.

    A noter que la property BrushStyle te permet de definir une transparence (bsClear/bsSolid)

    Soit tu derive de TShape qui fait deja pas mal de choses .... en rejoutant pourquoi pas tes propres types de dessins.
    Si il existe un TCustomShape serait peut etre mieux pour masquer ce dont tu n'as pas besoin.

    Pour ce qui est de la gestion de la classe etape, tout depends de quel type de focus tu souhaite avoir : Focus sur chaques parties ? ou sur le composant global ?
    Si tu desire le composant global, tu peux tout reunir dans une classe unique.
    Sinon, soit tu gere grace a l"evenement souri la position du click et fait appel a des evenements distincts que tu auras au prealablement cree, soit tu creer 3 sous composant, que tu peux evenetuelement reunir dans une classe TEtape.
    L'evenement Focus te permettra de detecter les clicks sur les sous composant plus facilement.

    Note : J'opterais pour la premiere solution.

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

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

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

    pour ce genre de choses, j'aurais tendance à créer des composants hors VCL possédant juste méthode Draw, et au besoin un MouseDown, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
     TCustomDrawItem=class
      procedure Draw(Canvas:TCanvas); virtual; abtract;
      procedure MouseDown(x,y:integer); virtual; abtract;
     // ...
     end;
    tu aussi avoir besoin d'un dérivé de TList pour contenir les TCustomDrawItem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type
     TDrawStack=class(TList)
      procedure Draw(Canvas:TCanvas); 
    // appel de tous les Items[i].Draw(Canvas);
     end;
    ensuite tu le dérives comme selon tes besoins
    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
     TEtape=class(TCustomDrawItem)
      Vector:TVector; { x1,y1,x2,y2 }
      Cercle:TCercle; { x1,y1,radius }
      Picto  :TPicto; { x,y,ImageIndex,angle }
      procedure Draw(Canvas:TCanvas); override;
     end;
     
    procedure TEtape.Draw(Canvas:TCanvas);
    begin
     with  Canvas do begin
      MoveTo(Vector.x1,Vector.y1);
      LineTo(Vector.x2,Vector.y2);
      ...
     end;
    end;
    l'objet peu avoir un "état" lors de la conception pour gérer le déplacement des différents éléments.

    quand à la création de trois composants, c'est intéressant si tu dois les réutiliser ailleurs, ou s'ils deviennent complexe. Mais comme je ne suis pas adorateur du 100% objet, je n'hésite pas aussi à créer des fonctions génériques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    procedure DrawVector(Canvas:TCanvas; x1,y1,x2,y2:integer);
    //...avec gestion de la flèche etc..
    [/code]
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 117
    Par défaut
    Bonjour
    Merci pour ces reponses.
    Chlorish:
    En se qui concerne la derivation du TCustomControle, oui c'est bien la piste qui m'a attiré en premier apres avoir lu les cours dispo sur la création de composant.

    En se qui cncerne le Focus, je penche plutot pour un Focus global de l'outil puisque la seul partie contenant tu text modifiable sera le cercle contenant le numero d'etape. Les autre partie de mon composant (vecteur et picto) eux donneront simplement le focus au composant complet (donc au cercle d'etape).

    Le faite de souhaiter pouvoir modifier la position de mon objet (en mode execution) en metant un mode "Modification" dans mon outil, fesant apparaitre des poignées permetant entre autre de modifier la position du bout de la fleche, ou sont origine, ceci ne m'oblige t'il pas a faire plusieur classe ou il suffit juste que je prenne en compte ou le click souris a eu lieu tout simplement (en ecrivant ca je pense que ce serait la meilleur solution)

    Paul Thot:
    Je debut juste est le faite de dirivé de rien voir de pas grand chose me fait un peu peur j'avoue.
    Ha mais en relisant j'ai peut etre fait erreur losque tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
     TCustomDrawItem=class
    serait ce un declaration forward avec plus loin un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCustomDrawItem=class(TCustomControl)
    ?
    Ce qui tout de suite me parait bien plus allechant comme ca D'autant que la plupart des mes procedures et functions sont deja pretes (FindAngleVecteur, TacerVecteur, TraceurCercle, TracerCadenas, ...) . En tout cas merci pour ton exemple fournis.
    Edit: Humm je viens de relire a nouveau le code que tu m'a fournis et en faite ca n'est pas une declaration Froward n'est ce pas. Il me faudrais donc recréé toutes les procedure et les proprieté dont j'ai besoin ? (je ne suis pas sur de ce que je dis je vais regarder de ce pas le mot clef abstract que je n'ai vu (ou me souviens plus) dans aucun des cours)./Edit

    Je ne suis pas chez moi actuellement mais je vais m'y atteler en debut de semaine prochaine je pense donc merci a vous 2 pour ces informations, a bientot pour la suite.
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Qwazerty
    En se qui concerne la derivation du TCustomControle, oui c'est bien la piste qui m'a attiré en premier apres avoir lu les cours dispo sur la création de composant.
    C'ets a mon avis la meilleur solution

    Citation Envoyé par Qwazerty
    En se qui cncerne le Focus, je penche plutot pour un Focus global de l'outil puisque la seul partie contenant tu text modifiable sera le cercle contenant le numero d'etape. Les autre partie de mon composant (vecteur et picto) eux donneront simplement le focus au composant complet (donc au cercle d'etape).
    Ok, donc gere tout dans la meme classe. Ca sera bien plus facile. A moins que, comme l'a confirmé Paul Toth, les sous objets ne deviennent trop complexe.
    Quoi qu'il en soit tu sera ammené a plus ou moins encapsuler ces sous composant dans un composant que j'appelle en general "Wrapper", dont la plupart des fonctions/evenements pointent sur ceux des sous composants.

    Citation Envoyé par Qwazerty
    Le faite de souhaiter pouvoir modifier la position de mon objet (en mode execution) en metant un mode "Modification" dans mon outil, fesant apparaitre des poignées permetant entre autre de modifier la position du bout de la fleche, ou sont origine, ceci ne m'oblige t'il pas a faire plusieur classe ou il suffit juste que je prenne en compte ou le click souris a eu lieu tout simplement (en ecrivant ca je pense que ce serait la meilleur solution)
    A priori non. Maintenant faut aller voir plus loin.
    Faut savoir juste une chose : Ce type de composant gere la partie grphique entierement dans la methode draw, dessinant sur le TCanvas (rectangle).
    Le fait de fusionner tous les sous compos en un seul, cela reviens au meme .. sauf que la taille du canvas etant differentes, il faut juste decaler (offset) les fonctiosn de dessins.
    Par exemple le dessin d'un fleche qui partirais de WidTh/0 jusqu'a 0/Height, devra etre dessiné de Width/TopFleche LeftFleche/Height .... c'ets tout

    Pour la detection des clicks c'ets pareille ...

    Citation Envoyé par Qwazerty
    Je debut juste est le faite de dirivé de rien voir de pas grand chose me fait un peu peur j'avoue.
    Ha mais en relisant j'ai peut etre fait erreur losque tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
     TCustomDrawItem=class
    serait ce un declaration forward avec plus loin un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCustomDrawItem=class(TCustomControl)
    ?
    Pas du tout.
    Derrierre le mot clef "Class" il n'y a pas de ";" donc la declaration se poursuite jusqu'au end.
    LEs procedures decrites font partie de la classe.
    Il a "oublié" de mentionner le mot clef "Public". Mais cela est facultatif. Toutes methdoes definie hors des sections Private/Public/Protected/Published est consideree comme publique.

    Citation Envoyé par Qwazerty
    Edit: Humm je viens de relire a nouveau le code que tu m'a fournis et en faite ca n'est pas une declaration Froward n'est ce pas. Il me faudrais donc recréé toutes les procedure et les proprieté dont j'ai besoin ? (je ne suis pas sur de ce que je dis je vais regarder de ce pas le mot clef abstract que je n'ai vu (ou me souviens plus) dans aucun des cours)./Edit
    Tu parles des procedures/Property des classes VCL ?
    Si oui, soit tu doit les recreer, soit tu doit deriver d'une classe les contenant.

    Si la methode de Paul semble plutot bien, je te conseillerais de partir en premier lieu de TCustomControl, plus pratique pour debuter. Bien que toutes les mthodes dont tu as besoin doivent etre definie dans le TCanvas.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    pour ce qui est de l'ancêtre, quelles sont les méthodes de TCustomControl dont tu as besoin dans tes objets dérivés ? là est toute la question
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [AC-2007] Liste de choix qui affiche les ID
    Par Carclin dans le forum IHM
    Réponses: 11
    Dernier message: 12/05/2010, 13h31
  2. Réponses: 6
    Dernier message: 26/11/2008, 20h14
  3. Réponses: 7
    Dernier message: 17/06/2008, 18h12
  4. Réponses: 2
    Dernier message: 26/07/2007, 14h27
  5. Récupérer les bits qui composent un byte
    Par ToTo13 dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2007, 17h12

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