モンドリィの自習室 - トップへ - 悶絶C#へ     

 C# について

  ● いわゆる覚え書き。自分が学んだことを忘れないように残しておこうと思います。

   ● 目次 ●

  ・ はじめに

  ・ String型をint型に変換するには?

  ・ String型を16進数のint型に変換するには?

  ・ String型(Unicode)をSJISに変換するには?

  ・ 今日の日付をDateTime型で取得するには?

  ・ 今日の日付をString型で取得するには?

  ・ DateTimeFormatInfoの形式指定文字列とは?

  ・ 書式設定あれこれ

  ・ フルパスからファイル名のみを取得するには?

  ・ フルパスからファイル名以外のパスを取得するには?

  ・ フォームサイズを最大化するには?

  ・ レジストリへデータを保存するには?

  ・ レジストリからデータを取得するには?

  ・ 二重起動を防止するには?

  ・ 部分文字列の取得

  ・ nullと""の違い

  ・ 先頭文字列が一致しているか判断する

  ・ テキストボックス(TextBox)に数字しか入力できないようにする

  ・ 正規表現:電子メールかをチェックする

  ・ 正規表現:○文字以上○文字以下かをチェックする

  ・ あとがき


 

 

  はじめに

   2002年春から、仕事で.NET環境での開発をすることになり、C#の勉強を始めました。

   勉強と言う実践の中で(コワッ)、忘れそうなものを覚書でまとめていきます。

 

  ご注意

  ※ 私が実行している環境は、VisualStudio.NET 2003 Enterprise Edition がインストールされています。

  ※ OSはWindows XP SP2 で、Microsoft SQL Server 2000がインストールされています。


 

String型をint型に変換するには?

  string型をint型に変換する時は、int.Parse(string) を使用します。

 ex)
 string StringOne = "1";
 int IntOne = int.Parse(StringOne);

 コーンソールアプリケーションによるソースコードはコチラ

 または、

 Convert.ToInt32(string) を使用します。

 ex)
 string strNum = "1234";
 int iNum = Convert.ToInt32(strNum);

 

 ※VisualStudio.NETを使用する事を前提としています。


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 職場のTさんより。06/03/23 まちさんより Convert.ToInt32()。

 記事作成日 : 2003/03/21

 記事最終更新日 :2006/03/23


 

 

String型を16進数のint型に変換するには?

 string型の文字列を16進数のint型として扱いたい時は、

 int.Parse(string, System.Globalization.NumberStyles.HexNumber) を使用します。

 ex)
 string StringHex = "fc";
 int Hex = int.Parse(StringOne, System.Globalization.NumberStyles.HexNumber);

 コーンソールアプリケーションによるソースコードはコチラ

 ※VisualStudio.NETを使用する事を前提としています。


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 職場のTさんより

 記事作成日 : 2003/03/21

 記事最終更新日 : 今のところなし


 

 

String型(Unicode)をSJISに変換するには? (文字コードのエンコーディング)  

 .NET Frameworkで扱われる文字列はUnicodeなので、int型のSJISコードに変換したい場合は、
 Unicode→SJISの変換となります。
 それを実現する方法として、まずstring型で取得したUnicodeの文字列を一度EUCにエンコーディ
 ングしてから バイト配列にし、それをint型にする方法を教わりました。
 詳しくはサンプルソースをご覧下さい。

 文字コードのエンコーディングにはEncoding.GetEncoding(string) を使用します。

 ex)
 Encoding euc = Encoding.GetEncoding("EUC-JP");

 コーンソールアプリケーションによるソースコードはコチラ

 ※VisualStudio.NETを使用する事を前提としています。


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 職場のTさんより

 記事作成日 : 2003/03/21

 記事最終更新日 : 今のところなし


 

今日の日付をDateTime型で取得するには?

.NET Frameworkのコレクションの中に、DateTime.Today と言うものがあります。
これによって本日の日付をDateTime型で簡単に取得する事が出来ます。

DateTime dt = DateTime.Today;


 このTIPSについてのコメントを送る

 関連情報 : 今日の日付をテキストで取得するには?

 学習先 : http://www.atmarkit.co.jp/fdotnet/index/bbs/index.html

 記事作成日 : 2004/01/14

 記事最終更新日 : 今のところなし


 

今日の日付をString型で取得するには?

DateTime.Today.ToString("D");

のようにすると、String型で取得する事が出来ます。

"D"の部分は、DateTimeFormatInfoの説明に詳しい事が書かれています。

説明によると"D"とは「LongDatePattern」(長い日付の値の形式パターン)

だそうです。つまり、2004/05/01 00:00:00 みたいな形式のことです(確か)。

 

