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

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

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

Re[5]: 子フォームから親フォームのメソッドへアクセス


(過去ログ 130 を表示中)

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

■77101 / inTopicNo.1)  子フォームから親フォームのメソッドへアクセス
  
□投稿者/ ゆーきゃん (40回)-(2015/09/11(Fri) 18:50:38)

分類:[C#] 

いつもお世話になっております。

質問に目を通して頂きありがとうございます。
宜しければお答えいただけないでしょうか。

C#/VisualStudio2013/windowsformアプリケーションでプログラムを組んでおります。


プログラムの流れは以下の通りです。

Form1(親フォーム)には、picturebox1、button1
Form2(子フォーム)には、picturebox2

があります。

親フォームのpicturebox1に対し、 drawメソッド内の「e.Graphics.DrawLine」で線を描画します。
button1を押すと、Form2が表示され、picturebox2にpicturebox1と全く同じ線を描画するというものです。

この際、Form2で親フォームメソッドのdrawメソッドにアクセスしているのですが、
以下のプログラムの方法以外に方法はありますでしょうか?

プログラムが長くなり、メソッド・変数が共に増えた際、いちいちメソッド毎に「Mypoint pt;」を
配置し、変数前に「pt」を配置するのはどうなのかと思い、質問させて頂きました。

何か良い方法・プログラムを省略できるポイントなどありましたら、ご指導頂けないでしょうか。


● Form1 =============================================================================

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;

namespace test1
{
    public partial class Form1 : Form
    {

        public struct Mypoint
        {
            public float x1;
            public float y1;
            public float x2;
            public float y2;

        }


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 Fm2 = new Form2();
            DialogResult drret = Fm2.ShowDialog();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            draw(sender, e);
        }

        public static void draw(object sender, PaintEventArgs e)
        {
            Mypoint pt;

            pt.x1 = 80;
            pt.y1 = 100;
            pt.x2 = 120;
            pt.y2 = 100;

            e.Graphics.DrawLine(Pens.Green, pt.x1, pt.y1, pt.x2, pt.y2);
        }
    }
}


● Form2 ==========================================================================

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;

namespace test1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Form1.draw(sender, e);
        }

    }
    
}



引用返信 編集キー/
■77102 / inTopicNo.2)  Re[1]: 子フォームから親フォームのメソッドへアクセス
□投稿者/ 魔界の仮面弁士 (491回)-(2015/09/11(Fri) 20:20:00)
No77101 (ゆーきゃん さん) に返信
> この際、Form2で親フォームメソッドのdrawメソッドにアクセスしているのですが、
> 以下のプログラムの方法以外に方法はありますでしょうか?

Form1 側に draw メソッドを用意しているのであれば、
Form2 に、そのメソッドのデリゲートを渡しておいては如何でしょう。



public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  private static void Draw(object sender, PaintEventArgs e)
  {
    e.Graphics.DrawLine(Pens.Green, 80, 100, 120, 100);
  }

  private void pictureBox1_Paint(object sender, PaintEventArgs e)
  {
    Draw(sender, e);
  }

  private void button1_Click(object sender, EventArgs e)
  {
    using (Form2 fm = new Form2(Draw))
    {
      fm.ShowDialog();
    }
  }
}


public partial class Form2 : Form
{
  public Form2(PaintEventHandler drawMethod)
  {
    InitializeComponent();
    if (drawMethod != null)
    {
      this.pictureBox1.Paint += drawMethod;
    }
  }

  public Form2() : this(null)
  {
  }
}
引用返信 編集キー/
■77107 / inTopicNo.3)  Re[2]: 子フォームから親フォームのメソッドへアクセス
□投稿者/ ゆーきゃん (41回)-(2015/09/14(Mon) 09:50:00)
No77102 (魔界の仮面弁士 さん) に返信
> ■No77101 (ゆーきゃん さん) に返信
>>この際、Form2で親フォームメソッドのdrawメソッドにアクセスしているのですが、
>>以下のプログラムの方法以外に方法はありますでしょうか?
> 
> Form1 側に draw メソッドを用意しているのであれば、
> Form2 に、そのメソッドのデリゲートを渡しておいては如何でしょう。
> 

お返事遅くなり、申し訳ございませんでした。
いつもお答えありがとうございます。
大変参考になりました。

申し訳ございません。testプログラムの組み方がよくありませんでした・・・

e.Graphics.DrawLine(Pens.Green, 80, 100, 120, 100);

の部分なのですが、実際は以下のようにしたいのです。


● Form1 =============================================================================

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;

namespace test1
{
    public partial class Form1 : Form
    {

        float x1;
        float y1;
        float x2;
        float y2;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 Fm2 = new Form2();
            DialogResult drret = Fm2.ShowDialog();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            draw(sender, e);
        }

        public static void draw(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawLine(Pens.Green, x1, y1, x2, y2);         
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            x1 = int.Parse(textBox1.Text);        
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            y1 = int.Parse(textBox2.Text);   
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            x2 = int.Parse(textBox3.Text);   
        }

        private void textBox4_TextChanged(object sender, EventArgs e)
        {
            y2 = int.Parse(textBox4.Text);
            pictureBox1.Refresh();
        }
    }
}

● Form2 (プログラム変化なし)===============================================



x1,y1,x2,y2はメソッドが増えた場合、頻繁に呼び出される情報となります。

上のプログラムの場合、「e.Graphics.DrawLine(Pens.Green, x1, y1, x2, y2);」部分で、
「オブジェクト参照が必要です」というエラーが起きてしまいます。

staticを宣言し、静的メソッドにしていることが原因と思われます。
しかし、静的メソッドにしないと、Form2の「Form1.draw(sender, e);」で、
「オブジェクト参照が必要です」というエラーが起きてしまします。

Form1、Form2のエラーを取り除く方法など御座いますでしょうか。
ご指導ご鞭撻の程よろしくお願い致します。



引用返信 編集キー/
■77108 / inTopicNo.4)  Re[3]: 子フォームから親フォームのメソッドへアクセス
□投稿者/ kiku (60回)-(2015/09/14(Mon) 10:51:35)
魔界の仮面弁士さんの方法であればstaticなしで動作しますよ。
引用返信 編集キー/
■77109 / inTopicNo.5)  Re[4]: 子フォームから親フォームのメソッドへアクセス
□投稿者/ ゆーきゃん (43回)-(2015/09/14(Mon) 11:20:07)
No77108 (kiku さん) に返信
> 魔界の仮面弁士さんの方法であればstaticなしで動作しますよ。

kiku様、魔界の仮面弁士様

大変申し訳ないです・・・
もう一度、魔界の仮面弁士様のプログラムソースを参考に考えてきます。

折角お答え頂いているのに申し訳ないです。
引用返信 編集キー/
■77110 / inTopicNo.6)  Re[5]: 子フォームから親フォームのメソッドへアクセス
□投稿者/ ゆーきゃん (45回)-(2015/09/14(Mon) 14:11:24)
魔界の仮面弁士様、kiku様

大変ご迷惑おかけしました。
無事に思い通りの結果を出力することができました。
ありがとうございます。

メソッドのデリゲート(PaintEventHandler)の動きがいまいちまだ理解できてないので、
調べて参ります。

また何かありましたら、ご指導ご鞭撻の程よろしくお願い致します。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -