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

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

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

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

Q&A

解決済

3回答

2976閲覧

モードレスFormを1つだけ表示させたい

WEjpon

総合スコア88

C#

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

0グッド

1クリップ

投稿2019/03/29 00:32

編集2019/03/29 01:32

C#のFormアプリケーションで、Form1からForm2をモードレスで1つだけ表示させたいです。
上のようにするとボタンクリックの度に表示されるので、下のようにしたら所望の動作をしましたが、なんとなくスマートな方法ではないと感じています。

他の良い方法は無いでしょうか?それとも下の方法で充分でしょうか。

C#

1 // Form1のイベントハンドラ 2 private void button1_Click(object sender, EventArgs e) 3 { 4 Form2 form2 = new Form2(); 5 form2.Show(); 6 }

C#

1     // Form1のメンバ変数 2 Form2 form2 = new Form2(); 3 4 // Form1のイベントハンドラ 5 private void button1_Click(object sender, EventArgs e) 6 { 7 form2.Show(); 8 }

以下、追記。

<スマートで無いと感じる理由>
Show()によりフォームが開くかどうかをShow()の仕様に任せているように感じるため。
下のコードで1つしか開かないことをShow()で保障しているかがわからない。
Show()呼び出し前に明示的に確認必要かどうかがわからない。

<知りたいこと>
システム全体としてのスマートさやデータ受渡し方法などは考慮せず、
「Form1からForm2をモードレスで1つだけ表示させたい」という点のみ
に絞ったときに下のコードが適切か。他によい方法があるか。

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

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

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

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

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

m.ts10806

2019/03/29 00:42

特に問題が起きてないのでしたらこれでいいような。 どのようなアドバイスを期待されているのでしょうか。(回答者も魔法使いではないのであくまで言語仕様と要件に沿ったものしかできません)
guest

回答3

0

この内容だけで何がスマートかを判断するのは不可能です。
現状問題が起きていないのならそれでOKとして進むべきではないでしょうか。

もし、もっと期待されているアドバイスがあるのでしたら作ろうとしているアプリケーションの全体の概要とか仕様とかそのあたり詳しく書かれるべきかと思います。

投稿2019/03/29 00:50

m.ts10806

総合スコア80850

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

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

WEjpon

2019/03/29 01:07

すみません、質問が簡略過ぎました。 データ・イベントの渡し方なども含めた全体としてのスマートさではなく、 「Form1からForm2をモードレスで1つだけ表示させる」の1点に絞ったつもりでした。 form2.Show()実行のとき表示されるかされないかがform2側で常に適切に処理してくれるかがわからず、明示的に記述する方法があればと思い質問させていただきました。
m.ts10806

2019/03/29 01:22

ご存知かもしれませんが、質問は編集できますので要件は具体的にお願いします。エスパー回答期待は逆に回答者を遠ざけますし、ざっくり質問にはざっくり回答しかつきません。
WEjpon

2019/03/29 01:27

質問を追記しておきます。 アドバイスありがとうございます。
guest

0

ベストアンサー

なぜスマートな方法でないのでしょう?
他の条件を無視して質問に書いてある条件のみを材料に考えれば、下がベストです。

投稿2019/03/29 00:42

Zuishin

総合スコア28660

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

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

WEjpon

2019/03/29 00:57

Show()の仕様として既に開かれている場合は再度開かれないことがはっきりしているかどうかの自信が無かったもので、スマートで無いと感じました。 探しても見つからなかったのですが、下記のような方法があるかと思い質問させていただきました。 if(!form2.IsOpened) { form2.Show(); }
Zuishin

2019/03/29 01:04

Show は Visible を true にするので Visible で条件分岐できますが、その分岐は Show 内部に含まれているので不要です。
WEjpon

2019/03/29 01:16

そういうことでしたか! すごくスッキリしました。
guest

0

表示するだけなら上の方法でOKです
が、繰り返しクリックされると、その分だけフォームが表示されることになりますんで、そこらへん考える必要はありますね

投稿2019/03/29 00:47

y_waiwai

総合スコア87747

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

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

WEjpon

2019/03/29 01:01

下の方法だと繰り返しクリックでも1つしか表示されなかったのですが、他によい方法があるのではと感じたので質問させていただきました。
y_waiwai

2019/03/29 01:04

ならそういうふうに質門に書きましょう。 上ではなぜクリックした分フォームが表示されるのか、 下ではなぜ一つだけなのか、を考えてみればどうでしょうか
WEjpon

2019/03/29 01:13

そういうふうに質問に書いたつもりです。 上の理由はわかります。 下の理由はわかりませんでした。Form2.Show()がうまく判断してくれてるからと思いました。
y_waiwai

2019/03/29 01:19

Show()メソッドはたんにフォームのVisibleプロパティをTrueにするだけ、 と考えればわかるでしょうか。 下の場合はForm2のインスタンスが一つだけで固定されてますんで、 繰り返しクリックしたところで同じフォームのVisibleをTrueにするだけ、ってことですね
WEjpon

2019/03/29 01:26

試してみると、Show()の換わりに.Visible = trueでも開くことができました。 下が動作する理由も納得できました。 一応追加確認で、 .Visible = trueで開く ⇒ Form閉じる ⇒ .Visible = trueで開く をすると「破棄されたオブジェクトにアクセスできません。」例外が出たので、Show()はインスタンス作成とVisible trueをやっているようでした。
y_waiwai

2019/03/29 02:08 編集

いや、インスタンス作成はnewです。 フォームをCloseするとフォームのインスタンスは破棄されます なので、Closeして再度開けるためには、 ・FormClosingイベントで、フォーム閉じないでVisibleをFalseにするだけにする ・再度開くときにはnewをやり直す のいずれかの対処が必要です。
Zuishin

2019/03/29 01:44

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form.close?view=netframework-4.7.2 > When the Close method is called on a Form displayed as a modeless window, you cannot call the Show method to make the form visible, because the form's resources have already been released. To hide a form and then make it visible, use the Control.Hide method. ×ボタンや Close を呼んだ場合には破棄されるのでそれ以降は使えません。 ×ボタンを表示しないようにして「閉じる」ボタンを作り、そこで Hide を呼ぶか、Closing イベントハンドラを使って破棄されないようにする必要があります。
Zuishin

2019/03/29 01:49

mts10806 さんのおっしゃる通り、聞きたいことだけ書かれていて詳細なユースケースがわからないので回答の方も詳細に書くことができません。私の回答に「他の条件を無視して」と但し書きがついているのもそのためです。次回の質問は具体的な使用法がわかるようにお書きください。
WEjpon

2019/03/29 01:51

ご指摘の通りです。反省します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問