C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

別フォームのラジオボタンやチェックボックスの取得?

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■88558 / inTopicNo.1)  別フォームのラジオボタンやチェックボックスの取得?
  
□投稿者/ Dulu (1回)-(2018/09/07(Fri) 15:39:53)

分類:[C#] 

VC2017 C#

こんにちは。

問1
Form1のPictureBOXの6枚の画像をForm2(仮に設定画面フォームとする)から画像切替をしたいのですが
その際、並んだradioButtonを使用したい場合はどうすればよいのでしょうか?


Form1上にはPictureBOX1つとForm2に行くButtonだけ
Form2には6個並んだradioButton  radioButton1なら画像1でradioButton2なら画像2…という風にしたい。 

問2
Form2のCheckBoxでForm1のFormの大きさを変えたい
「Form大」「Form小」とSize切替したい。

ド素人ですが、ご教授よろしくおねがいします。
引用返信 編集キー/
■88559 / inTopicNo.2)  Re[1]: 別フォームのラジオボタンやチェックボックスの取得?
□投稿者/ furu (183回)-(2018/09/07(Fri) 17:31:27)
No88558 (Dulu さん) に返信

ド素人だと大変だと思います。
どこでつまづいているかわからないで
とりあえずの回答です。

> 問1
> Form1のPictureBOXの6枚の画像をForm2(仮に設定画面フォームとする)から画像切替をしたいのですが
> その際、並んだradioButtonを使用したい場合はどうすればよいのでしょうか?
>
>
> Form1上にはPictureBOX1つとForm2に行くButtonだけ
> Form2には6個並んだradioButton  radioButton1なら画像1でradioButton2なら画像2…という風にしたい。 
radioButtonクリックなどで変更したいなら
radioButtonのCheckedChangedイベントで
Form1のPictureBOXのImageを変えればいいです。
ただし、Form1のPictureBOXをForm2に教えておく必要があります。

>
> 問2
> Form2のCheckBoxでForm1のFormの大きさを変えたい
> 「Form大」「Form小」とSize切替したい。
CheckBoxクリックなどで変更したいなら
CheckBoxのCheckedChangedイベントで
Form1のWidthやHeightを変えればいいです。
ただし、Form1をForm2に教えておく必要があります。

引用返信 編集キー/
■88560 / inTopicNo.3)  Re[1]: 別フォームのラジオボタンやチェックボックスの取得?
□投稿者/ 魔界の仮面弁士 (1825回)-(2018/09/07(Fri) 17:54:13)
No88558 (Dulu さん) に返信
> Form1のPictureBOXの6枚の画像をForm2(仮に設定画面フォームとする)から画像切替をしたいのですが
> その際、並んだradioButtonを使用したい場合はどうすればよいのでしょうか?
>
> Form1上にはPictureBOX1つとForm2に行くButtonだけ
> Form2には6個並んだradioButton  radioButton1なら画像1でradioButton2なら画像2…という風にしたい。 

画像1〜6 を管理しているのが、Form1 なのか Form2 なのか、
あるいはそれ以外(たとえば内部リソースなど)なのかにもよりますね。


やり方は何通りか思いつきますが、とりあえず 3 パターンほど書いてみると:


=== 案 1 ===
Form2 側に「RadioButton の選択状態が変更された時」に
選択された番号を返すイベントを用意ておく。

Form1 では、そのイベントで通知された番号に合わせて、
自フォーム上の画像を差し替える。

→ FontDialog の Apply イベントのイメージに近い



=== 案 2 ===
Form2 を呼び出す際に、Form1 のインスタンスを渡すようにする。
(コンストラクタで渡しても良いし、Owner プロパティを用いても良い)

Form2 側は、RadioButton の CheckedChanged イベントが呼ばれた時に、
あらかじめ受け取っておいた Form1 のインスタンスに対して画像の差し替えを行う。

→ Form 間の結合度が高くなるので、あまりおすすめしない。


=== 案 3 ===
Form1 は、「画像を差し替える処理」をデリゲート インスタンスとして
用意しておき、それを Form2 に渡すようにする。(ラムダ式でも可)

Form2 側は、RadioButton の CheckedChanged イベントが呼ばれた時に、
そのデリゲートを呼び出すようにする。




> 問2
> Form2のCheckBoxでForm1のFormの大きさを変えたい
> 「Form大」「Form小」とSize切替したい。

これも基本的には同じ。

