SGF Header

SGF Header の編集をサポートします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 最後に SGF Header の表示・編集機能をサポートします。
    Header に幾つかの主要なタグを追加して、囲碁ソフトは完成です。
    SGF Header の表示・編集は DialogBox を使ってメニューから呼び出すことにします。
    DialogBox の基礎は DialogText を参照して下さい。
  2. CELL 構造体には、Header 関係のタグ領域は含まれいません。
    そこで SGF Header のタグ関係の領域を配列で定義します。
    m_tag が処理する tag の名前で、m_tagstr がその値です。
    今回処理するのは次の6個ですが、増やしたり減らしたりするのは簡単です。
        //黒, 白, 対局名, 日付, 結果, コミ
        string[]   m_tag = { "PB", "PW", "EV", "DT", "RE", "KM" };
        string[]   m_tagstr = new string[6];
    
  3. KeyCheck() メソッドに m_tag で定義したタグを追加します。
        // 出題図プロパティのチェック
        private void KeyCheck()
        {
             ・・・
    
            for(i=0; i<6; i++)
            {   if (m_WS==m_tag[i])
                {   Token();
                    m_tagstr[i] = m_WS;
                    return;
                }
            }
            Token();    // 以外のプロパティはスキップ
        }
    
  4. SGFSave() メソッドでは m_tagstr[] に設定されているタグを書き出します。
        // SGF ファイルに保存
        private void SGFSave(string file)
        {   DialogResult rc;
    
            if (File.Exists(file))
            {   rc = MessageBox.Show("上書きで保存しますか", "選択",
                     MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rc == DialogResult.No)  return;
            }
            writer = new StreamWriter(file,false, Encoding.GetEncoding("utf-8"));
            writer.WriteLine(head);
            for (int i = 0; i < 6; i++)
            {
                if (m_tagstr[i] != string.Empty)
                    writer.Write(m_tag[i] + "[" + m_tagstr[i] + "]");
            }
            SaveBan();
    
             ・・・
    
  5. SGF Header の表示・編集は、メニューから起動します。
    ヘルプメニューに Header 情報(&H) を追加して Head_Dlg メソッドを呼び出して下さい。
        item = menu.MenuItems.Add("ヘルプ(&H)");
        item.MenuItems.Add(new MenuItem("Header 情報(&H)...", new EventHandler(this.Head_Dlg)));
    
  6. Head_Dlg メソッドから MyDialog Class を呼び出します。
    MyDialog を生成して、現在の Header 情報(m_tagstr[])を Mydlg の TextBox[] に設定します。
    MyDialog の終了コードが DialogResult.OK のとき、m_tagstr[] を更新します。
        // Header Dialog
        private void Head_Dlg(object sender, EventArgs e)
        {
            int i;
            MyDialog Mydlg = new MyDialog();
            for(i=0; i<6; i++)  Mydlg.textBox[i].Text = m_tagstr[i];
    
            DialogResult dr = Mydlg.ShowDialog();
            if (dr == DialogResult.OK)
            {   for(i=0; i<6; i++)  m_tagstr[i] = Mydlg.textBox[i].Text;
            }
        }
    
  7. SGF Header の表示・編集をする MyDialog Class です。
    class CELL の後にでも追加して下さい。
    6個の Label と6個の TextBox と "OK" ボタンと "Cancel" ボタンを配置しています。
    Label に見出しを、TextBox に現在の値を設定して、表示・編集を行います。
    "OK" ボタンがクリックされると TextBox の値を取得して DialogResult.OK をリターンします。
    //★ Dialog Class
    class MyDialog : Form
    {
        public string[]   tag = { "黒", "白", "対局名", "日付", "結果", "コミ" };
        public string[]   tagstr = new string[6];
        public TextBox[]  textBox = new TextBox[6];
        public Label[]    label = new Label[6]; 
    
        public MyDialog()
        {
            Text = "SGF Header";
            MaximizeBox = false;
            MinimizeBox = false;
            ControlBox = false;
            ShowInTaskbar = false;
            FormBorderStyle = FormBorderStyle.FixedDialog;
    
            Width = 250;
            Height = 210;
    
            Button btnOK = new Button();
            btnOK.Text = "OK";
            btnOK.Location = new Point(30, ClientSize.Height - btnOK.Height - 5);
            btnOK.Parent = this;
            btnOK.TabIndex = 2;
            btnOK.Click += new EventHandler(btnOK_Click);
            btnOK.DialogResult = DialogResult.OK;
    
            Button btnCancel = new Button();
            btnCancel.Text = "Cancel";
            btnCancel.Location = new Point(ClientSize.Width - btnCancel.Width - 30,
                ClientSize.Height - btnCancel.Height - 5);
            btnCancel.Parent = this;
            btnCancel.TabIndex = 3;
            btnCancel.DialogResult = DialogResult.Cancel;
            for(int i=0; i<6; i++)
            {
                tagstr[i]=string.Empty;
    
                label[i] = new Label();
                label[i].Parent = this;
                label[i].Location = new Point(10, i*24+10);
                label[i].Size = new Size(50, 24);
                label[i].TabIndex = i;
                label[i].Text = tag[i];
    
                textBox[i] = new TextBox();
                textBox[i].Parent = this;
                textBox[i].Location = new Point(60, i*24+10);
                textBox[i].Width = ClientSize.Width - 70;
                textBox[i].TabIndex = 0;
            }
        }
    
        void btnOK_Click(object sender, EventArgs e)
        {
            for(int i=0; i<6; i++)
            {
                if (textBox[i].Text!=string.Empty)  tagstr[i] = textBox[i].Text;
            }
        }
    }
    

[Previous Chapter ↑] LB tag をプログラム

超初心者のプログラム入門(C# Frame Work)