- PR -

フォームの切り替え

投稿者投稿内容
たぬき
会議室デビュー日: 2003/06/04
投稿数: 16
投稿日時: 2003-12-04 16:30
早速ですが、
メインとサブの雛型フォームが2個あるとします。

メインとなる画面に1〜10までのボタンを設置し、1のボタンを押すとサブフォームの型で
新たにフォームを作成して表示(フォームのタイトルは「form1」)、
2を押すとサブフォームの型で新たにフォームを作成して表示(フォームのタイトル
は「form2」)するとします。

この時、1のボタンを再度押すと、すでにロード(メイン画面の後ろに表示されている)
されているform1を一番前に持っていきたいのですが、
その方法がわかりません。

ハンドルの取得とか、その辺も疎いのですが、どなたか手法をご存知の方、
よろしくお願い致します。


ないとー
会議室デビュー日: 2002/08/29
投稿数: 9
投稿日時: 2003-12-04 17:54
とりあえず、開発環境とかは書きましょうよ。
Windows? Web? C#? VB.NET?

で、Windowsであれば、ベタですが、こんな感じにすればできるかと。

SubForm f1 = null;
SubForm f2 = null;
・・・

private void button1_click(object sender, System.EventArgs e)
{
if(f1 == null)
{
f1 = new SubForm();
f1.Closed += new EventHandler(f1_Closed);
f1.Text = "Form1";
f1.Show();
}
else
{
f1.Activate();
}
}
private void f1_Closed(object sender, EventArgs e)
{
f1 = null;
}

これらを10個書く。共通化できるところは共通化して下さい。
たぬき
会議室デビュー日: 2003/06/04
投稿数: 16
投稿日時: 2003-12-04 18:59
すいません、言葉足らずでした。C#で通常のwindowsフォームです。
Mainform.cs と Subform.csというフォームファイルがあって処理的には

Subform F_subform = new Subform();
F_subform.Show();

というこの2行を使いまわしています。どのボタンを押してもこの処理に飛んでくる
状態です。

「ないとー」さんのように

SubForm f1 = null;
SubForm f2 = null;

という感じでそれぞれ変数を分けるということはしていません。
私の作り方が悪いのかも知れませんが・・・・
変数1個だけで、どのフォームがロードされているのかを
判断するのは無理なのでしょうか?

ないとー
会議室デビュー日: 2002/08/29
投稿数: 9
投稿日時: 2003-12-04 20:20
どんな動作をさせたいのか見えないのですが、Subformは常に1つなんですか?
たとえば、ボタン1を押して、"Form1"のSubformが表示された後で、ボタン2を押すとどうなるのですか?
たぬき
会議室デビュー日: 2003/06/04
投稿数: 16
投稿日時: 2003-12-05 09:07
お返事ありがとうございます

>どんな動作をさせたいのか見えないのですが、Subformは常に1つなんですか?

 雛型ファイルは1つなんですが、表示されるのは複数です。
コピーを作るイメージと言えばよいのでしょうか。


>たとえば、ボタン1を押して、"Form1"のSubformが表示された後で、
>ボタン2を押すとどうなるのですか?
 
 もう1個Subformが作成され、表示されます(タイトルはform2 「ボタン2の方が
 いいかも・・」 です)。
 
 この時点でデスクトップ上にはメイン画面を含め3個のフォームが表示されています。
 
 もし、この後にもう一度ボタン1を押したらタイトル「form1(ボタン1)」のフォームが
 最前面に表示され、もう一度ボタン2を押すと、今度はタイトルform2(ボタン2)が
 最善面に表示されます。


 言い方が不明確かも知れませんが、よろしくお願い致します。
 

ないとー
会議室デビュー日: 2002/08/29
投稿数: 9
投稿日時: 2003-12-05 10:01
なるほど、動作は良く分かりました。

でも、ボタンを押した際は、必ず以下の記述が書いてあるメソッド(イベントハンドラ)に飛んでくるんですよね?
Subform F_subform = new Subform();
F_subform.Show();
確かに、この記述を書いてあればボタンを押すたびに、1つのFormが作成され表示されますね。
しかし、Subformの変数が1つであるということは、Subformのオブジェクトを1つしか保持できない(MainFormから操作可能なSubformのオブジェクトは1つだけ)と、いうことでは?
つまり、newするたびに、F_subformに格納されるオブジェクトの参照(アドレス)が変わってしまい、それまで格納されていたオブジェクトの参照は失われます。
表示されているSubformはきえませんが、参照が失われ、MainForm側からは操作不能になるということだと思います。
失われる前に、何ボタンで表示されたのかを判別できるようにした上で、何かに退避させておく必要がありますね。

なので、私は、Subform用の変数を複数用意しました。Hashtableに格納してもよいかも。
たぬき
会議室デビュー日: 2003/06/04
投稿数: 16
投稿日時: 2003-12-05 12:26
どうもダメっぽいですね・・・。複数枚(数は未定)のフォームを雛型から作成した場合、
今回求めていた画面遷移をスマートに走らせる方法があればいいなと思っていたんですが。
やっぱりムリなんですかねー。

いずれにせよ、どうも有難うございました。


ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2003-12-05 13:42
参考までに
ないとーさんのおっしゃるように
Hashtableに入れるとこんなかんじです。

コード:
private Hashtable _hash = new Hashtable();

private void buttons_click(object sender, System.EventArgs e)
{
	Button btn = (Button)sender;
	if(_hash.Contains(sender) == false)
	{
		Subform form = new Subform();
		form.Text = btn.Text;	// テスト:とりあえず区別がつくように
		_hash.Add(btn, form);
		form.Show();
	} 
	else 
	{
		Subform form = (Subform)_hash[btn];
		form.Activate();
	}
}

スキルアップ/キャリアアップ(JOB@IT)