VB 6.0で、MDIアプリケーションを作成しております。
MDI内の子ウィンドウAのボタンを押したときに、子ウィンドウB
のボタンのEnable状態を変更したいのですが、どのようにコード
を書くのが一番スマートなのかわかりません。良い方法を教えてください。
但し、子ウィンドウBが開いているか(ロードしているか)は、
わかりません。また、できれば子ウィンドウBが開いているかは
管理したくありません。
イメージ的には子ウィンドウAでボタンを押したときになんらかの
イベントを発信して、もし子ウィンドウBが開いていたらそのイベントを
受けとって表示を更新する、みたいなことがやりたいです。
> MDI内の子ウィンドウAのボタンを押したときに、子ウィンドウB
> のボタンのEnable状態を変更したいのですが、
単純には、FormA側で、
Private Sub Command1_Click()
FormB.Command1.Enabled = False
End Sub
のように書く事となるかと。
# 子フォームを「New FormB」等で生成していなければ、ですけど。
> 子ウィンドウBが開いているか(ロードしているか)は、
> わかりません。
ロードされていなかった場合は、どうされたいのでしょうか?
それによって、コードの書き方も変わってくると思います。
(a) Loadして、ボタンのEnableを変更し、Bを表示する。
(b) Loadして、ボタンのEnableを変更するが、Bは表示しないまま。
(c) Loadせず、ボタンのEnableも変更しない(つまり、何もしない)。
(d) その他
> 但し、子ウィンドウBが開いているか(ロードしているか)は、
> わかりません。また、できれば子ウィンドウBが開いているかは
> 管理したくありません。
Loadしているかどうかは、以下のようにして調査できます。
http://www.gj.il24.net/~nakasima/vb/tips/index.htm#VBTIPS4
> イメージ的には子ウィンドウAでボタンを押したときになんらかの
> イベントを発信して、もし子ウィンドウBが開いていたらそのイベントを
> 受けとって表示を更新する、みたいなことがやりたいです。
その場合、子ウィンドウBでイベントを受け取れる状態にするために、
FormBに「Private WithEvents Button As CommandButton」などの宣言を書き、
かつ、この Button という変数に、「Set Button = FormA.Command1」などとして、
ボタンへの参照を格納しておいてください。
そうすると、FormA.Command1がクリックされたときに、FormBの
Sub Button_Click() プロシージャが呼び出される事になります。
素早い回答ありがとうございます。
おかげで解決することができました。
一部説明不足でもうしわけありませんでした。
> ロードされていなかった場合は、どうされたいのでしょうか?
> それによって、コードの書き方も変わってくると思います。
>
> (a) Loadして、ボタンのEnableを変更し、Bを表示する。
> (b) Loadして、ボタンのEnableを変更するが、Bは表示しないまま。
> (c) Loadせず、ボタンのEnableも変更しない(つまり、何もしない)。
> (d) その他
(c)です。
> Loadしているかどうかは、以下のようにして調査できます。
> http://www.gj.il24.net/~nakasima/vb/tips/index.htm#VBTIPS4
こんな方法もあるんですね。
勉強になります。
> その場合、子ウィンドウBでイベントを受け取れる状態にするために、
> FormBに「Private WithEvents Button As CommandButton」などの宣言を書> き、
> かつ、この Button という変数に、「Set Button = FormA.Command1」など> として、
> ボタンへの参照を格納しておいてください。
> そうすると、FormA.Command1がクリックされたときに、FormBの
> Sub Button_Click() プロシージャが呼び出される事になります。
この方法で行うことにしました。
子ウィンドウBに相当するウィンドウが今後増えていく可能性があり、
メンテナンス上、Formの追加と、FormAの処理追加の2つになると修正忘れが
おきそうなので、Form追加の部分で全て完結できるこの方法としました。
非常にわかりやすくて助かりました。
ありがとうございます。