前回からの続きです。

 

【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();
        }
    }
}
 

はー、しんど。

 

書く方も大変です。次回からは(絵心のない私ですが)少し使い方をやってみましょうか?