Depuración de errores (MiBiciPublica - MiValenbisi)

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

Hasta el momento, utilizaba una versión portable (o al menos no instalada). De todos modos echaré un vistazo a la que indicas BasicOs. Por cierto, no sé si conocéis Scite Hopper http://www.autoitscript.com/forum/topic ... one-click/. Lo encontré hace poco y me resulta muy práctico.

En cuanto al programa MiValenBisi, ayer estuve peleando para poner color a los números de bicicletas libres, según si eran 0, menores o mayores que 5. El ListView lo rellenaba con _GUICtrlListView_AddItem, pero después de buscar maneras de poner color a una celda de la lista, encontrar programas y UDFs, pero no conseguir hacerlo funcionar en mi programa, decidí cambiarlo por GUICtrlCreateListViewItem y así poder dar color (aunque en este caso a toda la línea) con GUICtrlSetBkColor.

He limpiado, ordenado y comentado un poco el código. Os dejo la última versión hasta la fecha, incluyendo las cosillas que me habéis comentado, antes de crear un nuevo tema en el sub-foro de "esScripts".

Aprovecho para preguntar (por no abrir otro tema) ¿qué es y para qué sirve AutoIt3Wrapper? Lo veo en muchos códigos, como, por ejemplo, en alguno de los que ha publicado BasicOS en el tema sobre Autoit Portable.

Código: Seleccionar todo

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=App\Icons\autoitEspanol.ico
#AutoIt3Wrapper_outfile=AutoItPortableES.exe
#AutoIt3Wrapper_UseX64=N
#AutoIt3Wrapper_Res_Description=AutoIt3 Portable
#AutoIt3Wrapper_Res_Fileversion=3.3.6.1
#AutoIt3Wrapper_Res_Field=Website|
#AutoIt3Wrapper_Res_Field=E-Mail|comment at the website
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Run_Obfuscator=Y
#Obfuscator_Parameters=/SF /SV /OM /CS=0 /CN=0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****



¡Un saludo!

Código actualizado de MiValenBisi
|
V

Código: Seleccionar todo

;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
; Lee datos de estación de Valenbisi según explicación en la página: http://boozox.net/boozox/api-de-valenbisi-servicio-de-jcdeacaux/
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
;
;
; http://www.valenbisi.es/service/stationdetails/num_estacion -> Contiene los datos de la estación "num_estacion" relativos al número de bornetas totales, libres y número de bicicletas libres
;
; http://www.valenbisi.es/service/carto	-> Contiene listado de estaciones con su información (nombre, número, dirección, latitud, longitud,...)

; ---------- Versiones ----------
; 20110213: Guarda posición y dimensiones de ventana, y anchos de columna en archivo .ini para utilizarlo en la siguiente sesión
; 20110225: Corregidos errores con ayuda del foro Autoit en Español: http://www.emesn.com/autoitforum/viewtopic.php?f=12&t=2545
; 20110228: Comprueba si existe conexión a internet
;			Añadidos colores según haya 0, 1 a 4, 5 o más bicicletas
;

#include ".\includes\_XMLDomWrapper.au3"	; Comillas para que busque en relación al directorio del programa. Punto para indicar la carpeta raíz del programa.
;#include ".\includes\LV_Format_include.au3"	; http://www.autoitscript.com/forum/topic/89654-listview-for-every-subitem-set-color-backcol-and-font/
#include <File.au3>
#include <Array.au3>
#include <String.au3>	; Para _StringExplode

#include <Constants.au3>
#include <EditConstants.au3>; Para variables de controles edit
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

#include <GuiListView.au3>

Global $s_GIF_Report_Activity_Running = @ScriptDir & "\smf_progress_running.gif"
#include "_misfunc.au3"

; ============================ Opciones ============================ ;
Opt("MustDeclareVars", 1) ;Después de los includes porque sino, también se obliga a declarar las variables en éstos, y no siempre están declaradas.
;Opt("GUIResizeMode", 802) ; 802=(2+32+256+512) el control no se moverá durante el cambio de tamaño
Opt("GUIOnEventMode", 1) ; Para tener un evento en cada control

#Region Variables
; ============================ Definición de variables ============================ ;
Global $oXML = ObjCreate("Microsoft.XMLHTTP")
;--- Datos para ventana GUI, posición, tamaño y anchos de columna de ListView ---
Global $TituloGUI = "MiValenBisi (jamaro 2011)"
Global $Ventana_X = -1, $Ventana_Y = -1
Global $Ventana_Ancho = 450, $Ventana_Alto = 325
Global $columnaLV[5] = [50, 175, 65, 65, 65]
Global $columnaLVleida[5]

;--- Colores ---
Global $C_Blanco=0xFFFFFF, $C_Verde=0x00FF00, $C_Amarillo=0xFFFF00, $C_AmarilloClaro=0xF3F781, $C_Rojo=0xFF0000, $C_RojoClaro=0xF78181 ,$C_VerdeClaro=$CLR_MONEYGREEN
Global $defBkColLV = 0xFFFFFF

;--- Para manejo de archivo y lectura de datos de estación ---
Global $sFile, $sFile1, $file1, $fileXML, $sXPath, $direccion_estacion ; Para LeeDatosEstacion()

;--- Mensajes de ayuda ---
Global $MensajeEstaciones = "Los números de estación puede obtenerlos del plano de estaciones de Valenbisi de:" & @CR & "- mapa en papel" & @CR & "- página oficial www.valenbisi.es (pulsando sobre el icono de la estación)" & @CR & "- Página no oficial www.bicivalencia.com (pulsando sobre el icono de la estación)"
Global $MensajeAutor = "Para cualquier sugerencia puede contactar con el autor en: [email protected]"

;--- Utilizadas primero en LeeDatosIni()
Global $archivoini = @ScriptDir & "\" & StringLeft(@ScriptName, StringLen(@ScriptName) - 4) & "_estaciones.ini"
Global $num_estacion[1][1] ;Estación, Dirección, BicisLibres, BornetasLibres, BornetasTotales (Después se ReDimensiona en la función correspondiente)
Global $texto_estaciones, $estaciones
;--- Utilizadas primero en Principal()
Global $datoslibres, $datosestacion


