El Sitio de Oscar Chevez Ulloa

Mi foto
San Salvador, El Salvador, El Salvador
Lic. Administración de Empresas Preespecialización en Tecnologìa de Información Analista Programador de Sistemas Servicios que Ofrece: * Capacitación Office * Lenguajes de Programación * Base de Datos * Consultorías de Sistemas (Análisis, Diseño e Implementación) * Asesoría de Tésis Otros Servicios: * Panadería y Pastelería por **Encargo** * Bisuteria y Artesanias

lunes, 4 de abril de 2011

Reloj Despertador

Uso de los siguientes objetos
Timer --> name: temporizador
ContexMenuStrip -- name: MenuContextPais
StatusStrip --> name: BarraDeEstado
ToolStrip --> name:BarraDeHerramientas
MenuStrip --> name: BarraDeMenus
___________________________________________
Opciones que contendrá el Menu: BarraDeMenus
  1. Archivo
    1. Abrir
    2. Guardar
    3. Salir
  2. Despertador
    1. Activar
  3. Pais
    1. Añadir
    2. Eliminar
  4. Ayuda
    1. A cerca de
 Codificación opciones del Menu
Opción Archivo / Abrir Evento: click

OpenFileDialog DlgAbrir = new OpenFileDialog();

DlgAbrir.InitialDirectory = Directory.GetCurrentDirectory();
DlgAbrir.Filter = "fichero binario (*.bin) *.bin";
DlgAbrir.FilterIndex = 1;
DlgAbrir.RestoreDirectory = true;
// Mostrar el diálogo Abrir
if (DlgAbrir.ShowDialog() == DialogResult.OK)
{
     // Eliminar la configuación inicialmnte establecida
     int ind;
     ind = ListaPaises.Count - 1;
     while (ind >= 0)
          {
               // Eliminar elemento de List, País y menú contextual
               EliminarPais(ind);
               ind -= 1;
          }

     // Obtener los datos del fichero
     Deseriar(DlgAbrir.FileName);
}

Opción Archivo / Guardar Evento: click


SaveFileDialog DlgGuardar = new SaveFileDialog();

DlgGuardar.InitialDirectory = Directory.GetCurrentDirectory();
DlgGuardar.Filter = "fichero binario (*.bin) *.bin";
DlgGuardar.FilterIndex = 1;
DlgGuardar.RestoreDirectory = true;

if (DlgGuardar.ShowDialog() == DialogResult.OK)
     {
          // Guardar los datos en el fichero
          Seriar(DlgGuardar.FileName);
     }

 
Opción Ayuda / A cerca de Evento: click

{

     string mensaje ="Reloj Despertador.V1.0" + Environment.NewLine + "Copyright (c)colocar su nombre";
     MessageBox.Show(mensaje, "Acerca de Reloj Despertador");
}

Creación de nuevo evento Obtener Datos
public List  ObtenerDatos()
{
     return ListaPaises;
}

Opción Despertador / Activar
if (!DespertadorActivado)
     {
          DespertadorActivar.Text = "Desactivar";
          btbarDespertador.ToolTipText = "Desactivar";
          DespertadorActivado = true;
     }
else
     {
          DespertadorActivar.Text = "Activar";
          btbarDespertador.ToolTipText = "Activar";
          DespertadorActivado = false;
     }

Opción Pais / Anadir
     // Actúa sobre el menú País y sobre el menú contextual

     DlgAgregarPais dlg = new DlgAgregarPais();
     if (dlg.ShowDialog() == DialogResult.Cancel) return;
          string sPais = dlg.ctPais.Text;
          long dDifH = ObtenerHora(dlg.ctDifHoraria);
          if (sPais.Length == 0 or dDifH == -1)
               {
                    MessageBox.Show("Datos no válidos");
                    return;
               }

          if (dlg.cvPorsNeg.Checked) dDifH = -dDifH;
               / Crear objeto Pais
               Pais unPais = new Pais(sPais, dDifH);
               / Añadir el objeto Pais al objeto List
               ListaPaises.Add(unPais);
               // Añadir elemento al menú País y al menú contextual
               AñadirPaisAMenu(sPais);


Opción Pais / Eliminar


// Actúa sobre el menú País y sobre el menú contextual

DlgBorrarPais dlg = new DlgBorrarPais();
// this (Form1) será el propietario de dlg

if (dlg.ShowDialog(this) == DialogResult.Cancel)
     return;