例) 2004/05/01 と出力したい時
 string yyyymmdd.Text = DateTime.Today.ToString("yyyy/MM/dd");

例) 2004(年だけ)を表示したい時
 string yyyy.Text = DateTime.Today.ToString("yyyy");

例) 2004(年だけ)を表示したい時
 string mm.Text = DateTime.Today.ToString("MM");

例) 2004(年だけ)を表示したい時
 string dd.Text = DateTime.Today.ToString("dd");

※ 月の「MM」だけが大文字なのは、分を表すmmがあるせいだと思われます。

  また、MMとMを二つにすることで、一桁の月には、前にゼロがつきます。

  前にゼロをつけたくない場合は、「M」とすればOKです。


 このTIPSについてのコメントを送る

 関連情報 : 今日の日付をDateTime型で取得するには?

        DateTimeFormatInfoの形式指定文字列とは?

 学習先 : http://www.atmarkit.co.jp/fdotnet/index/bbs/index.html

 記事作成日 : 2004/01/14

 記事最終更新日 : 2005/03/20 寒い記述を発見したので修正。


 

DateTimeFormatInfoの形式指定文字列とは?

DateTime.Today.ToString("yyyy");

のようにすると、指定した形式で欲しいデータを取得する事ができます。

d その月の日付。1 桁の日付で、先行ゼロが付きません
dd その月の日付。1 桁の日には、先行ゼロが付きます
ddd AbbreviatedDayNames の定義に基づく、曜日の省略名
dddd DayNames の定義に基づく、曜日の完全名
M 月を表す数値。1 桁の月で、先行ゼロが付きません
MM 月を表す数値。1 桁の月には、先行ゼロが付きます
MMM AbbreviatedMonthNames の定義に基づく、月の省略名
MMMM MonthNames の定義に基づく、月の完全名
y

世紀を指定しない年 世紀を指定しない年が 10 未満の場合、その年は先行ゼロを付けずに表示されます

yy 世紀を指定しない年 世紀を指定しない年が 10 未満の場合、その年は先行ゼロを付けて表示されます
yyyy 世紀を含む 4 桁の年
gg 時期または時代 (年号) 形式指定される日付に、関連付けられた時期または時代 (年号) の文字列がない場合、このパターンは無視されます
h 12時間形式の時間 1桁の時刻で、先行ゼロが付きません
hh 12時間形式の時間 1桁の時刻で、先行ゼロが付きます
H 24時間形式の時間 1桁の時刻で、先行ゼロが付きません
HH 24時間形式の時間 1桁の時刻で、先行ゼロが付きます
m 分 1桁の分で、先行ゼロが付きません
mm 分 1桁の分で、先行ゼロが付きます
s 秒 1桁の秒で、先行ゼロが付きません
ss 秒 1桁の秒には、先行ゼロが付きます


 このTIPSについてのコメントを送る

 関連情報 : 今日の日付をDateTime型で取得するには?

 学習先 : ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpref/html/frlrfSystemGlobalizationDateTimeFormatInfoClassTopic.htm

 記事作成日 : 2004/01/14

 記事最終更新日 : 今のところなし


 

書式設定あれこれ

0:HH:mm:ss 時、分、秒、を2桁ずつ。先行ゼロが付きます
0:HH 時を2桁ずつ。先行ゼロが付きます
0:mm 分を2桁ずつ。先行ゼロが付きます
0:ss 秒を2桁ずつ。先行ゼロが付きます
0:D6 10進数の数字6桁、先行ゼロが付きます
*** *********
*** *********
*** *********


 このTIPSについてのコメントを送る

 関連情報 : http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconstandardnumericformatstrings.asp

 学習先 : http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconformattingoverview.asp

 記事作成日 : 2004/03/18

 記事最終更新日 : 今のところなし


 

フルパスからファイル名のみを取得するには?

  FileInfoクラスを利用する

    using System.IO;

    // 省略

    FileInfo fi = new FileInfo(fullname);
    string fileName = fi.Name;


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2004/04/14

 記事最終更新日 : 今のところなし


 

フルパスからファイル名以外のパスを取得するには?

  SubString() メソッド とLastIndexOf() メソッドを利用する

    // フルパスから、ファイル名以外のパスを取得する
    // SubString()で、「開始位置(引数1)」から「長さ(引数2)」のデータを取得する
    // LastIndexOf() メソッドで、最後の¥マークの位置を取得する


    string storage_space = fullname.Substring(0,fullname.LastIndexOf("\\")+1);


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2004/04/14

 記事最終更新日 : 今のところなし


 

フォームサイズを最大化するには?

    // 自分自身のフォームサイズを最大化

    this.WindowState = FormWindowState.Maximized;


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2004/04/22

 記事最終更新日 : 今のところなし


 

