ホチキス先生の「プログラマーと呼ばれたい」

InfoPath & SQL Server !

Archive for the ‘Microsoft Visual Studio 2017’ Category

C# – 教科「情報」の授業で使うタイピングトレーニングのソフトを作っています。その 6。テキストボックスをリッチテキストボックスに変更。フォントサイズを変えることができるようにした。

leave a comment »

授業でタイピング練習をすると同時に、アジャイル的なアプリケーションの開発の実際を体験する目的で、自作のタイピングソフトを作って改良を重ねている。今回はやや大きめの変更を加えた。

ひとつは、例題に対して自分が入力した文字のどこが間違ったかを「〇〇文字目」と表示していたのだが、実際に間違った文字の色を変えるなど直感的にわかるようにしてほしい、という生徒からの要望だ。これは、たしかに、わかる。しかしテキストボックスでは文字装飾に限界があるので、テキストボックスをリッチテキストボックスに変更し、間違った文字の BackColor を変えるようにした。

間違った文字の位置は、文字列の比較で myStrCount に入っているので、それを利用して次のようなコードになる。

—————————————————————————————–

//スコアの値から間違った文字を赤く変える
richTextBox1.Select(myStrCount, 1);
richTextBox1.SelectionBackColor = Color.Red;

—————————————————————————————–

もうひとつの要望は、文字の大きさが小さいので自分で適度な大きさに変更できるようにしてほしい、というものだった。これもいいフィードバックだ。

そこでフォームに 2 つのボタンとトラックバー、文字の大きさのサンプルテキストボックスを加えた。ボタンにはフォントサイズを 1 ポイントずつ増減するコードを書き、フォントサイズの下限を 1、上限を 30 としてトラックバーを連結した。コードは次の通りだ。

—————————————————————————————–

int myFontSize; // フォントサイズを変数にする

// フォントサイズを増やすボタン
private void buttonFontSizeUp_Click(object sender, EventArgs e)
{
    myFontSize++;
    if(myFontSize > 30)
     {
        myFontSize = 30;
    }
    myFontSizeChange();
}

// フォントサイズを下げるボタン
private void buttonFontSizeDown_Click(object sender, EventArgs e)
{
    myFontSize–;
    if(myFontSize <1)
    {
        myFontSize = 1;
    }
    myFontSizeChange();
}

// フォントサイズを変更するメソッド
private void myFontSizeChange()
{
     textBox2.Font = new Font("MS UI Gothic", myFontSize);
    richTextBox1.Font = new Font("MS UI Gothic", myFontSize);
    textBoxFontSize.Text = myFontSize.ToString();
    trackBar1.Value = myFontSize;
}

// トラックバーのスクロールイベントに対するメソッド
private void trackBar1_Scroll(object sender, EventArgs e)
{
    myFontSize = trackBar1.Value;
    myFontSizeChange();
}

—————————————————————————————–

textInputProgram_006

textInputProgram_007_mid_640_480

C# – 教科「情報」の授業で使うタイピングトレーニングのソフトを作っています。その 5。ユーザー ID を Active Directory から取得するようにした。

leave a comment »

教科「情報」の授業でタイピングソフトを自作して生徒実習をしている。このねらいは 2 つある。ひとつは、実際に使いやすいソフトウエアを使いたい、ということがある。特に生徒の実習データを Microsoft Flow に送信して集計しやすくする、ということがある。もう一つの目的は、ソフトウエア開発の実際を生徒に見せたい、ということだ。

いわゆる「ウォーターフロー型」の開発には限界があることが多く指摘されている。現代的なソフトウエア開発環境を最大限に活用するには、アジャイルと呼ばれる開発スタイルが望ましい。そこで教科「情報」の授業で自分が作ったソフトウエアを生徒に使わせながら、問題点や改善点を指摘させて次のバージョンに適用する、という手法でソフトウエア開発の実際を間接的に体験させるのだ。

そのためには、最初から完成されたソフトウエアを使わさない。最初はごく基本的な仕組みだけ作ったソフトウエアを使わせ、問題点や改善点を指摘することを演習とする。

様々な意見が生徒から出て興味深いのだが、これはまた別項でまとめることにする。今回のマイナーバージョンアップでは「学籍番号を入力するのが面倒だ」と「学籍番号を全角で入力してしまう間違いがおこる」ことを回避することを考えた。これは、システム管理をやっている者には常識的な実装になるが、ユーザー ID を Active Directory から取得することだ。これは一行のコードで実現できる。

——————————————————————————————-

myUserName = Environment.UserName;

——————————————————————————————-

そして取得したユーザー ID を gakuseID テキストボックスに表示する。

