Reloj Binario

y programas personales para otros como tu, puede que te corrijan ;)
Responder
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Reloj Binario

Mensaje 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?
Adjuntos
Reloj Binario.zip
(286.88 KiB) Descargado 429 veces
reloj binario.JPG
reloj binario.JPG (15.5 KiB) Visto 5554 veces
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Reloj Binario

Mensaje por gna08 »

jaja, muy bueno me encanto , solo qu ey k leer binary :smt021 :smt021 jajaj. muy ioriginal :smt023
Aunk no m Buskes, Seguro m enkontras!
Avatar de Usuario
Rupert.25
Hacker del Foro
Mensajes: 247
Registrado: 17 Jul 2007, 18:27

Re: Reloj Binario

Mensaje 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
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Reloj Binario

Mensaje 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
Avatar de Usuario
XPyro
Profesional del Autoit
Mensajes: 542
Registrado: 04 Mar 2007, 10:12
Ubicación: México
Contactar:

Re: Reloj Binario

Mensaje 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
Imagen
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

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

Mensaje 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 .
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 ;).
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Reloj Binario

Mensaje 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...
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Reloj Binario

Mensaje 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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Reloj Binario

Mensaje 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. ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Reloj Binario

Mensaje 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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Reloj Binario

Mensaje 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.
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 ;).
Responder