Página 1 de 1

Actualizar Edit

Publicado: 15 Mar 2011, 21:36
por kj_
hola, quisiera pedir ayuda con un edit.

Estoy intentando reconstruir un programa parecido al LinkSearch de XPyro, solo que este recolecta enlaces dentro de varios enlaces, este es el code por lo pronto:

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <Inet.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Titulo", 633, 451, 196, 125)
$Edit1 = GUICtrlCreateEdit("", 16, 32, 329, 177)
GUICtrlSetData(-1, "")
$Edit2 = GUICtrlCreateEdit(" ", 16, 256, 593, 177)
$Progress1 = GUICtrlCreateProgress(16, 224, 329, 17)
$Label1 = GUICtrlCreateLabel("Enlaces Donde Buscar:", 16, 15, 107, 17)
$Button1 = GUICtrlCreateButton("Start", 416, 24, 163, 41)
$Button2 = GUICtrlCreateButton("Creditos", 416, 120, 163, 41)
$Button3 = GUICtrlCreateButton("Copiar Enlaces", 416, 168, 163, 41)
$Button4 = GUICtrlCreateButton("Reset All", 416, 72, 163, 41, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
        Case $Button1
			if GUICtrlRead($Edit1) = "" then 
                MsgBox(0,"Error", "No has colocado ninguna url")
                ContinueLoop
            Else
				GUICtrlSetState($Button1, $GUI_DISABLE)
				GUICtrlSetData($Edit2, "")
				$ATmp = StringReplace(GUICtrlRead($Edit1), 'http:', '"http:')
				$Aurl = StringSplit($ATmp, '"')
				for $t=1 to $Aurl[0]
					$psuc = _INetGetSource($Aurl[$t])
					GUICtrlSetData($Edit2,"")
					$suc = StringSplit($psuc, '"')
					for $l=1 To $suc[0]
						if StringInStr($suc[$l], "paremetrodebusqueda") Then
							if StringLeft($suc[$l],7) = "http://" Then
							GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&StringReplace($suc[$l], " ","%20")&@CRLF)
							EndIf
						EndIf            
					Next
				Next
				MsgBox (0, "", "Tarea finalizada")
				GUICtrlSetState($Button1, $GUI_ENABLE)
            EndIf
            Case $Button2
            Case $Button3
			ClipPut(GUICtrlRead($Edit2))
		Case $Button4
			GUICtrlSetData($Edit1, "")
			GUICtrlSetData($Edit2, "")
	EndSwitch
WEnd
el problema supongo que está en estas lineas:

$Edit2 = GUICtrlCreateEdit(" ", 16, 256, 593, 177)
GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&StringReplace($suc[$l], " ","%20")&@CRLF)

