質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

7891閲覧

Form間での構造体の受け渡しについて

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2015/10/02 04:49

編集2015/10/02 04:53

VisualStdio2013 C# windowsフォームアプリケーションでプログラムを組んでいます。

Form1のpicturebox1に始点(x1,y1)から終点(x2,y2)まで線を描画し、それをForm2のpicturebox2にも表示させるというプログラムを作成しております。

Form1 : picturebox1・textbox1~4・button1
Form2 : picturebox2

が設置されております。

Form1のpicturebox1に線を引くことができ、次にForm2のpicturebox2にForm1のDrawクラスを使い、線を引きたいのですが、線を引くために必要な構造体をどう受け取りどう利用できるのかわからず、線を引くことができません。

プログラムの完成形は、以前の質問と同じでどのフォームからでも「public static class Draw」にアクセスできるようにし、
描画するのに必要な変数はまとめて構造体(クラス)で管理し、受け渡したいと思っております。

● 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 test10
{
public partial class Form1 : Form
{
Form2 fm2 = new Form2();

Kouzoutai k = new Kouzoutai(); public Form1() { InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Draw.draw(sender, e, k); } private void textBox1_TextChanged(object sender, EventArgs e) { k.x1 = float.Parse(textBox1.Text); } private void textBox2_TextChanged(object sender, EventArgs e) { k.y1 = float.Parse(textBox2.Text); } private void textBox3_TextChanged(object sender, EventArgs e) { k.x2 = float.Parse(textBox3.Text); } private void textBox4_TextChanged(object sender, EventArgs e) { k.y2 = float.Parse(textBox4.Text); pictureBox1.Invalidate(); } private void button1_Click(object sender, EventArgs e) { fm2.ShowDialog(); } } public class Kouzoutai { public float x1; public float y1; public float x2; public float y2; } public static class Draw { public static void draw(object sender, PaintEventArgs e, Kouzoutai k) { e.Graphics.DrawLine(Pens.Green, k.x1, k.y1, k.x2, k.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 test10
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

// Kouzoutai k を引数として持たせると、Paintイベントが起こらなくなる・・・ // 引数として構造体を持たせるのは間違い? private void pictureBox2_Paint(object sender, PaintEventArgs e Kouzoutai k) { Draw.draw(sender, e, k); } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

// 引数として構造体を持たせるのは間違い?

間違いです。

まず、k構造体はForm1とForm2で共通化したいのですか?
であれば、Form1のメンバとしてkは保持しないようにして、Form1の各TextBoxが変更された時のセット対象はDraw静的インスタンス上のk静的プロパティにするべきです。

C#

1public partial class Form1 : Form 2{ 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void pictureBox1_Paint(object sender, PaintEventArgs e) 9 { 10 //Draw.draw(sender, e, k); 11 Draw.draw(sender, e); 12 } 13 14 private void textBox1_TextChanged(object sender, EventArgs e) 15 { 16 //k.x1 = float.Parse(textBox1.Text); 17 Draw.k.x1 = float.Parse(textBox1.Text); 18 } 19 20 private void textBox2_TextChanged(object sender, EventArgs e) 21 { 22 //k.y1 = float.Parse(textBox2.Text); 23 Draw.k.y1 = float.Parse(textBox2.Text); 24 } 25 26 private void textBox3_TextChanged(object sender, EventArgs e) 27 { 28 //k.x2 = float.Parse(textBox3.Text); 29 Draw.k.x2 = float.Parse(textBox3.Text); 30 } 31 32 private void textBox4_TextChanged(object sender, EventArgs e) 33 { 34 //k.y2 = float.Parse(textBox4.Text); 35 Draw.k.y2 = float.Parse(textBox4.Text); 36 pictureBox1.Invalidate(); 37 } 38} 39 40public class Kouzoutai 41{ 42 public float x1; 43 public float y1; 44 public float x2; 45 public float y2; 46} 47 48public static class Draw 49{ 50 public static Kouzoutai k; //静的インスタンスとして 51 52 //public static void draw(object sender, PaintEventArgs e, Kouzoutai k) 53 public static void draw(object sender, PaintEventArgs e) 54 { 55 e.Graphics.DrawLine(Pens.Green, k.x1, k.y1, k.x2, k.y2); 56 } 57}

投稿2015/10/02 04:53

編集2015/10/02 04:59
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/02 05:30 編集

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 test10 { public partial class Form1 : Form { Form2 fm2 = new Form2(); Kouzoutai k = new Kouzoutai(); public Form1() { InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Draw.draw(sender, e); } private void textBox1_TextChanged(object sender, EventArgs e) { Draw.k.x1 = float.Parse(textBox1.Text); } private void textBox2_TextChanged(object sender, EventArgs e) { Draw.k.y1 = float.Parse(textBox2.Text); } private void textBox3_TextChanged(object sender, EventArgs e) { Draw.k.x2 = float.Parse(textBox3.Text); } private void textBox4_TextChanged(object sender, EventArgs e) { Draw.k.y2 = float.Parse(textBox4.Text); pictureBox1.Invalidate(); } private void button1_Click(object sender, EventArgs e) { fm2.ShowDialog(); } } public class Kouzoutai { public float x1; public float y1; public float x2; public float y2; } public static class Draw { public static Kouzoutai k; //静的インスタンスとして public static void draw(object sender, PaintEventArgs e) { e.Graphics.DrawLine(Pens.Green, k.x1, k.y1, k.x2, k.y2); } } } e.Graphics.DrawLine(Pens.Green, k.x1, k.y1, k.x2, k.y2); に移った際に、 エラーになってしまいました。 型 'System.NullReferenceException' のハンドルされていない例外が test10.exe で発生しました 追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。 という内容です。 kにnullが入っていたのですが、こちらが原因でしょうか? お手数おかけして申し訳ございませんが、再度ご教授願えませんでしょうか?
Tak1wa

2015/10/02 05:34

classなのでインスタンス化が必要でしたね。struct に戻しましょうか。 尚、細かいところを見ると出来れば色々直したほうが良い部分はあるのですが、とりあえず動作できることを目的としてますので言及しないでおきます。
fender0131

2015/10/02 06:02

お答えありがとうございます public class Kouzoutai { public float x1; public float y1; public float x2; public float y2; } を public struct Kouzoutai { public float x1; public float y1; public float x2; public float y2; } にするということでしょうか? 見当違いなことを言っていたらすいません。 勉強不足で、クラス・構造体の違いがいまいちわかっておりません。 このように書き換えると、クラス形式→構造体形式となりませんか?
Tak1wa

2015/10/02 06:04

> このように書き換えると、クラス形式→構造体形式となりませんか? なりますよ。構造体だとまずいのですか?
fender0131

2015/10/02 06:18

お時間取ってしまい申し訳ないです。 お付き合い感謝いたします。 今、構造体とクラスの違いを学ぼうと、簡単なテストプログラムを作成し、デバックで動作を追っていましたもので。 Tak1waさんのお付き合いのおかげで、Form間の構造体の渡し方がだいぶ分かりました。 Draw.k.x1 = float.Parse(textBox1.Text);の書き方大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問