トップ回答者
Formクラス内の変数にアクセスする方法

質問
-
こんにちは、プログラム中困ったことがあったので、質問させていただきました。
開発環境は「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クラスに関連する質問をして、皆さんに助けていただいたのに、また似たような質問をして申し訳ないのですが、よければ御回答よろしくお願いします。
また、まだ自分はプログラムを始めたばかりの学生ですので、大変恐縮ですが少し初心者向けの回答にしていただけると、助かります。
回答
-
C#の場合作成したプロジェクトの中の『program.cs』内で生成したフォームがスタートアップフォームですよ
Code Snippetnamespace CSTest12
{
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);// ここの『new Form1()』で生成しているのがそのフォームです
Application.Run(new Form1());
}
}
}開いているフォームのインスタンスを拾いたいのであれば
this.Application.OpenFormsから引き出せますよ
すべての返信
-
-
インスタンスというものを勉強されたら良いと思います。インスタンスの概念を学習することは非常に重要です。
変数はクラスに属するものとインスタンスに属するものがあります。staticを付けるとクラスに属するようになります。これは、既に書かれているようにForm1.flagでアクセスできます。staticを付けなければインスタンスに属するようになりますので、Form1のインスタンスが必要になります。これをmyForm1とすれば、myForm1.flagとすることでアクセスできるようになります。インスタンスは以下のようにして作成できます。
Form1 myForm1 = new Form1();
-
-
>>trapemiyaさん
お返事ありがとうございます。
実はこのことは前の質問でも、少し質問させていただいたのですが自動的に作られるForm1のインスタンスの名前がわからないのです。
詳しく書くと、まず実際に動かすとフォーム(今回ではForm1)がでてきますよね。
ということはなんらかのForm1のインスタンスが自動的に作成されていることは間違いないと思うんです(実際にmyForm1のようなiインスタンスを作ってPicturebox1などの設定を変えても表示されているPicturebox1には影響がない)。
ならば、その自動的に作られたインスタンスの名前がわかればいいじゃないか。 と思ったんですが、この質問に関しては「特にForm1のインスタンス名がわからなくてもPicturebox1などは参照(アドレス?)を示す名前なのだから、そこから変えればいい」と教えていただいたんです。
それで前はなんとか乗り切れたのですが、今回は変数等の参照はどうやって見ればいいのだろうか? と思って質問させていただいたのです。
ご迷惑おかけいたしますが、お返事お待ちしております。
-
C#の場合作成したプロジェクトの中の『program.cs』内で生成したフォームがスタートアップフォームですよ
Code Snippetnamespace CSTest12
{
static class Program
{
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);// ここの『new Form1()』で生成しているのがそのフォームです
Application.Run(new Form1());
}
}
}開いているフォームのインスタンスを拾いたいのであれば
this.Application.OpenFormsから引き出せますよ
-
こんばんは!(^^)!ふ~です。
こんな感じになります。
Code Snippetusing 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は、そのまま行けます。
-
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がクラス名でもインスタンス変数名でも使われているので、この区別をしっかりして下さい。
-
>>redfox63さん
お返事ありがとうございます。
>>Application.Run(new Form1());
おお!こんなところで作っていたのですね!ありがとうございます。>>開いているフォーム
っていうのは今でいうForm1であってますよね?
>>this.Application.OpenFormsから引き出せますよ
すいません><どこでこれを使えばいいのかわかりません。
「Form1.cs*」のプロジェクトのForm1クラスの中とかで呼び出して見たんですけど、呼び出せませんでした。
>>出来れば フィールドをそのまま使うのではなく プロパティとしてアクセスした方が安全かと ・・
了解です。できるだけメソッドとか使って、呼び出そうと思います。