No es por nada pero un poco de código siempre viene bien para tener algo con lo que empezar...
Bueno se me ocurren tres o cuatro maneras, dependiendo de lo que te interese.
Con las funciones básicas de AutoIt se puede establecer el valor por defecto del combo, que puedes cambiar cuando quieras. Desgraciadamente no sé cómo hacerlo sin redefinir el contenido de los items, así que no me gusta mucho, a menos que sean combos de pocos datos fijos.
Se haría:
Código: Seleccionar todo
$items = "|item1|item2|item3"
$comb = GUICtrlCreateCombo("", 10, 10, 160)
GUICtrlSetData(-1, $items, "item3")
...
GUICtrlSetData($comb, $items, "item1")
En este caso cuando lo creo pongo por defecto "item3", más adelante en otro punto del programa lo cambio a "item1". Como ves el problema es que el segundo parámetro de
GuiCtrlSetData es obligatorio, así que tengo que poner otra vez los items. Para simplificarlo los tengo en la variable
$items, aún así no me gusta mucho esta solución.
Si alguien sabe cómo utilizar GuiCtrlSetData en un combo para cambiar el valor por defecto sin redefinir los items que lo diga. En ese caso sí sería bastante interesante este método.
Las otras maneras se hacen mandando mensajes windows al combo. También es con las funciones básicas de AutoIt, pero es con la genérica
GUICtrlSendMsg. Afortunadamente tenemos los valores de los mensajes ya definidos en la udf
ComboConstants.au3.
Una manera es
por posición, cambiando al índice correspondiente, empezando a contar desde cero. Es el mensaje
CB_SETCURSEL, así que se hace así:
GUICtrlSendMsg($comb, $CB_SETCURSEL, $indice, 0)
$indice puede valer desde 0 hasta el número de items menos 1.
El último parámetro (
lParam) no se usa en este mensaje, pero no es opcional para la función así que lo pongo a cero.
Con ese mensaje te colocas por posición, pero también puedes buscar
por contenido, eso se hace con el mensaje
CB_SELECTSTRING:
GUICtrlSendMsg($comb, $CB_SELECTSTRING, $indice, $cadena)
En este caso
$indice indica desde qué posición se empieza a buscar, se usa
-1 para buscar en todo el combo. En
$cadena pones el texto a buscar (busca subcadenas pero sólo desde el principio del item.
Te pongo un ejemplo en el que uso estos dos métodos. También está comentado el equivalente a
CB_SELECTSTRING con
GUICtrlSetData.
Código: Seleccionar todo
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
Global $items, $msg, $comb, $bot1, $bot2
GUICreate("GUI combo", 180, 110)
$items = "|item1|item2|item3"
$comb = GUICtrlCreateCombo("", 10, 10, 160)
GUICtrlSetData(-1, $items, "item3")
$bot1 = GuiCtrlCreateButton('Selecciona "item1"', 10, 40)
$bot2 = GuiCtrlCreateButton("Selecciona segundo elemento", 10, 70)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
case $GUI_EVENT_CLOSE
ExitLoop
case $bot1
;GUICtrlSetData($comb, $items, "item1")
GUICtrlSendMsg($comb, $CB_SELECTSTRING, -1, "item1") ; Selecciona por texto
case $bot2
GUICtrlSendMsg($comb, $CB_SETCURSEL, 1, 0) ; Selecciona por posición (0 = primer elemento)
EndSwitch
WEnd
Por último decir que hay una udf para trabajar con combos,
GuiComboBox.au3, que tiene estas cosas y muchas más. Si vas a manejar el combo de maneras más complicadas te será muy útil. Si sólo vas a hacer lo de seleccionar el item yo no sobrecargaría el programa con esta udf tan completa, siendo que el problema se soluciona en una línea (el envío del mensaje). En cualquier caso aunque no uses la udf se puede aprender mucho de ella, por ejemplo veo que ellos hacen también esto con los mensajes, aunque curiosamente en vez de usar
GUICtrlSendMsg hacen una llamada directamente a
SendMessageW en
user32.dll, complicación que se podrían haber ahorrado usando el soporte nativo en AutoIT, pero bueno, el resultado es el mismo.