Calender

Visual Studio 2019 を使って TextBox から生年月日をタイプして生存日数を表示します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. Windows 10 & Visual Studio 2019 の環境で C# の Store Application を試します。
    C# には partial class(兄弟 Class) と言う便利な機能があるので、これを使って開発します。
    Partial を宣言した同じ名前の Class は一つにまとめられます。
    MainPage は規定値で Partial が宣言されています。
    今回は MainPage.xaml.cs と yymmdd.cs を partial class とします。
  2. Visual Studio を起動して [Visual C#][Windows][空白アプリ(ユニバーサル Windows)]を選びます。
    生年月日をタイプする TextBox と Button と生存日数を表示する TextBox を貼り付けて下さい。
        <Grid>
            <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="40,60,0,0" Text="TextBox"
                VerticalAlignment="Top" Height="40" Width="130"/>
            <Button x:Name="button" Content="Button" Margin="230,60,0,0" VerticalAlignment="Top" Click="Button_Click"/>
            <TextBox x:Name="textBox1" HorizontalAlignment="Left" Margin="360,60,0,0" Text="TextBox"
                VerticalAlignment="Top" Height="40" Width="120"/>
        </Grid>
    
  3. MainPage.xaml.cs を修正します。
    Button を選択してボタンクリックのイベントハンドラーを設定して下さい。
    Debug.Write を使うので using System.Diagnostics; を宣言します。
    MTBL[] は大の月と小の月のテーブルです。
    m_ymd[] には TextBox からタイプ入力された年月日を切り分けて格納します。
    yy, mm, dd; は年月日を数値にする領域で、Constructor では今日の日付を設定して Today に西暦1年1月1日から今日までの通算日数を計算します。
    cnt が誕生から何日たったかを計算する領域です。

    Button_Click() では textBox にタイプされた生年月日を取得して ymd() 関数で切り分けて m_ymd に格納します。
    m_ymd を数値に変換して西暦1年1月1日から誕生日までの通算日数を計算します。
    今日までの通算日数と誕生日までの通算日数の差が誕生から何日たったかの値です。
    using System.Diagnostics;
        ・・・
        public sealed partial class MainPage : Page
        {   static int[] MTBL = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
            string[] m_ymd;
            int     yy, mm, dd;
            int     Today, cnt;
    
            public MainPage()
            {
                this.InitializeComponent();
                yy= DateTime.Today.Year;
                mm= DateTime.Today.Month;
                dd= DateTime.Today.Day;
                Today = Days(yy, mm, dd);
                Debug.WriteLine("yy={0}  mm={1}  dd={2}  Today={3}", yy,mm,dd,Today);  
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                String str;
                str = textBox.Text;
                textBox1.Text = str;
                ymd(str);
                yy = int.Parse(m_ymd[0]);
                mm = int.Parse(m_ymd[1]);
                dd = int.Parse(m_ymd[2]);
                cnt = Today - Days(yy, mm, dd) + 1;
                textBox1.Text = cnt.ToString();
            }
        }
    
  4. MainPage と兄弟クラスの yymmdd.cs です。
    二つのファイルは一つにまとめられるので、関数や領域を共通して参照出来ます。
    ymd() 関数で年月日を切り分けて m_ymd に格納します。
    C# では str.Split() 関数が使えるので正味1行です。
    Days() 関数で西暦1年1月1日からの通算日数を調べます。
    Uruu() 関数で閏年を調べます。
    namespace App1
    {
        public partial class MainPage
        {
            //yyyy/mm/dd を切り分けて m_ymd に格納する
            private void ymd(string str)
            {   m_ymd= str.Split(new char[] {'/', '-'});
            }
            // 西暦1年1月1日からの通算日数を調べる関数
            private int Days(int yy, int mm, int dd)
            {   int w;
                w = (yy-1)*365;     //年*365
                w += (yy/4 - yy/100 + yy/400 + MTBL[mm-1] + dd);
                if (mm<3 && Uruu(yy))  w--;
                return(w);
            }
            // 閏年を調べる関数
            private bool Uruu(int year)
            {   if (year%400L==0L)  return(true);
                if (year%100L==0L)  return(false);
                if (year%4L==0L)    return(true);
                return(false);
            }
        }
    }   
    
  5. StoreC++ でも同様のプログラム Calender を作成しています。
    C++ のプログラムは String^ と Array が非力なのとネイティブクラスを使っているので初心者には難しいかも知れません。
    C++ の Partial Class は Partial Class を参照して下さい。

超初心者のプログラム入門(C# Frame Work)