none
すべてのFormからアクセスできるClassインスタンスを設定する方法 RRS feed

  • 質問

  •  

    Code Snippet

    [System.Serializable]
            class mydata
            {
                public long productkey = 0;
                public int[,] field = new int[1000, 1000];

            }

     

     

    Form1~Form4の複数のFormをあつかっているのですが、すべてのFormx.csでアクセスできるdata1の宣言の仕方(場所)が分かりません。よろしくお願いします。

     

     

     

    Code Snippet
    mydata data1=new mydata();

     

     

     

    2008年9月1日 13:12

回答

  • こんばんは!(^^)!ふ~です。

    人生いろいろ、文法もいろいろです。

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

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

            private void Form1_Load(object sender, EventArgs e)
            {
                MyData.myint = 15;
            }       
        }

        static class MyData
        {
            public static int myint;
        }
    }

    2008年9月4日 10:51

すべての返信

  • >Form1~Form4の複数のFormをあつかっているのですが、すべてのFormx.csでアクセスできるdata1の宣言の仕方(場所)が分かりません。よろしくお願いします。

    どういう使い方をしたいのかいまいちなのですが、こういうことですか?

    Code Snippet

    [System.Serializable]}

    public class mydata
    {
        private static mydata instance = new mydata();
        private mydata(){}

        public static mydata GetInstance()
        {
            return instance;
        }

        public long productkey = 0;
        public int[,] field = new int[1000, 1000];

    }


    どこかしらのFormXからアクセスしたい場合は、こんな感じです。

    Code Snippet

    mydata data = mydata.GetInstance();
    data.productkey = 5;

    2008年9月1日 14:18
  • 最初にForm1が開かれ、そこから順次Form2~Form4を開くいうことを前提とします。

     

    Form1でmydataクラスのインスタンス、data1を作成し、Form2~Form4にはコンストラクタの引数か、プロパティで渡します。

    Form1に本体があって、Form2~Form4ではForm1にある本体へのショートカット(参照)を持つイメージです。

     

     

    なお、この手法は参照型(クラス)でのみ可能です。

    値型はコピーになりますので、同じインスタンスを共有することはできません。

    2008年9月1日 14:23
    モデレータ
  •  CrimsonPork さんからの引用


    どういう使い方をしたいのかいまいちなのですが、こういうことですか?

    Code Snippet

    [System.Serializable]}

    public class mydata
    {
        private static mydata instance = new mydata();
        private mydata(){}

        public static mydata GetInstance()
        {
            return instance;
        }

        public long productkey = 0;
        public int[,] field = new int[1000, 1000];

    }


    シングルトンパターンとのことですが、Serializable属性がある点を考えると二の足を踏みます。

    Serialize/Deserializeするのであれば、シングルトンと相性が悪いかもしれません。

    2008年9月1日 14:29
    モデレータ
  • こんにちは!(^^)!ふ~です。

    VisualStudio2008では下記ソース名の場所に追加するのではと思います。

    Formが複数、2つだけ作って見ました。ご参考にどうでしょうか?

     

    usingは省略してあります。
    <ソース名:Program.cs>
    namespace WinApSerializable
    {

        [Serializable()]       // シリアライズ可能なクラスです。
        public class mydata
        {
            public long productkey;
            public int[,] field;

            // 初期化する
            public mydata()
            {
                productkey = 0;
                field = new int[1000, 1000];
            }
        }

        static class Program
        {
            static Form form1, form2;
                   
            /// <summary>
            /// アプリケーションのメイン エントリ ポイントです。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                form1 = new Form1();
                form2 = new Form2();

                form1.Text = "1 番目のフォーム";
                form2.Text = "2 番目のフォーム";
               
                form2.Show();

                Application.Run(form1);
            }
        }
    }

    <ソース名:Form1.cs>
    namespace WinApSerializable
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                mydata f1_data = new mydata(); // インスタンス作成
                f1_data.productkey = 1;
                f1_data.field[0,0] = 10;
            }
        }
    }

    <ソース名:Form2.cs>
    namespace WinApSerializable
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                mydata f2_data = new mydata(); // インスタンス作成
                f2_data.productkey = 1;
                f2_data.field[0,0] = 10;
            }
        }
    }
    以上です。

     

    2008年9月1日 15:47
  •  Azulean さんからの引用

    シングルトンパターンとのことですが、Serializable属性がある点を考えると二の足を踏みます。

    Serialize/Deserializeするのであれば、シングルトンと相性が悪いかもしれません。



    こちらのリンク先にあるような理由ですかね?
    http://unim-scribble.blogspot.com/2006/11/javasingleton-and-serialization-dont.html
    シングルトンなのにひとつに決まらないという観点からあまりよろしくなさそうですね・・・。勉強になりました。
    2008年9月1日 23:57
  • Azuleanさんからの引用

    Form1でmydataクラスのインスタンス、data1を作成し、Form2~Form4にはコンストラクタの引数か、プロパティで渡します。

     

    なんとなくイメージはわくのですが、力不足でコーディングまでいたりません。すみませんが、具体的な例を挙げていただけないでしょうか?よろしくお願い致します。

    2008年9月2日 6:06
  •  acslearner さんからの引用
    なんとなくイメージはわくのですが、力不足でコーディングまでいたりません。すみませんが、具体的な例を挙げていただけないでしょうか?よろしくお願い致します。

     

    コーディング自体はそのままやればそれほど難しくないです。

    単に意味がわからない箇所 (ワード) があるだけなのではないでしょうか?

     

    いずれにせよ、どこまでできて何がわからないのかを明示した方が良いと思います。

    2008年9月2日 8:38
  • 外池と申します。うーん、鶏と卵のような問答になってしまいるような。C#のコードや用語で書くことよりも、日本語で何をやりたいのかご説明頂けませんか?

     

    私が推察するところ、どのFormからも呼び出せる(アプリケーション全体に共通でプログラムのどの部分からでも呼び出せる)データを格納しておく場所が欲しいということなんじゃないかと・・・。違います?

     

     

    2008年9月2日 9:11
  • 関係ないところだけフォローしておきますが、
     
     CrimsonPork さんからの引用
    こちらのリンク先にあるような理由ですかね?
    http://unim-scribble.blogspot.com/2006/11/javasingleton-and-serialization-dont.html
    シングルトンなのにひとつに決まらないという観点からあまりよろしくなさそうですね・・・。勉強になりました。
     
    IObjectReference について調べると、しあわせになるかもしれません。サンプルコードがそのまんまですけど。
    2008年9月3日 5:52
  • 外池さんの言う通りです。

    Code Snippet

    [System.Serializable]
            class mydata
            {
                public long productkey = 0;
                public int[,] field = new int[1000, 1000];

            }

     

    上記のクラスにこだわりません。

     

    int型でも構いません。

     

    2008年9月3日 7:42
  • であれば単純にstaticを付けるだけでいいのかな? それとも必ずインスタンスが必要なのでしょうか?

     

    2008年9月3日 8:10
    モデレータ
  • Code Snippet

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

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

            private void Form1_Load(object sender, EventArgs e)
            {
               public static int myint=15;

            }
        }
    }

     

     

    エラー 6 '' は無効です。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 38 testAppli

    エラー 2 'public' は無効です。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 12 testAppli
    エラー 3 ; が必要です。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 19 testAppli
    エラー 5 ; が必要です。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 38 testAppli
    エラー 7 ; が必要です。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 39 testAppli
    エラー 4 修飾子 'static' がこの項目に対して有効ではありません。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 19 testAppli
    エラー 1 文字 ';' は予期されていません。 C:\Users\Y\Documents\Visual Studio 2005\Projects\testAppli\testAppli\Form1.cs 20 38 testAppli

     

    static intを宣言しようとしただけで、これだけのエラーが出てしまいました。(>_<。。)

    2008年9月4日 8:07
  • こんばんは!(^^)!ふ~です。

    人生いろいろ、文法もいろいろです。

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

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

            private void Form1_Load(object sender, EventArgs e)
            {
                MyData.myint = 15;
            }       
        }

        static class MyData
        {
            public static int myint;
        }
    }

    2008年9月4日 10:51
  • !(^^)!ふ~さん有難うございます。下記と合わせて解決したような気がします。(^∀^)
    http://homepage3.nifty.com/midori_no_bike/CS/

    「C# では、グローバル変数を、サポートしていない」というのは、今日初めて知りました。。。

     

    2008年9月4日 11:39