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 :

Problème création composant bouton personnalisé [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut Problème création composant bouton personnalisé
    Salut à tous

    Je suis en train d'essayer de créer un composant de type "Bouton" descendant de TCustomControl seulement celui-ci ne s'affiche pas et je ne sais pas pourquoi.
    Vous trouverez ci-joint un petit zip avec les sources "bz_button.pas" ceci est pour l'instant qu'une première ébauche. Mais là je sèche vraiment, l'affichage du bouton en mode normal devrait fonctionner.

    TestBouton.zip

    Dois-je utiliser les messages CMPaint, CM.... ?
    J'ai oublié quelque chose ?

    Merci d'avance de votre aide
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    J'ai enfin trouvé voila le code correct à remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Type
      TBZComponentProperty = class(TPersistent)
       private
         FOnChange: TOnBZPropertyChange;
       protected
         FControl: TObject; /// C'etait ici TComponent génere une erreur invisible du style "Control Has No Parent"
         procedure Change(AData: PtrInt = 0); virtual;
       public
         constructor Create(AControl: TObject); virtual;
       public
         property Control: TObject read FControl;
         property OnChange: TOnBZPropertyChange read FOnChange write FOnChange;
       end;
    J'ai trouvé en remplaçant le wCanvas := FBuffer.Canvas par wCanvas := Canvas dans la procedure DoDrawButton

    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Comme ce n'est qu'une première ébauche, je n'ai pas trop approfondi ton code.

    Quelques remarques cependant :
    1) Dans ton zip, TestBtn n'a pas de parent, donc normal qu'il ne s'affiche pas !
    2) En l'état de ton code, la variable wCanvas est inutile. Tu peux utiliser directement la propriété Canvas du CustomControl.
    3) Suggestion : au lieu de dessiner le tout directement sur le Canvas du bouton, crée un TBitmap temporaire sur le Canvas duquel tu dessines la bordure, le fond, l'image, le texte. Une fois le bitmap terminé, tu le dessines sur ton bouton. C'est beaucoup plus rapide, et tu pourras supprimer ton double buffered (qui utilise en fait la même méthode). Le TBitmap est à créer et à libérer dans la procedure Paint.
    4) Ne fais pas d'instruction Paint suivie de Invalidate : cela provoque un double affichage (une fois par l'appel direct à la procédure Paint, une seconde fois par le invalidate qui va appeler...Paint).

    Cordialement
    Thierry

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut William

    1) Dans ton zip, TestBtn n'a pas de parent, donc normal qu'il ne s'affiche pas !
    Le Create(self) suffit normalement, vu que c'est directement sur la Form et pas un autre containeur type TPanel. Et la l'erreur ne provenait pas directement du bouton mais de la propriété Styles de type "TBZComponentProperty" qui intégre les différents états qui sont aussi de type TBZComponentProperty et ce sont eux qui posaient le problème du Parent

    2) En l'état de ton code, la variable wCanvas est inutile. Tu peux utiliser directement la propriété Canvas du CustomControl.
    3) Suggestion : au lieu de dessiner le tout directement sur le Canvas du bouton, crée un TBitmap temporaire sur le Canvas duquel tu dessines la bordure, le fond, l'image, le texte. Une fois le bitmap terminé, tu le dessines sur ton bouton. C'est beaucoup plus rapide, et tu pourras supprimer ton double buffered (qui utilise en fait la même méthode). Le TBitmap est à créer et à libérer dans la procedure Paint.
    Comme je l'ai dis c'est une 1ere ébauche. J'ai deja avancé dessus maintenant chaque état est dessiné à la création dans un Buffer séparé qui sont gardés en mémoire et libérés à la fin ca évite de tout redessiner a chaque fois.
    OK pour le DoubleBuffered.

    4) Ne fais pas d'instruction Paint suivie de Invalidate : cela provoque un double affichage (une fois par l'appel direct à la procédure Paint, une seconde fois par le invalidate qui va appeler...Paint).
    Ok je savais pas ca.

    Je mettrai le code à disposition dès que le code sera correcte.

    Merci de tes explications
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. access2000, probleme creation relations de tables
    Par nono_60 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2005, 22h50
  2. probleme creation projet
    Par choupinet612 dans le forum XMLRAD
    Réponses: 2
    Dernier message: 05/11/2004, 10h11
  3. [Creation composant visuel] Problème avec le focus
    Par Ingham dans le forum Composants VCL
    Réponses: 9
    Dernier message: 23/09/2004, 16h59
  4. Probleme de composant inclus dans un autre.
    Par viro dans le forum C++Builder
    Réponses: 7
    Dernier message: 05/04/2004, 15h44
  5. probleme avec composant indy IDhttp
    Par ulysse66x dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 09h35

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