- PR -

Eventの関連づけに関して

1
投稿者投稿内容
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-20 15:15
〔会議室選択を誤ってしまい、2度の投稿お許し下さいませ〕

以下のように Formにあるボタンコントロールを
まとめてイベントに関連づけ処理しようとし、

Dim ctrl As Control
For Each ctrl In Me.Controls
 If TypeOf ctrl Is Button Then
  AddHandler ctrl.Click, AddressOf cmdButtons_Click
  AddHandler ctrl.MouseHover, AddressOf cmdButtons_MouseHover
  AddHandler ctrl.MouseLeave, AddressOf cmdButtons_MouseLeave
 End If
Next

の部分で、Me.Controls にすると、イベントは関連できたのですが、
アプリ終了時、以下のようにエラー中断してしまいます。
「このフォームの MDIParent として指定されたフォームは MDIContainer ではありません。」

で、Meがだめなのか、と思い、
Dim f As New frmMain
Dim ctrl As Control
For Each ctrl In f.Controls

とすると、コントロールは認識するんですが、
肝心のAddHandler がうまくいかずに関連づけできません(謎)
中断のエラーはなく普通に終了できます。

Meの使いかたや、MDIフォームで何か制限とかあるのでしょうか。。

--
MDIフォーム表示コード部:
Private Sub cmdButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs)
Dim fmdi As Form
Dim frm As New Form
Select Case sender.name
 Case "cmdButton1"
  frm = New frmChild1(Me)
 Case "cmdButton2"
  frm = New frmChild2(Me)
 Case "cmdButton3"
  :

End Select

For Each fmdi In Me.MdiChildren
 If fmdi.Name = frm.Name Then
  Exit Sub
 End If
Next
frm.MdiParent = Me
frm.Show()
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-21 01:31
諸農です。

引用:

以下のように Formにあるボタンコントロールを
まとめてイベントに関連づけ処理しようとし、

※中略

の部分で、Me.Controls にすると、イベントは関連できたのですが、
アプリ終了時、以下のようにエラー中断してしまいます。
「このフォームの MDIParent として指定されたフォームは MDIContainer ではありません。」

で、Meがだめなのか、と思い、

※中略

とすると、コントロールは認識するんですが、
肝心のAddHandler がうまくいかずに関連づけできません(謎)
中断のエラーはなく普通に終了できます。

Meの使いかたや、MDIフォームで何か制限とかあるのでしょうか。。



何となく言わんとしている事は判りそうなんですが、
私の読解力不足のため、何がダメなのか全くわかり
ませんでした。

1.MDIアプリを作っている
2.MDI子フォーム上のボタンクリックで、別途用意したイベント
 メソッドを当該のMDI子フォーム上のボタンコントロールの
 Click、MouseHover,MouseLeaveイベントにセットしたい。

問題
1.アプリ終了時にエラーが出る

試みた対策
1.MDI親フォームで New frmMain とし、インスタンスが格納
 された変数を利用してそのフォーム上のボタンコントロール
 のClick、MouseHover,MouseLeaveイベントにメソッドを
 セットしてみた。

結果
1.MDI子フォームのボタンコントロールをクリックしても、
 マウスが通過しても、イベントが発生しない(メソッドが呼ばれない)

と言う事でしょうか?

ところで、以下のコードですが、これはイベントに登録したいメソッドですか?
それとも何か別の処理ですか?

コード:
Private Sub cmdButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs) 
Dim fmdi As Form 
Dim frm As New Form 
Select Case sender.name 
 Case "cmdButton1" 
  frm = New frmChild1(Me) 
 Case "cmdButton2" 
  frm = New frmChild2(Me) 
 Case "cmdButton3" 
  : 

End Select 

For Each fmdi In Me.MdiChildren 
 If fmdi.Name = frm.Name Then 
  Exit Sub 
 End If 
Next 
frm.MdiParent = Me 
frm.Show() 




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ヤマザキ
常連さん
会議室デビュー日: 2004/05/10
投稿数: 22
投稿日時: 2004-05-21 09:23
Jubei様

私の下手な説明で申し訳ありません。
まず、投稿したコードは、全てfrmMain(MDIコンテナ)上のコードです。

・MDIアプリで、frmMain が親コンテナ
・MDI子フォームが Child1, Child2, と5つ程度
・親frmMain にメニューのようなイメージでボタンがあります。
 そのfrmMain.button 全てに別途用意したメソッド、Private Sub cmdButtons_Click ...
 MouseHover,MouseLeave をセットしたい。
・例のコードは、登録したい子フォームを表示するイベント。

というものでした。

で、昨日から色々やっていたのですが、
単純に、
Private Sub cmdButtons_Click(ByVal sender As System.Object, ByVal e As EventArgs)
 Dim fmdi As Form
 Dim frm As New Form

 Me.IsMdiContainer = True   ' ここで明示
 Select Case sender.name

としたら、エラーもなくなりました。。。。。?
プロパティが途中で消えるのか?という感じです。
なんかお騒がせしてしまったようで申し訳ありません。
投稿前にもう少しがんばるようにしなきゃいけませんね。
1

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