Varios inputs

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Varios inputs

Mensaje por avechuche »

Hola gente que tal. Bueno vengo con un problema. Resulta que quiero crear un boton por cada celda de un array, seria asi

Código: Seleccionar todo

$Nombre_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
$Texto_Label = StringSplit("Texto_1,Texto_2,Texto_3,Texto_4,Texto_5", ",")
$Nombre_Label = StringSplit("Label_1,Label_2,Label_3,Label_4,Label_5", ",")

For $s = 1 To $Nombre_Inputs[0]

	$Nombre_Inputs[$s] = GUICtrlCreateInput($Texto_Inputs[$s], $Left_Input, $Top, 150)
	$Nombre_Label[$s] = GUICtrlCreateLabel($Texto_Label[$s], 20, $Top)
	$Top += 25

Next
Hasta ahi todo bien. El tema es que por ejemplo, ahora quiero que el texto de alguno de los inputs se vea en otro label, por ejemplo

Código: Seleccionar todo

$Lala = GUICtrlCreateLabel(GUICtrlRead(Input_3), 50, 350)
Pero ahi el error, me devuelve 0 :( ... Alguna idea?
Última edición por avechuche el 08 Nov 2011, 23:30, editado 1 vez en total.
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Varios botones

Mensaje por arkcrew »

Hola avechuche,

Si lo que quieres es crear botones, te has confundido de comando, es GUICtrlCreateButton, lo que generas con tu code es un input box, vaya un cuadro de texto.. , también te faltan variables por definir..

En fin, te dejo esto que creo que es lo que quieres...

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
GUICreate("My GUI Button")
$Nombre_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
$Texto_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
$Texto_Label = StringSplit("Texto_1,Texto_2,Texto_3,Texto_4,Texto_5", ",")
$Nombre_Label = StringSplit("Label_1,Label_2,Label_3,Label_4,Label_5", ",")
$Left_Input = 15
$Top = 25
For $s = 1 To $Nombre_Inputs[0]
	GUICtrlCreateButton($Texto_Inputs[$s], $Left_Input, $Top)
	GUICtrlCreateLabel($Texto_Label[$s], 60, $Top + 6)
	$Top += 25
Next
GUISetState()
While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			ExitLoop
	EndSelect
WEnd
Si lo quieres como lo tenías con los imputs:

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("My GUI Button")

$Nombre_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
$Texto_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
$Texto_Label = StringSplit("Texto_1,Texto_2,Texto_3,Texto_4,Texto_5", ",")
$Nombre_Label = StringSplit("Label_1,Label_2,Label_3,Label_4,Label_5", ",")
$Left_Input = 15
$Top = 25

For $s = 1 To $Nombre_Inputs[0]
	GUICtrlCreateinput($Texto_Inputs[$s], $Left_Input, $Top)
	GUICtrlCreateLabel($Texto_Label[$s], 250, $Top + 6)
	$Top += 25
Next
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			ExitLoop
	EndSelect

WEnd
Espero que te sirva!

Un saludo!
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Varios botones

Mensaje por avechuche »

Me confundi no eran botones, eran Inputs con sus respectivos Label, por lo que va este code

Código: Seleccionar todo

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    GUICreate("My GUI Button")

    $Nombre_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
    $Texto_Inputs = StringSplit("Input_1,Input_2,Input_3,Input_4,Input_5", ",")
    $Texto_Label = StringSplit("Texto_1,Texto_2,Texto_3,Texto_4,Texto_5", ",")
    $Nombre_Label = StringSplit("Label_1,Label_2,Label_3,Label_4,Label_5", ",")
    $Left_Input = 15
    $Top = 25

    For $s = 1 To $Nombre_Inputs[0]
       GUICtrlCreateinput($Texto_Inputs[$s], $Left_Input, $Top)
       GUICtrlCreateLabel($Texto_Label[$s], 250, $Top + 6)
       $Top += 25
    Next
    GUISetState()

    While 1
       $msg = GUIGetMsg()
       Select
          Case $msg = $GUI_EVENT_CLOSE
             ExitLoop
       EndSelect

    WEnd
Hasta ahi todo bien, el problema es que no se le asigna ningun nombre a cada Input/Label que se crea. Eso es lo que yo necesito, saber si se puede o no, que mediante un For, tome los nombres de un Array y se los ponga a cada input/label
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Varios botones

Mensaje por arkcrew »

Ah, ya entiendo a qué te refieres, pues la verdad así de golpe no se me ocurre, porque no puedes decir "$input & $a" como variable porque te va a tirar error, se supone que los nombres de las avriables los sabes...
Ni idea, miraré haber si se me ocurre alguna cosa...

Un saludo!
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Varios botones

Mensaje por avechuche »

Claro ese es el tema, yo habia echo lo siguiente

Código: Seleccionar todo

$Nombre_Inputs[$s] = GUICtrlCreateinput($Texto_Inputs[$s], $Left_Input, $Top)
Eso anda sin problemas, pero no me asiga el nombre $Input_1 (En este caso) al input.

Ahora como hacen los programas, por ejemplo el WPI, que por cada programa te generea un check y "sabe" cuando ese esta tildado y sabe que programa tiene q instalar
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Varios botones

Mensaje por arkcrew »

Hola,

Esa estructura es incorrecta, ya que lo que das a entender con eso es que es una array de [$s] valores, ejemplo $var[3] = [xxx,xx,xx], si alguna sintaxix así fuese posible estaríamos hablando de $titulo & $s, para que nos genere algo en plan $titulo1, $titulo2, pero me tira error, veré que se puede hacer, quizás con una función se podría hacer...

Saludos!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Varios inputs

Mensaje por Ximorro »

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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Varios inputs

Mensaje por avechuche »

Ahora hay q ser zapallo para no darse cuenta de la boludes que estaba haciendo ^^ lo miro y lo miro y me rio solo ^^. Eso pasa cuando estas metido con algo y pensas q es asi y no es asi, pero seguis pensando q esta bien y no cambias la tactica. Muchas gracias!!!
Responder