案 1:Form2 側にサイズ変更通知イベントを実装。それを Form1 で受け取り、Form1 自身をリサイズする。
案 2:Form2 に Form1 自身を渡して呼び出す。Form2 側で Form1 をリサイズする。
案 3:Form1 上にサイズ変更処理を実装。その処理のデリゲートを Form2 に渡し、Form2 側で呼び出す。
引用返信 編集キー/
■88561 / inTopicNo.4)  Re[2]: 別フォームのラジオボタンやチェックボックスの取得?
□投稿者/ Dulu (3回)-(2018/09/07(Fri) 20:11:13)
返信ありがとうございます。
返事遅れてしまって申し訳ありません。

> 画像1〜6 を管理しているのが、Form1 なのか Form2 なのか、
> あるいはそれ以外(たとえば内部リソースなど)なのかにもよりますね。

内部リソースです。


> やり方は何通りか思いつきますが、とりあえず 3 パターンほど書いてみると:

何通りかあるんですね…どれがいいのでしょう?
どれもちんぷんかんぷんです。
うーんやっぱり私には難しいのかなあ。

ネット検索を駆使して背景カラー(動いてるけど自信無い)だけは出来たんですが、何かヒントになるワード等教えてくださると幸いです。



フォーム1

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        //バックカラーを取得
        public Color BackColorCode { get => BackColor; set => BackColor = value; }

        public Form1()
        {
            InitializeComponent();
        }

        private void To_form2_Click(object sender, EventArgs e)
        {
            using (var Form2 = new Form2(this))
            {
                Form2.ShowDialog();
            }
        }

        //private void ????
        //{
        //    pictureBox1.Image = Properties.Resources.Default_Symbol.png
        //    pictureBox1.Image = Properties.Resources.Sun_Symbol.png
        //    pictureBox1.Image = Properties.Resources.Water_Symbol.png
        //    pictureBox1.Image = Properties.Resources.Fire_Symbol.png
        //    pictureBox1.Image = Properties.Resources.Forest_Symbol.png
        //    pictureBox1.Image = Properties.Resources.Skull_Symbol.png
        //}
    }
}


フォーム2

namespace WindowsFormsApp3
{
    public partial class Form2 : Form
    {
        //Form1インスタンス格納用
        public Form1 Form1Instance;

        private int BackColorCode;

        public Form2(Form1 Form1Instance)
        {

            InitializeComponent();

            //Form1のインスタンスを取得
            this.Form1Instance = Form1Instance;

            //Form1のバックカラーをForm2のカラーボックスへ設定
            BackColorBox.BackColor = this.Form1Instance.BackColorCode;
        }

        private void BackColor_Click(object sender, EventArgs e)
        {
            // 選択してる色をダイアログ内で選択状態
            colorDialog1.Color = BackColorBox.BackColor;

            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                BackColorCode = colorDialog1.Color.ToArgb();
                BackColorBox.BackColor = colorDialog1.Color;
            }
        }

        
        private void Close_Click(object sender, EventArgs e)
        {
            //Form2のカラーボックスの色をForm1へ設定
            Form1Instance.BackColorCode = BackColorBox.BackColor;

            Close();
        }

    }
}

引用返信 編集キー/
■88563 / inTopicNo.5)  Re[3]: 別フォームのラジオボタンやチェックボックスの取得?
□投稿者/ 魔界の仮面弁士 (1826回)-(2018/09/07(Fri) 21:59:51)
No88561 (Dulu さん) に返信
>>やり方は何通りか思いつきますが、とりあえず 3 パターンほど書いてみると:
> 何通りかあるんですね…どれがいいのでしょう?
> どれもちんぷんかんぷんです。

提示頂いたコードだと、2 番に相当しますね。
実際には、「public Form1 Form1Instance;」は private の方が良いですけど。


> pictureBox1.Image = Properties.Resources.Default_Symbol.png
Properties.Resources.Default_Symbol.png は変ですね。
Properties.Resources.Default_Symbol_png もしくは
Properties.Resources.Default_Symbol なのではありませんか?


> public Form2(Form1 Form1Instance)
この場合 Form2 は、Form1 からしか呼び出せないことになりますので、
別の画面の選択でも使いたいといった使いまわしができなくなります。
(もちろん、Form2 が Form1 専用のクラスという位置づけならそれもアリですが)

もし、他のフォームからでも再利用できるようにしたいなら、
共通の interface を用意して、それを受け渡すようにすると良いでしょう。



> ネット検索を駆使して背景カラー(動いてるけど自信無い)だけは出来たんですが、

先の案1 の実装例。

