Página 1 de 1

Reloj Binario

Publicado: 27 Nov 2009, 23:10
por joaquin
Les dejo éste Reloj Binario. Es el primer programa que hago con Autoit y surgió a partir de Screensaver BinaryClock v.1.0
Agradezco los comentarios y explicaciones de Ximorro y las sugerencias de XPyro y Chefito sobre ExitLoop...
Queda abierto a comentarios, sugerencias y mejoras...que seguro son unas cuantas... :smt003
Por cierto, ¿Se podría hacer un .scr?

Re: Reloj Binario

Publicado: 28 Nov 2009, 02:06
por gna08
jaja, muy bueno me encanto , solo qu ey k leer binary :smt021 :smt021 jajaj. muy ioriginal :smt023

Re: Reloj Binario

Publicado: 28 Nov 2009, 07:49
por Rupert.25
Saludos joaquin, la verdad no he visto el codigo pero viendo el relog puedo decirte que es una idea original, y si lo llevasta a cabo en programación pues felicidades! Muy buen programa la verdad!

Y no habia tenido la oportunidad de darte la bienvenida, pero aun así, se bienvenido.

Sifue participando en el foro, de esos Scripts creativos queremos :D

Re: Reloj Binario

Publicado: 28 Nov 2009, 11:54
por joaquin
Dentro del script hay un pequeño esquema para poder interpretar la hora, para +info consulta:
http://es.wikipedia.org/wiki/Reloj_binario

saludos

Re: Reloj Binario

Publicado: 28 Nov 2009, 18:38
por XPyro
Muy original, me agrado mucho :smt003

Sobre poner como salvapantallas tan solo con cambiar la extensión a .scr pero tienes que hacer que la ventana del script se coloque en toda la pantalla y este encima de todas otras ventanas. :smt006

Reloj Binario y función para pasar numeros de decimal a bina

Publicado: 29 Nov 2009, 01:28
por Chefito
Me has dejado alucinado :smt048 . Me ha gustado mucho tu idea y la forma de mostrala :smt023 . Muy muy original el reloj binario. Si existía no lo conocía.
Para ser tu primer script has dado en el clavo :smt023 .
Pero te digo una cosa, el código se puede mejorar y acortar bastante.
Me ha gustado tanto que he utilizado tu código para hacer una versión mía (con tu permiso) :smt002 :smt024 .
Dentro de esta versión he hecho una función para pasar un número decimal a binario. Se le puede pasar dos parámetros, uno obligado, el cual es el número decimal entero positivo a convertir, y el otro es opcional, el cual es el mínimo de longitud en bits (dígitos) que quieres que tenga el número binario devuelto.

Código: Seleccionar todo

#cs
AutoIt Version: 3.3.0.0
 Author:        Joaquin
 Modificado por Chefito y Ximorro ;).


 ;Sumar los 'leds' encendidos(X) en cada columna, cuyo valor está asignado en cada fila. En el ejemplo serian las 23:49:04


	8          0       X         0

	4          0   X   0    0    X

	2      X   X   0   0    0    0

	1      0   X   0   X    0    0


#ce

#Include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

TraySetIcon(@ScriptDir & "\led.ico",1)
TraySetToolTip("Reloj Binario ")
TraySetState()
Global $Pic[20]

$Form1 = GUICreate("Reloj Binario", 475, 400, 192, 124, BitOR($WS_CAPTION,$WS_POPUPWINDOW))
GUISetBkColor(0x000000)

$On = @ScriptDir & "\on.bmp"
$Off = @ScriptDir & "\off.bmp"

;1º dígito de los sg.
$Pic[0] = GUICtrlCreatePic($Off, 350, 265, 60, 60)
$Pic[1] = GUICtrlCreatePic($Off, 350, 205, 60, 60)
$Pic[2] = GUICtrlCreatePic($Off, 350, 145, 60, 60)
$Pic[3] = GUICtrlCreatePic($Off, 350, 85, 60, 60)

;2º dígito de los sg.
$Pic[4] = GUICtrlCreatePic($Off, 290, 265, 60, 60)
$Pic[5] = GUICtrlCreatePic($Off, 290, 205, 60, 60)
$Pic[6] = GUICtrlCreatePic($Off, 290, 145, 60, 60)

;1º dígito de los minutos.
$Pic[7] = GUICtrlCreatePic($Off,230, 265, 60, 60)
$Pic[8] = GUICtrlCreatePic($Off, 230, 205, 60, 60)
$Pic[9] = GUICtrlCreatePic($Off, 230, 145, 60, 60)
$Pic[10] = GUICtrlCreatePic($Off, 230, 85, 60, 60)

;2º dígito de los minutos.
$Pic[11] = GUICtrlCreatePic($Off, 170, 265, 60, 60)
$Pic[12] = GUICtrlCreatePic($Off, 170, 205, 60, 60)
$Pic[13] = GUICtrlCreatePic($Off, 170, 145, 60, 60)