El problema que primero coloca correctamente el primer enlace encontrado en el Edit2, pero al encontrar el segundo enlace borra al primero para colocarlo en el edit y así sucesivamente :(.

alguien me puede hechar una mano?

kj

Re: Actualizar Edit

Publicado: 16 Mar 2011, 11:51
por Ximorro
Para los Edit (y también los Input) hay un tercer parámetro para indicar que se quiere añadir el texto, no sustituirlo. Basta con que ese parámetro valga cualquier cosa distinta de una cadena vacía:
GUICtrlSetData($EditControl, "Este texto sustituye a lo que hubiera ya en el Edit. ")
GUICtrlSetData($EditControl, "Este texto se añade al anterior", 1)


Saludosss

Re: Actualizar Edit

Publicado: 16 Mar 2011, 14:42
por kj_
ya intenté hacerlo así, solo que en lugar de 1 colocaba "true" y no me funciona.

kj

Re: Actualizar Edit

Publicado: 18 Mar 2011, 10:07
por Ximorro
El problema debe estar en la lógica del programa, porque ese mecanismo de añadir datos está comprobado que funciona (con true también).
Ve sacando mensajes por consola (o con MsgBox, pero la consola es mucho más adecuada para estas cosas) con lo que estás insertando.
Revisa la lógica del programa, por ejemplo, ¿ese GUICtrlSetData($Edit2,"") dentro del For-Next es correcto? ¿Es correcto limpiar ahí el edit?

También sería buena idea que no se use a sí mismo para actualizarse, a ver si es que hay algún problema con eso, o sea, este bucle (he quitado condiciones para simplificarlo):

Código: Seleccionar todo

for $l=1 To $suc[0]
	GUICtrlSetData($Edit2,GUICtrlRead($Edit2)&StringReplace($suc[$l], " ","%20")&@CRLF)
Next
se podría poner así:

Código: Seleccionar todo

$edit2_txt = GUICtrlRead($Edit2)
for $l=1 To $suc[0]
	$edit2_txt &= StringReplace($suc[$l], " ","%20") & @CRLF
Next
GUICtrlSetData($Edit2, $edit2_txt)
Además aunque el código sea más largo probablemente es más eficiente, porque acceder al texto del control y actualizarlo con cada línea será más lento que acceder directamente a una variable String y actualizar sólo al final.

Re: Actualizar Edit

Publicado: 19 Mar 2011, 22:40
por kj_
mmm, lo que me pones allí tampoco me funciona :smt022

lo puse que se use a si mismo para actualizarse como desespeada medida para que funcionara xD, aunque en un principio no lo hacía :P.

tengo 2 preguntas:

a que te refieres con sacar mensajes por la consola y como esos mensajes?
para que sirve el "&=" que colocaste al definir esta variable?:

$edit2_txt &= StringReplace($suc[$l], " ","%20") & @CRLF

perdona tanta ignorancia :smt022

kj

Re: Actualizar Edit

Publicado: 20 Mar 2011, 01:33
por XPyro
Mira que buena idea la de revisar barios enlaces, espero y ayas revisado el código de LinkSearch ya que te puede servir de mucho.

El problema aquí no es el control edit si no los datos que _INetGetSource() recibe al buscar el código de la pagina, si escribes en el edit los mismos datos que le arroja a _INetGetSource veras que existe un salto de linea y eso provoca el error, me refiero a @CRLF, te dejo el código un poco retocado :smt006

Código: Seleccionar todo

#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <Inet.au3>

$Form1 = GUICreate("Titulo", 633, 451, 196, 125)
$Edit1 = GUICtrlCreateEdit("http://www.google.com" & @CRLF & "http://www.bing.com", 16, 32, 329, 177)
$Edit2 = GUICtrlCreateEdit("", 16, 256, 593, 177)
$Progress1 = GUICtrlCreateProgress(16, 224, 329, 17)
$Label1 = GUICtrlCreateLabel("Enlaces Donde Buscar:", 16, 15, 127, 17)
$Button1 = GUICtrlCreateButton("Start", 416, 24, 163, 41)
$Button2 = GUICtrlCreateButton("Creditos", 416, 120, 163, 41)
$Button3 = GUICtrlCreateButton("Copiar Enlaces", 416, 168, 163, 41)
$Button4 = GUICtrlCreateButton("Reset All", 416, 72, 163, 41, 0)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			If GUICtrlRead($Edit1) = "" Then
				MsgBox(0, "Error", "No has colocado ninguna url")
			Else
				GUICtrlSetState($Button1, $GUI_DISABLE)
				GUICtrlSetData($Edit2, "")
				$Aurl = StringSplit(GUICtrlRead($Edit1), @CRLF) ;dividir por el salto
				For $t = 1 To $Aurl[0]
					If $Aurl[$t] <> "" Then
						$psuc = _INetGetSource($Aurl[$t])
						$suc = StringSplit($psuc, '"')
						For $l = 1 To $suc[0]
							If StringInStr($suc[$l], "www") Then
								If StringLeft($suc[$l], 7) = "http://" Then
									GUICtrlSetData($Edit2, StringReplace($suc[$l], " ", "%20") & @CRLF, 1)
								EndIf
							EndIf
						Next
					EndIf
				Next
				MsgBox(0, "", "Tarea finalizada")
				GUICtrlSetState($Button1, $GUI_ENABLE)
			EndIf
		Case $Button2
		Case $Button3
			ClipPut(GUICtrlRead($Edit2))
		Case $Button4
			GUICtrlSetData($Edit1, "")
			GUICtrlSetData($Edit2, "")
	EndSwitch
WEnd
PD: como dice @Ximorro, Ve sacando mensajes, solo coloca un msgbox en los datos que envías para ver que es lo que recibe la función o en este caso as que se escriban en un control :smt006

Re: Actualizar Edit

Publicado: 21 Mar 2011, 09:57
por Ximorro
El &= es un operador para concatenar y asignar cadenas a una variable
$a = $a & $b
es equivalente a:
$a &= $b

Vaya, se opera sobre una cadena y se guarda el resultado en ella misma. Es una forma más rápido de escribirlo.

Hay operadores parecidos para los aritméticos, p.e.:
$a = $a + 1 => $a += 1

Y así con -=, *=, /=


Lo de sacar mensajes, pues o lo haces por ventana con MsgBox, o por consola con ConsoleWrite. Para lo segundo o ejecutas el programa desde una ventana DOS, o desde el editor Scite. Yo hago los programas en Scite así que es muy cómodo. La consola es mejor porque no interrumpe el programa, va sacando mensajes según va trabajando.

Re: Actualizar Edit

Publicado: 21 Mar 2011, 22:42
por kj_
muchas gracias a ambos ^^.

a Ximorro por su persistente ayuda y a XPyro por dar la solucion final.

ximorro >> ok, entendí perfectamente, programo en batch y hay algo parecido al "&=" y lo de la consola ya lo supongo.

XPryo >> el codigo de linksearch no lo he visto, no lo encuentro para descargar.

kj