int indElemSelec = dlg.lsListaPaises.SelectedIndex;
if (indElemSelec == -1) return;
     // Eliminar el elemento seleccinado en el control lista
     dlg.lsListaPaises.Items.RemoveAt(indElemSelec);
     // Eliminar el elemento seleccinado en List, País y menú contextual
     EliminarPais(indElemSelec);

FUNCION DE USUARIO Eliminar Pais
private void EliminarPais(int ind)

{
     // Eliminar el elemento de índice ind en List
     ListaPaises.RemoveAt(ind);
     // Eliminar el elemento de índice ind en el menú País y en el contextual
     menuPais.DropDownItems.RemoveAt(3 + ind);
     MenuContextPais.Items.RemoveAt(3 + ind);
     if (menuPais.DropDownItems.Count == 3)
          {
               // No quedan más países. Ocultar los elementos Eliminar y Separador2
               PaisEliminar.Visible = false;
               Separador2.Visible = false;
               ContextPaisEliminar.Visible = false;
               ContextSeparador1.Visible = false;
          }
}

CODIFICACIÓN OBJETO TEMPORIZADOR EVENTO ELAPSED
private void Temporizador_Elapsed(System.Object sender, System.Timers.ElapsedEventArgs e)

{
     ctHora.Text = DateTime.Now.ToLongTimeString();
     ctHoraPais.Text = DateTime.Now.AddTicks(DiferenciaHoraria).ToLongTimeString();
    
     // Un tick (paso) = 100 nanosegundos
     long horaActual = DateTime.Now.TimeOfDay.Ticks / 10000000L; // en segundos
     lon horaDespertador = ObtenerHoraDespertador() / 10000000L; // en segundos

     //Debug.WriteLine(horaActual)
     //Debug.WriteLine(horaDespertador)
     if (DespertadorActivado && horaDespertador != -1)
     {
          if (horaActual < horaDespertador)
          {
               // Aun no ha llegado la hora de la alarma,
               // pero hay un caso especial en el que debe
               // sonar: acaba de ser medianoche, estamos en
               // los primeros minutos del día y la alarma
               // estaba puesta en los últimos minutos de ayer.

               if (horaDespertador - horaActual > 86400 - 300)
               {
                    Console.Beep();
               }
          }
     else
          {
               // La hora de la alarma ya ha pasado. Si hace mas
               // de cinco minutos, NO debe sonar. Si aun no han
               // transcurrido los cinco minutos, SI debe sonar.
               if (horaActual - horaDespertador < 300)
               {
                    Console.Beep();
               }
          }
     }
}

EVENTO OBTENER HORA
private long ObtenerHora(MaskedTextBox cajaTexto)
{
     // Obtener la hora de una caja de texto MaskedTextBox.
     // Si no se introducen al menos horas:minutos,
     // la función devolverá -1.
     char delim = ':';
     string[] hms;
     hms = cajaTexto.Text.Split(delim);

     if (hms.Length < 2) return -1;

     int horas = int.Parse(hms[0]);
     int minutos;
     int segundos;

     if (hms[1].Length != 0)
          {
               minutos = int.Parse(hms[1]);
          }
     else
          {
               minutos = 0;
          }

     if (hms.Length > 2 && hms[2].Length != 0)
          {
               segundos = int.Parse(hms[2]);
          }
     else
          {
               segundos = 0;
          }

     // Si la hora no es válida, la función devolverá -1
     if (horas < 0  OR horas > 23  OR minutos < 0  OR minutos > 59 OR segundos < 0 OR segundos > 59)
     {
          return -1; // hora no válida
     }

     return new TimeSpan(horas, minutos, segundos).Ticks; // hora válida
}


EVENTO OBTENER HORA DESPERTADOR
private long ObtenerHoraDespertador()
{
     // Obtener la hora del despertador en segundos.
     // Si no se introducen al menos horas:minutos,
     // la función devolverá -1

     return ObtenerHora(ctDespertador); // ticks
     }