;1º dígito de la hora.
$Pic[14] = GUICtrlCreatePic($Off, 110, 265, 60, 60)
$Pic[15] = GUICtrlCreatePic($Off, 110, 205, 60, 60)
$Pic[16] = GUICtrlCreatePic($Off, 110, 145, 60, 60)
$Pic[17] = GUICtrlCreatePic($Off, 110, 85, 60, 60)

;2º dígito de la hora.
$Pic[18] = GUICtrlCreatePic($Off, 50, 265, 60, 60)
$Pic[19] = GUICtrlCreatePic($Off, 50, 205, 60, 60)

$Lh = GUICtrlCreateLabel(@HOUR & " : " & @MIN & " : " & @SEC, 190, 370, 110,20)
GUICtrlSetColor(-1,0xE00000)
GUICtrlSetFont(-1, 12, 800)

Reloj()
AdlibEnable("Reloj",1000)

Func Reloj()
	GUICtrlSetData($Lh, @HOUR & " : " & @MIN & " : " & @SEC)
	$Lh1=Int(StringRight(@HOUR,1))
	$Lh2=Int(StringLeft(@HOUR,1))
	$Lm1=Int(StringRight(@MIN,1))
	$Lm2=Int(StringLeft(@MIN,1))
	$Ls1=Int(StringRight(@SEC,1))
	$Ls2=Int(StringLeft(@SEC,1))

	Local $bits=ConvDecimalBinario($Lh2,2)
	$bits&=ConvDecimalBinario($Lh1,4)
	$bits&=ConvDecimalBinario($Lm2,3)
	$bits&=ConvDecimalBinario($Lm1,4)
	$bits&=ConvDecimalBinario($Ls2,3)
	$bits&=ConvDecimalBinario($Ls1,4)

	For $n=0 To 19
		$unBit=StringMid($bits,20-$n,1)
		If $unBit="0" Then
			GUICtrlSetImage($Pic[$n], $Off)
		Else
			GUICtrlSetImage($Pic[$n], $On)
		EndIf
	Next
EndFunc
GUISetState(@SW_SHOW)

Do
	Sleep(10)
	$nMsg=GUIGetMsg()
Until $nMsg = $GUI_EVENT_CLOSE
Exit

;Función para pasar un número decimal entero positivo a binario.
;Dos parámetro:
;			- $numeroDecimal (obligado): Se le pasa un número en base decimal entero.
;			- $NumBits (opcional): Se pasa el mínimo número de bits que quieres que tenga el
;					 número devuelto. Si no llega al número dado, lo rellena con ceros.
;					Por defecto es igual a 0. Esto significa que no da ningún mínimo de longitud.
;			Si no es un número entero positivo entonces @error=1 y la función
;			devuelve -1.
;Realizada por Chefito el 28/11/2009. Mejorada por Ximorro el 20/11/2009.

Func ConvDecimalBinario($numeroDecimal,$NumBits=0)
	If Not(IsInt($numeroDecimal)) Or $numeroDecimal<0 Then
		SetError(1)
		$resultado=-1
	Else
		Local $resultado=""
		While 1
			$resultado=Mod($numeroDecimal,2) & $resultado
			$numeroDecimal=Int($numeroDecimal/2)
			If $numeroDecimal=0 Then ExitLoop
		WEnd
	EndIf
	$resultado = StringFormat("%0" & $NumBits & "s", $resultado)
	Return $resultado
EndFunc
Espero que te guste joaquín.

Saludos :smt026 .

Re: Reloj Binario

Publicado: 29 Nov 2009, 22:07
por joaquin
Pues sí....con la función de Chefito queda mucho más simplificado el código. :smt003
Suponía que había otra forma más elaborada y económica (en líneas claro) de hacerlo, porque me parecía un poco "primitivo", eso de ir cambiando con GUiCtrlSetImage para cada caso... Así que gracias por la función.
Sin duda, queda más profesional!

Saludos...

Re: Reloj Binario

Publicado: 30 Nov 2009, 12:42
por Ximorro
¡MUY BUENO JOAQUIN! :smt004 :smt023

Muy molón, como primer programa ya destacas, veo un nuevo profesional en ciernes.

Me alegro de haberte ayudado, para eso estamos, pero ni por asomo pensaba que harías algo así partiendo de aquéllas preguntas, te has superado.
Echaré un ojo al código por si puedo comentarte algo de lo que puedas aprender, eso si Chefito ha dejado algo ;-)
Pero será en dos o tres semanas porque me largo de viajeeeeeee. :smt023 :smt041

