MDIアプリで、子ウィンドウAから子ウィンドウBのボタン表示を更新するには?

解決


おくとぱしぃ  2004-07-27 01:24:55  No: 115033

VB 6.0で、MDIアプリケーションを作成しております。
MDI内の子ウィンドウAのボタンを押したときに、子ウィンドウB
のボタンのEnable状態を変更したいのですが、どのようにコード
を書くのが一番スマートなのかわかりません。良い方法を教えてください。

但し、子ウィンドウBが開いているか(ロードしているか)は、
わかりません。また、できれば子ウィンドウBが開いているかは
管理したくありません。

イメージ的には子ウィンドウAでボタンを押したときになんらかの
イベントを発信して、もし子ウィンドウBが開いていたらそのイベントを
受けとって表示を更新する、みたいなことがやりたいです。


魔界の仮面弁士  2004-07-27 02:28:31  No: 115034

> 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() プロシージャが呼び出される事になります。


おくとぱしぃ  2004-07-27 03:50:25  No: 115035

素早い回答ありがとうございます。
おかげで解決することができました。

一部説明不足でもうしわけありませんでした。

> ロードされていなかった場合は、どうされたいのでしょうか?
> それによって、コードの書き方も変わってくると思います。
>
> (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追加の部分で全て完結できるこの方法としました。

非常にわかりやすくて助かりました。
ありがとうございます。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加