ayuda con (si $t = $r sigo con lo proximo ...)

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

tengo un programa que repite ControlSend("", "", "Edit1", "{ENTER}{TAB}") tantas veces como yo le indique y arriba a la izquierda aparece un mensaje que cuenta cuantas veces se va repitiendo ,

ahora el problema es el siguiente. cuando yo le indico por ejemplo que se repita 10 veces ,en el mensaje de arriba llega hasta el numero 10 y enves de pasar a la siguiente parte empieza a contar devuelta desde 0 , como seria la forma de hacer que cuando $t sea igual a $r ( termina de contar todas ) pase a lo q sigue.

do

$r= GUICtrlRead($Input)
for $t=0 to $r
ToolTip("Progreso "& $t ,0,0)

ControlSend("", "", "Edit1", "{PGUP}")
sleep(500)
ControlClick("", "", "", "main",4 ,95 ,281)


sleep(2000)

ControlSend("", "", "Edit1", "{ENTER}{TAB}")

ControlClick("", "", "", "main",2 ,668 ,250)

ControlSend("", "", "Edit1", "{PGDN}")
sleep(500)
ControlClick("", "", "", "main",1 ,590 ,52)



$i += 1
next

until $i = GUICtrlRead($Input)/20

MsgBox(0, "", "Terminado :)")
Avatar de Usuario
juantxo
Hacker del Foro
Mensajes: 78
Registrado: 02 Abr 2008, 13:36

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por juantxo »

UFFF!!! Que difícil!! :smt017 :smt017 :smt017

Creo que el problema lo tienes en la linea :smt043 :smt042 :smt043 :smt042

Código: Seleccionar todo

until $i = GUICtrlRead($Input)/20
Si al iniciar el programa tu escribes por ejemplo '12' en el Inputbox, el bucle FOR lo hace para $t =0 hasta $t=12 :smt023

Pero en esta linea que te indico, le dices que repita el proceso hasta que 12/20 sea igual a $i es decir que pararía cuando $i valdría 0,6 lo cual nunca ocurre. :smt022

Prueba poniendo 40 como valor de repeticion (en $input) y veras que hace el proceso 2 veces ( o pon 20 y solo lo hará una vez). :smt023 :smt023

Ya nos dirás si he acertado!! :smt020
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por Ximorro »

Si sólo lo quieres repetir $r veces lo que tienes que hacer es quitar el while.
El FOR que tienes ya te lo hace las r veces, al tener un while vuelve a repetir ese bucle, por eso empieza de cero otra vez.

Y como indica el compañero juantxo la condición de ese while es incorrecta, con lo que realmente es un bucle infinito (a menos que casualmente $r sea divisible entre 20 y dé un número entero)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

el error era ese que decias vos , que si daba con coma nunca paraba jaja xD ,
pero el tema es que el numero que va ahi siempre varia y no siempre sera multiplo de 12 ,
ahi alguna forma de que para darle el valor a $r= GUICtrlRead($Input)/12 de siempre sin coma , por ejemplo
si ($Input) valiera 52 , entonces seria $r = 52/12 que es igual a 4.3333333 , no ahi alguna forma de que solo quede 4 y no 4,3333333 ,asi podria agregarlo y que no importe el numero que aparesca ahi , siempre me de entero.


gracias :)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por Chefito »

La función Int(numero) da la parte entera de un número.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

y como puedo aplicar int(numero) en el ejemplo que di , porque me fije en la ayuda que viene en el autoit y solo me aparece $var = Int(10.793), si donde pongo el numero es $Input quedaria $var = Int($Input) ?
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por Ximorro »

Claro, donde puedes poner el número puedes poner una variable o una expresión.
Te quedaría
until $i = Int(GUICtrlRead($Input)/20)

No entiendo mucho el código pero si el $Input no cambia mientras se está ejecutando el bucle, lo puedes simplificar un poco.

Ah, y eso de que en la ayuda sólo aparece Int(10.793)... eso sólo es un ejemplo.
Fíjate arriba donde dice cómo se usa la función, pone:
Int(expression)

Expresión puede ser una constante, una variable, una expresión que se calcule en ese momento...
Con las llamadas a funciones casi siempre suele ser así, la única excepción es cuando la función modifica el argumento que le pasas, en ese caso requiere un nombre de variable. Pero en Autoit, aunque existen, son casos raros.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

hola ,con respecto a lo que me decias , el $imput no cambia mientras esta el bucle , es una aplicacion donde que tiene q seleccionar 12 items por pagina entonces si yo quiero seleccionar 36 items voy a poner que el until $i = 3 , ya que 3x 12 son 36 :P eaea , pero lo que pasa es que cuando pongo queuntil $i = GUICtrlRead($Input3) que en $imput3 es donde va la cantidad de veces que se repite el bucle,
pero siempre que lo pongo a funcionar no deja de repetirse ,y si le pongo que de 3 vueltas o las que sean siempre sigue y no para,
alguna idea de porque puede ser?

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

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por Ximorro »

Mira, tu estructura es la siguiente:

Código: Seleccionar todo

do

    $r= GUICtrlRead($Input)

    for $t=0 to $r

        ;hace otras cosas

        $i += 1

    next

