Bonjour !
Je cherche le moyen de changer la couleur de la bordure d'un panel et d'un radiogroup (ou autres objets de ce type) sans changer la couleur de fond.
Quelqu'un peut-il m'aider svp?
Merci d'avance 8)
Bonjour !
Je cherche le moyen de changer la couleur de la bordure d'un panel et d'un radiogroup (ou autres objets de ce type) sans changer la couleur de fond.
Quelqu'un peut-il m'aider svp?
Merci d'avance 8)
Bonjour,
J'ai pas trouvé de propriété mais il est possible de ruser comme un renard en mettant un panel (panel N°1) puis dans ce panel il faut mettre un autre panel (panel N°2 qui correpond au panel dont on veut changer la couleur de la bordure).
Pour changer la couleur de la brodure du panel 2 (qui en fait n'a pas de bordure car les propriétés bevelouter et bevelinnner sont à bvnone), il suffit de changer la couleur de fond du panel N°1.
salut seb !
merci pour ta réponse et je pense que ça va marcher.
Cependant, j'aimerais bien trouvé un vrai truc car en fait, g une feuille de style en XML et ds celle ci, je mets la couleur des bordures et par conséquent, cela concerne TOUS les panels (et groupBox, ...) de mon appli alors je ne me vois pas dessiner un autre cadre pour chacun de ces objets.![]()
Connais tu "brush" et "canvas" ? car je pense que la solution est ici...
@+
Qu'entends tu par "Bordure" ? Le relief ??
Sinon tu sais que tu peux creer un nouvel objet TMonPanel derivant de TPanel et en surchargeant la Methode Paint, appeler l'ancienne Pour dessiner l'objet puis apres coup dessiner ta propre bordure.
Dans le cas des panels, tu peux aussi creer un panel plat (sans bordure) et y ajouter un TImage avec un bitmap qui represente ta bordure.
Ca marche aussi pour les forms.
C'est la même chose avec le canvas.
Tu seras obligé de dessiner une bordure autour de tous les composants.
Combien as-tu de composants ?
précisions ::
la "bordure", est l'encadrement que l'on trouve dans une groupBox ou radioGroup par exemple. toujours de couleur gris et impossible a changer dans les propriétés.
Cet encadrement est coupé par le "caption".
Au pire, je voudrais dessiner un cadre autour de ces controles.
pour clorish
ton idée est bonne et si j'avais su, c'est ce que j'aurai fait ms je n'ai pas le tps de tout redessiner.
pour sebCbien
g environ 300 components.
Voici ce que j'ai pour le mmt :
Mais le cadre ne se dessine que dans la Form ou le code est écrit alors que j'aimerais le faire pour le groupBox2 de MainFormDemo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 with MainFormDemo.GroupBox2 do begin canvas.Brush.Color:=clRed; canvas.Rectangle(MainFormDemo.GroupBox2.left - 2,MainFormDemo.GroupBox2.top - 2,MainFormDemo.GroupBox2.left+MainFormDemo.GroupBox2.width + 2,MainFormDemo.GroupBox2.top+MainFormDemo.GroupBox2.Height + 2); end;
contrairement a redessiner un autre panel(ou groupbox ou autre) avec canvas, je peux écrire :
et cela m'évite de surcharger mes feuilles qui ont déjà pas mal d'objets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for i:=0 to componentcount - 1 do // code ci dessus corrigé
Merci encore de votre aide ![/b]
300 Composants c'est 300 Classes differentes ?? ou 300 instances de 2 ou 3 classes a tout casser ... Ca change tout dans la maniere de proceder.
Je pense que la Creation de nouveaux composants n'est pas tres compliqué et donnera les meileurs resulats
Principe : Surcharger la pethode Paint, executer celle heritee et dessiner apres coup sur les "traits coloré" des trains de la nouvelle couleur.
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 Type tMonPanel = Class(TcustomPanel) Protected Procedure Paint; Override; End; TMonGroupBox = Class(TGroupBox) Protected Procedure Paint; Override; End; implementation Procedure TMonPanel.Paint; Var i : Integer; Begin Inherited; Canvas.Pen.Color := clRed; Canvas.MoveTo(0,0); Canvas.LineTo(0, Self.Height-1); Canvas.LineTo(Self.Width-1, Self.Height-1); Canvas.LineTo(Self.Width-1, 0); Canvas.LineTo(0, 0); End; Procedure TMonGroupBox.Paint; Begin Inherited; Canvas.Pen.Color := clRed; Canvas.MoveTo(7,5); Canvas.LineTo(0,5); Canvas.LineTo(0, Self.Height-2); Canvas.LineTo(Self.Width-2, Self.Height-2); Canvas.LineTo(Self.Width-2, 5); Canvas.LineTo(7+Canvas.TextWidth(Self.Caption), 5); End;
Remarque :
Bordure d'un Panel :
- Epaisseur 1px
- Bord Droit et Bas = Couleur
- Bord Haut et Gauche = Couleur plus clair si "raised" plus foncé si "lowered"
Bordure d'un GroupBox :
- Bordure 2 px
- 1 Bordure coloré de 0 -> Largeur -2 et Hauteur -2
- 1 bordure Claire decalé de 1px (de 1 a LArgeur -1 et hauteur -1)
- Bordure Claire a dessiner avant la bordure Foncee.
Si je comprend bien ce que tu cherche a faire, c'est une sorte de skin pour ton appli utilisant un fichier XML, je pense que celà est possible, je m'y suis interessé il y a qqs temps mais apres plusieurs recherches sur google, je n'ai rien trouvé qui pouvais m'éclaircir sur le sujet, j'ai justement un soft qui utilise cette technique (nouveau yahoo messenger) et apres une recherche sur mon disque, je suis tombé sur le fichier xml du skin que j'ai analysé mais je ne vois pas comment on peut implementé ça au sein de l'application, j'ai aussi essayé de chercher des exemple en c++ et autres language, j'ai posé des questions un peu partout mais aucune réponse. Je me suis penché sur le fonctionnement des themes XP avec le manifest dans l'espoir de trouver une piste mais j'ai rien trouvé![]()
Sinon, je peux te proposer qqs liens qui te donneront une idée de la manière dont tu peux créer un fichier xml de skin mais pas comment implementé au sein de l'executable, c'est toujours ça
http://www.winamp.com/nsdn/winamp/skinning/modern/tutorials/2.3-simpleskin.php
http://www.angelfire.com/al4/tsoft/skinabout.html un peu plus interessante mais sans suite
Bonne chance si c'est ce que j'ai compris![]()
PS: Si tes recherches sont plus fluctueuses que les miennes, je suis preneur![]()
lil_jam63,
g posté un message la dessus :"feuille de style XML"; tu y retrouveras mon pseudo. ça marche pour tous les components mais pas pour les propriétés qui ne sont pas dans l'inspecteurs d'objets d'où ma venue sur le forum de nouveau.
Je pense que la meilleure solution est de créer soi même ses objets. ce que je vais faire tout de suite ! (merci a l'auteur de cette idée)
Ya pas mieux que l'implementation de compos persos .... si tu place bien tes props, tu cela te facilitera meme les developpements futurs.
JE sais pas si c'est possible, mais si tu arrive a modifier la methode de TWincontrol elle meme tu devrais pouvoir changer la couleur de bordure de tous tes composants sans redevelopper une chasse speciale pour chacun d'entre eux.
Mais pour cela il faut au moins avoir acces aux soucres des classes TWincontrol (edition > Enterprise il me semble) pour la modifier et recompiler l'unitee DCU
Clorish, peux tu stp, me montrer un exemple (avec MonGroupBox1 par exemple) utilisant les classes que tu m'as donné.
pour créer une instance ?
la placer sur une feuille ?
Lui attribuer des propriétés/procédures et en l'occurence "paint" ?
Merci car je ne connais pas ce genre de chose ...![]()
Sinon, j'avais pensé à une astuce qui aurais été de dessiner un "shape" dynamiquement mais comment fait on ds ce cas ?
Tu cree une nouvelle unitee :
Pour ce qui est de la creation/Utilisation rien de plus simple :
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 Unit Unit2; Interface Uses .....; Type tMonPanel = Class(Panel) Private pBorderColor : TColor; // Variable de stockage de la couleur Procedure SetBorderColor(Color : TColor); Protected Procedure Paint; Override; Public Property BorderColor : TColor Read pBorderColor Write SetBorderColor default clBlack; // Change la couleur par defaut si tu veux Constructor Create(AOwner : TComponent); Override; End; implementation Constructor TMonPanel.Create(AOwner : TComponent); Begin Inherited; pBorderColor := clBlack; // Reporte ici la couleur par defaut; End; Procedure TMonPanel.Paint; Var i : Integer; Begin Inherited; Canvas.Pen.Color := pBorderColor; Canvas.MoveTo(0,0); Canvas.LineTo(0, Self.Height-1); Canvas.LineTo(Self.Width-1, Self.Height-1); Canvas.LineTo(Self.Width-1, 0); Canvas.LineTo(0, 0); End; Procedure TMonPanel.SetBorderColor(Color : TColor); Begin pBorderColor := Color; Self.Repaint; end; End.
Cela sous entends bien sur que tu ai des connaissances minimales sur la creation de composants et l'utilisaton dynamique de composants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ... Uses Unit2; ... Var MonPanel : TMonPanel; ... MonPAnel := TMonPanel.Create(Self); MonPanel.PArent := Self; MonPanel.BorderColor := clRed; ....
Dans un premier temps tu doit ajouter l'unitee qui contient la declaration de tous tes composants (ici Unit2) dans tes projets, mais si tu prends le DCU et que tu le copie sous Borland\Delphi\lib tu n'aura plus besoin de faire ca .. et il te suffit juste de nomer l'unite dans la clause Uses.
Pour ce qui est de le placer sur la feuille comme tout autre objets de la toolbar, il faut pour cela l'enregistrer.
Essaye Composant, installer dans un premier temps.
En effet, j'avais raté le sujet "fichiers XML", et en 2 minutes, j'en ai appris plus que pendant toutes une semaine a faire des recherches sur google.
Clorish, je dois vraiment te remercier car ça marche comme je veux !
ça m'a permis d'apprendre tout ce qui est création de composant aussi.
![]()
Je file une partie de code pour ceux que ça interesse. Il s'agit de la classe TMonGroupBox où on peux modifier la couleur du contour :![]()
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 unit MonGroupBox; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, ImgList, Grids, Buttons; type TMonGroupBox = class(TGroupBox) private pBorderColor : TColor; //variable de stockage de la couleur procedure SetBorderColor(color : TColor); protected Procedure Paint; Override; public property BorderColor : TColor Read pBorderColor Write SetBorderColor default clBlack; Constructor Create(AOwner : TComponent);Override; published { Déclarations publiées } end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TMonGroupBox]); end; Constructor TMonGroupBox.Create(AOwner : TComponent); Begin Inherited; pBorderColor := clBlack; // Reporte ici la couleur par defaut; End; Procedure TMonGroupBox.Paint; Begin Inherited; Canvas.Pen.Color := pBorderColor; Canvas.MoveTo(7,5); Canvas.LineTo(0,5); Canvas.LineTo(0, Self.Height-2); Canvas.LineTo(Self.Width-2, Self.Height-2); Canvas.LineTo(Self.Width-2, 5); Canvas.LineTo(7+Canvas.TextWidth(Self.Caption), 5); End; Procedure TMonGroupBox.SetBorderColor(Color : TColor); Begin pBorderColor := Color; Self.Repaint; end; end.Ensuite, il n'y a plus qu'à faire Composant|installer pour obtenir ce nouvel élément dans la palette outils. un "uses" et c parti
![]()
Je rajoute une precision sur mon idee de modification des Classes Delphi.
Si on possede les Sources des Unites delphi (StdCtrls.pas par exe) livré dans certaines version de Delphi, on peux modifier ces sources pour inclure nos propres methodes, proprietes pour en faire beneficier les sous objets.
Ex : Modifier TWinControl repercule la modif sur les TLabels, TGroupBox, etc... sans avoir a creer sa propre classe derivant de chacuns de ces Types incluant n fois la meme prop/Methode.
Seul Hic : Incompatibilitee entre la nouvelle classe cree et celle connu de delphi dans d'autres unitees.
Ex : Modifier TLabel dans StdCtrls entraine une incompatibilitee avec l'unitee Dialogs qui a ete compile avec l'ancienne unite stcCtrls.
Il faut simplment penser a recompiler toutes les unties delphi pour que les autres unites incluant l'unitee modifiee dans sa declaration puissent prendre en compte la modif.
Ya encore QQun ?
Je tenais juste a preciser ce fait au cas ou qqun aurait ete interesse par cette methode.
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