レジストリへデータを保存するには?

  レジストリへ、キーとともに記憶させたい文字列を保存する

 【 レジストリ保存用クラス 】

 using System;
 using Microsoft.Win32;

 namespace Mondry
 {
  public class Registry
  {
    public string Save(string company_name, string project_name, string app_name, string key, string data)
    { 
      RegistryKey rk;
      string subKey = "Software\\" + company_name + "\\" + project_name + "\\" + app_name;

      string res = "";

      try
      {
        rk = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(subKey);
        rk.SetValue(key, data);
      }
      catch(System.Exception se)
      {
        // レジストリ保存エラー(エラーの時はエラーメッセージを return する)
        res = se.Message;
        return res;
      }
      finally
      {
      }

      return res;
    }
 }

-----------------------------------------------------------------------------

 【 呼び出し側 】


 private void SaveRegistryData()
 {

   //  レジストリのHKEY_CURRENT_USERツリーに
   //  会社名, プロジェクト名, アプリケーション名と言う階層を作成し(または検索し)
   //  データをキー名で保存

   Registry reg = new Mondry.Registry();

   string company_name = "CompanyName"; // 会社名
   string project_name = "ProjectName"; // プロジェクト名
   string app_name = "ApplicationName"; // アプリケーション名
   string key = "KeyName"; // キー名
   string data = "保存用データ"; // 保存用データ

   string res = reg.Save(company_name, project_name, app_name, key, data);

   if (res != "")
   {
    // 例外発生
    MessageBox.Show("レジストリへの文字列保存に失敗しました:" + res,
       "レジストリ保存エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
 }


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2004/04/23

 記事最終更新日 : 今のところなし

 


 

レジストリからデータを取得するには?

  レジストリへ保存されている、キーと関連付けられた文字列を読み出す

 

 【 レジストリ読み出し用クラス 】

 using System;
 using Microsoft.Win32;

 namespace Mondry
 {
  public class Registry
  {
    public string Get(string company_name, string project_name, string app_name, string key, string default_value)
    {
      RegistryKey rk;
      string subKey = "Software\\" + company_name + "\\" + project_name + "\\" + app_name;

      string data = "";
      try
      {
        rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subKey);
        data = (string)rk.GetValue(key, default_value);
      }
      catch(System.NullReferenceException snre)
      {
        // レジストリデータが存在しない場合(初回作成時)はスローする
        data = default_value;
        return data;
      }
      catch(System.Exception se)
      {
        // レジストリ読み出しエラー(エラーの時は""のまま return する)
        return data;
      }
      finally
      {
      }

      return data;
    }
  }
}

-----------------------------------------------------------------------------

 【 呼び出し側 】


 private void GetRegistryData()
 {

   //  レジストリのHKEY_CURRENT_USERツリーから
   //  会社名, プロジェクト名, アプリケーション名と言う階層を検索し
   //  データをキー名で取得

   Registry reg = new Mondry.Registry();

   string company_name = "CompanyName"; // 会社名
   string project_name = "ProjectName"; // プロジェクト名
   string app_name = "ApplicationName"; // アプリケーション名
   string key = "KeyName"; // キー名
   string default_value = "既定値";// データが存在しなかった場合の代用値

   string data = reg.Get(company_name, project_name, app_name, key, default_value);

   // 取得文字列格納場所
   string SetData;

   if (data != "")
   {
      SetData = data;
   }
   else
   {
      // 例外発生
      MessageBox.Show("レジストリに保存された文字列の読み出しに失敗しました",
                  "レジストリ読み出しエラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
 }


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2004/04/23

 記事最終更新日 : 今のところなし


 

二重起動を防止するには?

  二重起動の防止が考慮された岡部さんのコード

【 二重起動防止を考慮された起動時の処理 】

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;

namespace StartUp
{
 /// <summary>
 /// Form1 の概要の説明です。
 /// </summary>

 public class fStartUp : System.Windows.Forms.Form
 {
  /// <summary>

  /// 必要なデザイナ変数です。
  /// </summary>

  private System.ComponentModel.Container components = null;

  public fStartUp()
  {
   //
   // Windows フォーム デザイナ サポートに必要です。
   //

   InitializeComponent();
   //
   // TODO: InitializeComponent 呼び出しの後に、コンストラクタ
   //
コードを追加してください。
   InitializeApplication();
  }

  /// <summary>
  /// 使用されているリソースに後処理を実行します。
  /// </summary>

  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  【フォーム デザイナで生成されたコード】(省略)

  private System.Windows.Forms.Label label1;

  /// <summary>
  /// Initialize結果判定用
  /// </summary>

  private bool isInit = false;

  /// <summary>
  /// アプリケーションのメイン エントリ ポイントです。
  /// </summary>

  [STAThread]
  static void Main()
  {
   // Windows XP のビジュアルスタイルを有効にする
   Application.EnableVisualStyles();

   // Mutexインスタンス作成
   Mutex m = new Mutex(false, "Application");

   // 二重起動防止
   if (m.WaitOne(0, false))
   {
    // Formインスタンス作成
    using (fStartUp f = new fStartUp())
    {
     // Initializeが正常終了していればRun
     if (f.isInit)
     {
      Application.Run(f);
     }
    }

    // Mutex開放
    m.ReleaseMutex();
   }
   else
   {
    MessageBox.Show ("既に起動されています。",
     "Application", MessageBoxButtons.OK,
      MessageBoxIcon.Exclamation);
   }

   // MutexをClose
   m.Close();
  }

  private void InitializeApplication()
  {
   // Applicationの起動処理(非機能用件)
   // 異常終了時はReturn
   // 正常終了時は最後まで実行

   // Initialize成功
   this.isInit = true;
  }
 }
}


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 株式会社 コアクリエイトシステム 岡部 充さん がC# UsersGroupMLに投稿されたコード。

       岡部 充さん の許可を頂いて掲載しています。

 記事作成日 : 2004/10/12

 記事最終更新日 : 2004/11/05 岡部さんより新しいコードを頂いたのでコードを修正しました。


 

部分文字列の取得

  SubString()メソッドを使って、String型のデータから部分的に文字列を取得する。

    // String型の変数 data の 0バイト目から4バイトを変数 a に取得

    string a = data.Substring(0, 4);

 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2005/03/20

 記事最終更新日 : 今のところなし

 


 

nullと""の違い

  null は、オブジェクトが存在しないことを表し、 "" (空文字)は、長さゼロの文字列のオブジェクト。

  ※最初の頃、似たような結果のこの2つの違いがよく分からなくて不思議だった(^_^;


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2005/06/08

 記事最終更新日 : 今のところなし

 


 

先頭文字列が一致しているか判断する

  StartsWith()メソッドを使って、String型のデータの先頭文字列が指定文字列と一致しているかを判断する。

    // ファイル名の先頭が指定した文字列と一緒かどうかを判断する

    FileInfo fi = new FileInfo("C:\\file.di");

    string file = "C:\\file.di01a";

    if (file.StartsWith(fi.Name))
    {
     // 先頭が一致した時の処理
    }


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2005/06/18

 記事最終更新日 : 今のところなし


 

TextBoxに数字しか入力できないようにする

  TextBoxに数字のみの入力を許可し、他の文字の入力は認めないようにする。

  1. TextBoxのImeModeプロパティ を Disable にしてIMEを無効化する。

  2. KeyPressイベントを作成し、以下のように記述する



    // テキストボックスに数字しか入力できないようにする

    private void TextBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        if (e.KeyChar < '0' || e.KeyChar > '9')
        {
            e.Handled = true;
        }
    }


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : 今のところなし

 記事作成日 : 2005/07/07

 記事最終更新日 : 今のところなし


 

正規表現:電子メールかをチェックする

  Regex.IsMatch メソッドを使用して、文字列が電子メールの形式であるかを検証する。


    using System.Text.RegularExpressions;

    // (中略)

    // 電子メール形式でない時は false を返すメソッド
    private bool IsValidEmailFormat(string email)
    {
      return Regex.IsMatch(email,
        @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
    {


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : .NET Framework 開発者ガイド .NET Framework の正規表現

 記事作成日 : 2005/09/03

 記事最終更新日 : 今のところなし


 

正規表現:○文字以上○文字以下かをチェックする

  Regex.IsMatch メソッドを使用して、文字列が電子メールの形式であるかを検証する。


    using System.Text.RegularExpressions;

    // (中略)

    // 名前が2文字以上20文字以下の範囲に無い場合は false を返すメソッド
    private bool IsValidNameFormat(string name)
    {
      // 電子メール形式の時はtrue を返す
      return Regex.IsMatch( name, ".{2,20}");
    {


 このTIPSについてのコメントを送る

 関連情報 : 今のところなし

 学習先 : .NET Framework 開発者ガイド .NET Framework の正規表現

 記事作成日 : 2005/09/04

 記事最終更新日 : 今のところなし

 


 

  あとがき

   記事作成日 : 2004/09/03

   記事最終更新日 : まだない。

   内容的におかしいところ、見づらい個所(色使い)などございましたらご指摘ください。

   同じようにC#.NETを利用されている方からの苦労話も大歓迎です。

 

     モンドリィの自習室 - トップへ - 悶絶C#へ