El código es parecido a lo que tenéis, pero necesitáis tener los conceptos más claros.
Cuando en una matriz haces
$a[2] = 5 estás poniendo un número
5 en el
índice 2 (tercera posición pues empieza en
$a[0]).
Y da igual lo que hubiera antes, es exactamente igual a cuando asignas a una variable, el valor anterior se pierde.
Así que si antes
$a[2] valía "Input_1", ahora no se crea una variable llamada Input_1 donde se pone un 5, ese es un error bastante gordo, lo que se hace es machacar ese valor anterior, que era un string, con el nuevo valor numérico.
Y si en vez de poner un número ponemos un control como un Input pues es lo mismo. Puede ser más complicado aceptar que en una posición de un vector puede haber un control, que es algo bastante más complicado que un número o string, pero pensar que en una posición de un array se puede asignar cualquier cosa que podríais asignar a una variable normal ¡incluso otra matriz!
Así que sencillamente usa la matriz directamente, no los nombres de dentro de la matriz. No puedes asignar los nombres así directamente (bueno, se podría con el comando
Assign pero entonces será más complicado referenciarlos luego)
Lo que hago es crear un vector (matriz) de tantos elementos (inputs) como queremos. Podría también ser de uno más y poner en la primera posición el número de elementos, pero entonces en la gestión de eventos igual se complica la cosa, no con los Input, pero si pones ristras de checkboxes o botones ya me dirás
Si te sientes más cómodo modifica el programa para que en la posición cero esté el número de elementos, no es problema.
Se puede hacer algo parecido con los label, pero como no hay que referenciarlos, que se quedan estáticos, pues no lo he hecho. En caso de que tengas que modificarlos o leerlos posteriormente puedes usar el mismo mecanismo creando un array de labels. Si es por leer sus textos no hace falta acceder a los controles label, basta con leerlo desde la matriz original
$Texto_Label.
El programa en el bucle asigna cada
Input a una
posición del array, fíjate que eso no le da el nombre como intentabas tú, sino que lo almacena en el array. Lo que tenemos es una posición en el vector, no un nombre.
De esta manera si quieres acceder al primer Input pondrás
$aInputs[0], para el tercero
$aInputs[2], etc. Por ejemplo para leer el texto sería:
GuiCtrlRead($aInputs[2])
El último estará en la posición
$Texto_Inputs[0]-1, o en
UBound($aInputs)-1, para no depender de otra matriz. De todas maneras es raro acceder directamente a un control dinámico poniendo explícitamente la posición, lo normal será procesarlos en bucles.
Este sería el programa modificado (por cierto, he cambiado el Select por un Switch, me gusta más porque es más compacto pero es cuestión de gustos):
Código: Seleccionar todo
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
GUICreate("My GUI **INPUTS** ;-)")
Global $Texto_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
Global $Texto_Label = StringSplit("Texto_1,Texto_2,Texto_3,Texto_4,Texto_5", ",")
Global $aInputs[$Texto_Inputs[0]]
Global $Left_Input = 15, $Top = 25
For $s = 1 To $Texto_Inputs[0]
$aInputs[$s-1] = GUICtrlCreateInput($Texto_Inputs[$s], $Left_Input, $Top, 200)
GUICtrlCreateLabel($Texto_Label[$s], 250, $Top + 6)
$Top += 25
Next
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd