Título: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: #Aitor en 23 Septiembre 2015, 16:26 pm Código
La idea es hacer una cuenta regresiva que este en una continua actualización, a partir de una fecha clave, y la fecha base del ordenador. El problema aquí está en que el mes no es el mismo, y por lo tanto la variable Diarestante da un valor negativo. ¿Cómo solucionar eso? O en su defecto alguna forma mejor de hacerlo. La idea principal es que no se muestre lo que contiene el programa hasta ese día, supongo que para saber si se ha pasado el día basta con comprobar que el díaActual sea mayor que el diaAni. Edito: Para arreglarlo de una forma cutre: Código
De esta forma con los casos me aseguro de que tengan el dia correspondiente a su dia en base a los 365 dias posibles... Pero claro, esto solo sirve como un apaño para solucionar mi problema suponiendo que la cuenta regresiva es de máximo 1 mes. Sigo sin saber como solucionar el problema en sí. Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Eleкtro en 23 Septiembre 2015, 18:15 pm ¿Cómo solucionar eso? O en su defecto alguna forma mejor de hacerlo. Estás siguiendo el camino equivocado. Usa un TimeSpan. Tenia un viejo código que desarrollé el año pasado para medir el tiempo de forma amistosa, para usar un cronómetro o un temporizador/cuenta atrás de forma sencilla. He refactorizado un poco el código (por eso he tardado en responderte). Para tus necesidades, podrías utilizarlo de la siguiente manera: Código
El código fuente (version actualizada y mejor refactorizada): Código
Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: #Aitor en 23 Septiembre 2015, 18:53 pm Siento haberte hecho modificar parte de tu código, pero mi nivel de programación es pésimo y no entiendo nada...
Estoy en shock (?) Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Eleкtro en 23 Septiembre 2015, 19:39 pm Siento haberte hecho modificar parte de tu código, pero mi nivel de programación es pésimo y no entiendo nada... Estoy en shock (?) La class TimeMeasurer que compartí, solo tienes que copiarla y pegarla en un nuevo archivo.vb, el archivo lo creas desde Visual Studio, Add Item -> Class, y ahí pegas todo el código tal cual lo puse. La class expone varios eventos, los que te interesan son TimeMeasurer.RemainingTimeUpdated y TimeMeasurer.RemainingTimeFinished, el primer evento se dispara al mismo tiempo que el Timer interno de la class tickea (el intervalo de actualización lo puedes modificar usando la propiedad TimeMeasurer.UpdateInterval), y el otro evento se dispara cuando la cuenta atrás llega a cero. Arriba te mostré un ejemplo de lo que acabo de mencionar respecto a cómo suscribirte a esos eventos y cómo usar la class en general, ¿hay algo que sigas sin entender?. Saludos! Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Lekim en 26 Septiembre 2015, 02:07 am Hola Aitor
Te explico, respondí a tu pregunta en el foro de VisualBasic, de hecho al final te decía que eso no era para .Net. así que he copiado la respuesta y ahora la pongo aquí (añadiendo alguna cosa). Veo que ya te ha respondido Elektro, pero él es un programador muy avanzado y a veces su código puede ser un poco difícil de entender como ya has mencionado. Yo soy más como tu así que no creo que tengas problemas para entender el mío. Código
No soy profesional pero sabía un poco sobre el tema porque hice un programa en el que tenía que ir restando días a partir de una determinada fecha. Así que he hecho esta otra forma. Creo que se puede simplificar más o hacer de otra manera. Ejemplo, la línea siguiente resta 3 días a la fecha 5/8/2015 y se obtiene 3/12/2015: Código
Esta otra obtiene la diferéncia en días, meses, años, horas, etc te sadrá valor negativo o postitivo dependiendo de si Date1 es anterior o posterior a Date2. En este caso obtiene días porque he puesto DateInterval.Day, si quieres meses tienes que poner DateInterval.Month, y así sucesivamente: Código
Espero que te sirva, sino para lo que quieres que sirva como ejemplo. Código
más info: https://msdn.microsoft.com/es-es/library/b5xbyt6f%28v=vs.90%29.aspx (https://msdn.microsoft.com/es-es/library/b5xbyt6f%28v=vs.90%29.aspx) Saludos Otra cosa, si quieres saber cuantos días tiene un mes de un determinado año usa: Código
Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Eleкtro en 26 Septiembre 2015, 19:48 pm Por si sirve de algo, he vuelto a refactorizar el código fuente para que se entienda mejor, ahora solo expongo UN solo evento al que podemos suscribirnos para obtener el tiempo transcurrido, el tiempo restante, y el tiempo límite o meta.
El ejemplo de arriba también lo he modificado, más simple que esto es imposible ya: Cita de: http://foro.elhacker.net/net/cuenta_regresiva_a_partir_de_una_fecha_vbnet-t441934.0.html;msg2040412#msg2040412 Código
Basicamente el código fuente que compartí encapsula todos los miembros necesarios para resolver el problema que tienes de una forma amistosa orientada a eventos xD. De todas formas si aun sigues sin saber cómo utilizarlo a pesar del ejemplo, o si por algún motivo prefieres no usar mi solución entonces ahí tienes la alternativa de @Lekim, aunque os aconsejo a los dos que cambieis los hábitos que están siguiendo ya que son perjudiciales para el aprendizaje, por ejemplo no es necesario la aplicación de operaciones aritméticas para calcular manualmente las horas, dias, minutos y demás, pueden usar las propiedades que expone un objeto TimeSpan o un objeto Date cómo mencioné al principìo!, con eso lo resolverían TODO sin complicarse. @Lekim, con tu permiso, te muestro como podrías simplificar para mejorar el código que compartiste: Código
(http://i.imgur.com/L61wEGC.png) También te recomiendo activar las declaraciones "Option" cuando programes bajo VB.Net, verias las decenas de fallos que cometiste en aquél código sin darte cuenta, sobre todo de casting. Otra recomendación que les hago, eviten CUALQUIER uso de los miembros expuestos en el namespace Microsoft.VisualBasic, cómo por ejemplo DateDiff, DateAdd, FormatDateTime, Len, Mid, etc, evitenlo todo sin excepción, todo eso es morralla rescatada de VisualBasic 6 para familiarizar a los que migran a VB.Net, aunque es puro código .Net pero no tan optimizado, así que deberían usar los equivalentes del resto de la librería de classes de .Net. Saludos! Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Lekim en 27 Septiembre 2015, 14:30 pm Hola Elektro. Gracias por el comentario
Citar También te recomiendo activar las declaraciones "Option" cuando programes bajo VB.Net He puesto Option Explicit On a principio de código pero no me muestra ningún fallo. Si que es cierto que hay variables sin uso pero es porque en un principio lo hice de una manera y luego lo cambié, porque en un prinicipio usaba la variable Dim Reloj24h As Object = "#23:59:59#" y lo le iba restando los segundos con Segundos -=1 y DateAdd pero caí en que no sería correcto decir que desde ahora hasta pasado mañana quedan 1 día y 23:59:59 a no ser que ahora mismo sean justo las 00:00:00 de la noche. Habría que descontar las horas desde las doce hasta la hora actual. Por eso anulé 'Dim SegundoMenos As Integer, pero aunque estaba, no se usaba. Simplemente lo dejé para que se viera esa opción de hacerlo así. Bueno, he corregido un poco el código ya que según la hora dabe error en CronoTime (línea 29) y he puesto Option Explicit On. Ejecuto el código y me va perfecto. En cuanto a la librería de classes de .Net me gustaría que me dijeras como encontrar lo que busco cuando quiero hacer algo porque con los miembros Microsoft.VisualBasic es fácil intuir como contruir el código, además que es muy directo. Es decir, quiero saber la diferencia de fecha lo puedo hacer sólo con una línea de código , pero NO con con las clases de .Net. que son mucho más rebuscadas, como su puede ver en tu conversión. Voy a analizar tu código a ver como se usan esas clases que pones. No hace falta que me las expliques ya experimento yo ;) También he visto que usas Shown en lugar de Load, ¿Cuál es la diferencia? saludos Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Eleкtro en 27 Septiembre 2015, 16:08 pm He puesto Option Explicit On a principio de código pero no me muestra ningún fallo. Pero no estás activando la opción de los casteos ni desactivando la inferencia de types, solamente activaste la declaración explícita de variables. Código
Pruébalo de nuevo y verás de lo que te hablaba. :P PD: Puedes activar por edefecto esas opciones para todos los proyectos/classes nuevos, en el menú Tools -> Options -> Projects and Solutions -> VB Defaults de Visual Studio. También he visto que usas Shown en lugar de Load, ¿Cuál es la diferencia? El evento Form.Shown se dispara cuando la ventana del Form se muestra. El evento Form.Load se dispara cuando el Form se carga (esto ocurre antes de mostrar la ventana). En el ejemplo de arriba lo usé por costumbre, nada relevante. En cuanto a la librería de classes de .Net me gustaría que me dijeras como encontrar lo que busco cuando quiero hacer algo Creo que no existe un artículo que especifique esos miembros equivalentes en la documentación de la MSDN, pero si que podemos encontrar esa tabla de miembros equivalentes en otras fuentes: ➢ Visual Basic 6 to .NET Function Equivalents (http://en.wikibooks.org/wiki/Visual_Basic_.NET/Visual_Basic_6_to_.NET_Function_Equivalents) Si lo que buscas no está ahí entonces siempre puedes formular una pregunta en el foro y con gusto te ayudaré. (pero en otro post. No hagamos demasiado offtopic en este hilo) con los miembros Microsoft.VisualBasic es fácil intuir como contruir el código, además que es muy directo. Nombres intuitivos si, pero solo eso. De todas formas los miembros que están fuera de ese namespace también son intuitivos, simplemente los desconocerás, pero intuitivos te aseguro que si lo son. La gente suele pensar que me quejo demasiado de este asunto en concreto, que no me tengo que obsesionar con tanta "perfección" en el rendimiento por que da igual usar un método u otro con argumentos como los que has expuesto de que "es más intuitivo" o etc, así que despues de esto no se ya que pensarán, pero bueno, supongo que es mi deber intentar defender los buenos hábitos de programación .Net xD. Para empezar, si aprendes a usar Microsoft.VisualBasic y te acostumbras a ello, en realidad no estás aprendiendo a usar .Net. Digamos que el Namespace Microsoft.VisualBasic es cómo el lenguaje Batch en programación, algo que está ahí, se le llama lenguaje, pero no se puede clasificar cómo lenguaje de programación realmente, pues eso mismo es el namespace Microsoft.VisualBasic, está ahí por cuestiones de compatibilidad, se puede usar siempre que lo necesites, pero lo mejor sería no utilizarlo por que no lo necesitas. Todo lo que existe en Microsoft.VisualBasic es un código menos optimizado y son miembros con menos overloads (sustitutos). En resumen, la funcionalidad es más limitada. Aparte, si vieras el código fuente (mediante reflection) verías que no es tan "directo" internamente hablando, hacen muchas vueltas y la mayoría de los métodos no se valen por si mismos así que en realidad son simples wrappers (gracias a dios) de los métodos optimizados de .Net, por ejemplo la función Microsoft.VisualBasic.Strings.Mid() (entre otras) en realidad se limitan a hacer unas evaluaciones irrelevantes del argumento y seguidamente llama a System.String.Substring(), vuelve a hacer las mismas evaluaciones del argumento (si. esto quiere decir que cuando llamas a Mid y a toda esa otra morralla, trabajan innecesareamente x2) y por último devuelve el valor que tenga que devolver, es quien hace el trabajo de verdad. Aquí puedes ver una referencia del código fuente de la librería de classes de .Net Framework: ➢ http://referencesource.microsoft.com/ (creo que es una referencia parcial) Saludos Título: Re: Cuenta regresiva a partir de una fecha (VB.Net) Publicado por: Lekim en 29 Septiembre 2015, 13:35 pm Gracias por la ayuda Elektro
He vuelto a retocar mi código y ahora creo que no tiene ningún error, excepto los del uso de los miembros de VisualBasic. Aunque no se puede considerar error, si no como dices una forma poco eficiente de programar en .NET. Tu información me va de perlas, de nuevo gracias ;-) |