// --------------------------------------------------------------
// 呼び出される側(選択画面)となる Form2。
// RadioButton を 6 つ貼っておきます。
public sealed partial class Form2 : Form
{
    // 独自に作成した変更通知イベントです。
    // 選択されている番号が変更された時に通知されます。
    public event EventHandler<SelectedIndexEventArgs> SelectedIndexChanged;

    // ラジオボタンは配列で管理しておくと便利です。
    private RadioButton[] radioButtons = { };

    public Form2(int initialIndex = 0)
    {
        InitializeComponent();

        // InitializeComponent の呼び出しが終わったら、
        // 6 つのラジオボタンを配列としてセットしておきます。
        radioButtons = new RadioButton[6]
        {
            radioButton1,
            radioButton2,
            radioButton3,
            radioButton4,
            radioButton5,
            radioButton6,
        };

        // 下記の行は、6 つすべてに、同じイベントハンドラを割り当てる処理です。
        Array.ForEach(radioButtons, r => r.CheckedChanged += radioButtons_CheckedChanged);

        // 上記の行では、CheckedChanged イベントをコードで割り当てていますが、
        // あらかじめフォームのデザイン時に、radioButton1〜6 すべてに対して
        // 一つのイベントハンドラ(radioButtons_CheckedChanged)を
        // 手動で割り当てておいても OK です。


        // 引数で示された選択肢を、最初に選んでおきます。
        radioButtons[initialIndex].Checked = true;
        // 今回のサンプルでは initialIndex 引数は指定していないので、
        // 常に 0 番目である radioButton1 が選択状態になります。
    }

    // 6 つのラジオボタンすべてを、この一つの共通イベントで処理しています。
    private void radioButtons_CheckedChanged(object sender, EventArgs e)
    {
        // 選択されたラジオボタンの番号を、0〜5 の値に変換します。
        int index = Array.IndexOf(radioButtons, sender);

        // 独自に用意した変更通知イベントを発生させます。
        SelectedIndexChanged?.Invoke(this, new SelectedIndexEventArgs(index));
    }

    // これは、変更通知イベント用の EventArgs 継承クラスです。
    // int 型を返すプロパティが用意されています。
    public class SelectedIndexEventArgs : EventArgs
    {
        public int SelectedIndex { get; }
        public SelectedIndexEventArgs(int selectedIndex)
        {
            SelectedIndex = selectedIndex;
        }
    }
}


// --------------------------------------------------------------
// 呼び出し元(メイン画面)となる Form1。
// 選択画面を呼ぶための Button を 2 つと、
// 画像表示用の PictureBox を 1 つ貼っておきます。
public partial class Form1 : Form
{
    private Image[] images;
    public Form1()
    {
        InitializeComponent();

        // 6 種の画像をあらかじめ配列に入れておきます。
        images = new Image[]
        {
            Properties.Resources.Default_Symbol,
            Properties.Resources.Sun_Symbol,
            Properties.Resources.Water_Symbol,
            Properties.Resources.Fire_Symbol,
            Properties.Resources.Forest_Symbol,
            Properties.Resources.Skull_Symbol,
        };

        // 上記では、画像リソースごとに個別のプロパティ名で
        // 取り出していますが、名前指定(string)で取得する方法もあります。 
        // https://dobon.net/vb/dotnet/programing/resourcemanager.html


        // とりあえず、最初の画像を表示しておきます。
        pictureBox1.Image = images[0];
    }

    // 六択画面(Form2)でラジオボタンの選択が変更されると、
    // このイベントプロシージャが呼び出されます。
    private void childForm_SelectedIndexChanged(object sender, Form2.SelectedIndexEventArgs e)
    {
        // 選択されたラジオボタンの番号に該当する画像に変更します。
        pictureBox1.Image = images[e.SelectedIndex];
    }

    // 六択画面を「モーダル」で呼び出す場合はこのようにします。
    private void button1_Click(object sender, EventArgs e)
    {
        using (var childForm = new Form2())
        {
            childForm.SelectedIndexChanged += childForm_SelectedIndexChanged;
            childForm.ShowDialog(this);
        }
    }

    // 六択画面を「モードレス」で呼びたい場合はこう。
    private void button2_Click(object sender, EventArgs e)
    {
        button2.Enabled = false;    // ボタンを使用不可にして二重呼び出しを防ぐ

        childForm = new Form2();
        childForm.SelectedIndexChanged += childForm_SelectedIndexChanged;
        childForm.Show(this);

        // 選択画面が閉じられたら、ボタンの状態を戻す
        childForm.FormClosed += delegate { button2.Enabled = true; childForm = null; };
    }

    private Form2 childForm = null;
}

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