- - PR -
mdi関係で、子フォームLOAD時の子フォームの閉じ方
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-21 18:55
vs2005 winxp winform
いつも、拝見しております。 今、MDI関係を持っている親フォームからボタン押下で、子フォームを開く処理が入れてあります。 fom1親フォーム form2子フォーム Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Form2.MdiParent = Me Form2.Activate() Form2.StartPosition = FormStartPosition.CenterScreen Form2.Show() End Sub そうすると、子フォームのLOADイベントが発生すると思うのですが、このときに、今開いているユーザーがform2を開く権限があるかをチェックし、なかったら閉じる処理を入れたいと思います。 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load if 権限チェック() = false '権限があるかチェック なかったら閉じる Me.Close() end if End Sub という処理をいれております。そうすると、me.close時に「CreateHandle() の実行中は値 Close() を呼び出せません。」という、エラーが発生してしまします。 こういう場合というのは、親フォームの方で、判断するしかないのでしょうか?? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Form2.MdiParent = Me Form2.Activate() Form2.StartPosition = FormStartPosition.CenterScreen Form2.Show() if form2を開く権限があったかチェック then 'なかった場合 form2.close end if End Sub できれば、子の方で閉じたいのですが、わかる方がいらっしゃいましたら、ご教授お願いいたします。 | ||||||||
|
投稿日時: 2006-10-21 20:52
Load する前 (Show される前) に判断できますよね。Load されることを前提に考えていると、選択肢を狭めることになります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-10-21 22:13
ダッチです。
これの順番を入れ替えて
とすれば子のフォームが親のフォームに対して 「私に権限がありませんので開かないでね。」と教えることができます。 普通に考えて、下記のパターンでどちらが自然だと思いますか。 親と子のやりとりを会話形式にしてみました。 <パターン1> 親:「開けますか」 子:「・・・」 親:「? とりあえず子を開いてみよう」 子:「開けないってば!」 親:「っげ!?」 <パターン2> 親:「開けますか」 子:「開けますよ」 親:「よし子を開こう」 わかりづらいかもしれませんが パターン1が子のフォームが自分で表示を中断するパターン パターン2が親が子に対して判断してから表示するパターンです。 パターン2の方が自然だと思いませんか? プログラムをもっと自然に考えて見ましょう。 | ||||||||
|
投稿日時: 2006-10-23 10:01
じゃんぬねっとさん、ダッチさん返答ありがとうございます。
みなさまの、ご意見をいただいて考えたところ、子のロード時に、権限チェックをして、閉じるのではなく、親の方で、制限するのが普通ですよね。 親のほうでチェックし、それで子フォームを開くかどうかを判別したいと思います。 また、何かありましたら、ご教授お願いいたします。ありがとうございました。 | ||||||||
|
投稿日時: 2006-10-23 10:54
> 親のほうでチェックし、それで子フォームを開くかどうかを判別したいと思います。
判別ロジックを親に書くと、 ・子だくさんになったときに親が大変です それぞれの子に対するロジックが多くなると、親フォームのコードが膨れます。 ・親離れしにくくなります。 汎用ツールウィンドウのような子フォームを他のプログラムにも使用しようとした場合、 その子を扱うためのコードも親にコピーしなくてはならなくなります。 子フォーム内だけで判断できるのであれば、 判断ロジックは public または friend メソッドとして子フォームに書き、 それを親フォームから呼び出すとコードがすっきりすると思います。 <追記> 子フォーム内だけで判断できないとしても、 親フォームなどで管理している「現在の状態」を渡して判断させてもよいですね。 例えば、こんな感じ(UserInfo はユーザーの情報を格納したクラス)。 public function CanOpenDialog(user as UserInfo) as boolean 権限があれば true を返す end function [ メッセージ編集済み 編集者: masa 編集日時 2006-10-23 11:01 ] | ||||||||
|
投稿日時: 2006-10-23 11:02
masaさんの回答と被ってしまいますが、
各フォームに権限検証メソッド(静的)を持たせても良いかもしれません。 あと、ダッチさんの例ですが
だと、動作が異なるので <パターン1> 親:「開けますか」 子:「・・・」 親:「? とりあえず子を開いてみよう」 子:「開けないってば!」 親:「っげ!?」 <パターン2> 親:「開けますか」 子:「開けません」 の方が適切かもしれませんね。 | ||||||||
|
投稿日時: 2006-10-24 10:26
masaさん、うにくまさん返答ありがとうございます。
子に検証メソッドを持たせて、区別する方法もあるのですね。 今のところ、権限検証だけなので、親で、チェックするようにしましたが、 さまざまなチェックをするときには、親で全部書くより、後々いいかもしれないですね。 勉強になりました。ありがとうございます。 | ||||||||
|
投稿日時: 2006-10-24 11:50
どっちに「書く」かということは主検討事項ではありません。 権限検証をおこなうための情報の所在とその管理者は誰か、 そしてそれに依存するのはどっちか、ということになります。 親が依存するなら、子は自身の機能に専念でき、子の再利用性が増します。 ただし、親子間の機能的なつながりが増します。 子が依存するなら、親は呼ぶだけになり自由度が増し、親子間の依存度が減ります。 ただし、子は依存が増えるため再利用性が減ることになります。 権限なのでたぶんシステムでユニークな位置づけと思われますので 静的検証クラスを作って随所から呼び出すという方法もあります。 |