開発環境
- OS: Windows 10 Pro
- IDE(統合開発環境): Visual Studio Community 2017
Head First C# ―頭とからだで覚えるC#の基本 (Andrew Stellman (著)、Jennifer Greene (著)、佐藤 嘉一 (監修, 監修)、木下 哲也 (翻訳)、オライリージャパン)の8章(例外処理 - 消火は時代遅れ)、エクササイズ(p. 373)を取り組んでみる。
コード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace WindowsFormsApp21
{
public partial class Form1 : Form
{
private Excuse currentExcuse = new Excuse();
private bool formChanged = false;
private string selectedPath = "";
private Random random = new Random();
public Form1()
{
InitializeComponent();
save.Enabled = false;
open.Enabled = false;
randomExcuse.Enabled = false;
currentExcuse.Description = description.Text;
currentExcuse.Results = results.Text;
currentExcuse.DateTime = lastUsed.Value;
}
[Serializable]
public class Excuse
{
private string description;
private string results;
private DateTime dateTime;
private string excusePath;
public Excuse()
{
excusePath = "";
}
public Excuse(string filename)
{
openFile(filename);
}
public Excuse(Random random, string path)
{
string[] files = Directory.GetFiles(path, "*.excuse");
string file = files[random.Next(files.Length)];
openFile(file);
}
public string Description
{
get { return description; }
set { this.description = value; }
}
public string Results
{
get { return results; }
set { this.results = value; }
}
public DateTime DateTime
{
get { return dateTime; }
set { this.dateTime = value; }
}
public string ExcusePath
{
get { return excusePath; }
}
public void openFile(string excusePath)
{
this.excusePath = excusePath;
using (Stream input = File.OpenRead(excusePath))
{
BinaryFormatter formatter = new BinaryFormatter();
Excuse excuse = (Excuse)formatter.Deserialize(input);
description = excuse.description;
results = excuse.results;
dateTime = Convert.ToDateTime(excuse.dateTime);
}
}
public void save(string filename)
{
using (Stream output = File.Create(filename))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(output, this);
}
this.excusePath = filename;
}
}
private void UpdateForm(bool changed)
{
if (!changed)
{
this.description.Text = currentExcuse.Description;
this.results.Text = currentExcuse.Results;
this.lastUsed.Value = currentExcuse.DateTime;
if (!string.IsNullOrEmpty(currentExcuse.ExcusePath))
{
fileDate.Text =
File.GetLastWriteTime(
currentExcuse.ExcusePath).ToString();
}
this.Text = "口実マネージャ";
}
else
{
this.Text = "口実マネージャ*";
}
this.formChanged = changed;
}
private void folder_Click(object sender, EventArgs e)
{
folderBrowserDialog1.SelectedPath = selectedPath;
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
selectedPath = folderBrowserDialog1.SelectedPath;
save.Enabled = true;
open.Enabled = true;
randomExcuse.Enabled = true;
}
}
private void save_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(description.Text) ||
string.IsNullOrEmpty(excuse.Text))
{
MessageBox.Show(
"口実とその結果を入力してください。",
"保存できません",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
else
{
saveFileDialog1.InitialDirectory = selectedPath;
saveFileDialog1.Filter =
"excuseファイル(*.excuse)|すべてのファイル(*.*)";
saveFileDialog1.FileName = description.Text + ".excuse";
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
currentExcuse.save(saveFileDialog1.FileName);
UpdateForm(false);
}
}
}
private void open_Click(object sender, EventArgs e)
{
if (formChanged)
{
DialogResult dialogResult =
MessageBox.Show(
"この口実は保存されません。よろしいですか?",
"警告",
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation);
if (dialogResult == DialogResult.No)
{
return;
}
}
openFileDialog1.InitialDirectory = selectedPath;
openFileDialog1.FileName = description.Text + ".excuse";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
bool clearForm = false;
try
{
currentExcuse = new Excuse(openFileDialog1.FileName);
try
{
UpdateForm(false);
}
catch (Exception ex)
{
MessageBox.Show(
"'" + openFileDialog1.FileName + "'\n" +
"無効な口実ファイルを読み込もうとしました\n" +
ex.Message,
"口実ファイルを開けません",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
clearForm = true;
}
}
catch (Exception ex)
{
MessageBox.Show(
"次の口実ファイルを開くときにエラーが発生しました'" +
openFileDialog1.FileName + "'\n" +
ex.Message,
"口実ファイルを開けません",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
clearForm = true;
}
finally
{
if (clearForm)
{
description.Text = "";
results.Text = "";
lastUsed.Value = DateTime.Now;
}
}
}
}
private void randomExcuse_Click(object sender, EventArgs e)
{
if (formChanged)
{
DialogResult dialogResult =
MessageBox.Show(
"この口実は保存されません。よろしいですか?",
"警告",
MessageBoxButtons.YesNo,
MessageBoxIcon.Exclamation);
if (dialogResult == DialogResult.No)
{
return;
}
}
currentExcuse = new Excuse(random, selectedPath);
UpdateForm(false);
}
private void description_TextChanged(object sender, EventArgs e)
{
currentExcuse.Description = description.Text;
UpdateForm(true);
}
private void results_TextChanged(object sender, EventArgs e)
{
currentExcuse.Results = results.Text;
UpdateForm(true);
}
private void lastUsed_ValueChanged(object sender, EventArgs e)
{
currentExcuse.DateTime = lastUsed.Value;
UpdateForm(true);
}
}
}
0 コメント:
コメントを投稿