Sign in Join
Wiki copytemporary

TComboBox/fr: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: TComboBox/fr

OldNewLine
1+Un **TComboBox** ![](/wiki-images/7/75/Tcombobox.png) est la combinaison d'un champ de saisie et d'une liste (déroulante) permettant de choisir une des options proposées.
2+
3+# Emploi
4+
5+Pour utiliser un [[doc:lcl/stdctrls/tcombobox.html|TComboBox]] sur une [[TForm/fr|fiche]], vous pouvez simplement le sélectionner dans l*'[[Standard tab/fr|onglet Standard]]* de la [[Component Palette/fr|palette de composant]] et le placer en cliquant sur la fiche.
6+
7+Dans le ComboBox, les [[String/fr|chaînes]] sont enregistrées dans la propriété *Items*, de type TStrings. Ainsi, vous pouvez affecter ou supprimer des chaînes dans le ComboBox comme dans un [[TStringList-TStrings Tutorial/fr|TStringList]] ou son parent [[TStringList-TStrings Tutorial/fr|TStrings]] (NdT: cette dernière affirmation est partiellement vrai car TStrings est une classe abstraite).
8+
9+Voici quelques petits exemple pour utiliser un ComboBox *ComboBox1* sur une fiche *Form1* :
10+
11+## Remplissage du ComboBox
12+
13+### par l'inspecteur d'objet
14+
15+- Sélectionnez le ComboBox sur votre fiche avec un clic.
16+- Allez dans l'inspecteur d'objet, dans l'onglet Propriétés et sur la propriété *Items*.
17+- Cliquez sur le bouton avec les trois points. L'éditeur de liste de chaînes s'ouvre.
18+- Entrez votre texte et confirmez le tout avec *OK*.
19+
20+### Par le code quand vous créez la fiche
21+
22+- Créez le gestionnaire d'événement *OnCreate* sur la fiche en cliquant sur votre fiche, utilisez l'inspecteur d'objet, l'onglet Evénements, choisissez l'événement *OnCreate* et cliquez sur le bouton \[...\] ou double-cliquez le bouton sur la fiche.
23+- Dans l'éditeur de source, vous pouvez maintenant insérer le texte désiré, pour notre exemple, vous écrivez ce qui suit :
24+
25+``` pascal
26+procedure TForm1.FormCreate(Sender: TObject);
27+begin
28+ ComboBox1.Items.Clear; //Delete all existing choices
29+ ComboBox1.Items.Add('Red'); //Add an choice
30+ ComboBox1.Items.Add('Green');
31+ ComboBox1.Items.Add('Blue');
32+ ComboBox1.Items.Add('Random Color');
33+end;
34+```
35+
36+## Faire que quelque chose arrive après la sélection
37+
38+Comme tous les composants, même le TComboBox fournit divers [[Event order/fr|events]], qui sont appelés quand l'utilsiateur agut sur le ComboBox. Pour répondre à une changement de sélection dans le ComboBox, vous pouvez utiliser l'événement *OnChange* :
39+
40+- Double-cliquez sur le ComboBox dans la fiche ou choisissez l'événement *OnChange* dans l'inspecteur d'objet et cliquez sur le bouton \[...\].
41+- Le gestionnaire d'événement est créé, vous pouvez maintenant insérer votre code, dans notre exemple nous voulons changer la couleur de fond de la fiche :
42+
43+``` pascal
44+procedure TForm1.ComboBox1Change(Sender: TObject);
45+begin
46+ case ComboBox1.ItemIndex of //what entry (which item) has currently been chosen
47+ 0: Color:=clRed;
48+ 1: Color:=clGreen;
49+ 2: Color:=clBlue;
50+ 3: Color:=Random($1000000);
51+ end;
52+end;
53+```
54+
55+- Démarrez votre application, la sélection change la couleur de fond de la fiche.
56+
57+## ComboxBox dessiné par le propriétaire
58+
59+En général, il est préférable de laisser le ComboBox suivre le [thème](http://en.wikipedia.org/wiki/Skin_%28computing%29) défini par l'utilisateur. Dans certains cas (par exemple to programmer un jeu avec une surface toute colorée), vous pouvez vous détourner de ce standard et dessiner le contrôle selon votre propre choix.
60+
61+> **Note:** **Paramètres of ComboBoxDrawItem:**\
62+> \
63+> **Control:**\
64+> Si plusieurs contrôles (p.ex. de multiples ComboBox) ont accès à ce gestionnaire, vous savez lequel a déclenché l'événement. Vous pouvez dans votre exemple au lieu de ComboBox1.Canvas.FillRect(ARect) écrire aussi TComboBox(Control).Canvas.FillRect(ARect). Néa,moins, vous devrez vérifier s'il s'agit d'un TComboBox :
65+>
66+> ``` pascal
67+> if Control is TComboBox then
68+> TComboBox(Control).Canvas.FillRect(ARect);
69+> ```
70+>
71+> **Index**:\
72+> Spécifie l'emplacement de l'article, vous avez ainsi accès à la chaîne **`<ComboBox>.Items[Index]`**.\
73+> **ARect**:\
74+> Décrit le rectangle, ce qui est nécessaire pour le dessin du fond.\
75+> **State**:\
76+> Etat de l'article, soit normal, mis en évidence (focus), sélectionné etc;
77+
78+### Dessiner une rectangle rempli
79+
80+- Vous pouvez modifier l'exemple [[TComboBox/fr|Remplir le ComboBox par code quand vous créez la fiche]].
81+- Dans *ComboBox1*, modifiez depuis l'inspecteur d'objet la propriété *Style* en *csOwnerDrawFixed*.
82+- Créez depuis l'inspecteur d'objet le gestionnaire d'événement pour l'événement *OnDrawItem* en cliquant sur le bouton \[...\].
83+- Ajoutez le code suivant dans le gestionnaire :
84+
85+``` pascal
86+procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
87+ ARect: TRect; State: TOwnerDrawState);
88+var
89+ ltRect: TRect;
90+
91+ procedure FillColorfulRect(aCanvas: TCanvas; myRect: TRect); //paint random color
92+ // Fills the rectangle with random colours
93+ var
94+ y: Integer;
95+ begin
96+ for y:=myRect.Top to myRect.Bottom - 1 do begin
97+ aCanvas.Pen.Color:=Random($1000000);
98+ aCanvas.Line(myRect.Left, y, myRect.Right, y);
99+ end;
100+ end;
101+
102+begin
103+ ComboBox1.Canvas.FillRect(ARect); //first paint normal background
104+ ComboBox1.Canvas.TextRect(ARect, 22, ARect.Top, ComboBox1.Items[Index]); //paint item text
105+
106+ ltRect.Left := ARect.Left + 2; //rectangle for color
107+ ltRect.Right := ARect.Left + 20;
108+ ltRect.Top := ARect.Top + 1;
109+ ltRect.Bottom := ARect.Bottom - 1;
110+
111+ ComboBox1.Canvas.Pen.Color:=clBlack;
112+ ComboBox1.Canvas.Rectangle(ltRect); //draw a border
113+
114+ if InflateRect(ltRect, -1, -1) then //resize rectangle by one pixel
115+ if Index = 3 then
116+ FillColorfulRect(ComboBox1.Canvas, ltRect) //paint random color
117+ else begin
118+ case Index of
119+ 0: ComboBox1.Canvas.Brush.Color := clRed;
120+ 1: ComboBox1.Canvas.Brush.Color := clGreen;
121+ 2: ComboBox1.Canvas.Brush.Color := clBlue;
122+ end;
123+ ComboBox1.Canvas.FillRect(ltRect); //paint colors according to selection
124+ end;
125+end;
126+```
127+
128+- Votre exemple pourrait ressembler à ceci :
129+
130+![](/wiki-images/1/1d/ComboBoxBsp1.png) -\> ![](/wiki-images/7/70/ComboBoxBsp2.png)
131+
132+### Mettre une image en marge
133+
134+Dans cet exemple, nous chargeons quelques images dans une [[TImageList/fr|TImageList]] et les dessinons devant les articles dans le ComboBox. C'est un exemple simple qui montre ce l'on peut faire. Je ne donne pas les détails tels que vérifier si les images correspondantes existent etc. dans cet exemple. Ceci devrait être fait selon vos besoins.
135+
136+- Créez une application analogue à notre exemple [[http://wiki.freepascal.org/TComboBox/fr|Remplir le ComboBox par code quand vous créez la fiche]].
137+- Modifiez la propriété *Style* de *ComboBox1* depuis l'inspecteur d'objet en *csOwnerDrawFixed*.
138+- Ajoutez un [[TImageList/fr|TImageList]] depuis la palette de composant *Common controls* sur votre fiche.
139+- Les propriétés *Height* et *Width* sont défines au départ à 16 dans *ImageList1*. Pour mieux correspondre à nos images, nous portons ces propriétés à 18 depuis l'inspecteur d'objet.
140+- Ajoutez les images dans l'ImageList :
141+ - Double-cliquez sur *ImageList1* ou cliquez droit sur *ImageList1* et sélectionnez *Editeur de liste d'images...*
142+ - Cliquez sur *Ajouter* et sélectionner une image (voir \<Lazarus directory\>/images/... il y a divers images et icônes en taille 16x16 pixels).
143+ - Une fois les images ajoutées, confirmez votre travail avec \[Ok\].
144+- Créez dans l'inspecteur d'objet le gestionnaire d'événement pour l'événement *OnDrawItem* en cliquant sur le bouton \[...\].
145+- Ajoutez le code suivant dans le gestionnaire :
146+
147+``` pascal
148+procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
149+ ARect: TRect; State: TOwnerDrawState);
150+begin
151+ ComboBox1.Canvas.FillRect(ARect); //first paint normal background
152+ ComboBox1.Canvas.TextRect(ARect, 20, ARect.Top, ComboBox1.Items[Index]); //paint item text
153+ ImageList1.Draw(ComboBox1.Canvas, ARect.Left + 1, ARect.Top + 1, Index); //draw image according to index on canvas
154+end;
155+```
156+
157+- Votre exemple pourrait ressembler à ceci :
158+
159+![](/wiki-images/1/1d/ComboBoxBsp1.png) -\> ![](/wiki-images/c/ca/ComboBoxBsp3.png)
160+
161+# Voir aussi
162+
163+- [[doc:lcl/stdctrls/tcombobox.html|TComboBox]]
164+- [[TEdit/fr|TEdit]]
165+- [[TListBox/fr|TListBox]]
166+- [[TDBComboBox/fr|TDBComboBox]]
167+- [[TDBLookupComboBox/fr|TDBLookupComboBox]]
168+
169+---
170+*From the Free Pascal wiki, page "TComboBox/fr", as it stood on 2020-02-29 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history