——————————————————————————————-

gakuseID.Text = myUserName;

——————————————————————————————-

ちゃんと取得することが確認できれば、学籍番号のテキストボックスの Enabled プロパティを false にし、書き換えられないようにする。

——————————————————————————————-

gakuseID.Enabled = false;

——————————————————————————————-

これで学生番号は間違いなく処理されるようになる。

C# – 教科「情報」の授業で使うタイピングトレーニングのソフトを作っています。その 4。いつでも終了、開始ができるボタンのインタフェースを制御した。

leave a comment »

教科「情報」の授業で使うタイピングトレーニングのソフトを作っている。ここでマイナーチェンジをしたのは、ボタンの有効状態を制御したところだ。たとえば、次の画面は文字入力をトレーニングして「終了」のボタンを押し、かかった時間とスコアを表示したところだ。

textInputProgram_001_mid_640

ところがこの状態で「開始」のボタンが有効になっている。そこでこのまま「開始」をクリックして「終了」をクリックすると、一字も入力することなく結果が出てしまう。

textInputProgram_002_mid_640

そこで「開始」ボタンを押す前は「終了」と「リセット」を無効にし、「開始」ボタンを押せば「開始」ボタンは無効となり「終了」ボタンが有効になり、「終了」ボタンを押せば「終了」ボタンは無効となり「リセット」ボタンが有効となる、といったようにボタンの有効無効を制御することにした。

まずフォームの初期化で「終了」ボタンと「リセット」ボタンを無効にしておく。

——————————————————————————————

btnEnd.Enabled = false; //終了ボタンを無効にする
btnClear.Enabled = false; //クリアボタンを無効にする

——————————————————————————————

次に「開始」ボタンのクリックイベントで「開始」ボタンを無効にし「終了」ボタンを有効にする。

——————————————————————————————

btnStart.Enabled = false; //開始ボタンを無効にする
btnEnd.Enabled = true; //終了ボタンを有効にする

——————————————————————————————

そして「終了」ボタンのクリックイベントで「終了」ボタンを無効にし「クリア」ボタンを有効にする。

——————————————————————————————

btnStart.Enabled = false; //スタートボタンを無効にする
btnClear.Enabled = true; //リセットボタンを有効にする

——————————————————————————————

最後に「クリア」ボタンのクリックイベントで「クリア」ボタンを無効にし「開始」ボタンを有効にする。

——————————————————————————————

btnClear.Enabled = false; //クリアボタンを無効にする
btnStart.Enabled = true; //スタートボタンを有効にする

——————————————————————————————

これでボタンの有効無効管理ができた。

textInputProgram_003_mid_640

textInputProgram_004_mid_640

textInputProgram_005_mid_640

さて、このような制御をどこまですればよいのだろうか。それはプログラムを誰がどのように使うのかにかかっている。たとえばこのソフトウエアが、自分で文字入力のトレーニング結果を知りたいために使うのならば、このような制御を考える必要はないのかもしれない。自分の力を知るために「ずる」をする意味がないからだ。しかし、たとえば学校の授業で先生が生徒に課す場合は、少しでもよい結果を出すために「ずる」をしようと考える生徒がいるかもしれない。

そのことを考えると、たとえばテキストを別に入力しておき、ペーストするような「ずる」も考えられるかもしれない。使いやすさと同時に、想定外の利用をされないように考えることは、ソフトウエアの本来の機能とはまた別に、ソフトウエア開発のテーマである。

C# プログラミング – Visual Studio 2017 で作る Windows Form アプリケーションで起動時にテキストファイルを読み込む。

leave a comment »

教科「情報」の「情報の科学」の授業で、定期的に文字入力のトレーニングをするための簡単なプログラムを作っている。あらかじめ登録されたテキストと同じテキストをテキストボックスに入力し、正しく入力できたか、何文字入力したか、入力にかかった時間は何分何秒か、を記録するトレーニングツールだ。

文字入力トレーニングソフトの画面_mid_640

フォームのイメージはこんなかんじ。テキストボックスは「開始」のボタンが押されるまでは使えないようにしておき、「開始」で時間を計測する。「終了」で時間の計測を終え、入力できた文字列を評価する。

このプログラムを生徒に配布するのだが、入力原稿に相当するテキストを、その都度プログラム内に保存しなければならない。このとき、原稿テキストをテキストファイルにしておき、プログラムを起動するときに読み込むようにした。テキストファイルはプログラムと同じフォルダに置いてもいいが、ファイルが丸見えでは触られてしまう可能性が高いので「settings」フォルダの下に入れることとした。

文字入力トレーニングソフトの画面_002_mid_640_480