LeeDatosIni() ; Lectura de datos de archivo .ini (dimensiones de ventana, anchos de columna de listview, número de estación a

;_ArrayDisplay($num_estacion)

; Crea Interfaz Gráfica de Usuario (GUI)
Global $gui_main = GUICreate($TituloGUI, $Ventana_Ancho, $Ventana_Alto, $Ventana_X, $Ventana_Y, $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUI_Principal_Cierra")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")

Global $hListView = GUICtrlCreateListView("", 2, 2, $Ventana_Ancho - 10, $Ventana_Alto - 100)
_GUICtrlListView_SetUnicodeFormat($hListView, False)
GUICtrlSetResizing($hListView, $GUI_DOCKAUTO)

Global $CajaTextoMensaje = GUICtrlCreateEdit("Utilice el menú contextual (botón derecho del ratón) para opciones", 2, $Ventana_Alto - 80, $Ventana_Ancho - 10, 20, $ES_CENTER + $ES_READONLY)
GUICtrlSetResizing($CajaTextoMensaje, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKHCENTER)

Global $BActualizar = GUICtrlCreateButton("Actualizar", 2, $Ventana_Alto - 50, $Ventana_Ancho - 10, 20)
GUICtrlSetResizing($BActualizar, $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT + $GUI_DOCKHCENTER)
GUICtrlSetOnEvent($BActualizar, "BActualizar")

GUISetState()

; Añade columnas al ListView
_GUICtrlListView_AddColumn($hListView, "Estación", $columnaLVleida[0])
_GUICtrlListView_AddColumn($hListView, "Dirección", $columnaLVleida[1])
_GUICtrlListView_AddColumn($hListView, "Bicis Libres", $columnaLVleida[2])
_GUICtrlListView_AddColumn($hListView, "Bornetas Libres", $columnaLVleida[3])
_GUICtrlListView_AddColumn($hListView, "Bornetas Totales", $columnaLVleida[4])

; Crea menú contextual
Global $contextmenu = GUICtrlCreateContextMenu($hListView)
Global $ItemEditarEstaciones = GUICtrlCreateMenuItem("Editar estaciones", $contextmenu)
GUICtrlSetOnEvent(-1, "EditaEstaciones")	; define el evento
GUICtrlCreateMenuItem("", $contextmenu) ; separator
Global $infoitem = GUICtrlCreateMenuItem("Info", $contextmenu)
GUICtrlSetOnEvent(-1, "MuestraInfo")	; define el evento

principal()	; ejecuta la función principal

While 1
	;
WEnd


; ============= FUNCIONES =============

;-------------------------------------------------------------------------------------------
; Lectura de datos del archivo .ini (dimensiones y posición de ventana, anchos de columnas de listview y números de estaciones)
;-------------------------------------------------------------------------------------------
Func LeeDatosIni()

	If FileExists($archivoini) Then ; Si existe el archivo .ini
		;MsgBox(0,"Aviso","Existe el archivo .ini")
		$Ventana_X = IniRead($archivoini, "Configuracion", "Ventana_X", 400)
		$Ventana_Y = IniRead($archivoini, "Configuracion", "Ventana_Y", 325)
		$Ventana_Ancho = IniRead($archivoini, "Configuracion", "Ventana_Ancho", -1)
		$Ventana_Alto = IniRead($archivoini, "Configuracion", "Ventana_Alto", -1)
		cw("Datos de ventana: " & $Ventana_X & "," & $Ventana_Y & "," & $Ventana_Ancho & "," & $Ventana_Alto)
	Else
		MsgBox(0, "Aviso", "No existe el archivo .ini necesario." & @CR & @CR & "A continuación se le pedirá que introduzca los números de estación deseados, separados por comas." & @CR & @CR & $MensajeEstaciones)
		CreaIni()
	EndIf

	Local $TextoCWcolumnas = ""
	$texto_estaciones = IniRead($archivoini, "Estaciones", "num", "NO_HAY")
	If $texto_estaciones = "NO_HAY" Then
		MsgBox(0, "Aviso", "No existe ninguna estación en el archivo .ini" & @CR & @CR & "A continuación se le pedirá que introduzca los números de estación deseados, separados por comas." & @CR & @CR & $MensajeEstaciones)
		CreaIni()
		$texto_estaciones = IniRead($archivoini, "Estaciones", "num", "NO_HAY")
	EndIf
	cw("Estaciones leidas: " & $texto_estaciones)
	$estaciones = _StringExplode($texto_estaciones, ",", 0)
	For $i = 0 To 4
		$columnaLVleida[$i] = IniRead($archivoini, "Configuracion", "Columna" & $i, $columnaLV[$i])
		$TextoCWcolumnas = $TextoCWcolumnas & " " & $columnaLVleida[$i]
	Next
	cw("Ancho Columnas: " & $TextoCWcolumnas)

	ReDim $num_estacion[UBound($estaciones)][5] ;Estación, Dirección, BicisLibres, BornetasLibres, BornetasTotales

	For $i = 0 To UBound($estaciones) - 1
		$num_estacion[$i][0] = $estaciones[$i] ; Estación
		$num_estacion[$i][1] = 0 ; Dirección
		$num_estacion[$i][2] = 0 ; BicisLibres
		$num_estacion[$i][3] = 0 ; BornetasLibres
		$num_estacion[$i][4] = 0 ; BornetasTotales
	Next

EndFunc   ;==>LeeDatosIni

;-------------------------------------------------------------------------------------------
; Crea archivo .ini con los números de estaciones que introduce el usuario
;-------------------------------------------------------------------------------------------
Func CreaIni($texto_estaciones = "")

	While 1
		Local $estaciones_usuario = InputBox("Nuevas estaciones", "Introduzca las estaciones que desea mostrar, separadas por coma. (ej: 173,172,143)" & @CR & @CR & $MensajeEstaciones & @CR & @CR, $texto_estaciones, " M", 500, 250) ; M para que necesariamente se introduzca algún valor
		If StringRegExp($estaciones_usuario, "[^0-9|,]", 0) = 1 Then ; si no se introducen sólo digitos y comas
			mb("Se ha introducido caracteres no válidos." & @CR & "Sólo puede introducir números y comas." & @CRLF)
			$texto_estaciones = $estaciones_usuario ; Pone en $texto_estaciones el texto introducido para que pueda ser modificado
		Else
			cw("Los datos introducidos en el INPUTBOX son correctos: " & $estaciones_usuario & @CRLF)
			If $estaciones_usuario = "" Then
				cw("Se ha cancelado la operación de modificar estaciones. Se saldrá de la operación.")
				ExitLoop
			Else
				; Elimina posibles comas al inicio y/o final del texto introducido
				While StringInStr($estaciones_usuario, ",,") ;mientras encuentre comas repetidas
					$estaciones_usuario = stringreplace($estaciones_usuario, ",,", ",") ;reemplaza ,, por , en caso de que se haya introducido repetida
				WEnd
				If StringLeft($estaciones_usuario, 1) = "," Then $estaciones_usuario = StringRight($estaciones_usuario, StringLen($estaciones_usuario) - 1)
				If StringRight($estaciones_usuario, 1) = "," Then $estaciones_usuario = StringLeft($estaciones_usuario, StringLen($estaciones_usuario) - 1)

				IniWrite(@ScriptDir & "\" & StringLeft(@ScriptName, StringLen(@ScriptName) - 4) & "_estaciones.ini", "Estaciones", "Num", $estaciones_usuario)
				ExitLoop
			EndIf
		EndIf
	WEnd

EndFunc   ;==>CreaIni


Func principal()

	Local $ColorListViewActual

	$ColorListViewActual = $C_Blanco ; Define el blanco como color de fondo del ListView
	GUICtrlSetBkColor($hListView, $C_VerdeClaro) ; Cambia el color de fondo a verde
	GUICtrlSetData($BActualizar, "... Actualizando datos de estaciones ...")	; Cambia el texto del botón


	For $a = 0 To UBound($estaciones) - 1 ; Número de estaciones

		$datoslibres = leelibres($num_estacion[$a][0])
		cw("Leido datoslibres de " & $num_estacion[$a][0])
		$datoslibres = StringSplit($datoslibres, ",")
		;_ArrayDisplay($datoslibres)
		$datosestacion = leedatosestacion($num_estacion[$a][0])
		cw("Leido 'datosestacion' de " & $num_estacion[$a][0])

		$num_estacion[$a][1] = $datosestacion	; Dirección de estación
		$num_estacion[$a][2] = $datoslibres[1]	; Bicis libres
		$num_estacion[$a][3] = $datoslibres[2]	; Bornetas libres
		$num_estacion[$a][4] = $datoslibres[3]	; Bornetas totales
		cw("Estación: " & $num_estacion[$a][0] & " - " & "Dirección: " & $num_estacion[$a][1] & " - Bicis libres / Bornetas libres / Bornetas totales: " & $num_estacion[$a][2] & " / " & $num_estacion[$a][3] & " / " & $num_estacion[$a][4])

		;_GUICtrlListView_AddItem($hListView, $num_estacion[$a][0], 0)	; Número de estación en la primera (0+1) columna
		GUICtrlCreateListViewItem($num_estacion[$a][0],$hListView)	; Con función propia de Autoit para que se pueda cambiar el color facilmente
		_GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][1], 1)	; Dirección de estación en la segunda (1+1) columna
		_GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][2], 2)	; Bicis libres en la tercera (2+1) columna
		_GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][3], 3)	; Bornetas libres en la cuarta (3+1) columna
		_GUICtrlListView_AddSubItem($hListView, $a, $num_estacion[$a][4], 4)	; Bornetas totales en la quinta (4+1) columna

		;#cs
			Select
				Case $num_estacion[$a][2]=0
					cw("No quedan bicicletas en la estación " & $num_estacion[$a][0] & " - " & $direccion_estacion)
						GUICtrlSetBkColor(-1, $C_RojoClaro)
					Case $num_estacion[$a][2]>=1 and $num_estacion[$a][2]<5
					cw("Quedan menos de 5 bicicletas en la estación " & $num_estacion[$a][0] & " - " & $direccion_estacion)
						GUICtrlSetBkColor(-1, $C_AmarilloClaro)
					Case $num_estacion[$a][2]>=5
					cw("Hay 5 o más bicicletas en la estación " & $num_estacion[$a][0] & " - " & $direccion_estacion)
						GUICtrlSetBkColor(-1, $C_VerdeClaro)

			EndSelect
		;#ce

	Next





	GUICtrlSetBkColor($hListView, $ColorListViewActual) ; Vuelve a poner el color de fondo original
	GUICtrlSetData($BActualizar, "Actualizar")	; Vuelve a poner el texto del botón
	WinSetTitle($gui_main, "", $TituloGUI & " - Última actualización de datos (" & @HOUR & ":" & @MIN & ":" & @SEC & ")")	; Muestra en la barra de título de la ventana la hora de la última lectura/actualización de datos

	;_ArrayDisplay($num_estacion,"Estaciones del entorno")
	;_GUICtrlListView_AddArray($hListView, $num_estacion)

