Sign in Join
Wiki copytemporary

TComboBox/es: what changed

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

OldNewLine
11\>\> [[LCL Components]] \>\> TComboBox\
22
33## Visión General
44
55Esta página explica como utilizar el componente [[doc:lcl/stdctrls/tcombobox.html|TComboBox]]. Cuando mencione hacer click en algo, a menos que diga explícitamente que haga click-derecho, siempre me referiré a realizar un click izquierdo en el elemento en cuestión.
66
77## Descripción
88
99Es una combinación de una caja de edición (edit box) y un listado (soltar-abajo(drop-down) permitiendo una o varias opciones a ser escogidas.
1010
11-<figure>
12-<img src="ComboBox_04.png" title="ComboBox_04.png" />
13-<figcaption>ComboBox_04.png</figcaption>
14-</figure>
11+![](/wiki-images/1/15/ComboBox_04.png)
1512
1613## Modo de uso
1714
1815Para utilizar un [[doc:lcl/stdctrls/tcombobox.html|TComboBox]] en un [[TForm|form]], simplemente lo seleccionas de la paleta de componentes *Standard*y a continuación lo ubicas en el formulario mediante un click en el mismo.\
1916En el componente ComboBox, las [[String|strings]] se almacenan en la propiedad *Items*, que es del tipo TStrings. Por tanto puedes asignar o eliminar cadenas en el ComboBox como en un [[TStringList-TStrings Tutorial|TStringList]] o su padre [[TStringList-TStrings Tutorial|TStrings]].
2017
2118Aquí hay unos cuantos ejemplo de uso para combobox *ComboBox1* en un formulario *Form1*:
2219
2320### Llenar el ComboBox
2421
2522#### Mediante el Inspector de Objetos
2623
2724- Selecciona el ComboBox en tu formulario mediante un click.
2825- Ve al *Inspector de Objetos* en la solapa *Propiedades* de la propiedad *Items*.
2926- Haz Click en el pulsador que tiene los tres puntos *...* que habrirá el editor de cadenas.
3027- Escribe las entradas de texto que necesites y confirma el contenido con *OK*.
3128
3229#### Mediante código cuando creas el formulario
3330
3431- Crea el manejador del evento *OnCreate* para el formulario haciendo click en el formulario, luego en el Inspector de Objetos vamos a la solapa **events**, selecciona el evento *OnCreate* y haz click en \[...\] o haz doble click en el pulsador dentro del formulario.
3532
3633- En el editor de código fuente ahora insertamos la sección de texto deseada, para nuestro ejemplo, escribiéndola como sigue:
3734
3835``` pascal
3936procedure TForm1.FormCreate(Sender: TObject);
4037begin
4138 ComboBox1.Text := 'Esto es un ComboBox';
4239 ComboBox1.Items.Clear; // Elimina todo el contenido previo.
4340 ComboBox1.Items.Add('Rojo'); // Añade la entrada del elemento 'Rojo'.
4441 ComboBox1.Items.Add('Verde'); // Añade la entrada del elemento 'Verde'.
4542 ComboBox1.Items.Add('Azul'); // Añade la entrada del elemento 'Azul'.
4643 ComboBox1.Items.Add('Color Aleatorio'); // Añade la entrada del elemento 'Color Aleatorio'.
4744end;
4845```
4946
50-<figure>
51-<img src="ComboBox_01.PNG" title="ComboBox_01.PNG" />
52-<figcaption>ComboBox_01.PNG</figcaption>
53-</figure>
47+![](/wiki-images/5/55/ComboBox_01.PNG)
5448
5549### Hacer que suceda algo después de la selección
5650
5751Como todos los componentes TComboBox también provee varios [[Event order|eventos]] que son llamados cuando el usuario lo utiliza. Para responder a un cambio en la selección de los elementos podemos utilizar el evento **OnChange**:
5852
5953- Para ello hacemos doble click sobre el componente ComboBox del formulario en el que estemos trabajando o bien escogemos el evento *OnChange* en el Inspector de Objetos y a continuación click en **\[...\]**.
6054
6155- Con esto se crea el manejador del evento permintiéndonos insertar el código deseado. En nuestro ejemplo queremos cambiar el color del recuadro que muestra el elemento seleccionado:
6256
6357``` pascal
6458procedure TForm1.ComboBox1Change(Sender: TObject);
6559begin
6660 case ComboBox1.ItemIndex of // Caso de escoger el elemento de indice ?
6761 0: ComboBox1.Color:=clRed; // 0 asigna clRed a Color (Rojo)
6862 1: ComboBox1.Color:=clGreen; // 1 asigna clGreen a Color (Verde)
6963 2: ComboBox1.Color:=clBlue; // 2 asigna clBlue a Color (Azul)
7064 3: ComboBox1.Color:=Random($1000000); // 3 asigna un color aleatorio a Color
7165 end;
7266end;
7367```
7468
7569- Arranca tu aplicación, cada una de las selecciones cambia el color de fondo del rectángulo del ComboBox que nos muestra el elemento seleccionado.
7670
77-<figure>
78-<img src="ComboBox_02.PNG" title="ComboBox_02.PNG" />
79-<figcaption>ComboBox_02.PNG</figcaption>
80-</figure>
71+![](/wiki-images/1/10/ComboBox_02.PNG)
8172
8273### Dibujado personalizado del ComboBox
8374
8475En general, es ventajoso permitir al ComboBox mostrar el [tema](http://en.wikipedia.org/wiki/Skin_%28computing%29) que ha escogido el usuario en sus configuraciones. En algunos casos (por ejemplo, para programar un juego con una superficie repleta de color), puedes desviarte de este estandar y dibujarlo acorde a tu propia elección. Así es como funciona:
8576
8677> **Note:** **Parámetros de un ComboBoxDrawItem:**\
8778> \
8879> **Control:**\
8980> If multiple controls (e.g. multiple ComboBoxes) access this event handle, sabes que control causó el evento. En nuestro ejemplo, en lugar de **`ComboBox1.Canvas.FillRect(ARect)`** puedes además escribir **`TComboBox(Control).Canvas.FillRect(ARect)`**. However, you should still check in advance, whether it is a TComboBox:
9081>
9182> ``` pascal
9283> if Control is TComboBox then
9384> TComboBox(Control).Canvas.FillRect(ARect);
9485> ```
9586>
9687> **Index:** Epecifica la localización del elemento, de forma que se tenga acceso a la cadena **`<ComboBox>.Items[Index]`**.\
9788> **ARect:** Describe el rectángulo, el cual es necesario para dibujar el fondo.\
9889> **State:** Estado de los elementos, nos indica cuando se encuentran en estado normal, enfocado, seleccionado, etc.
9990
10091#### Dibujar un rectángulo relleno
10192
10293- Puedes modificar el ejemplo [[TComboBox|Fill ComboBox mediante cógigo cuando se crea el formulario]].
10394- Cambio para *ComboBox1* en el Inspector de Objetos la propiedad *Style* al valor *csOwnerDrawFixed*.
10495- Crea en el Inspector de Objetos el manejador de evento para el evento *OnDrawItem*, haciendo click en el pulsador \[...\].
10596- Añade el siguiente código al manejador:
10697
10798``` pascal
10899procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
109100 ARect: TRect; State: TOwnerDrawState);
110101var
111102 ltRect: TRect;
112103
113104 procedure FillColorfulRect(aCanvas: TCanvas; myRect: TRect); // Pinta un color aleatorio
114105 // Rellena el rectángulo con un color aleatorio.
115106 var
116107 y: Integer;
117108 begin
118109 for y:=myRect.Top to myRect.Bottom - 1 do begin
119110 aCanvas.Pen.Color:=Random($1000000);
120111 aCanvas.Line(myRect.Left, y, myRect.Right, y);
121112 end;
122113 end;
123114
124115begin
125116 ComboBox1.Canvas.FillRect(ARect);
126117 // Primero pinta el fondo normal.
127118 ComboBox1.Canvas.TextRect(ARect, 22, ARect.Top, ComboBox1.Items[Index]);
128119 // A continuación pinta el texto del elemento.
129120
130121 ltRect.Left := ARect.Left + 2; // Define el rectángulo para el color de relleno.
131122 ltRect.Right := ARect.Left + 20;
132123 ltRect.Top := ARect.Top + 1;
133124 ltRect.Bottom := ARect.Bottom - 1;
134125
135126 ComboBox1.Canvas.Pen.Color:=clBlack;
136127 ComboBox1.Canvas.Rectangle(ltRect); // Dibuja un borde.
137128
138129 if InflateRect(ltRect, -1, -1) then // Redimensiona el rectángulo en un pixel.
139130 if Index = 3 then
140131 FillColorfulRect(ComboBox1.Canvas, ltRect) //Pinta un color aleatorio.
141132 else begin
142133 case Index of
143134 0: ComboBox1.Canvas.Brush.Color := clRed; // Color Rojo.
144135 1: ComboBox1.Canvas.Brush.Color := clGreen; // Color Verde.
145136 2: ComboBox1.Canvas.Brush.Color := clBlue; // Color Azul.
146137 end;
147138 ComboBox1.Canvas.FillRect(ltRect);
148139 // Pinta colores rellenando el rectángulo de acuerdo a la selección escogida.
149140 end;
150141end;
151142```
152143
153144- Tu ejemplo podría parecerse a esto:
154145
155146![](/wiki-images/1/1d/ComboBoxBsp1.png) -\> ![](/wiki-images/7/70/ComboBoxBsp2.png)
156147
157148#### Preceder una imagen al elemento
158149
159150En este ejemplo cargamos unas cuantas imágenes en un [[TImageList]] y las dibujamos en frente de los elementos del ComboBox. Es un ejemplo que generalmente solo muestra que puedes hacer en el: no entro explícitamente en detalles, tales como chequeo, si la imagen correspondiente existe, etc. en este ejemplo. Esto debería hacerse por tu parte dependiendo de las necesidades.
160151
161152- Crea una aplicación análoga a la del ejemplo [[TComboBox|Rellena el ComboBox mediante código cuando se crea el formulario]].
162153- Cambia de *ComboBox1* en la propiedad *Style* del Inspector de Objetos a *csOwnerDrawFixed*.
163154- Añade un[[TImageList]] desde la paleta de componentes *Common controls* a tu formulario.
164155- La *Height* y *Width* de 16 pixels viene predefinida para *ImageList1*. Lo permitimos. Para contener completamente las imágenes en nuestro ComboBox establecemos la propiedad *ItemHeight* de *ComboBox1* a *18* mediante el Inspector de Objetos.
165156- Añade 4 imágenes en ImageList:
166157 - Doble click *ImageList1* 0 click izquierdo *ImageList1* y selecciona *ImageList Editor...*.
167158 - Haz click en *Add* y selecciona una imagen (ver \<Lazarus directory\>/images/... hay varias imágenes e iconos en tamaño 16px).
168159 - Has añadido 4 imágenes, confirma tu selección con \[ok\].
169160- Crea mediante el Inspector de Objetos el manejador de eventos para el evento *OnDrawItem*, haciendo click en el pulsador \[**...**\].
170161- Añade el siguiente código al manejador:
171162
172163``` pascal
173164procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
174165 ARect: TRect; State: TOwnerDrawState);
175166begin
176167 ComboBox1.Canvas.FillRect(ARect); // Primeramente pinta un fondo normal.
177168 ComboBox1.Canvas.TextRect(ARect, 20, ARect.Top, ComboBox1.Items[Index]); // Pinta el texto del elemento.
178169 ImageList1.Draw(ComboBox1.Canvas, ARect.Left + 1, ARect.Top + 1, Index); // Dibuja la imagen de acuerdo al índice (index) en el canvas.
179170end;
180171```
181172
182173- Tu ejemplo debería parecerse a esto:
183174
184175![](/wiki-images/1/10/ComboBox_02.PNG) -\> ![](/wiki-images/8/8c/ComboBox_03.PNG)
185176
186177Como puedes observar asigna las imágenes que tienen su propio índice en ImageList1 correlativo al índice que tienen los elementos en el ComboBox1.
187178
188179---
189180*From the Free Pascal wiki, page "TComboBox/es", 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