Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/11/2012, 09h50   #1
Jon Shannow
Membre Expert
 
Avatar de Jon Shannow
 
Homme
Responsable de service informatique
Inscription : avril 2011
Messages : 1 149
Détails du profil
Informations personnelles :
Sexe : Homme
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 : 1 149
Points : 1 681
Points : 1 681
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
__________________
L'Amour est fort difficile à conjuguer.
Au passé, il n'est jamais simple.
Au présent, il n'est qu'indicatif.
Et au futur, il n'est que conditionnel.
(d'après Jean Cocteau)
Jon Shannow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 14h07   #2
Jon Shannow
Membre Expert
 
Avatar de Jon Shannow
 
Homme
Responsable de service informatique
Inscription : avril 2011
Messages : 1 149
Détails du profil
Informations personnelles :
Sexe : Homme
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 : 1 149
Points : 1 681
Points : 1 681
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
__________________
L'Amour est fort difficile à conjuguer.
Au passé, il n'est jamais simple.
Au présent, il n'est qu'indicatif.
Et au futur, il n'est que conditionnel.
(d'après Jean Cocteau)
Jon Shannow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 14h46   #3
ApproxDev
Nouveau Membre du Club
 
Homme Benjamin
Codeur
Inscription : août 2012
Messages : 37
Détails du profil
Informations personnelles :
Nom : Homme Benjamin
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Codeur

Informations forums :
Inscription : août 2012
Messages : 37
Points : 36
Points : 36
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 :
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 :
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;
ApproxDev est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2012, 10h07   #4
Jon Shannow
Membre Expert
 
Avatar de Jon Shannow
 
Homme
Responsable de service informatique
Inscription : avril 2011
Messages : 1 149
Détails du profil
Informations personnelles :
Sexe : Homme
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 : 1 149
Points : 1 681
Points : 1 681
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
__________________
L'Amour est fort difficile à conjuguer.
Au passé, il n'est jamais simple.
Au présent, il n'est qu'indicatif.
Et au futur, il n'est que conditionnel.
(d'après Jean Cocteau)
Jon Shannow est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 10h34   #5
Jon Shannow
Membre Expert
 
Avatar de Jon Shannow
 
Homme
Responsable de service informatique
Inscription : avril 2011
Messages : 1 149
Détails du profil
Informations personnelles :
Sexe : Homme
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 : 1 149
Points : 1 681
Points : 1 681
@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
__________________
L'Amour est fort difficile à conjuguer.
Au passé, il n'est jamais simple.
Au présent, il n'est qu'indicatif.
Et au futur, il n'est que conditionnel.
(d'après Jean Cocteau)
Jon Shannow est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h08.


 
 
 
 
Partenaires

Hébergement Web