EndFunc   ;==>principal

;-------------------------------------------------------------------------------------------
; Lectura de datos (bicicletas libres, bornetas libres, bornetas totales) de una estación num_estacion
;-------------------------------------------------------------------------------------------

Func leelibres($num_estacion)

	SiHayInternet() ; Comprueba si hay conexión a internet

	$oXML.Open("GET", "http://www.valenbisi.es/service/stationdetails/" & $num_estacion, 0)
	$oXML.Send
	$sFile = _TempFile(@TempDir, '~', '.xml')
	FileWrite($sFile, $oXML.responseText)

	Local $file = FileRead($sFile)
	$file = StringReplace($file, @LF, '')
	$file = StringSplit($file, @CR, 1)

	Local $Valenbisi_disponibles = XMLget($file, 'station\available')
	Local $Valenbisi_libres = XMLget($file, 'station\free')
	Local $Valenbisi_totales = XMLget($file, 'station\total')

	Local $DisponibilidadEstacion = "Estación / Bicis / Bornetas libres / Bornetas totales: " & $num_estacion & " / " & $Valenbisi_disponibles & " / " & $Valenbisi_libres & " / " & $Valenbisi_totales

	cw($DisponibilidadEstacion&@CRLF)

	FileDelete($sFile)
	return ($Valenbisi_disponibles & "," & $Valenbisi_libres & "," & $Valenbisi_totales)
EndFunc   ;==>leelibres
;-------------------------------------------------------------------------------------------


;-------------------------------------------------------------------------------------------
; Lectura de datos (dirección) una estación num_estacion
;-------------------------------------------------------------------------------------------
Func LeeDatosEstacion($num_estacion)

	SiHayInternet() ; Comprueba si hay conexión a internet

	$oXML.Open("GET", "http://www.valenbisi.es/service/carto", 0)
	$oXML.Send
	$sFile1 = _TempFile(@TempDir, '~', '.xml')
	FileWrite($sFile1, $oXML.responseText)
	$file1 = FileRead($sFile1)


	$fileXML = _XMLLoadXML($file1)
	$sXPath = '//carto/markers/marker[@number="' & $num_estacion & '"]'
	$direccion_estacion = _XMLGetAttrib($sXPath, 'address')
	cw("Valor obtenido con _XMLGetAttrib: " & $direccion_estacion & @CRLF & " Error: " & @error)

	FileDelete($sFile1)

	Return $direccion_estacion

EndFunc   ;==>LeeDatosEstacion
;-------------------------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------
; Comprobación de conexión a internet
;-------------------------------------------------------------------------------------------
Func SiHayInternet()
	Local $ping, $MsgBoxConexionInternet
	While 1
		$ping = Ping("www.valenbisi.es")
		If $ping > 0 Then ; Si hay respuesta del PING
			ExitLoop
		Else ; Si no hay respuesta del PING
			$MsgBoxConexionInternet = MsgBox(53, "Error de Conexión a Internet", "Para que el programa funcione es necesario tener conexión a internet." & @CRLF & @CRLF & "Pulse REINTENTAR cuando tenga la conexión a internet activada, o CANCELAR para salir del programa.")
			Select
				Case $MsgBoxConexionInternet = 4 ;Reintentar
					ContinueLoop ; Continúa intentándolo
				Case $MsgBoxConexionInternet = 2 ;Cancelar
					Exit ; Sale del programa
			EndSelect
		EndIf
	WEnd