EVENTO AÑADIR PAIS A MENU
private void AñadirPaisAMenu(string sPais)
{
     // Inicialmente hay 3 elementos (dos ocultos)
     if (menuPais.DropDownItems.Count == 3)
     {
          // Hacer visibles los elementos Eliminar y el separador
          PaisEliminar.Visible = true;
          Separador2.Visible = true;
          ContextPaisEliminar.Visible = true;
          ContextSeparador1.Visible = true;
     }
     // Crear un elemento
     ToolStripMenuItem elemento = new ToolStripMenuItem(sPais);
     ToolStripMenuItem contextElemento = new ToolStripMenuItem(sPais);
     // Especificar cuál será su controlador de eventos Click
     elemento.Click += new System.EventHandler(ElementoMenuPais_Click);
     contextElemento.Click += new System.EventHandler(ElementoMenuPais_Click);

     // Añadir el elemento al menú
     menuPais.DropDownItems.Add(elemento);
     MenuContextPais.Items.Add(contextElemento);
}


METODO ELEMENTO MENU PAIS
private void ElementoMenuPais_Click(System.Object sender, System.EventArgs e)
{
     // Controlador para los elementos del menú País y sobre del menú contextual
     ToolStripMenuItem elemento = (ToolStripMenuItem)sender;
     etPais.Text = elemento.Text;
     int ind = elemento.Owner.Items.IndexOf(elemento);
     Pais objPais = ListaPaises[ind - 3];
     DiferenciaHoraria = objPais.ObtenerDifHor();
}


EVENTO FORM CLOSING DEL FORMULARIO
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
     if (File.Exists("DifsHorsPredeterminado.bin"))
     {
          DialogResult respuesta;
          Respuesta = MessageBox.Show("¿Desea sobrescribir el fichero predeterminado?", "Seleccione una opción", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

          if (respuesta == DialogResult.No)
          {
               ArchivoGuardar.PerformClick(); // clic en Guardar
               return;
          }
     }
          Seriar("DifsHorsPredeterminado.bin");
}


EVENTO SERIAR
private void Seriar(string fichero)
{
     if (ListaPaises == null)
     {
          return;
     }
     Stream fs = File.Create(fichero);
     BinaryFormatter seriador = new BinaryFormatter();
     seriador.Serialize(fs, ListaPaises);
     fs.Close();
}


EVENTO LOAD DEL FORMULARIO
private void Form1_Load(object sender, EventArgs e)
{
     ListaPaises = new List();
     if (File.Exists("DifsHorsPredeterminado.bin"))
     {
          Deseriar("DifsHorsPredeterminado.bin");
     }
}


EVENTO DESERIAR
private void Deseriar(string fichero)
{
     Stream fs = File.OpenRead(fichero);
     BinaryFormatter deseriador = new BinaryFormatter();

     // Añadir los países a la lista
     ListaPaises = ((List)deseriador.Deserialize(fs));
     fs.Close();
     // Construir el menú País y el menú contextual
     Pais unPais;
     foreach (Pais tempLoopVar_unPais in ListaPaises)
     {
          unPais = tempLoopVar_unPais;
          AñadirPaisAMenu(unPais.ToString());
     }
}


FINALIZACIÓN CODIFICACIÓN DEL FORMULARIO PRINCIPAL


NOTA:
Verificar que existan los siguientes namespace
using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;



INICIO CODIFICACIÓN DE NUEVOS FORMULARIOS
PARA AGREGAR PAIS

PARA ELIMINAR PAIS

using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


namespace RelojDespertador
     {
          public partial class DlgBorrarPais : Form
          {
               public DlgBorrarPais()
               {
                    InitializeComponent();
               }

               private void DlgBorrarPais_Load(object sender, EventArgs e)
                    {
                         // Llenar la lista con los nombres de los países
                         List objListaPaises = ((Form1) this.Owner).ObtenerDatos();
                         Pais elemento;

                         foreach (Pais tempLoopVar_elemento in objListaPaises)
                              {
                                   elemento = tempLoopVar_elemento;
                                   lsListaPaises.Items.Add(elemento);
                              }
                    }
               }
     }

Reloj Sencillo

A continuación se coloca script para la generación de un Reloj Sencillo el cual hara uso del objeto timer


Definición de variables globales

private TimeSpan tAntes;

private TimeSpan tDespues;

Evento LOAD
tAntes = DateTime.Now.TimeOfDay;

Temporizador.Interval = 1; // milisegundo
 
private void Temporizador_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

{
     etHora.Text = DateTime.Now.ToLongTimeString(); // hora actual
     tDespues = DateTime.Now.TimeOfDay;
     Debug.WriteLine((tDespues - tAntes).Milliseconds + " mseg.");
     tAntes = tDespues;
}

NOTA:
Verificar que esten activos los siguientes NAMESPACE
using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;