until $i = Int(GUICtrlRead($Input)/20)
Un par de cosas... el bucle for no se ejecuta $r veces, sino $r+1, porque empiezas desde cero. Si $r es 1 quieres que lo haga una vez, pero lo hace una para el cero y otra para el uno = 2 veces. Solución, contar desde 1.
La otra es que si son 12 items por página habrá que dividir entre 12, no entre 20.
Así que los primeros cambios sería cambiar el 0 por 1 y el 20 por 12.
Además no sabemos qué valor inicial tiene $i, deberías asegurarte de que es cero, si no lo tienes al principio pon
$i = 0

El problema del bucle infinito (una vez puesto el Int) es que cambias $i dentro del for.
Supongamos que $input es el 36 que pones de ejemplo, entonces el bucle for se ejecuta 36 veces (si empieza en 1 como te he indicado antes), como $i aumenta ahí dentro al salir del For vale 36.
Cuando llega al until se está mirando
until $i = Int(GUICtrlRead($Input)/12) => until $i = Int(36/12) => until 36 = 3
Así que da otra vuelta, donde se vuelve a incrementar $i 36 veces, así que el siguiente until es:
until 72 = 3
Como ves la $i se va incrementando y esa igualdad nunca se va a cumplir.

Como solución o sacas el incremento de $i fuera del for (pero dentro del do-until), o bien simplemente no divides entre 12, pues en $input estás poniendo ya el número total de veces que haces el asunto ¿no?
Eso pareces querer decir con "si yo quiero seleccionar 36 items voy a poner que el until $i = 3 , ya que 3x 12 son 36".
Eso es que until $i = Int(GUICtrlRead($Input)/12) <=> until $i = 3
Entonces GUICtrlRead($Input)/12 = 3, entonces GUICtrlRead($Input) = 36.
Pero digo esto porque no tengo muy claro que quieras hacer el For 36 veces, pero eso puedes ser porque no tengo muy claro el objeto de todo esto...

Ah, la mejora es que si $input no cambia en el bucle no hay que calcular $r cada vez, hazlo fuera y úsalo dentro en todas las lecturas de $input
Así sin la división sería:

Código: Seleccionar todo


$i = 0

$r= GUICtrlRead($Input)

do

    for $t=1 to $r

        ;hace otras cosas

        $i += 1

    next

until $i =$r
Aquí ya no te hará bucle infinito, pero es un código raro, porque el until es innecesario. Si en $input ya está el 36 el for ya se hace las 36 veces, para mí que no es lo que quieres...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

muchas gracias ximorro , no era exactamente lo que queria pero lo ley varias veces y aprendi un par de cosas que no tenia en claro :) ,ya logre solucionar mi problema y era una pequeñes que nunca pense que era eso :P jajaja

sleep(5000)
$i = 0

do

    $r= 3
for $t=1 to $r
    ToolTip("Progreso "& $t*12 ,0,0)
sleep(3000)
send($t*12)


  $i += 1

next

until $i = 3

MsgBox(0, "", "Terminado :)")

lo que esta en negro es lo que tenia mal, yo antes tenia que $t=0 y $i=1
ximorro abri un bloc de notas ,abri el script este y apreta dentro del bloc de notas asi lo podes ver ,

lo que queria que haga era que en modo oculto seleccione los items de una web , al ir seleccionando los items ,arriba a la izquierda me apareciera un cartel que me indicaba cuantos ya habia seleccionado ,ya que estando en modo oculto no tenia la posibilidad de ver como iba progresando ,
a todo esto yo al principio queria hacer que me diga en x % cuanto me faltaba para que termine de seleccionar los que yo le habia indicado , pero al no tener idea de como hacer eso decidi mejor qe el programa me diga cuantos ya tenia ,mas quilombo al cuete :P

ya que saque el tema de los cartelitos ,yo se que ahi unos globos amarillos que se pueden poner donde esta la hora en el scritorio ,como se llaman asi lo busco en la ayuda o como los pongo?

y una ultima cosa , si yo uso BlockInput(1) , ahi alguna forma de hacer una esepcion para F6? , porque el programa tiene la opciones de poner en pausa con F6 ,pero cuando se ejecuta se activa BlockInput(1) para que no alla errores por si tocan en algun sector incorrecto ya que es como una automatizacion

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

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por Ximorro »

Bueno, pues ya lo tienes, pero fíjate que así el while es innecesario.
Esto hace exactamente lo mismo:
$r= 3
for $t=1 to $r
ToolTip("Progreso "& $t*12 ,0,0)
sleep(3000)
send($t*12)
next

porque la $i sólo la usas para contar y ver cuándo parar, pero esas cosas son precisamente las que hace el FOR automáticamente.
Tienes que buscarte un libro o un tutorial de algorítmica que te explique lo de los bucles FOR, WHILE y compañía...

Respecto al blockinput me temo que no se pueden hacer excepciones, ahí la cosa está difícil.
En los automatismos de este tipo, donde el ratón y el teclado se van moviendo solos, hay que pedir al usuario que se quede quietecito... o bloquearlo todo.

Ah, y quita lo de Mr. de Mr. Ximorro, hombre :smt002

Saludos.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
iamchavo
Hacker del Foro
Mensajes: 134
Registrado: 26 Mar 2009, 22:46

Re: ayuda con (si $t = $r sigo con lo proximo ...)

Mensaje por iamchavo »

muchas gracias ,tendre que decirles que no toquen nada entonces jaja
y lo de mr perdon xD ,es que me acostumbre a decirlo
saluuudos :)
Responder