EndFunc   ;==>SiHayInternet
;-------------------------------------------------------------------------------------------


;-------------------------------------------------------------------------------------------
; http://www.autoitscript.com/forum/topic/97466-xml-read/
Func XMLget($file, $Path); XMLget($file,'adc_database\currentconditions\realfeel')
	Local $lastline, $hstart, $hstarta, $end, $ends, $return

	$Path = StringSplit($Path, '/\|', 0)
	$lastline = 0
	For $lvl = 1 To $Path[0] Step 1
		For $line = $lastline To $file[0] Step 1
			$lastline = $line
			$hstart = StringInStr($file[$line], '<' & $Path[$lvl] & '>', 0)
			$hstarta = StringInStr($file[$line], '<' & $Path[$lvl] & ' ', 0)
			If $hstart Or $hstarta Then
				If $lvl == $Path[0] Then
					If $hstart Then
						$end = StringInStr($file[$line], '</' & $Path[$lvl] & '>', 0)
						If $end Then
							$hstart = $hstart + StringLen('<' & $Path[$lvl] & '>')
							Return StringMid($file[$line], $hstart, $end - $hstart)
						EndIf
					EndIf
					If $hstarta Then
						$end = StringInStr($file[$line], '/>', 0)
						If $end Then
							$hstarta = $hstarta + StringLen('<' & $Path[$lvl] & ' ')
							$return = StringMid($file[$line], $hstarta, $end - $hstarta)
							Return $return
						EndIf
						$ends = StringInStr($file[$line], '>', 0)
						If $ends Then
							$hstart = $ends + 1
							$end = StringInStr($file[$line], '</' & $Path[$lvl] & '>', 0)
							If $end Then
								$return = StringMid($file[$line], $hstart, $end - $hstart)
								Return $return
							EndIf
						EndIf
					EndIf
				EndIf
				ContinueLoop 2
			EndIf
		Next
		If $line == $file[0] Then ExitLoop
	Next
	Return 'not found'
EndFunc   ;==>XMLget


Func EditaEstaciones()
	;$texto_estaciones=IniRead(@scriptdir&"\valenbisi_estaciones.ini","Estaciones","num","NO_HAY")
	CreaIni($texto_estaciones)
	BActualizar()
EndFunc   ;==>EditaEstaciones

Func MuestraInfo()
	MsgBox(0, "Información", "Esta utilidad permite mostrar la situación actual de las estaciones cuyos números se encuentren almacenados en el archivo .ini" & @CR & @CR & "Puede introducir nuevas estaciones o modificar la existentes con 'Editar estaciones' del menú contextual."& @CR & @CR & "Mediante colores se muestran las estaciones que no tienen bicicletas libres (rojo), estaciones con menos de 5 bicicletas libres (amarillo) y estaciones con 5 o más bicicletas libres (verde)." & @CR & @CR & $MensajeEstaciones & @CR & @CR & $MensajeAutor)
EndFunc   ;==>MuestraInfo

Func BActualizar()
	LeeDatosIni() ; Lectura de datos de archivo .ini
	_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hListView))
	principal()
EndFunc   ;==>BActualizar