プログラムでテキストファイルを読み込むコードは次のとおりだ。

—————————————————————————-

myFileName = @"settings\inputtext.txt"; //テキストファイルの場所を示す
enc = System.Text.Encoding.GetEncoding("shift_jis"); //エンコーディングを指定

//テキストファイルの読み込み
try
{
    myInputTextString = System.IO.File.ReadAllText(myFileName, enc);
}
catch
{
    MessageBox.Show("テキストファイルがありません");
}

—————————————————————————-

これで、生徒にプログラム本体とテキストファイルが入った「settings」フォルダを一緒に配布すればいい。

C# – 文字列を比較するアルゴリズムについて考える(1) – 2つの文字列を前から順に比較し、違いがあった位置を見つけるアルゴリズム

leave a comment »

学校の授業で文字入力のトレーニングをするために、効果的なアプリケーションを作っている。ここで必要な実装として文字列比較がある。

仕様、というか、個人で作るアプリケーションなので厳密な仕様は決めないが、イメージ的にはこうだ。入力トレーニングの元になる文がある。この文は、フォントやポイント、文字飾りなどは無視し、単にテキスト文字列だけのものとする。つまり単なるテキスト文とする。この文と同じ文をキーボードから入力するトレーニングとし、入力にかかった時間と入力できた文字数をカウントしてスコアとする。このとき、入力を間違ったことを評価に加えたい、というものだ。

すぐに思いつくのは、文字列を前から順番に比較し、違いがあったら位置を見つけ出すアルゴリズムだ。2つの文字列が myStr1 と myStr2 に入っており、2つの文字列の長さが同じだとする。

——————————————————————

for (int i = 0; i < myStr1.Length; i++)
{
    if (myStr1[i] != myStr2[i])
    {
        myStrDiff = i;
        break;
    }
}

——————————————————————

前から順に比較し、違いがあった文字でループを抜ける。前から何文字目であったかが myStrDiff に数字として入る。この数字は 0 から始まるので、実際は +1 文字目に違いがあった、となる。これだと、たとえば次のようになるだろう。

myStr1 = "あいうえおかきくけこ";
myStr2 = "あいうえおまきくけこ";

このとき、myStrDiff の値は 5となる。前から 6文字目に違いがあるからだ。しかし、「か」を「ま」と間違えてはいるが、そのあとはちゃんと入力できている。つまり「5文字目までしか間違いなく入力できなかった」のではなく「6文字目だけ間違えたが、それ以外はちゃんと入力できた」はずだ。つまり、このように評価すべきだろう。

入力すべき文字列 ・・・ あいうえおかきくけこ
実際の入力1 ・・・・・ あいうえおかきくけこ (評価10点:満点)
実際の入力2 ・・・・・ あいうえおまきくけこ (評価9点:1文字だけ間違った)
実際の入力3 ・・・・・ あいうえおまみむめも (評価5点:5文字間違った)

つまり、間違った文字以降をどう再判定するか、を考えなければならない。このアルゴリズムについて引き続き考えていきたい。

C# – 文字列を比較する(5)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreSymbols オプションで $%&!#'()*?<>^~-+ の特殊記号やスペースを無視して評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreSymbols オプションがある。このオプションを使うと、$ や %、# などの特殊記号やスペースを無視して文字列を評価できる。まず IgnoreSymbols オプションを使わない例だ。次の例では文字列に特殊記号やスペースが入っているので「違う」と評価する。

——————————————————————–

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

しかし次のように System.Globalization.CompareOptions の IgnoreSymbols オプションを使うと、同じと評価する。

——————————————————————–

string a = "あいうえお";
string b = "あ$い%う&え  お!#'()*?<>^~-+";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreSymbols) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

C# – 文字列を比較する(4)– System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare クラスの System.Globalization.CompareOptions の IgnoreKanaType オプションでカタカナとひらがなを同じに評価する。

leave a comment »

System.Globalization.CompareOptions には IgnoreKanaType オプションがある。このオプションを使うと、カタカナとひらがなを同じとして評価できる。まず IgnoreKanaType オプションを使わない例だ。次の例ではカタカナとひらがなを「違う」と評価する。

——————————————————————–

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare(a, b) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–

次に IgnoreKanaType オプションを使った例を示す。この例ではカタカナとひらがなを「同じ」と評価する。

——————————————————————–

string a = "アイウエオ";
string b = "あいうえお";
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.Compare
(コードの続き)(a, b, System.Globalization.CompareOptions.IgnoreKanaType) ==0)
    textBox1.Text = "同じ";
else
    textBox1.Text = "違う";

——————————————————————–