Hola foreros, me preguntaba si podian ayudar en la programacion de un cronometro regresivo
miren este seria el diseño basico y simple
(http://i.imm.io/16kCz.png)
Perdon, si les pido mucho...
en el RadioButton1 "Ejecutar Programa" quiero que abra un programa, pero este programa estara en la misma ruta de la carpeta, ejemplo..
Al termina el tiempo se ejecutara el AutoIt3
y en el RadioButton2 "Ejecutar Sonido" igual que reproduzca el sonido
(http://i.imm.io/16kGp.png)
en los Botones "Iniciar y Detener" pues es obvio iniciar el timer o detenerlo
y en los TextBox "Horas, Minutos y Segundos" yo pueda aplicar el tiempo que quiero poner en regresiva y al finalizar el tiempo se ejecute alguna de las dos acciones. el sonido o el programa
que en una hora con cinco minutos se ejecute el sonido
(http://i.imm.io/16kHJ.png)
que en 24 horas ejecute el sonido etc
(http://i.imm.io/16kIY.png)
Espero y no ser molesto, lo se soy un novato pregunton :(
Hola,
Todo eso está muy bien, pero... ¿y si comentas en que lenguaje lo estás haciendo?...
Como iniciar un proceso externo: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start%28v=vs.100%29.aspx
process.start(".\AutoIt3.exe", "Argumentos si quieres")
Para lo del lapsus de tiempo usa un
Timer si no tienes la necesidad de mostrar la cuenta regresiva: http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.90%29.aspx
timer1.interval = 5000 ' ms
...De lo contrario usa un TimeSpan junsto a un StopWatch si quieres ir mostrando la cuenta atrás hasta llegar a "00" "00" "00" en los TextBoxes: http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch%28v=vs.90%29.aspx http://msdn.microsoft.com/en-us/library/system.timespan%28v=vs.90%29.aspx
#Region " Time Remaining "
' [ Time Remaining ]
'
' // By Elektro H@cker
'
' Examples :
' CountDown_Start()
Dim TotalTime As Long = 10000 ' ms
Dim Time_Elapsed_Watch As New Stopwatch
Dim Time_Remaining_Span As New TimeSpan()
Dim WithEvents CountDown_Timer As New Timer
Private Sub CountDown_Start()
Time_Remaining_Span = TimeSpan.FromMilliseconds(TotalTime + 1000)
Time_Elapsed_Watch.Start()
CountDown_Timer.Start()
End Sub
Private Sub CountDown_Timer_Tick(sender As Object, e As EventArgs) Handles CountDown_Timer.Tick
Dim TimeRemaining As TimeSpan = Time_Remaining_Span - Time_Elapsed_Watch.Elapsed
Label1.Text = "Elapsed : " & _
String.Format("{0:00}:{1:00}:{2:00}", _
Time_Elapsed_Watch.Elapsed.Hours, _
Time_Elapsed_Watch.Elapsed.Minutes, _
Time_Elapsed_Watch.Elapsed.Seconds)
Label2.Text = "TimeLeft: " & _
String.Format("{0:00}:{1:00}:{2:00}", _
CLng(Math.Floor(TimeRemaining.TotalHours)) Mod 999999999999999999, _
CLng(Math.Floor(TimeRemaining.TotalMinutes)) Mod 60, _
CLng(Math.Floor(TimeRemaining.TotalSeconds)) Mod 60)
If TimeRemaining.TotalSeconds <= 0 OrElse Time_Elapsed_Watch.ElapsedMilliseconds > TotalTime Then
Time_Elapsed_Watch.Reset()
CountDown_Timer.Stop()
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CountDown_Start()
End Sub
#End Region
EDITO: Como reproducir un archivo que no séa WAV:
Cita de: http://www.daniweb.com/software-development/vbnet/threads/119460/playing-mp3-file-with-vb.net On Error GoTo ErrMsg
AxMMControl1.Wait = True
AxMMControl1.FileName = OpenFileDialog1.FileName
AxMMControl1.Command = "Open"
AxMMControl1.Command = "Play"
Exit Sub
ErrMsg:
MsgBox(Err.Description)
End Sub
O usando APIs: http://stackoverflow.com/questions/10244068/playing-a-wav-mp3-file-at-the-start-of-a-vb2010-windows-form
PD: Acerca de la interfaz yo modificaría "Ejecutar sonido" por "Reproducir sonido" y "Ejecutar programa" por "Iniciar proceso".
Saludos.
es programacion en visual basic 2008...
voy a probar tu codigo y miro que tal funciona
gracias por ayudar a un novaton en esto del mundo de la programacion :) ;-) ;-)
si, pero el timer no es totálmente exácto, puesto que depende de sus eventos y como habréis visto, si windows está muy ocupado los eventos se retrasan. Hay otra clase llamada stopWatch que yo uso para medir el lag. Éste cuenta los ciclos o milisegundos exactos desde que se abrió el programa.
http://msdn.microsoft.com/es-es/library/system.diagnostics.stopwatch.aspx?ppud=4 (http://msdn.microsoft.com/es-es/library/system.diagnostics.stopwatch.aspx?ppud=4)
No se si la precisión es muy importante, en caso de que no es más sencillo usar un timer, en caso de que si usa el stopwatch.
edito: Bueno, ahora veo que Electro H@cker también lo usa en su ejemplo XD, ya estaba yo pensando que el timer era para medir el tiempo. -_-
Según lo que estuvimos hablando me parece que SyntaxError404 se ha resignado a intentar hacer el programa por si mismo a pesar de la información que le hemos dado y códigos de ejemplo... pero bueno, a ver si nos sorprendes mostrando algún avanze para poder ayudarte, no es dificil.
Saludos!
Gracias por el cronometro EleKtro H@cker, muy bueno ya lo estoy usando en mi nuevo soft.
Salu2
Yo sugiero algo mas sencillo, si bien el ejemplo de Electro es correcto, hay veces que los novatos se sienten "frustrados" por manejar codes de gente con experiencia ya que muchas veces se entreveran.
Este code se puede decir que no es 100 % preciso, puede haber algún milisegundo de diferencia;
Dim Hora As Integer
Dim Segundo As Integer
Dim Minutos As Integer
'variable para asemejar el segundo
Dim Mx As Integer
Private Sub CalcularyMostrar()
txtHoras.Text = Hora.ToString.PadLeft(2, "0") 'para rellenar en caso que sea menor que dos digitos
txtMinutos.Text = Minutos.ToString.PadLeft(2, "0")
txtSegundos.Text = Segundo.ToString.PadLeft(2, "0")
End Sub
Private Sub cmdIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIniciar.Click
If txtSegundos.Text = "" Then
MsgBox("debe indicar un tiempo para iniciar retroceso")
Exit Sub
End If
Segundo = txtSegundos.Text
Minutos = txtMinutos.Text
Hora = txtHoras.Text
tmrKonteo.Enabled = True
End Sub
Private Sub tmrKonteo_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrKonteo.Tick
'tick es como el timer_timer en visual 6
Mx = Mx - 1
If Mx = 0 Or Mx = -1 Then
Mx = 9
Segundo = Segundo - 1
If Segundo = -1 Then
Segundo = 59
Minutos = Minutos - 1
If Minutos = 0 Then
Minutos = 59
Hora = Hora - 1
End If
End If
CalcularyMostrar()
End If
End Sub
Private Sub cmdDetiene_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDetiene.Click
tmrKonteo.Enabled = False
End Sub
Use 1 timer, 3 cajas de texto y dos botones de comando.
El if de comparacion de segundos es a modo de ejemplo, se puede modificar a gusto, por ejemplo para que vos te obligues a colocar valores superiores a cero.
Falta implementar la ejecucion de acciones cuando el tiempo finalize, eso lo dejo a tu criterio.
Saludos.
Gracias al usuario XresH, por explicarme...
logre esto...
(http://i.imm.io/176M7.png)
Cuando llega a 00:00:00 reproduce un sonido.wav usando este codigo
Try
Dim ruta As String
ruta = My.Application.Info.DirectoryPath & "\Sonido.wav"
My.Computer.Audio.Play(ruta, AudioPlayMode.BackgroundLoop)
My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)
Catch ex As Exception
End Try
hasta ahora todo funciona....
ahora quiero crear dos variables
"Reproducir sonido" y "Ejecutar proceso"
(http://i.imm.io/176Oy.png)
elemplo, selecciono el RadioButton1 y se activa la funcion de "Reproducir sonido"
(http://i.imm.io/176Ow.png)
cuando selecciono el RadioButton2 se ejecuta un "proceso/archivo"
y todo esto ocurre al llegar a 00:00:00
Mas que variables con los mismos RadioButon podes hacerlo;
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If RadioButton1.Checked = False And RadioButton2.Checked = False Then
MsgBox("Seleccione un option para seguir")
ElseIf RadioButton1.Checked = True Then
'codigo para reproducir sonido
ElseIf RadioButton2.Checked = True Then
'codigo para ejecutar programa
End If
End Sub
Sino entendes algo en el code me decis pero estoy seguro que lo comprendés.
Saludos.
El code de XResH está bien, puedes hacerlo de esa manera, pero esto está más simplificado:
Primero de nada modifica la propiedad "Tag" de los radiobuttons,
al radio button de "reproducir sonido" le añades el tag "sound"
al radio button de "ejecutar programa" le añades el tag "program",
y ya puedes usar esto:
Dim Run_Sound As Boolean = False
Dim Run_Program As Boolean = False
Private Sub RadioButtons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
RadioButton1.Click, _
RadioButton2.Click
Select Case sender.tag.tolower
Case "sound" : Run_Sound = True : Run_Program = False
Case "program" : Run_Program = True : Run_Sound = False
Case Else : Throw New Exception("Wrong tagname")
End Select
End Sub
Private Sub Time_Success() ' a este sub lo llamas cuando el tiempo restante séa "00:00:00"
If Run_Sound Then
' play wav
ElseIf Run_Program Then
' process.start()
Else
Throw New Exception("Wrong option")
End If
End Sub
saludos
Humm, gracias el codigo que me das Electro.. tal parece no funciona... cuando selecciona la funcion de "sonido o proceso" esta automaticamente se inicia sin nisiquiera transcurrir el tiempo
mira te paso todo el codigo que llevo hasta ahora
Public Class Form1
Dim Hora As Integer
Dim Segundo As Integer
Dim Minutos As Integer
Dim Mx As Integer
Private Sub CalcularyMostrar()
TextBox1.Text = Hora.ToString.PadLeft(2, "0") 'para rellenar en caso que sea menor que dos digitos
TextBox2.Text = Minutos.ToString.PadLeft(2, "0")
TextBox3.Text = Segundo.ToString.PadLeft(2, "0")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If TextBox3.Text = "" Then
MsgBox("Indica el tiempo para Iniciar")
Exit Sub
End If
Segundo = TextBox3.Text
Minutos = TextBox2.Text
Hora = TextBox1.Text
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Mx = Mx - 1
If Mx = 0 Or Mx = -1 Then
Mx = 9
Segundo = Segundo - 1
If Segundo = -1 Then
Segundo = 59
Minutos = Minutos - 1
If Minutos = 0 Then
Minutos = 59
Hora = Hora - 1
End If
End If
If Hora = 0 Then
If Minutos = 0 Then
If Segundo = 0 Then
TextBox3.Text = "00"
Timer1.Enabled = False
'Aqui es donde termina el tiempo, y es donde tiene que
'inicar alguna de las variables "sonido o proceso"
Exit Sub
End If
End If
End If
CalcularyMostrar()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Timer1.Enabled = False
My.Computer.Audio.Stop()
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
Label1.Text = Date.Now.ToLongTimeString
End Sub
End Class
no se que es lo que no comprendo, pero no funciona :/
Cita de: SyntaxError404 en 24 Mayo 2013, 16:43 PMgracias el codigo que me das Electro.. tal parece no funciona...
En ningúna parte de tú código veo que hayas usado el código que te he mostrado, tampoco veo que hayas declarado las variables de mi ejemplo.
PD: Aunque tampoco voy a testear un código sin que me des detalles de porque "no funciona"
Saludos!
Cita de: EleKtro H@cker en 24 Mayo 2013, 17:00 PM
En ningúna parte de tú código veo que hayas usado el código que te he mostrado, tampoco veo que hayas declarado las variables de mi ejemplo.
PD: Aunque tampoco voy a testear un código sin que me des detalles de porque "no funciona"
Saludos!
Detalles: cuando selecciona la funcion de "sonido o proceso" esta automaticamente se inicia sin nisiquiera transcurrir el tiempo
Si, lo se lo elimine.. pues no se la forma correcta de como insertarlo
Public Class Form1
Dim Hora As Integer
Dim Segundo As Integer
Dim Minutos As Integer
Dim Mx As Integer
Dim Run_Sound As Boolean = False
Dim Run_Program As Boolean = False
Private Sub CalcularyMostrar()
TextBox1.Text = Hora.ToString.PadLeft(2, "0") 'para rellenar en caso que sea menor que dos digitos
TextBox2.Text = Minutos.ToString.PadLeft(2, "0")
TextBox3.Text = Segundo.ToString.PadLeft(2, "0")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If TextBox3.Text = "" Then
MsgBox("Indica el tiempo para Iniciar")
Exit Sub
End If
Segundo = TextBox3.Text
Minutos = TextBox2.Text
Hora = TextBox1.Text
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Mx = Mx - 1
If Mx = 0 Or Mx = -1 Then
Mx = 9
Segundo = Segundo - 1
If Segundo = -1 Then
Segundo = 59
Minutos = Minutos - 1
If Minutos = 0 Then
Minutos = 59
Hora = Hora - 1
End If
End If
If Hora = 0 Then
If Minutos = 0 Then
If Segundo = 0 Then
TextBox3.Text = "00"
Timer1.Enabled = False
If Run_Sound Then
' play wav
ElseIf Run_Program Then
' process.start()
Else
Throw New Exception("Wrong option")
End If
Exit Sub
End If
End If
End If
CalcularyMostrar()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Timer1.Enabled = False
My.Computer.Audio.Stop()
End Sub
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
Label1.Text = Date.Now.ToLongTimeString
End Sub
Private Sub RadioButtons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.Click, RadioButton2.Click
Select Case sender.tag.tolower
Case "sound" : Run_Sound = True : Run_Program = False
Case "program" : Run_Program = True : Run_Sound = False
Case Else : Throw New Exception("Wrong tagname")
End Select
End Sub
End Class
vamos, que no es dificil SyntaxError404
Pero si empeizas a usar if's anidados te puedes acabar liando.
Aquí tienes el source del siguiente form: http://elektrostudios.tk/WindowsApplication3.zip
Public Class Form1
Dim Run_Sound As Boolean = False
Dim Run_Program As Boolean = False
Dim TotalTime As Long
Dim Time_Elapsed_Watch As New Stopwatch
Dim Time_Remaining_Span As New TimeSpan()
Dim WithEvents CountDown_Timer As New Timer
Dim TimeIsOut As Boolean = False
Dim Want_To_Stop As Boolean
#Region " Form "
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
RadioButton1.Tag = "sound"
RadioButton2.Tag = "program"
End Sub
Private Sub RadioButtons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
RadioButton1.Click, _
RadioButton2.Click
Select Case sender.tag.tolower
Case "sound" : Run_Sound = True : Run_Program = False
Case "program" : Run_Program = True : Run_Sound = False
Case Else : Throw New Exception("Wrong tagname")
End Select
End Sub
Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles _
NumericUpDown1.ValueChanged, _
NumericUpDown2.ValueChanged, _
NumericUpDown3.ValueChanged
TotalTime = (NumericUpDown1.Value * 3600000) _
+ (NumericUpDown2.Value * 60000) _
+ (NumericUpDown3.Value * 1000)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TimeIsOut = False
Want_To_Stop = False
CountDown_Start()
While Not TimeIsOut : Application.DoEvents() : End While
If Not Want_To_Stop Then Time_Success()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Want_To_Stop = True
End Sub
#End Region
#Region " Procedures "
Private Sub CountDown_Start()
Time_Remaining_Span = TimeSpan.FromMilliseconds(TotalTime + 1000)
Time_Elapsed_Watch.Start()
CountDown_Timer.Start()
End Sub
Private Sub CountDown_Timer_Tick(sender As Object, e As EventArgs) Handles CountDown_Timer.Tick
Dim TimeRemaining As TimeSpan = Time_Remaining_Span - Time_Elapsed_Watch.Elapsed
If Want_To_Stop Then TimeIsOut = True : Time_Elapsed_Watch.Reset() : CountDown_Timer.Stop()
Try
NumericUpDown1.Value = String.Format("{0:00}", CLng(Math.Floor(TimeRemaining.TotalHours)) Mod 999999999999999999)
NumericUpDown2.Value = String.Format("{0:00}", CLng(Math.Floor(TimeRemaining.TotalMinutes)) Mod 60)
NumericUpDown3.Value = String.Format("{0:00}", CLng(Math.Floor(TimeRemaining.TotalSeconds)) Mod 60)
Catch
TimeIsOut = True
Time_Elapsed_Watch.Reset()
CountDown_Timer.Stop()
End Try
End Sub
Private Sub Time_Success()
If Run_Sound Then
MsgBox("Reproducir sonido")
ElseIf Run_Program Then
MsgBox("Ejecutar proceso")
Else
Throw New Exception("Wrong option")
End If
End Sub
#End Region
End Class
Saludos.
Veo que el codigo es muy diferente, cabe mencionar que uso VB.NET 2008
Al ver tu codigo, vi cosas que no habia visto antes :-\
quede algo confundido, pues por lo que XresH me explico de otra manera.... siendo el mismo proceso pero con codigo diferente
pero se agradece tu intencion por ayudarme.. el codigo ahora si funciona, justo ahora mire tu ejemplo y a segun lo que entendi decidi crear uno nuevo y si funciono
Cita de: SyntaxError404 en 24 Mayo 2013, 18:02 PM
Veo que el codigo es muy diferente
Sólamente he usado los códigos de ejemplo que te puse, con alguna que otra modificación.
El proyecto está hecho en VS2012, VB.NET
Saludos
Cita de: SyntaxError404 en 24 Mayo 2013, 18:02 PM
Veo que el codigo es muy diferente, cabe mencionar que uso VB.NET 2008
Al ver tu codigo, vi cosas que no habia visto antes :-\
quede algo confundido, pues por lo que XresH me explico de otra manera.... siendo el mismo proceso pero con codigo diferente
pero se agradece tu intencion por ayudarme.. el codigo ahora si funciona, justo ahora mire tu ejemplo y a segun lo que entendi decidi crear uno nuevo y si funciono
No vamos a explicarte el código de la misma forma, tenemos maneras distintas de programar, cosa que es normal.
Lograr mismos resultados con diferentes métodos es algo común y corriente.
Por lo que no vamos a explicartelo de la misma forma, jamas, porque tanto electro como yo tenemos nuestra forma de hacer las cosas, lo importante es que entiendas las ideas que te explicamos y los coódigos expuestos, para que lo apliques junto con tu conocimiento actual.
Pudiste resolver tus dudas al final? reitero lo importante es que comprendas lo que te planteamos!
Saludos.
Miren esta manera mucho mas sencilla de usar el cronometro
Public Class Form1
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
tmrWatch.Start()
End Sub
Private Sub btnStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStop.Click
tmrWatch.Stop()
End Sub
Private Sub tmrWatch_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrWatch.Tick
txtTenths.Text -= 1
If txtTenths.Text = -1 Then
txtTenths.Text = 9
txtSeconds.Text -= 1
If txtSeconds.Text = -1 Then
txtSeconds.Text = 59
txtMinutes.Text -= 1
If txtMinutes.Text = -1 Then
txtMinutes.Text = 59
txtHours.Text -= 1
If txtHours.Text = -1 Then
txtHours.Text = 23
txtDays.Text -= 1
If txtDays.Text = -1 Then
tmrWatch.Stop()
txtTenths.Text = "0"
txtSeconds.Text = "0"
txtMinutes.Text = "0"
txtHours.Text = "0"
txtDays.Text = "0"
End If
End If
End If
End If
End If
End Sub
Te parece más sencillo porque aún no has aprendido a dominar un select case para evitar tanta cantidad de if's o usar el StopWatch como en el ejemplo que te puse, podrías practicar con ellos.
Quizás te parezca más sencillo con if's pero a mi por lo menos no me parece una forma práctica de hacerlo, además es un poco inteligible y da sensación de "desordenado".
Sabemos el propósito de esos if's, pero si no lo supieramos entonces costaría de adivinarlo a la primera y habría que leer ese bloque de código varías veces para saber que hace tanto If,
aparte no recuerdo quien fue el que te comentó que el Timer no es tán preciso como el StopWatch, pero es algo que debiste tomar en cuenta.
un saludo!
Cita de: XresH en 25 Mayo 2013, 01:30 AM
No vamos a explicarte el código de la misma forma, tenemos maneras distintas de programar, cosa que es normal.
Lograr mismos resultados con diferentes métodos es algo común y corriente.
Por lo que no vamos a explicartelo de la misma forma, jamas, porque tanto electro como yo tenemos nuestra forma de hacer las cosas, lo importante es que entiendas las ideas que te explicamos y los coódigos expuestos, para que lo apliques junto con tu conocimiento actual.
Pudiste resolver tus dudas al final? reitero lo importante es que comprendas lo que te planteamos!
Saludos.
Si, logre lo que esperaba.. Gracias a ustedes dos por su colaboracion :)