Func SpecialEvents()
	Select
		Case @GUI_CtrlId = $GUI_EVENT_CLOSE
			;MsgBox(0, "Close Pressed", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
			GUISetState(@SW_HIDE, @GUI_WinHandle) ; Esconde la ventana
		Case @GUI_CtrlId = $GUI_EVENT_MINIMIZE
			;MsgBox(0, "Window Minimized", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
		Case @GUI_CtrlId = $GUI_EVENT_RESTORE
			;MsgBox(0, "Window Restored", "ID=" & @GUI_CtrlId & " WinHandle=" & @GUI_WinHandle)
	EndSelect
EndFunc   ;==>SpecialEvents

Func GUI_Principal_Cierra()
	Local $size = WinGetPos($gui_main) ; Obtiene las coordenadas de la ventana
	;MsgBox(0, "Coordenadas de ventana $gui_main (x,y,width,height):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3])
	IniWrite($archivoini, "Configuracion", "Ventana_X", $size[0])
	IniWrite($archivoini, "Configuracion", "Ventana_Y", $size[1])
	IniWrite($archivoini, "Configuracion", "Ventana_Ancho", $size[2])
	IniWrite($archivoini, "Configuracion", "Ventana_Alto", $size[3])
	For $i = 0 To 4
		$columnaLV[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
		IniWrite($archivoini, "Configuracion", "Columna" & $i, $columnaLV[$i])
		cw("Columna " & $i & " ancho: " & $columnaLV[$i])
	Next
	cw("Borrando: " & $sFile)
	FileDelete($sFile)
	Exit
EndFunc   ;==>GUI_Principal_Cierra

Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Depuración de errores

Mensaje por BasicOs »

El código es muy bueno, lo has hecho trabajando usando la red de internet para los datos.
Esta muy bien el Hopper cuando trabajas con programas largos con muchas funciones porque crea una barra flotante con las funciones. Gracias.

AutoIt3Wrapper realmente no sirve para nada del programa, solo es para cuando eliges compilar con opciones, te guarda las opciones personalizadas de compilación, como el nombre del exe y el icono que usas. Mejor así que en otro fichero aparte que esté suelto por la carpeta ;).
Gracias por el código


Faltaría un fichero.ini y si deseas colocarlo junto con los 3 ficheros.au3, puedes crear un tópico nuevo en Galería y reemplazar las versiones, si quieres que quede mas accesible, incluso si deseas poner el ejecutable tal cual en un zip. ;)
Si lo deseas distribuir puedes hacerlo el foro por si alguien desea bajarlo.
En _misfunc tienes todavía un warning de Debugit, y si no tienes el ini da error al introducir las estaciones.
Puedes completarlo actualizando una página web simplemente enviando con un fichero.php los cambios que quieras si lo quieres hacer web.
Que fantástico el servicio de bicis este, como está subiendo el precio del petroleo va a hacer buena falta:).
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Depuración de errores

Mensaje por Ximorro »

Hombre, el wrapper no es que sirva "para nada", ja, ja.
Ahí se ponen todas las opciones de los programas que procesan el au3, como el compilador, el Tidy, au3Check o Obfuscator. En vez de tener diferentes archivitos con las configuraciones para cada programa fuente, lo pone en el propio fuente al principio con esas directivas. Así tu programa va con sus opciones, es muy cómodo.
Yo normalmente no lo edito a mano, si no que uso las pestañas que salen al invocar la compilación y lo que cambio lo pone ahí. Así la próxima vez que compilas vuelve a usar esas opciones.

Muy útil cuando finalizas un programa y le quieres poner un icono al exe, poner más compresión a upx (pero quitarla en desarrollo para que vaya más rápido), poner info de copyright, idioma, versión, comentarios, etc...
También se pueden especificar acciones a ejecutar antes y después de la compilación (programas o comandos DOS) para hacer algún tipo de pre o postproceso.

Por cierto, Au3Check tiene opciones equivalentes a Opt("MustDeclareVars", 1), así que si tengo otras opciones yo lo pongo ahí y por alguna razón el exe queda algo más pequeño, quizás el Opt hace alguna comprobación en ejecución, mientras que Au3Check es un preprocesador y no afecta al código final.
Yo uso #AutoIt3Wrapper_AU3Check_Parameters=-d -w 3
-d es el equivalente al MustDeclareVars, además con -w 3 compruebo si he declarado dos veces una variable, lo que probablemente quiere decir que me he equivocado al escribirla...
Otra útil es -w 4, que te dice si has usado una variable local en el ámbito global, o -w 5 es muy útil para ver variables declaradas pero que luego no se usan, típico con códigos que reescribes pero te olvidas de eliminar variables que el nuevo código no usa.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

Vamos por partes:

- No he detectado ningún warning en _misfunc.au3 (subo la versión que estoy utilizando, que modifiqué a raíz de vuestros comentarios)
- El archivo .ini, en principio, y asé está pensado, si no existe (por ejemplo, la primera vez que se ejecuta el programa), sale un aviso diciendo que no existe y que se creará, introduciendo las estaciones nuevas (se comprueba en el inputbox que los datos introducidos sean dígitos y comas, eliminando las comas que el usuario haya podido introducir por error antes o después de los dígitos, o incluso si el usuario pone más de una coma seguida). He vuelto a probar, eliminando el .ini, y en mi PC me funciona correctamente, creando el .ini a partir de los datos introducidos.
Puedes completarlo actualizando una página web simplemente enviando con un fichero.php los cambios que quieras si lo quieres hacer web.
Que fantástico el servicio de bicis este, como está subiendo el precio del petroleo va a hacer buena falta:).
Salu22:)
- De momento, con la aplicación de escritorio tengo bastante (muy complicado veo todo lo demás). El otro día, un amigo que se ha comprado un teléfono Android, me picó la curiosidad, me bajé los programas necesarios para empezar a programar en Android y... me asusté lo borré de nuevo :-) (Pensaba en si sería capaz de hacer algo similar para el móvil (aunque ya hay aplicaciones muy buenas para el tema de las bicis públicas que hasta te indican las distancias a las que se encuentran respecto a tu móvil, y qué dirección tomar para llegar hasta ellas).
La verdad es que el servicio de bicis públicas lo veo como alternativa al bus, aunque también tiene sus pegas. Tener bicis libres cuando lo quieres usar y (no menos fácil) encontrar bornetas libres cuando la quieres dejar. Muchas veces te encuentras las estaciones llenas de bicis (normalmente sitios muy céntricos en horario diurno o de oficina).

- AutoIt3Wrapper no lo había utilizado nunca, pero una de las razones puede ser que mi Scite no me mostraba en Herramientas la opción de compilar, creo que sólo tenía Ejecutar y Generar (y si estaba compilar no la había utilizado nunca). Ahora echaré un vistazo a esas opciones que comentáis.


Por otro lado, y siguiendo con el tema de obtener datos de la web (no tiene nada que ver con XML), cuando empecé con lo de MiValenBisi, también hice un pequeño código para ver los próximos autobuses que se acercan a una parada de la EMT Valencia. Los números de parada se pueden conocer en la página de EMT Valencia: http://www.emtvalencia.es/portal/Main

Aquí va el código "a lo bruto" (aunque no tiene nada de especial, ni relacionado con XML):

Código: Seleccionar todo

#include <string.au3>
#include <array.au3>

$parada_por_defecto=10
$num_parada =InputBox("Parada de autobús","Introduzca el número de parada",$parada_por_defecto)



;----------------------------------------------------------------------------------
; Método con IE.au3
;----------------------------------------------------------------------------------
#cs
#include <IE.au3>

$oIE = _IECreate("http://www.csnet.mobi/?p="&$num_parada,0,0)	; No visible
$sText = _IEBodyReadText ($oIE)
$aArray=_StringBetween($sText,"parada: ","© 2009")
MsgBox(0, "Body Text", $aArray[0])
#ce
;----------------------------------------------------------------------------------


;----------------------------------------------------------------------------------
; Método con ObjCreate
;----------------------------------------------------------------------------------
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1") ;create a http request object
$oHTTP.Open("GET", "http://www.csnet.mobi/?p="&$num_parada, False) ;get data from the feed
$oHTTP.Send() ;send the data
$sText = $oHTTP.ResponseText ;get the response
;MsgBox(0, "Texto web", $sText)

$sText=stringreplace($sText,"<br>",@CRLF)
$aArray=_StringBetween($sText,"parada: ","<form")
;_ArrayDisplay($aArray)
MsgBox(0, "Próximos autobuses de la parada "&$num_parada, $aArray[0])
;----------------------------------------------------------------------------------



¡Saludos!
Adjuntos
_misfunc.au3
(2.34 KiB) Descargado 253 veces
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Depuración de errores

Mensaje por Ximorro »

¡Es interesante las cosas útiles que se pueden hacer extrayendo info de la web!

Respecto al wrapper, las opciones salen la primera vez que haces F7 (Build), las ejecuciones posteriores ya usan los parámetros que tienes y no te pregunta. Para que vuelva a salir y poder cambiarlas se hace con Ctrl-F7 (Compile).

Otra opción interesante es pasar sólo el Au3Check, se hace con Ctrl-F5, en vez de F5 (que además ejecuta, como seguramente has hecho muchas veces ;-) )
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

¡Hola de nuevo! Ya estoy aquí dando la lata con mi proyecto otra vez.

Como se indica en líneas comentadas en el propio programa, estas son las dos direcciones de donde se obtienen los datos de las estaciones:

http://www.valenbisi.es/service/stationdetails/num_estacion -> Contiene los datos de la estación "num_estacion" relativos al número de bornetas totales, libres y número de bicicletas libres

http://www.valenbisi.es/service/carto -> Contiene listado de estaciones con su información (nombre, número, dirección, latitud, longitud,...)

He estado viendo que las bicicletas instaladas en Valencia son las mismas que hay en otras ciudades, y que en todas, la empresa que las instala tiene el mismo modelo de página web y por tanto, se puede obtener los datos de forma similar. Simplemente hay que cambiar el dominio (marcado en negrita) por el adecuado.

Algunos dominios que he visto son:
Valencia..........: valenbisi.es
Santander.........: tusbic.es
Sevilla...........: sevici.es

Bruselas..........: villo.be
París.............: velib.paris.fr
Aix-en-Provence...: vhello.fr
Nantes............: bicloo.nantesmetropole.fr

He pensado que el programa se podría utilizar en otras ciudades simplemente dando la opción de seleccionar la ciudad deseada. Los datos de las ciudades podría guardarse en el archivo .ini y dar la opción al usuario de seleccionarla en un desplegable.

