Help Me Pls

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
denysrom
Mensajes: 3
Registrado: 08 Feb 2011, 23:27

Help Me Pls

Mensaje por denysrom »

Hola Gente soi nuevo y me gusta muxo el AutoiT
y quiero acer una calculadora y no me sale Ayuda por favor:(


Código: Seleccionar todo

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.6.1
 Author:         myName

 Script Function:
	Template AutoIt script.

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>



#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Calculator", 186, 267, 192, 124)
GUISetBkColor(0x000080)
$1 = GUICtrlCreateButton("1", 8, 8, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$2 = GUICtrlCreateButton("2", 64, 8, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$3 = GUICtrlCreateButton("3", 120, 8, 59, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$4 = GUICtrlCreateButton("4", 8, 40, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$5 = GUICtrlCreateButton("5", 64, 40, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$6 = GUICtrlCreateButton("6", 120, 40, 59, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$7 = GUICtrlCreateButton("7", 8, 72, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$8 = GUICtrlCreateButton("8", 64, 72, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$9 = GUICtrlCreateButton("9", 120, 72, 59, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$0 = GUICtrlCreateButton("0", 8, 104, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$mas = GUICtrlCreateButton("+", 64, 104, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$Minus = GUICtrlCreateButton("-", 120, 104, 59, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$paranteza1 = GUICtrlCreateButton("(", 8, 136, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$paranteza2 = GUICtrlCreateButton(")", 64, 136, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$x = GUICtrlCreateButton("x", 120, 136, 59, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$linie = GUICtrlCreateButton("/", 8, 168, 51, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$egal= GUICtrlCreateButton("=", 64, 168, 115, 25, $WS_GROUP)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
$stergere = GUICtrlCreateButton("Stergere", 8, 200, 171, 25, $WS_GROUP)
GUICtrlSetFont(-1, 10, 800, 0, "Fixedsys")
$Label1 = GUICtrlCreateLabel("ToTal", 8, 236, 40, 23)
GUICtrlSetFont(-1, 10, 800, 0, "Comic Sans MS")
GUICtrlSetColor(-1, 0xFF0000)
$resultado= GUICtrlCreateInput("", 48, 232, 129, 24)
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $1
			calcular(1)
		Case $2
			calcular(2)
		Case $3
			calcular(3)
		Case $4
			calcular(4)
		Case $5
			calcular(5)
		Case $6
			calcular(6)
		Case $7
			calcular(7)
		Case $8
			calcular(8)
		Case $9
			calcular(9)
		Case $0
			calcular(0)
		Case $mas
			calcular('+')
		Case $egal
			calcular("egal")
		Case $stergere
			GUICtrlSetData($resultado,"")



	EndSwitch
WEnd

Func calcular($num)
	If $num = "get" Then
		get()
	Else
        If $num = 'nul' Then
            GUICtrlSetData($resultado, GUICtrlRead($resultado) & 0)
        Else
            GUICtrlSetData($resultado, GUICtrlRead($resultado) & $num)
        EndIf

    EndIf
EndFunc   ;==>calcular
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: Help Me Pls

Mensaje por Alastor »

Erm... ese codigo no tiene mucho sentido, faltan funciones y la unica que hay esta incompleta.
Te dejo una que hice el año pasado por si te sirve como ejemplo [Codigo Fuente]

Si tienes alguna duda, explica exactamente qué es lo que no entiendes.
Aprendiendo AutoIt y C++
denysrom
Mensajes: 3
Registrado: 08 Feb 2011, 23:27

Re: Help Me Pls

Mensaje por denysrom »

Vale Muxas gracias amigo espero que me ayudas mas Cuidate hermano !
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Help Me Pls

Mensaje por Ximorro »

Hombre, denysrom, es que das poco para que te ayudemos. Sí, el gui ya está, muy bien, pero la lógica de la función Calcular no está muy empezada, ¿qué son esos get y nul?
Te recomiendo mirar el código de Alastor pero no lo copies, mejor intenta entenderlo (así también se aprende) y haz tu versión.
Ah, por favor, la próxima vez que hagas una consulta, pon un título adecuado a la entrada.

@Alastor, tu código está muy bien pero permíteme sugerirte una mejora. Los HotKey pueden ser un problema porque son globales al sistema, aunque estés en otra aplicación siguen activos, y tratándose de teclas tan comunes puede ser un problema.
Hay una manera de hacer HotKey locales (bueno, seguro que hay varias, por ejemplo también se me ocurre mirar si la ventana está activa o no y activar o desactivar todos los HotKey en consonancia). Pero hay otra manera que explico aquí, te recomiendo echarle un vistazo porque es justo lo que quieres: asocia teclas de acceso rápido a tus botones, y sólo afecta a tu GUI.
http://www.emesn.com/autoitforum/viewto ... a6a6#p8211

Por supuesto puedes crear la matriz de una, esto asignaría las dos primeras:
$AccelKeys[2][2]=[["{NUMPAD0}", $Boton_0], ["{NUMPAD1}", $Boton_1]]
GUISetAccelerators($AccelKeys)


Tendrás que asignar los eventos a cada botón (aunque para los de números vayan a la misma función), pues a GUISetAccelerators en vez de decirle la función que quieres ejecutar, le dices el control cuyo evento quieres disparar, así que tendrás que poner las funciones en los eventos.
Para los números no creo que luego funcione distinguirlos con HotKetPressed, pues realmente no es un HotKey, pero al estar dentro de un evento puedes hacerlo con GUICtrlRead(@GUI_CTRLID).
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: Help Me Pls

Mensaje por Alastor »

Gracias por el consejo. Sabia que existía esa funcion pero nunca la había utilizado antes.
Entonces, al definir las HotKeys mediante GUISetAccelerators ¿se envia el evento correspondiente al boton a la ventana? Si es así no hay problema con las de los números ya que sus eventos estan definidos ahí.

Edit: Ya lo he modificado, quedaria asi:
[PasteBin]

Código: Seleccionar todo

#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.6.1
	Author:         Alastor [ZKFA Team]

	Script Function:
	Una calculadora muy simple.

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $Buffer = 0
Global $Operacion = 0

#region #GUI Calculadora 1.2.kxf
$GUI = GUICreate("Calculadora 1.2", 253, 236, 191, 153)

$Resultado = GUICtrlCreateInput("", 8, 8, 239, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL, $ES_READONLY, $ES_NUMBER))
GUICtrlSetFont($Resultado, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor($Resultado, 0x0000FF)

$Boton_Retroceso = GUICtrlCreateButton("Retroceso", 40, 40, 63, 29, $WS_GROUP)
$Boton_CE = GUICtrlCreateButton("CE", 112, 40, 62, 29, $WS_GROUP)
$Boton_C = GUICtrlCreateButton("C", 184, 40, 62, 29, $WS_GROUP)

$Boton_7 = GUICtrlCreateButton("7", 8, 80, 36, 29, $WS_GROUP)
$Boton_8 = GUICtrlCreateButton("8", 56, 80, 36, 29, $WS_GROUP)
$Boton_9 = GUICtrlCreateButton("9", 104, 80, 36, 29, $WS_GROUP)
$Boton_Dividir = GUICtrlCreateButton("/", 152, 80, 36, 29, $WS_GROUP)

$Boton_4 = GUICtrlCreateButton("4", 8, 120, 36, 29, $WS_GROUP)
$Boton_5 = GUICtrlCreateButton("5", 56, 120, 36, 29, $WS_GROUP)
$Boton_6 = GUICtrlCreateButton("6", 104, 120, 36, 29, $WS_GROUP)
$Boton_Multiplicar = GUICtrlCreateButton("*", 152, 120, 36, 29, $WS_GROUP)

$Boton_1 = GUICtrlCreateButton("1", 8, 160, 36, 29, $WS_GROUP)
$Boton_2 = GUICtrlCreateButton("2", 56, 160, 36, 29, $WS_GROUP)
$Boton_3 = GUICtrlCreateButton("3", 104, 160, 36, 29, $WS_GROUP)
$Boton_Restar = GUICtrlCreateButton("-", 152, 160, 36, 29, $WS_GROUP)

$Boton_0 = GUICtrlCreateButton("0", 8, 200, 36, 29, $WS_GROUP)
$Boton_Signo = GUICtrlCreateButton("+/-", 56, 200, 36, 29, $WS_GROUP)
$Boton_Coma = GUICtrlCreateButton(",", 104, 200, 36, 29, $WS_GROUP)
$Boton_Sumar = GUICtrlCreateButton("+", 152, 200, 36, 29, $WS_GROUP)
$Boton_Igual = GUICtrlCreateButton("=", 199, 200, 44, 29, $WS_GROUP)
GUICtrlSetFont($Boton_Igual, 10, 400, 0, "MS Sans Serif")
#endregion #GUI Calculadora 1.2.kxf

Local $AccelKeys[18][2] =  [["{NUMPAD0}", $Boton_0], _
							["{NUMPAD1}", $Boton_1], _
							["{NUMPAD2}", $Boton_2], _
							["{NUMPAD3}", $Boton_3], _
							["{NUMPAD4}", $Boton_4], _
							["{NUMPAD5}", $Boton_5], _
							["{NUMPAD6}", $Boton_6], _
							["{NUMPAD7}", $Boton_7], _
							["{NUMPAD8}", $Boton_8], _
							["{NUMPAD9}", $Boton_9], _
							["{NUMPAD9}", $Boton_9], _
							["{NUMPADSUB}", $Boton_Restar], _
							["{NUMPADADD}", $Boton_Sumar], _
							["{NUMPADMULT}", $Boton_Multiplicar], _
							["{NUMPADDIV}", $Boton_Dividir], _
							["{BACKSPACE}", $Boton_Retroceso], _
							["{DELETE}", $Boton_CE], _
							["{ENTER}", $Boton_Igual]]

GUISetAccelerators($AccelKeys, $GUI)

GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE	; Si se cierra la GUI
			Exit 0				; Salir con codigo de error 0

		Case $Boton_Retroceso									; Boton para borrar el ultimo caracter
			$TxtActual = GUICtrlRead($Resultado)				; Se lee el numero actual
			$TxtMenos1 = StringTrimRight($TxtActual, 1)			; Se le quita el utlimo numero
			GUICtrlSetData($Resultado, $TxtMenos1)				; Se modifica

		Case $Boton_CE						; Boton para borrar todo
			$Buffer = 0						; $Buffer se utiliza para guardar el numero anterior
			$Operacion = 0					; $Operacion se utiliza para saber que operacion realizar
			GUICtrlSetData($Resultado, "")	; Se borra la input de resultados

		Case $Boton_C						; Boton para borrar solo la input de resultados
			GUICtrlSetData($Resultado, "")

		Case $Boton_1								; Botones del 0 al 9 para agregar el numero correspondiente
			GUICtrlSetData($Resultado, '1', 0)

		Case $Boton_2
			GUICtrlSetData($Resultado, '2', 0)

		Case $Boton_3
			GUICtrlSetData($Resultado, '3', 0)

		Case $Boton_4
			GUICtrlSetData($Resultado, '4', 0)

		Case $Boton_5
			GUICtrlSetData($Resultado, '5', 0)

		Case $Boton_6
			GUICtrlSetData($Resultado, '6', 0)

		Case $Boton_7
			GUICtrlSetData($Resultado, '7', 0)

		Case $Boton_8
			GUICtrlSetData($Resultado, '8', 0)

		Case $Boton_9
			GUICtrlSetData($Resultado, '9', 0)

		Case $Boton_0
			GUICtrlSetData($Resultado, '0', 0)

		Case $Boton_Coma
			GUICtrlSetData($Resultado, ',', 0)

		Case $Boton_Signo											; Boton para modificar el signo actual (Negativo / Positivo)
			$TxtActual = GUICtrlRead($Resultado)					; Se lee el valor actual

			$Signo = StringLeft($TxtActual, 1)						; Se lee el primer caracter
			If $Signo == '-' Then									; Si es negativo
				$CambioDeSigno = StringTrimLeft($TxtActual, 1)		; Se borra el signo
			Else													; Si es positivo (No tiene signo)
				$CambioDeSigno = '-' & $TxtActual					; Se agrega el signo
			EndIf

			GUICtrlSetData($Resultado, $CambioDeSigno)

		Case $Boton_Dividir
			If $Operacion == 0 Then					; Si no hay ninguna operacion definida
				$Buffer = GUICtrlRead($Resultado)	; Se guarda el valor actual
				$Operacion = '/'					; Se define la operacion
				GUICtrlSetData($Resultado, "")		; Se borra la entrada de resultados
			Else
				$Operacion = '/'					; En caso contrario solo se modifica la operacion
			EndIf

		Case $Boton_Multiplicar
			If $Operacion == 0 Then
				$Buffer = GUICtrlRead($Resultado)
				$Operacion = '*'
				GUICtrlSetData($Resultado, "")
			Else
				$Operacion = '*'
			EndIf

		Case $Boton_Restar
			If $Operacion == 0 Then
				$Buffer = GUICtrlRead($Resultado)
				$Operacion = '-'
				GUICtrlSetData($Resultado, "")
			Else
				$Operacion = '-'
			EndIf

		Case $Boton_Sumar
			If $Operacion == 0 Then
				$Buffer = GUICtrlRead($Resultado)
				$Operacion = '+'
				GUICtrlSetData($Resultado, "")
			Else
				$Operacion = '+'
			EndIf

		Case $Boton_Igual
			If $Operacion = Not 0 Then										; Si hay una operacion definida
				$TxtActual = GUICtrlRead($Resultado)						; Se lee el valor actual

				$AnteriorArreglado = StringReplace($Buffer, ',', '.')		; Se reemplazan las comas por puntos (Para las operaciones decimales en autoit)
				$ActualArreglado = StringReplace($TxtActual, ',', '.')

				Switch $Operacion
					Case '+'
						$Result = $AnteriorArreglado + $ActualArreglado

					Case '-'
						$Result = $AnteriorArreglado - $ActualArreglado

					Case '*'
						$Result = $AnteriorArreglado * $ActualArreglado

					Case '/'
						$Result = $AnteriorArreglado / $ActualArreglado

				EndSwitch

				$ResultadoArreglado = StringReplace($Result, '.', ',')		; Se vuelven a poner puntos en lugar de comas
				GUICtrlSetData($Resultado, $ResultadoArreglado)

				$Buffer = 0
				$Operacion = 0
			EndIf

	EndSwitch
WEnd
Aprendiendo AutoIt y C++
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Help Me Pls

Mensaje por Ximorro »

Sí, perdona, es que no sé por qué estaba pensando en el modo de eventos OnEvent, y te decía de hacer algo parecido como hacías lo del hotkey, que los enviabas todos a la misma función y así no tienes que repetirlo para cada número. Pero en el modo MessageLoop aunque no dispones de @GUI_CTRLID también lo puedes compactar si te guardas lo que devuelve GUIGetMsg():

Código: Seleccionar todo

$msg = GUIGetMsg()
Switch $msg
...
      Case $Boton_1, $Boton_2, $Boton_3, $Boton_4, $Boton_5, $Boton_6, $Boton_7, $Boton_8, $Boton_9, $Boton_0
            GUICtrlSetData($Resultado, GUICtrlRead($msg), 0)
...
EndSwitch
En realidad también puedes poner $Boton_Coma, pues recibe el mismo proceso.

Y ahora que queda más compacto para compensar puedes poner más teclas de acceso directo, ¡resulta que un botón puede tener varias!, Así que puedes hacer:
[["{NUMPAD0}", $Boton_0], ["0", $Boton_0], ["{NUMPAD1}", $Boton_1], ["1", $Boton_1],...]
Y así también se puede usar el teclado normal, no el numérico, es un poco rollo definirlos todos, pero bueno, sólo se hace una vez.
Para que no quede un churro muy largo puedes poner las dos asignaciones a la misma tecla en la misma línea de código.
Al final te va a quedar una super-calculadora ;-)

@denysrom
, todo esto ya son técnicas avanzadas, lo importante es que entiendas el mecanismo de tomar los operandos y hacer las operaciones. O pensar tú en otro diferente. Si piensas en otro sistema y no te funciona al programarlo sólo tienes que decirlo.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder