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 :

Création de composant - Problème à la création dans l'IDE [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 340
    Points : 9 597
    Points
    9 597
    Par défaut Création de composant - Problème à la création dans l'IDE
    Bonjour,
    Je suis à la recherche d'informations sur la création de composant, et surtout comment le composant est géré dans l'IDE.

    En effet, j'ai un problème avec un composant que je créé.

    Je voudrais que le composant se redessine si on change le Caption (normal, me direz-vous). Je suis reparti de TCustomControl qui contient Caption de TControl.

    Le problème que j'avais, c'est que si je redéfinissais SetCaption alors le nom du composant n'était plus automatiquement attribué au Caption.

    Je suis alors passé par une procedure Message sur CMTextChanged, que j'ai implémenté en appelant Paint tout simplement.

    Le soucis, c'est que maintenant, lors de la création du composant dans l'IDE, j'ai le message suivant: "Error setting the name of a componant".

    J'imagine que c'est l'appel à Paint alors que le composant n'est pas encore créé qui pose problème.
    Seulement, je ne sais qu'elle condition mettre pour que le Paint ne se fasse que si le composant est complètement créé. Sur les composants que j'avais déjà sur ma form, la méthode fonctionne nickel, donc, je tiens le bon bout.

    Je suppose que je dois jouer sur les ComponentState, ControlState, ControlStyle et ComponentStyle, mais là je nage un peu.

    Quelqu'un aurait des connaissances sur ces sujets ?

    Merci d'avance.

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  2. #2
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 340
    Points : 9 597
    Points
    9 597
    Par défaut
    Bon, j'ai résolu en remplaçant l'appel à Paint par un appel à Invalidate.

    Je ne sais pas pourquoi ça marche ainsi, mais ça marche.

    Cool

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Joli travail. Si je peux me permettre -et si cela fonctionne (sous Linux ?)-, je modifierais 2 choses

    • les Procedure SetImgGlyph et SetImgFond;

    Le problème, c'est qu'en mode csDesigning, l'image n'est pas remise à jour quand on la modifie dans l'Inspecteur d'objet. Il faut pour faire apparaître le changement utiliser une autre property déjà existante (qui redessine le composant).
    J'ai rencontré le même problème et je crois (toujours Linux à voir) l'avoir réglé ainsi :
    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
    private 
    procedure GlyphChanged(Sender : TObject);  
    procedure FondChanged(Sender : TObject);  
    [...]
    procedure TimagesBouton.Create( Aowner : Tcomponent) ; 
    begin
    [...]
      fImgFond := TBitMap.Create;
      fImgFond.OnChange:=@FondChanged;
      fImgGlyph := TBitMap.Create;
      fImgGlyph.OnChange:=@GlyphChanged; 
    [...]
    procedure TimagesBouton.Setimgfond(Image : Tbitmap) ;
    begin
      fImgFond.Assign(Image);
    end;
     
    procedure TimagesBouton.FondChanged(sender : TObject);
    var
      nW	: Integer;
    begin
     nW := fImgFond.Width Div fNbImages;
     if fTailleAuto then begin
       Width := nW;
       Height := fImgFond.Height;
     end;
     boImgFaites := False;
     boforcePaint := True;
     invalidate;
    end; 
     
    procedure TimagesBouton.Setimgglyph(Image : Tbitmap) ;
    begin
      fImgGlyph.Assign(Image);
    end;
     
    procedure TimagesBouton.GlyphChanged(sender : TObject);
    begin
      boGlyphFaites := False;
      boforcePaint := True;
      invalidate;
    end;
    • Il faudrait pouvoir positionner le texte en align center (et éventuellement right ou respectivement à left) dans la partie restante (non utilisée par fImgGlyph) lorsque le glyph est à gauche ou respectivement à droite.

    A bientôt.

    PS 1 : par rapport à Windev je vois que nos 2 boutons ont le même problème. Si tu fais un stretch horizontal alors en considérant un fond qui a au départ un bord épais de 1 pixel, le bord arrive à 2, 3 voire 4 pixels suivant le facteur multiplicatif... La fonction de stretching à mon avis est mal utilisable dans ce cas particulier... Malheureusement c'est celui dont j'ai besoin. Je regarde comment on peut émuler le modèle 9 images de notre référence de départ...
    PS 2 : Structurellement mon ébauche diffère beaucoup de ton travail. Le mien est également un TCustomControl mais il travaille non pas directement sur le canvas du Tcustom mais avec un Tlabel et 2 TBitMaps inclus pour gérer l'affichage... évidemment soumis à l'évolution qu'en fait Lazarus... Le tien est donc moins sensible à ces variations. Mais comme j'étais parti d'un TCustomPanel au départ, j'avais préféré utiliser cette structure et les ancrages.
    PS 3 : Pour le centrage du Caption, si cela présente un quelconque intérêt, je modifierais ton code ainsi :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    Type
    TFontAlignmt = (alRight, alLeft, alCenter);  
    [...]
     TImagesBouton = class(TCustomControl)
      private                            
       fFontAlign : TFontAlignmt;       
        [...]
        procedure SetFontAlign(Value : TFontAlignmt);   
      published
        [...]
        property FontAlign : TFontAlignmt read fFontAlign write SetFontAlign;    
    end;
     
    constructor TImagesBouton.Create( Aowner : Tcomponent) ;
    begin
      [...]
     fFontAlign:= alCenter;    
    end;
     
    procedure TimagesBouton.Paint; 
    begin
    [...]  
        //Si un texte est précisé, on l'écrit
        if Trim( Caption) <> '' then
        begin
          if veb_NewEtat = ebSurvol then
          	Canvas.Font := fFontSurvol
          else
    	  Canvas.Font := Font;
      	  nTH := Canvas.TextHeight( Caption);
      	  nTW := Canvas.TextWidth( Caption);
          if fImgGlyph.Height > 0 then
          begin	//Il y a une Glyph de déssiner
            case fGlyphAlign Of
              gaAGauche : begin
                nTY := (Height - nTH) Div 2;
                //nTX := nGX + nGW + fEspacement;
                if fFontAlign = alcenter then
                  nTX := fMarge+ nGW + (Width - fMarge - ngW- nTW)  div 2
                else if fFontAlign = alRight then
                   nTx :=  Width - nTW - fMarge
                else
                   nTX := fMarge + nGW + fEspacement;
              end;
              gaADroite : begin
                nTY := ( Height - nTH) Div 2;
                //nTX := nGX - fEspacement - nTW;
                if fFontAlign = alcenter then
                  nTX := (Width - fMarge - ngW - nTW)  div 2
                else if fFontAlign = alRight then
                   nTX :=  Width - nTW - ngW - fMarge -fEspacement
                else
                   nTX := fMarge;
              end;
              gaEnHaut : begin
                nTY := nGY + nGH + fEspacement;
                if fFontAlign = alCenter then
                   nTX := (Width - nTW)  Div 2
                else if fFontAlign = alRight then
                   nTX := Width - nTW - fEspacement
                else
                   nTX := fMarge;
              end;
              gaEnBas : begin
                nTY := nGY - fEspacement - nTH;
                if fFontAlign = alCenter then
                   nTX := (Width - nTW)  Div 2
                else if fFontAlign = alRight then
                   nTX := Width - nTW - fEspacement
                else
                   nTX := fMarge;
              end;
            end;
          end
          else begin
            //Pas de glyph alors le Texte est centré dans l'image principal
            if fFontAlign = alcenter then
              nTX := (Width - nTW)  Div 2
            else if fFontAlign = alRight then
              nTx := Width - ntw - fEspacement
            else
              nTx := fMarge;
            //Ras pour le positionnement vertical
            nTY := (Height - nTH) Div 2;
          end;
          Canvas.TextRect( Rect( 0, 0, Width, Height), nTX, nTY, Caption);
        end;
      end;
    end;
    Dernière modification par Invité ; 01/12/2012 à 19h12.

  4. #4
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 340
    Points : 9 597
    Points
    9 597
    Par défaut
    Merci ApproxDev pour ces retours.

    En effet, je n'arrivais pas à trouver comment rendre visuel les changements d'images lors de la conception.

    Pour le centrage du texte, j'en étais arrivé à la même réflexion que toi pour la place du texte, que je ne trouvais pas pertinent.

    Je vais corriger.

    Pour le stretching, c'est vrai que c'est un soucis, mais le mode 9 images me semble peu évident à mettre en œuvre. En plus, je t'avouerais que j'utilise les images en mode "TailleAuto".

    Mais, je vais regarder ça de plus près... Qui peut le plus peut le moins après tout.

    A+
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  5. #5
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 340
    Points : 9 597
    Points
    9 597
    Par défaut
    @ApproxDev, je viens de voir le code que tu as mis pour la gestion du mode 9 images. Je me demandais si tu m'autoriserais à l'utiliser pour améliorer mon code ?

    Je pense que nous devrions continuer la discussion sur le post concernant le composant ImagesBouton car celui-ci est marqué "Résolu".

    A+
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

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

Discussions similaires

  1. Problème de création de table en mode sql dans phppgadmin
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/09/2015, 14h48
  2. [Lazarus] Problème de création de composant
    Par Gouyon dans le forum Lazarus
    Réponses: 24
    Dernier message: 06/11/2011, 00h25
  3. Création de composants: Problème lors du Destroy
    Par fred64 dans le forum Langage
    Réponses: 17
    Dernier message: 13/12/2007, 23h42
  4. Réponses: 1
    Dernier message: 29/05/2007, 01h00
  5. Réponses: 9
    Dernier message: 05/04/2006, 18h48

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