Esto supongo que lo haré (cuando disponga de un ratillo de inspiración), pero la pregunta ahora son las siguientes, en caso de hacer el programa multi-lenguaje:

- ¿Cuál es la manera más adecuada de configurar y seleccionar un idioma de uso del programa?
- ¿Dónde y cómo guardar los datos de los distintos idiomas?

En algunos programas se utiliza una archivo de lenguaje que tiene, por ejemplo, palabra_idioma_original=palabra_idioma_traducido. Otros en los que he participado en su traducción, usan el sistema QT Linguist (para programas realizados con Qt de nokia).

A ver si alguien me puede decir cómo afrontar este "nuevo reto".

Saludos y gracias.

EDITO: En otro foro he visto algún hilo que habla del tema, aunque no sé si es un buen sistema, o es mejor hacer algo parecido, con los datos en el .ini u otro archivo tipo: otro_idioma.txt
http://www.autoitscript.com/forum/topic ... lications/

También he visto este otro hilo, que parece más interesante:
http://www.autoitscript.com/forum/topic ... tilangau3/
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Depuración de errores

Mensaje por BasicOs »

Puedes crear una Func como
Muestraitem($idiomaElegido,$palabraaTraducir)
para devolver un string con el dato seleccionado
Lo puedes hacer en archivos ini por ejemplo con un concepto del programa:

defaultlang=1
languages=Español,English,Deutsch,etc..

bi1=bici,bike,fahrad,etc,..

luego recuperas b1 con iniregread(), y con un stringsplit() obtienes una matriz, según el lenguaje activado abi1[1] sería para el español.

Otra opción hasta mejor sería hacer un archivo individual por idioma y usar un idioma com el español como principal, o bien unos códigos como elemento1= o item1=

bicicleta=bike

La ventaja de este es que copiandolo y pegandolo en el traductor eg inglés->frances, tienes una traducción "inicial" aceptable (del lado dcho de la igualdad) y creas los ini sobre la marcha teniendo el inglés español inicial,
Ya cuentas como te va, y para ver unos pantallazos jpg del programa publicados
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Depuración de errores

Mensaje por Ximorro »

Yo no lo he hecho nunca pero lo que he visto que se suele hacer es como la segunda propuesta de BasicOS:
Se tiene un archivo para cada lenguaje que es algo parecido a un archivo INI.
Las cadenas tienen un nombre (la clave) y un valor (el texto en el idioma correspondiente).
Cuando el programa no es excesivamente extenso se pueden usar nombres para las cadenas, como
introdatocli=Introduzca los datos del cliente
error1=Cliente no encontrado


Naturalmente la clave es la misma en todos los archivos de idioma.
En estos casos lo normal es montarse una tabla hash, un diccionario, para acceder rápidamente a las cadenas por clave. Eso no está soportado directamente en AutoIT, pero hay un objeto en windows que se puede usar de forma relativamente cómoda que te dará esa funcionalidad, es el objeto "Scripting.Dictionary", si vas a usar eso y te hace falta más ayuda nos lo dices.

De todas maneras para AutoIt lo más fácil será simplemente numerar las entradas y cargarlas en una matriz normal y corriente, el acceso también será muy rápido, el problema es que el código es menos legible porque no es lo mismo ver:
GUICtrlCreateLabel($dictioLang.Item("introdatocli"), ...)
que
GUICtrlCreateLabel($arrayLang[12], ...)

Por lo demás no hay más problema.

Otra cuestión más avanzada es cuando tienes que crear cadenas con textos intercalados, como
El cliente <nombrecliente> no se ha encontrado en la tabla <nombretabla>.
Eso ya es bastante avanzado y espero que no tengas que utilizarlo :smt005 . El caso es que para algo así se suelen usar métodos como el que se usa en la función StringFormat, poniendo en los archivos de lenguaje los formatos correspondientes y luego formateándolos con esa función.
errorCliNoTabla=El cliente %s no se ha encontrado en la tabla %s.

También habrá que ver cómo almacenar los archivos de idiomas, supongo que lo más adecuado sería UNICODE o UDF-8, porque si no a ver cómo lo traduces a chino :smt003
Y otra cuestión es los lenguajes que se escriben de derecha a izda. Esto es mucho más peliagudo porque además de traducir implicaría recolocar los controles del GUI.

No creo que necesites llegar tan lejos, pero si resuelves el problema completo publícalo y haremos una UDF de localización :smt024
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

Hola gracias por las ideas, me pongo manos a la obra con vuestras indicaciones.
Antes de seguir con el tema del idioma, quería volver al tema propio de este hilo "Depuración de errores".
He pasado de nuevo la última versión del programa, a la misma persona que me advirtió del error original, y ahora el programa directamente le da error (en principio controlado) sobre la conexión a internet.

La parte de código que añadí para comprobar la conexión a internet es:

Código: Seleccionar todo

;-------------------------------------------------------------------------------------------
; Comprobación de conexión a internet
;-------------------------------------------------------------------------------------------
Func SiHayInternet()
	Local $ping, $MsgBoxConexionInternet
	While 1
		$ping = Ping("www.valenbisi.es")
		If $ping > 0 Then ; Si hay respuesta del PING
			ExitLoop
		Else ; Si no hay respuesta del PING
			$MsgBoxConexionInternet = MsgBox(53, "Error de Conexión a Internet", "Para que el programa funcione es necesario tener conexión a internet." & @CRLF & @CRLF & "Pulse REINTENTAR cuando tenga la conexión a internet activada, o CANCELAR para salir del programa.")
			Select
				Case $MsgBoxConexionInternet = 4 ;Reintentar
					ContinueLoop ; Continúa intentándolo
				Case $MsgBoxConexionInternet = 2 ;Cancelar
					Exit ; Sale del programa
			EndSelect
		EndIf
	WEnd
EndFunc   ;==>SiHayInternet
;-------------------------------------------------------------------------------------------
Esta función es lo primero que se hace en las funciones de lectura de datos:
Func leelibres($num_estacion)
y
Func LeeDatosEstacion($num_estacion)

El error se lo da, al menos, en dos ordenadores que han probado dentro de la misma red y empresa. He pedido que prueben en casa, a ver si también les da problemas allí. ¿Sería conveniente hacer el PING más veces antes de sacarlo directamente del programa? Aunque, ahora que "releo" mi función, el programa debe darle la opción de reintentar o cancelar. :smt017
Mañana a ver si me confirman exactamente el error, porque estoy pensando que lo mismo le dan directamente a cancelar y salen del programa :smt001


----------- Y volviendo al tema del idioma --------

De momento he hecho esta prueba y creo que es por donde van los tiros.

Código: Seleccionar todo

;--- Prueba leer idioma ---

#Include <Array.au3>

#include <FileLineUDF.au3>	; _StringInLine()

Global $FileIdioma=@ScriptDir &"\"&"español.txt"
Global $archivo,$palabra

