DLL
Børre Stenseth
Moduler>Assemblies>Visere

Viserberegning

Hva
Et bibliotek for å regne ut viserposisjoner

Hensikten er å lage en assembly, DLL, som beregner hvordan viserne skal stå på en klokke for et bestemt klokkeslett.

Du vi se av koden nedenfor at det er lagt til flere funksjoner for å finne vinkler. Du finner et sett med metoder som beregner vinkler ut fra tiden nå og ett sett med metoder som beregner vinkler ut fra et gitt tidspunkt. Dessuten finner du to metoder som gir tiden i formen hh:mm:ss, en for nå og en for en gitt tid.

using System;
using System.Collections.Generic;
using System.Text;
namespace clockarms
{
    /// <summary>
    ///     Calculate analog angles for a clock.
    ///     Second-arm is not incremented within a second
    /// </summary>
    public class TimeAngle
    {
        private static float sec_angle(DateTime dt)
        {
            return -(360.0f * ((float)dt.Second / 60.0f) - 90.0f);
        }
        private static float min_angle(DateTime dt)
        {
            return -(360.0f * ((float)dt.Minute / 60.0f) - 90.0f);
        }
        private static float hour_angle(DateTime dt)
        {
            return -(360.0f / 12.0f *
                    ((float)dt.Hour +
                     ((float)dt.Minute) / 60.0f) - 90.0f);
        }
        /// <summary>
        ///     Secondspart of current time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float SecondAngleNow
        {
            get { return sec_angle(DateTime.UtcNow.ToLocalTime()); }
        }
        /// <summary>
        ///     Secondspart of given time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float SecondAngle(DateTime dt)
        {
            return sec_angle(dt);
        }
        /// <summary>
        ///     Minutespart of current time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float MinuteAngleNow
        {
            get { return min_angle(DateTime.UtcNow.ToLocalTime()); }
        }
        /// <summary>
        ///     Minutespart of given time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float MinuteAngle(DateTime dt)
        {
            return min_angle(dt);
        }

        /// <summary>
        ///     Hoursspart of current time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float HourAngleNow
        {
            get { return hour_angle(DateTime.UtcNow.ToLocalTime()); }
        }
        /// <summary>
        ///     Hoursspart of given time converted 
        ///     to degrees on an analog clock
        /// </summary>
        public static float HourAngle(DateTime dt)
        {
            return hour_angle(dt);
        }
        ///<summary>
        /// All angles at current time as ref variables
        ///</summary>
        public static void AllAnglesNow(ref float sAngle, 
            ref float mAngle, 
            ref float hAngle)
        {
            sAngle = HourAngleNow;
            mAngle = MinuteAngleNow;
            hAngle = HourAngleNow;
        }
        ///<summary>
        /// All angles at given time as ref variables
        ///</summary>
        public static void AllAnglesNow(DateTime dt, 
            ref float sAngle, 
            ref float mAngle, 
            ref float hAngle)
        {
            sAngle = HourAngle(dt);
            mAngle = MinuteAngle(dt);
            hAngle = HourAngle(dt);
        }

        /// <summary>
        ///     Current time as hh:mm:ss
        /// </summary>
        public static String DigitalFormNow
        { get { return DateTime.UtcNow.ToLocalTime().ToLongTimeString(); } }
        /// <summary>
        ///     Given time as hh:mm:ss
        /// </summary>
        public static String DigitalForm(DateTime dt)
        { return dt.ToLongTimeString(); }
    }
}

Den kompilerte versjonen av denne, clockarms.dll, må koples til ditt prosjekt i Visual Studio dersom du skal eksperimentere med dette klokkeviserbiblioteket. Dette gjøres ved å høyreklikke på References i Solution Explorer-vinduet i Visual Studio og velge "Add Reference..". Det kommer da opp en dialogboks som gir deg noen valg. Du kan enten velge fra lista over assemblies som er registrerte som system globale eller i dette tilfellet må du browse til den katalogen der du har plassert clockarms.dll.

Det er også mulig å arbeide med både "brukerprogrammet", f.eks. klokkeprogrammet beskrevet i modulen Klokke, og dll-fila i samme prosjekt. Du kan ganske enkelt åpne et prosjekt til og si at du ikke vil lukke det som er åpent i øyeblikket.

Referanser
  • DLL-prosjektet:
    https://svn.hiof.no/svn/psource/Csharpspikes/clockarms
Vedlikehold

B.Stenseth, revidert desember 2006

(Velkommen) Moduler>Assemblies>Visere (Alarmklokke)