none
Formクラス内の変数にアクセスする方法 RRS feed

  • 質問

  • こんにちは、プログラム中困ったことがあったので、質問させていただきました。

    開発環境は「Visual Studio 2005」で、プロジェクトはC#の「windous アプリケーション」です。

     

    Form1クラスの変数flagに、アクセスしたくて困っています。

    ソースコードで説明すると(ちょとTabが変です。申し訳ないです>< ここのTab機能使いずらいですね;;)

     

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

     

    namespace tesuto
    {

    public partial class Form1 : Form//Form作成時に自動的に作られるクラス
    {

    public bool flag = false;//こいつにアクセスしたい

     

    public Form1

    {

    InitializeComponent();

    }

     

    private void Form1_Load(object sender, EventArgs e)

    {

    flag = true;

    }

    }

     

        public class Myclass//自分で作ったクラス

    {

    if(Form1.flag == true)//こんな感じで呼び出したい(実際には呼びだせない)

    {

    }

    }

     

     

    というような感じです。

     

    実は前回にもFormクラスに関連する質問をして、皆さんに助けていただいたのに、また似たような質問をして申し訳ないのですが、よければ御回答よろしくお願いします。

     

    また、まだ自分はプログラムを始めたばかりの学生ですので、大変恐縮ですが少し初心者向けの回答にしていただけると、助かります。

    2008年12月8日 5:17

回答

  • C#の場合作成したプロジェクトの中の『program.cs』内で生成したフォームがスタートアップフォームですよ

     

    Code Snippet

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

                // ここの『new Form1()』で生成しているのがそのフォームです
                Application.Run(new Form1());
            }
        }
    }

     

     

    開いているフォームのインスタンスを拾いたいのであれば

    this.Application.OpenFormsから引き出せますよ

     

    出来れば フィールドをそのまま使うのではなく プロパティとしてアクセスした方が安全かと ・・・
    2008年12月8日 7:46