if FileExists($FileIdioma) Then
		;msgbox(0,"Aviso"&@ScriptLineNumber,"Existe el archivo " & $fileidioma)
	Else
		msgbox(0,"Aviso (línea "&@ScriptLineNumber&")","NO Existe el archivo " & $fileidioma)
EndIf


GUICreate(LeeDatoIdioma($FileIdioma,"Titulo"),400,400,100,100)
guictrlcreatelabel(LeeDatoIdioma($FileIdioma,"Label1"),20,20)
LeeDatoIdioma($FileIdioma,"introdatocli")
LeeDatoIdioma($FileIdioma,"error1")


GUISetState()

While 1
	;
WEnd

func LeeDatoIdioma($archivo,$palabra)
	Local $E=_StringInLine($archivo,$palabra)
	Local $lineacompleta=filereadline($archivo,$E[1])
	Local $posinicial=StringInStr($lineacompleta,"=")
	Local $CadenaBuena=StringTrimLeft($lineacompleta,$posinicial)
	;consolewrite("La línea "&$E[1]&" contiene: "&filereadline($archivo,$E[1])&@CRLF)
	consolewrite("La línea "&$E[1]&" contiene el valor bueno: "& $CadenaBuena &@CRLF)
	return $CadenaBuena
EndFunc
Conteniendo el archivo español.txt

Código: Seleccionar todo

Titulo=Mi GUI sobre idiomas
Label1=Mi etiqueta
introdatocli=Introduzca los datos del cliente
error1=Cliente no encontrado
La función lee los datos que están después de etiqueta=.

Bueno, ya os cuento sobre el error y (cuando avance) sobre los avances de la "internacionalización" del programa.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Depuración de errores

Mensaje por Ximorro »

Respecto a la conexión ya te dirán otros que controles más el tema internet, de todas maneras como dices lo mejor es que te digan qué error concreto les está dando. Tampoco estaría mal que comprobaran que pueden acceder a esa web desde IExplorer, porque si desde ahí no va aún menos podrá el programa ;-)

Respecto a la internacionalización (o localización, que curiosamente parece que quiere decir lo contrario pero lo usan para lo mismo) la idea es esa, sólo que sospecho que esa función _StringInLine() abre cada vez el archivo y hace la búsqueda. Si es así eso es muy ineficiente, ponerse a buscar en todo el archivo cada vez que quieres poner una cadena... como tengas muchas líneas lo vas a notar.
Lo mejor es que lo leas previamente como te digo en una matriz (o para liar más las cosas en un Scripting.Dictionary ;-) ). El caso es que de esa manera sólo se lee el archivo una vez, y además secuencialmente, con lo que es muy rápido, no se trata de buscar cadenas aleatorias porque las lees todas.
No es problema tener la matriz en memoria todo el rato, piensa que esos textos no sólo se usan para crear el GUI al principio, todos los mensajes que se creen después también estarán traducidos.

Luego a la hora de acceder a las cadenas tendrás que hacerlo por índice, en realidad el archivo de idioma se simplifica porque ni siquiera hay que poner claves, pones un texto en cada línea y ya está, luego el índice de la matriz es la línea del archivo de idioma (si lo tienes abierto en un editor que pone líneas, como Scite o Ultraedit ves fácilmente qué número corresponde a cada texto (bueno, uno menos porque los índices empiezan en cero y las líneas en uno, pero si eso te lía siempre puedes poner dejar vacía la posición cero de la matriz y empezar en uno).

Luego para ponerlo pues usas la matriz:
GuiCtrlCreateLabel($arrayLang[1], 20, 20)

El archivo sería:

Código: Seleccionar todo

Mi GUI sobre idiomas
Mi etiqueta
Introduzca los datos del cliente
Cliente no encontrado
Si quieres usar un mecanismo similar con claves se me ocurren dos opciones. Una es la ya mencionada del diccionario (más eficiente pero yo haría pruebas para asegurarme de que está disponible en todos los Windows, como es un objeto del sistema es Microsoft quien decide lo que hace con ello). Otra posibilidad que se me ocurre, menos eficiente pero seguro siempre disponible, es usar matrices de AutoIT bidimensionales, donde si $arrayLang[0][0] vale "Label1" entonces en $arrayLang[0][1] tienes el correspondiente "Mi etiqueta".

Así sería parecido a lo que haces de buscar en el archivo cada vez, pero al hacerlo en este caso en memoria, en vez de un archivo en disco, es muchísimo más rápido. Y encima se pueden usar técnicas avanzadas, como tener ordenada la matriz por claves y hacer un búsqueda binaria en la misma, en vez de secuencial, aunque eso ya es un problema de programación por sí mismo ;-)

Resulta que en Array.au3 tienes lo que necesitas:
_ArraySearch busca en matrices 1D y 2D.
Si quieres hacer búsquedas eficientes:
_ArraySort te ordena matrices 1D y 2D
_ArrayBinarySearch hace la búsqueda binaria, desgraciadamente no va en matrices 2D, así que o la modificas a tu gusto o usas dos matrices unidimensionales en vez de una bidimensional.

Además, en File.au3 tienes
_FileReadToArray, que te lee un archivo y te lo mete en el array, una línea en cada celda. En la posición 0 te pone el número de líneas leído, con lo que el primer texto empieza en uno, igual que el número de línea. Esto es ideal si no tienes claves. Teniendo claves también se puede usar para agilizar la lectura aunque igual hay que hacer el proceso de separar clave-valor.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

Ximorro: Una clase magistral ;-) Y sobretodo, dando las explicaciones que a mi me gusta dar. El por qué esto sí y por qué esto no. Me ha parecido muy buena la explicación de que _StringInLine() sería más lento que poner todos los datos en una matriz y guardarlo en memoria.

Seguiré atacando todos los campos que tengo abiertos ;-)

Saludos
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Depuración de errores

Mensaje por BasicOs »

Yo el ping lo haría con Google.com que verifica exactamente el asunto, y si luego lee mal el Xml, generaría otro error (o comprobaría la página y la calidad del texto recibido, con algún bucle e reintento.
Puedes hacer un bucle de reintento con un while que soporte algunos errores en el ping (e.g. que al tercero consecutivo salte)..

Recuerda que copiando y pegando en el traductor tienes en cualquier idioma la parte dcha del = del fichero de idiomas, ya no necesitas traductor en persona.
Salu22:)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores

Mensaje por jamaro »

BasicOS: Muchas gracias. Modificaré el código para hacer el ping a Google.com con varios intentos, en caso de fallo, y como dices, otro tipo de error si no se consigue leer la página donde está el xml.

Por otro lado, la eficiencia de las matrices creo que ya me lo comentó Chefito en otro hilo en sobre un programa que utilizaba SQLite. Leyendo el mensaje anterior de Ximorro me he dado cuenta que mi programa falla también, en ese sentido, ya que en la función principal() ejecuta, para cada número de estación que se desea "leer", el siguiente código:

