前回からの続きです。
【TGEditor.cs】
(続き)
//終了処理
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
DialogResult dr = MessageBox.Show("終了しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(dr == DialogResult.No)
{
e.Cancel = true;
}
//命令セットライブラリー(CmdList.tge)を書き込む(解説:一応システム管理です。上書きではなく、日時を付けて別ファイル処理の方がより安全ですが...)
tge.CmdList.FileName = ".\\tgeFiles\\CmdList.tge";
tge.CmdList.WriteFile();
}
//「新規作成」処理(解説:実際は「初期化」処理ですね。)
private void OnNew_Click(object sender, EventArgs e)
{
if(tssl[1].Text != "(ファイル名)")
{
DialogResult dr = MessageBox.Show("データがありますが、初期化しますか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if(dr == DialogResult.Yes)
{
tssl[1].Text = "(ファイル名)";
tssl[1].ToolTipText = "(ファイル名)"; //ToolTip設定
}
else
return;
}
tge.Reset(); //Nakov.TurtleGraphics初期化
tge.ExeList.Clear(); //「実行リスト(ExeList)」初期化
MessageBox.Show("実行リストを作るには、「実行リストの編集」で「命令リスト」から「命令セット」を選んでください。\r\n" +
"「命令リスト」は「命令リスト編集」で編集できます。また、新たに命令セットを作成するには「命令セット" +
"作成」または「命令リスト編集」の「命令セット追加」を選んでください。", "ToDo", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
//「ファイルを開く」処理
private void OnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog ofDlg = new OpenFileDialog();
//ファイルフィルターの指定
ofDlg.Filter = "タートルグラフィックデータファイル|*.tge";
ofDlg.FilterIndex = 0;
ofDlg.RestoreDirectory = true; //初期ディレクトリへ復帰
ofDlg.CheckPathExists = true; //ファイルパスの存在チェック
ofDlg.InitialDirectory = ".\\tgeFiles"; // デフォルトのフォルダーの指定
ofDlg.Title = "ファイルを開く"; //ダイアログのタイトルを指定する
if(ofDlg.ShowDialog() == DialogResult.Cancel) //ダイアログを表示する
{
MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
if(Path.GetExtension(ofDlg.FileName) == ".tge")
{
tssl[1].Text = ofDlg.FileName; //ファイル名を記録
tssl[1].ToolTipText = ofDlg.FileName; //ToolTip設定
//ExeListを初期化、ファイル読み込み(解説:対象は実行リストファイルです。)
tge.ExeList.Clear();
tge.ExeList.FileName = tssl[1].Text;
tge.ExeList.ReadFile();
}
else
{
//エラー処理
MessageBox.Show("タートルグラフィックデータファイル(*.tge)ではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//オブジェクトを破棄する
ofDlg.Dispose();
}
//「保存」処理
private void OnSave_Click(object sender, EventArgs e)
{
if(tssl[1].Text == "(ファイル名)")
OnSaveAs_Click(sender, e);
else
{
//ファイル保存処理
tge.ExeList.FileName = tssl[1].Text;
tge.ExeList.WriteFile();
}
}
//「名前を付けて保存」処理
private void OnSaveAs_Click(object sender, EventArgs e)
{
SaveFileDialog sfDlg = new SaveFileDialog();
//ファイルフィルターの指定
sfDlg.AddExtension = true; //拡張子自動付加
sfDlg.DefaultExt = ".tge";
sfDlg.Filter = "タートルグラフィックデータファイル|*.tge";
sfDlg.FilterIndex = 0;
sfDlg.RestoreDirectory = true; //初期ディレクトリへ復帰
sfDlg.CheckPathExists = true; //ファイルパスの存在チェック
sfDlg.InitialDirectory = ".\\tgeFiles"; // デフォルトのフォルダーの指定
sfDlg.Title = "ファイルを保存"; //ダイアログのタイトルを指定する
sfDlg.OverwritePrompt = true; //上書き確認
if(sfDlg.ShowDialog() == DialogResult.Cancel) //ダイアログを表示する
{
MessageBox.Show("キャンセルされました。", "キャンセル", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
//ファイル名を記録
tssl[1].Text = sfDlg.FileName;
tssl[1].ToolTipText = sfDlg.FileName; //ToolTip設定
//ファイル保存処理
tge.ExeList.FileName = tssl[1].Text;
tge.ExeList.WriteFile();
}
//オブジェクトを破棄する
sfDlg.Dispose();
}
//「終了」処理
private void OnExit_Click(object sender, EventArgs e)
{
Close(); //修了確認はOnClosingメソッドで行う
}
//「命令セット作成」処理
private void OnSetEdit_Click(object sender, EventArgs e)
{
//CmdSetDlgによる命令セットの作成
CmdSetDlg csd = new CmdSetDlg(); //引数無し(新規作成)
if(csd.ShowDialog(this) == DialogResult.OK)
{
tge.CmdList.AddSet(csd.Tgs); //作成したTGSetはCmdListに追加する
}
csd.Dispose();
}
//「命令リスト編集」処理
private void OnListEdit_Click(object sender, EventArgs e)
{
//CmdListDlgによる命令セットの編集
CmdListDlg cld = new CmdListDlg(tge, 1);
if(cld.ShowDialog(this) == DialogResult.OK)
{
MessageBox.Show("命令リストが編集されました", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
cld.Dispose();
}
//「実行リスト編集」処理
private void OnExeListEdit_Click(object sender, EventArgs e)
{
//CmdListDlgによる命令セットの編集
CmdListDlg cld = new CmdListDlg(tge, 2);
if(cld.ShowDialog(this) == DialogResult.OK)
{
MessageBox.Show("実行リストが編集されました", "確認", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
cld.Dispose();
}
//「命令セット実行」処理
private void OnSetExe_Click(object sender, EventArgs e)
{
//CmdListDlgによる命令セットの選択
CmdListDlg cld = new CmdListDlg(tge, 0);
if(cld.ShowDialog(this) == DialogResult.OK)
{
//描画初期化
tge.Reset();
tge.CmdList.GetSet(cld.Selection).DoThis();
}
cld.Dispose();
}
//「実行リスト実行」処理
private void OnExe_List_Click(object sender, EventArgs e)
{
//描画初期化
tge.Reset();
tge.ExeList.DoSet();
}
//「使い方」処理(解説:本当はもっと素敵な表示にしたかったのですが...手抜きでした。)
private void OnHowtoUse_Click(object sender, EventArgs e)
{
MessageBox.Show("TGEditorはNakov.TurtleGraphics用の描画エディターです。\r\n\r\n" +
"LOGOベースの描画命令を纏めた「命令セット」、その一覧である「命令リスト」及び" +
"指定する「命令セット」で繰り返しを含め実行順を定めた「実行リスト」を編集し、" +
"「命令セット」単体や「実行リスト」を実行してウィンドウに描画します。\r\n\r\n" +
"出来上がった「命令リスト」、「実行リスト」は\"*.tge\"ファイルにすることができ" +
"\"*.tge\"ファイルで起動したり、また起動後もドラッグアンドドロップすることができます。\r\n\r\n" +
"【TurtleGraphicsメソッド】\r\n" +
"Init(arg)-タートルグラフィックスシステムを初期化します。argは描画対象のFormsコントロールで、指定しない場合、アクティブなフォームが描画領域となります。\r\n" +
"Dispose() / Reset()-タートルグラフィックスシステムを破棄し、関連するすべてのリソースを解放します。\r\n" +
"Forward(arg)-現在の方向に亀をarg1ピクセル前進させ、ペンが下がっている場合線を描きます。\r\n" +
"Backward(arg)-現在の方向に亀をarg1ピクセル後退させ、ペンが下がっている場合線を描きます。\r\n" +
"MoveTo(arg1, arg2)-亀を指定した位置へ移動させます。ペンが下がっている場合線を描きます。\r\n" +
"Rotate(arg)-現在の向きからarg(度数)亀を回転させます。\r\n" +
"RotateTo(arg)-亀を指定角度(度数)へ向けます。初期状態の亀の方向(角度)は0度(上向き)です。\r\n" +
"PenUp()-ペンを描画面から離し、線は描かれません。\r\n" +
"PenDown()-ペンを描画面に降ろし、線が描かれます。\r\n\r\n" +
"【TurtleGraphicsプロパティ】\r\n" +
"X-亀の現在X座標を取得/設定します。初期状態の亀は {0, 0}(画面中央)です。\r\n" +
"Y-亀の現在Y座標を取得/設定します。初期状態の亀は {0, 0}(画面中央)です。\r\n" +
"Angle-亀の現在方向(度数)を取得/設定します。(上-0、右-90、下-180、左-270)\r\n" +
"PenColor-描画色を取得/設定します。既定色はBlue(青)です。\r\n" +
"PenSize-描画太さ(ピクセル単位)を取得/設定します。規定値は7です。\r\n" +
"PenVisible-ペンが下がり描画可能であればtrue、ペンが上がればfalseとなります。\r\n" +
"ShowTurtle-亀の表示可否を取得/設定します。規定値は表示可です。\r\n" +
"Delay-移動/回転後の待機時間(ミリ秒)を取得/設定します。規定値は0です。",
"簡単な説明", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//「ショートカットキー」処理
private void OnShortcutKey_Click(object sender, EventArgs e)
{
MessageBox.Show("Ctrl+N-新規作成\r\nCtrl+O-ファイルを開く\r\n" +
"Ctrl+S-ファイルの保存\r\nCtrl+P-印刷\r\nCtrl+X-終了\r\n\r\n" +
"Ctrl+T-命令セット編集\r\nCtrl+L-命令リスト編集\r\nCtrl+E-実行リスト編集\r\n\r\n" +
"Ctrl+H-使い方\r\nF1-ショートカットキーの解説\r\nF2-バージョン情報",
"ショートカットキーの解説", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//「バージョン」処理
private void OnVersion_Click(object sender, EventArgs e)
{
VersionDlg verDlg = new VersionDlg(this.Icon); //Versionダイアログ表示
verDlg.ShowDialog();
verDlg.Dispose();
}
}
/////////////////////
//Version ダイアログ
/////////////////////
class VersionDlg : Form
{
public VersionDlg(Icon ico)
{
//ダイアログの属性設定
this.Text = "バーション情報";
this.ClientSize = new Size(320, 100);
this.MaximizeBox = false; // 最大化ボタン
this.MinimizeBox = false; // 最小化ボタン
this.ShowInTaskbar = false; //タスクバー上表示
this.FormBorderStyle = FormBorderStyle.FixedDialog; // 境界のスタイル
this.StartPosition = FormStartPosition.CenterParent; // 親フォームの中央に配置
//コントロールの属性設定
Button btnOK = new Button();
btnOK.Size = new Size(40, 28);
btnOK.Location = new Point(ClientSize.Width - btnOK.Width - 10, (ClientSize.Height - btnOK.Height) / 2);
btnOK.Text = "OK";
btnOK.Click += new EventHandler(OnOK_Click);
Label imglabel = new Label();
imglabel.Size = new Size(40, 40);
imglabel.Location = new Point(10, (ClientSize.Height - imglabel.Height) / 2);
imglabel.BorderStyle = BorderStyle.Fixed3D;
imglabel.Image = ico.ToBitmap(); //親のシステムアイコン
Label label = new Label();
label.Size = new Size(ClientSize.Width - imglabel.Width - btnOK.Width - 40, ClientSize.Height- 20);
label.Location = new Point(imglabel.Width + 20, (ClientSize.Height - label.Height) / 2);
label.BorderStyle = BorderStyle.Fixed3D;
label.Text = "TGEditor Version 1.0\r\nCopyright (c) 2026 by Ysama\r\n(written in Microsoft C#)";
label.TextAlign = ContentAlignment.MiddleCenter;
label.Font = new Font("Times New Roman", 10, FontStyle.Bold);
this.Controls.Add(btnOK);
this.Controls.Add(imglabel);
this.Controls.Add(label);
}
private void OnOK_Click(object sender, EventArgs e)
{
Close();
}
}
}
はー、しんど。
書く方も大変です。次回からは(絵心のない私ですが)少し使い方をやってみましょうか?