Enhorabuena, esperamos la versión salvapantallas. Como te comenta XPyro un SCR es un EXE normal, pero tendrás que ponerlo a toda pantalla y controlando ratón y teclado para desactivarlo como hacen los salvapantallas. Si te hace falta ayuda ya sabes dónde estamos.
Con pantalla completa habría que hacer que por lo menos los numeritos salgan más grandes... y quizás escalar también las imágenes. Pero tranqui una cosa cada vez.
O se me ocurre que para llenar más la pantalla en la versión salvapantallas se podría añadir la fecha :smt002

Al margen:
No sé si sabíais que hay relojes de estos... ¡de verdad!. Quiero decir el cacharro físico, por ejemplo:
http://www.regaletes.com/reloj-binario-p-517.html

También los hay de pulsera :smt002

Re: Reloj Binario

Publicado: 30 Nov 2009, 13:03
por Ximorro
Tomando el cambio de Chefito, que es más compacto, se me ocurre una mejora importante. Es sobre las etiquetas de la hora con números.
Fíjate que cada segundo estás creando nuevas etiquetas, lo que haces es poner nuevas etiquetas encima de las anteriores, y eso no es bueno porque va consumiendo recursos innecesariamente.

Además, esto ya es menos importante, pero podrías usar una única etiqueta para todo el texto, en vez de 5.

Así que yo crearía la etiqueta fuera de la función Reloj(), para que sólo la haga una vez, por ejemplo después de crear los GUICtrlCreatePic:

Código: Seleccionar todo

   $Pic[19] = GUICtrlCreatePic($Off, 50, 205, 60, 60)

    $Lh = GUICtrlCreateLabel(@HOUR & " : " & @MIN & " : " & @SEC, 190, 370, 110,20)
    GUICtrlSetColor(-1,0xE00000)
    GUICtrlSetFont(-1, 12, 800)

    Reloj()
    AdlibEnable("Reloj",1000)
Con GUICtrlSetFont la hago más grande y en negrita, igual te interesa esa función.

Luego dentro de Reloj, ese primer bloque que empieza por $Lh=... y termina por $Ls2=... se quedaría en:

Código: Seleccionar todo

       GUICtrlSetData($Lh, @HOUR & " : " & @MIN & " : " & @SEC)
       $Lh1=Int(StringRight(@HOUR,1))
       $Lh2=Int(StringLeft(@HOUR,1))
       $Lm1=Int(StringRight(@MIN,1))
       $Lm2=Int(StringLeft(@MIN,1))
       $Ls1=Int(StringRight(@SEC,1))
       $Ls2=Int(StringLeft(@SEC,1))
Como ves en vez de crear nuevas etiquetas cambio el texto de la anterior con GUICtrlSetData.

Una sugerencia, para indentar el código mejor usa tabuladores, en vez de la barra espaciadora. Es más fácil colocar las cosas en su sitio, y encima ocupa menos. ;-)

Re: Reloj Binario

Publicado: 30 Nov 2009, 13:31
por Ximorro
Chefito, en la función que pasa a binario, para rellenar con ceros en vez de ir con un FOR poniendo uno a uno se podría usar StringFormat.
Por ejemplo:
StringFormat("%05s", "101")
devuelve "00101"

El "5" sería el número de dígitos $NumBits, al prefijarlo con 0 rellena con ceros. Está pensado para números pero como resulta que también funciona con Strings...
El "101" sería lógicamente $resultado.

La verdad es que con esto no hace falta ni mirar el tamaño, pues si éste es menor que el número de bits no hace nada. Funciona incluso con $NumBits = 0.

Así que se puede quitar el If $NumBits Then...EndIf totalmente, y dejarlo como:
$resultado = StringFormat("%0" & $NumBits & "s", $resultado)

:smt002

Re: Reloj Binario

Publicado: 01 Dic 2009, 00:52
por Chefito
Como casi siempre....Ximorro tiene razón en todos mis fallos :smt004 . Ya los he corregido y añadido en los comentarios por sus correcciones :smt002 .
Lo más gordo fue el meter la creacción de labels dentro de la función :smt021 . Como trabajé utilizando el código de joaquín, no me di cuenta de este fallo. Se me pasó. Mea culpa :smt021 . Por culpa de esto, como bien dice Ximorro, el programa va creando objetos labels cada segundo y va ocupando memoria y objetos en la ventana. También puede causar un leve efecto de parpadeo :smt021 .
Bueno, pues eso, que ya está corregido el código según los consejos de Ximorro.

Respecto a lo de cambiar todo el if para rellenar con ceros por la función stringformat......que puede decir......un aplauso por mi parte :smt038 . Muy buena idea. No creo que se me hubiese ocurrido nunca ya que no he utilizado esa función nunca. Parece mentirar que si utilizase los formatos de cadenas en vb6 y aquí se me haya pasado :smt005 . Gracias por corregirme y mejorar la función.
CORREGIDO :smt023 .

Saludos.