すべての返信

  • すいません。ソースコードで間違っている点があったので修正

     

    public class Myclass

    {

            void run()

            {

                   if(Form1.flag == true)

                    {

                    }

            }

    }

     

     

    2008年12月8日 5:52
  •  

    こんにちは!(^^)!ふ~です。

     

    ご自分で作成したクラスをForm1クラスより、継承させると、Form1のPublic変数も使えるようになります。

     

    public class Myclass : Form1

    {

            void run()

            {

                   if(Form1.flag == true)

                    {

                    }

            }

    }

    2008年12月8日 6:19
  • インスタンスというものを勉強されたら良いと思います。インスタンスの概念を学習することは非常に重要です。

    変数はクラスに属するものとインスタンスに属するものがあります。staticを付けるとクラスに属するようになります。これは、既に書かれているようにForm1.flagでアクセスできます。staticを付けなければインスタンスに属するようになりますので、Form1のインスタンスが必要になります。これをmyForm1とすれば、myForm1.flagとすることでアクセスできるようになります。インスタンスは以下のようにして作成できます。

     

    Form1 myForm1 = new Form1();

    2008年12月8日 6:26
    モデレータ
  • >>karasiさん

     

    なるほど、staticをつければ、アクセスできますね。

     

    ただ、質問してるくせに厚かましいのですが、Form1からの引数にする物全部に、staticをつけるのは少し困ります。

     

    大変申し訳ないのですが、もう少しだけスマートなやり方があれば教えてください。

    2008年12月8日 6:35
  •  

    <<ふ~さん

     

    お返事ありがとうございます。

     

    いわれたとおりにやってみたのですが、Pubilc変数が使えなかったです><(Staticを付けたのは使えた)

     

    何か設定がおかしいんでしょうか・・・。

     

    ご迷惑をおかけしますが、なにか心あたりがありそうな点があれば教えていただけると幸いです><。

    2008年12月8日 6:38
  •  SE_lain さんからの引用

    なるほど、staticをつければ、アクセスできますね。

     

    ただ、質問してるくせに厚かましいのですが、Form1からの引数にする物全部に、staticをつけるのは少し困ります。

     

    大変申し訳ないのですが、もう少しだけスマートなやり方があれば教えてください。


    ご提示されたコードだけは推測しかねましたので、

    一応、2通りの方法を提示したつもりだったのですが(しかもstaticは2番目に)

    もっともスマートな方法は、リンク先のドキュメントを読む事です。

    そこにtrapemiyaさんが書かれてる事と同じ事が書いてあります。

    2008年12月8日 6:47
  • >>trapemiyaさん

     

    お返事ありがとうございます。

     

    実はこのことは前の質問でも、少し質問させていただいたのですが自動的に作られるForm1のインスタンスの名前がわからないのです。

     

    詳しく書くと、まず実際に動かすとフォーム(今回ではForm1)がでてきますよね。

    ということはなんらかのForm1のインスタンスが自動的に作成されていることは間違いないと思うんです(実際にmyForm1のようなiインスタンスを作ってPicturebox1などの設定を変えても表示されているPicturebox1には影響がない)。

    ならば、その自動的に作られたインスタンスの名前がわかればいいじゃないか。 と思ったんですが、この質問に関しては「特にForm1のインスタンス名がわからなくてもPicturebox1などは参照(アドレス?)を示す名前なのだから、そこから変えればいい」と教えていただいたんです。

    それで前はなんとか乗り切れたのですが、今回は変数等の参照はどうやって見ればいいのだろうか? と思って質問させていただいたのです。

     

    ご迷惑おかけいたしますが、お返事お待ちしております。

    2008年12月8日 6:49
  • C#の場合作成したプロジェクトの中の『program.cs』内で生成したフォームがスタートアップフォームですよ

     

    Code Snippet

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

                // ここの『new Form1()』で生成しているのがそのフォームです
                Application.Run(new Form1());
            }
        }
    }

     

     

    開いているフォームのインスタンスを拾いたいのであれば

    this.Application.OpenFormsから引き出せますよ

     

    出来れば フィールドをそのまま使うのではなく プロパティとしてアクセスした方が安全かと ・・・
    2008年12月8日 7:46
  • こんばんは!(^^)!ふ~です。

     

    こんな感じになります。

     

    Code Snippet

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

    namespace FormMyClass
    {
     public partial class Form1 : Form
     {
      public bool bFlag = false; // アクセス

      public Form1()
      {
       InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
       MyClass test = new MyClass();
      }

     }

     

    public class MyClass : Form1
     {
      public MyClass()
      {
       MessageBox.Show("bFlag =" + bFlag.ToString());
      }

      void run()
      {
       if ( this.bFlag == true )
       {

       }

      }
     }
    }

     

     

    ごめんなさい。アクセスの仕方を忘れてました。Form1は不要で、bFlagは、そのまま行けます。

     

     

    2008年12月8日 7:47
  •  SE_lain さんからの引用

    詳しく書くと、まず実際に動かすとフォーム(今回ではForm1)がでてきますよね。

    ということはなんらかのForm1のインスタンスが自動的に作成されていることは間違いないと思うんです(実際にmyForm1のようなiインスタンスを作ってPicturebox1などの設定を変えても表示されているPicturebox1には影響がない)。

     

    redfox63さんも書かれていますが、Program.csというファイルがあると思います。そこでnewしています。

     

     SE_lain さんからの引用

    それで前はなんとか乗り切れたのですが、今回は変数等の参照はどうやって見ればいいのだろうか? と思って質問させていただいたのです。

     

    なるほど。そういう質問だったのですね。Picturebox1は、Form1クラス内でPictureboxをnewしてそのインスタンスがPicturebox1にセットされています。Picturebox1はForm1クラスにある変数ですので、Form1クラス内から簡単にアクセスできるわけです。

    ところが、Form1という変数はMyclassクラスには存在しません。なので、Myclassクラスにおいて、Form1という変数にアクセスすることはできません。

    ではどうすれば良いのか?

    MyclassクラスからForm1クラスのインスタンスへアクセスできれば良いのです。この場合、Form1のインスタンスをForm1においてpublicでstaticなプロパティで公開する、Myclassを作成する時にForm1のインスタンスをMyclassに渡すなどが考えられます。技術的にはこのようにすれば可能ですが、これらを必ずしも推奨するものではありません。今回のケースですと、redfox63さんがご紹介されている方法で目的が達成されるのではないかと思います。

     

    #Form1がクラス名でもインスタンス変数名でも使われているので、この区別をしっかりして下さい。

    2008年12月8日 8:20
    モデレータ
  • >>redfox63さん

    お返事ありがとうございます。

     

    >>Application.Run(new Form1());
    おお!こんなところで作っていたのですね!ありがとうございます。

     

    >>開いているフォーム

    っていうのは今でいうForm1であってますよね?

     

    >>this.Application.OpenFormsから引き出せますよ

    すいません><どこでこれを使えばいいのかわかりません。

    「Form1.cs*」のプロジェクトのForm1クラスの中とかで呼び出して見たんですけど、呼び出せませんでした。

     

     

    >>出来れば フィールドをそのまま使うのではなく プロパティとしてアクセスした方が安全かと ・・

    了解です。できるだけメソッドとか使って、呼び出そうと思います。

    2008年12月8日 9:34
  • >>ふ~さん

     

    お返事ありがとうございます。

    こちらで示してもらった通りに書けばアクセスすることができました^^ありがとうございます。

     

    でも、他の方法なども学びたいのでまだ質問はつづけさせていただきますね。

    2008年12月8日 9:37
  • >>trapemiyaさん

     

    お返事ありがとうございます。

     

    <<#Form1がクラス名でもインスタンス変数名でも使われているので、この区別をしっかりして下さい。

    2通りで使われていたんですか・・・なるほどです。

     

    <<Picturebox1は、Form1・・・

    なるほど・・・クラスの中でnewしていたんですね・・・納得です。

     

     

    2008年12月8日 9:53
  • OpenFormsはFormのコレクションですから

    Code Snippet

    Form1 frm = null;

    frm = (Form1)this.Application.OpenForms[0];

    if frm.bFLag )

    {

    // 何らかの処理

    }

     

     

     

     

    といった具合でいいかと ・・・
    2008年12月9日 7:58
  • >>redfox63

     

    お返事ありがとうございます。おかげさまで解決できました。

     

     

    2008年12月9日 9:30