Código: Seleccionar todo

Func principal()
(...)
	For $a = 0 To UBound($estaciones) - 1 ; Número de estaciones
		$datoslibres = leelibres($num_estacion[$a][0])
(...)
		$datosestacion = leedatosestacion($num_estacion[$a][0])
(...)
y tanto en leelibres como en leedatosestacion, se ejecuta el código:
1. lee un XML
2. crea un archivo temporal con su contenido
3. se obtiene el dato necesario
4. se borra el archivo temporal.

En el caso de leelibres sí es necesario leer una página distinta para cada estación (porque sólo tiene el número de bicicletas y bornetas de una estación en concreto), pero en el de leedatosestacion voy a probar a mejorar el rendimiento, ya que realmente en el documento XML de http://www.valenbisi.es/service/carto está el contenido de todas las estaciones posibles (listado de número de estación, dirección,...), con lo que sólo es necesario leerlo una vez, crear el temporal y después leer los datos la estaciones que necesitemos. O incluso, ¿se podría mejorar algo pasando ese xml a una matriz?

A ver si puedo dedicarle un poco de tiempo al código (además de al foro) y hacer realidad esas mejoras.

EDITO: Acabo de modificar la función poniendo la condición y ¡¡¡ vaya si va más rápido !!!

Código: Seleccionar todo

;-------------------------------------------------------------------------------------------
; Lectura de datos (dirección) una estación num_estacion
;-------------------------------------------------------------------------------------------
Func LeeDatosEstacion($num_estacion)

	SiHayInternet() ; Comprueba si hay conexión a internet
	if $XMLyaCreado=0 Then ; Si es 0, todavía no se ha creado el archivo XML temporal
		$oXML.Open("GET", "http://www.valenbisi.es/service/carto", 0)
		$oXML.Send
		$sFile1 = _TempFile(@TempDir, '~', '.xml')
		FileWrite($sFile1, $oXML.responseText)
		$file1 = FileRead($sFile1)
		$fileXML = _XMLLoadXML($file1)

		$XMLyaCreado=1	; Cambia a 1 para que no se vuelva a crear el archivo XML temporal
	EndIf

	$sXPath = '//carto/markers/marker[@number="' & $num_estacion & '"]'
	$direccion_estacion = _XMLGetAttrib($sXPath, 'address')
	cw("Valor obtenido con _XMLGetAttrib: " & $direccion_estacion & @CRLF & " Error: " & @error)

	FileDelete($sFile1)

	Return $direccion_estacion

EndFunc   ;==>LeeDatosEstacion
Basicos: En cuanto a la traducción, no había probado (hasta ahora que lo has recalcado) que en google puedes poner lo_que_sea_en_un_idioma=texto_a_traducir y el te lo cambia por lo_que_sea_en_un_idioma=texto_traducido. Parece que el Sr. Google piensa en casi todo ;-)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por jamaro »

Con vuestros comentario publiqué el programa (y la última versión) en el hilo http://www.emesn.com/autoitforum/viewto ... 442#p10442.

En la parte que he modificado para utilizar las bicicletas de Castellón, tenía un código que buscaba texto en un archivo html con las funciones StringInStr, stringmid, stringlen,... pero leyendo los mensajes de este y otros foros y la ayuda de Autoit, he terminado utilizando StringRegExp, y es fantástico lo que se puede hacer con las expresiones regulares (eso sí, he tenido que hacer un montón de pruebas hasta que he conseguido el resultado deseado, ya que me cuesta comprender realmente su funcionamiento).

Respecto al programa MiBiciPublica, tengo un par de preguntas sobre el combo-desplegable que muestra las ciudades en el GUI principal:

El Combo está creado con este código:

Código: Seleccionar todo

Global $CajaWebServicio=GUICtrlCreateCombo($webServicioBicisLeidaCompleta, $Ventana_Ancho/2, 20, $Ventana_Ancho - ($Ventana_Ancho/2)-10, 20)
	GUICtrlSetTip(-1,"Desplegable con las ciudades soportadas y sus páginas oficiales.")
- ¿Por qué el TIP que he puesto sólo lo muestra al pasar el ratón sobre la flecha del desplegable y no en cualquier parte del combo?
- ¿Cómo se puede bloquear el combo para que no permita escribir texto en su interior? Ahora mismo se puede entrar en el combo, seleccionar texto y escribir sobre él.

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

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por Ximorro »

En realidad aunque escriban en el combo no pueden añadirlo a la lista ni modificar lo que está. De todas maneras efectivamente queda mejor si no se puede escribir.
Para hacerlo se pone el estilo $CBS_DROPDOWNLIST en el creación del combo:

#include <ComboConstants.au3>
...
GUICtrlCreateCombo(..., ..., 20, ..., 20, BitOr($GUI_SS_DEFAULT_COMBO,$CBS_DROPDOWNLIST))


Al hacer esto ¡de paso se arregla lo del tip!. Al no ser editable ya sale también en la parte del edit, lo que no sé cómo se hará si quieres que sea editable y salga el tooltip, pero al menos en este caso lo tienes solucionado ;-)

Ciaooo
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por jamaro »

Gracias XImorro. Efectivamente, no se puede editar, sale el tip, y se puede pinchar sobre todo el objeto (no sólo la flecha) para desplegarlo.

Modificando estoy...
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por jamaro »

Bueno, ya he creado el GUI para configurar las opciones, pero no sé por qué razón no consigo que me funcione los botones de este GUI.

Adjunto el archivo con el código.

A partir de la linea 187 se define $GUI_ConfiguraOpciones,
de la 223 a la 227, se le indica el evento de cada botón, que es EditaColores1
a partir de la 736 se define la función EditaColores1() y al ver que no me funcionaba los botones con los Case @GUI_CtrlHandle (que pensaba que sería el control desde el que se ha llamado a la función), he puesto los MsgBox para mostrar datos, pero resulta que no lo muestra.

El GUI de configurar opciones se abre correctamente, de hecho, si se edita las estaciones en la caja de texto, se guarda correctamente en el archivo .ini, y si se cierra, también, pero de momento no sé por qué, no responden los botones.

A ver si sabéis la razón o a ver si dentro de un rato lo retomo y estoy más fresco y veo cuál es el error.

Un saludo
MiBiciPublica_20110329_2156.au3
Código actualizado, con GUI princpal y GUI para configurar opciones
(52.17 KiB) Descargado 228 veces
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por Ximorro »

Me ha costado verlo, qué tontería.
Pues es que estás usando GUISetOnEvent, que es para los eventos del sistema, para los controles del GUI tienes que usar GUICtrlSetOnEvent. :smt005
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Depuración de errores (MiBiciPublica - MiValenbisi)

Mensaje por jamaro »

¡Gracias XImorro!

Eso me pasa por copiar/pegar de arriba y no fijarme... :smt021
Responder