- PR -

mdi関係で、子フォームLOAD時の子フォームの閉じ方

投稿者投稿内容
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 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

できれば、子の方で閉じたいのですが、わかる方がいらっしゃいましたら、ご教授お願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-21 20:52
引用:

どらさんの書き込み (2006-10-21 18:55) より:

そうすると、子フォームのLOADイベントが発生すると思うのですが、このときに、今開いているユーザーがform2を開く権限があるかをチェックし、なかったら閉じる処理を入れたいと思います。


Load する前 (Show される前) に判断できますよね。Load されることを前提に考えていると、選択肢を狭めることになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-10-21 22:13
ダッチです。

引用:

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



これの順番を入れ替えて

コード:
' 親フォームにて
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    if form2を開く権限があったかチェック then 
        ' なかった場合 
        Return ' 処理を抜ける
    end if 

    ' 権限があった
    Form2.MdiParent = Me 
    Form2.Activate() 
    Form2.StartPosition = FormStartPosition.CenterScreen 
    Form2.Show() 
End Sub 



とすれば子のフォームが親のフォームに対して
「私に権限がありませんので開かないでね。」と教えることができます。

普通に考えて、下記のパターンでどちらが自然だと思いますか。
親と子のやりとりを会話形式にしてみました。

<パターン1>
親:「開けますか」
子:「・・・」
親:「? とりあえず子を開いてみよう」
子:「開けないってば!」
親:「っげ!?」

<パターン2>
親:「開けますか」
子:「開けますよ」
親:「よし子を開こう」

わかりづらいかもしれませんが
パターン1が子のフォームが自分で表示を中断するパターン
パターン2が親が子に対して判断してから表示するパターンです。

パターン2の方が自然だと思いませんか?
プログラムをもっと自然に考えて見ましょう。
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-23 10:01
じゃんぬねっとさん、ダッチさん返答ありがとうございます。

みなさまの、ご意見をいただいて考えたところ、子のロード時に、権限チェックをして、閉じるのではなく、親の方で、制限するのが普通ですよね。

親のほうでチェックし、それで子フォームを開くかどうかを判別したいと思います。

また、何かありましたら、ご教授お願いいたします。ありがとうございました。
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 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 ]
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-10-23 11:02
masaさんの回答と被ってしまいますが、
各フォームに権限検証メソッド(静的)を持たせても良いかもしれません。


あと、ダッチさんの例ですが
引用:

<パターン1>
親:「開けますか」
子:「・・・」
親:「? とりあえず子を開いてみよう」
子:「開けないってば!」
親:「っげ!?」

<パターン2>
親:「開けますか」
子:「開けますよ」
親:「よし子を開こう」


だと、動作が異なるので

<パターン1>
親:「開けますか」
子:「・・・」
親:「? とりあえず子を開いてみよう」
子:「開けないってば!」
親:「っげ!?」

<パターン2>
親:「開けますか」
子:「開けません」

の方が適切かもしれませんね。
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-10-24 10:26
masaさん、うにくまさん返答ありがとうございます。

引用:

各フォームに権限検証メソッド(静的)を持たせても良いかもしれません。



子に検証メソッドを持たせて、区別する方法もあるのですね。

今のところ、権限検証だけなので、親で、チェックするようにしましたが、
さまざまなチェックをするときには、親で全部書くより、後々いいかもしれないですね。

勉強になりました。ありがとうございます。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-10-24 11:50
引用:

子に検証メソッドを持たせて、区別する方法もあるのですね。
今のところ、権限検証だけなので、親で、チェックするようにしましたが、
さまざまなチェックをするときには、親で全部書くより、後々いいかもしれないですね。


どっちに「書く」かということは主検討事項ではありません。
権限検証をおこなうための情報の所在とその管理者は誰か、
そしてそれに依存するのはどっちか、ということになります。
親が依存するなら、子は自身の機能に専念でき、子の再利用性が増します。
ただし、親子間の機能的なつながりが増します。
子が依存するなら、親は呼ぶだけになり自由度が増し、親子間の依存度が減ります。
ただし、子は依存が増えるため再利用性が減ることになります。

権限なのでたぶんシステムでユニークな位置づけと思われますので
静的検証クラスを作って随所から呼び出すという方法もあります。

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