VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2006/10/02(Mon) 10:05
投稿者魔界の仮面弁士
Eメール
URL
タイトルRe: ActiveXドキュメントEXE

子フォームに、呼び出し元のドキュメントのプロパティを操作させようという事ですね。
その設計だと、UserDocument と Form 間の結びつきが双方向になるので、結合度が強すぎて
汎用性が薄くなってしまうのではないでしょうか。

他の UserDocument にも流用可能な、汎用的なフォームにしたいのであれば、操作の方向を
見直した方が良い気もします。すなわち、親の世話(Form1.Command1.Enabled)を子供に
やらせるというのではなく、親が自分で、自身と子供の面倒を見るような設計にする
という事です。これなら、子フォームの「親」への依存度を下げることができますので。

# ただし、その子フォームが、「そのUserDocumentを管理するための専用フォーム」として
# 特化された物であれば、今の設計のままでも、さほど問題は無いかと思います。


> このように別フォームからUserDocument1を制御かける方法はないのでしょうか?

たとえば、

(案1) 子に、操作対象(UserDocument1 の Command1)のインスタンスを渡しておく。☆
(案2) 子に管理させず、親(UserDocument1)自身が自分で制御する。★
(案3) ボタンを制御させるタイミングで、子が親にイベントとして通知する。◎

などといった方法があるかと思います。(あとは、コールバックメソッドとか)
一応、それぞれのパターンを例示しておきます。


'=================
'===== Form1 =====
'=================
Option Explicit

'制御対象となる親フォームの部品
Private WithEvents ownerButton As VB.CommandButton

'◎ 案3 : 操作が必要になるたびに、親にそれを通知する ◎
Public Event ButtonClicked()

'☆ 案1 : 子フォームに、操作対象のインスタンスを渡しておく☆
'パラメータを渡すための初期化処理
Friend Sub Initialize(ByVal Button As VB.CommandButton)
    Set ownerButton = Button
    'この中では、自身のコントロール等を操作しないこと。
    'コントロールの初期化等が必要なら、Loadイベントを使うようにする。
End Sub

'子に親の面倒をみさせる場合のサンプル
Private Sub Command1_Click()
    If Not ownerButton Is Nothing Then
        '制御対象のボタンが、初期化パラメータが渡されていれば、
        'それを使って、ボタンの Enabled を制御する。
        ownerButton.Enabled = Not ownerButton.Enabled
    End If
End Sub

'子が親に通知する場合のサンプル
Private Sub Command2_Click()
    '◎ 案3 : 操作が必要になるたびに、親にそれを通知する ◎
    RaiseEvent ButtonClicked    '独自の ButtonClicked イベントを発生させる
End Sub


'=========================
'===== UserDocument1 =====
'=========================
Option Explicit

'子フォームのイベントを受け取れるよう、WithEvents にしておく
Private WithEvents childForm As Form
Private WithEvents childCustomForm As Form1

'ボタンを押すと、子フォームが開かれる
Private Sub Command1_Click()
    '★ 2 : ボタンの Enabled を、自分自身で制御する★
    'フォーム表示中は、ボタンを使用不可にする
    Command1.Enabled = False
    
    '子フォームのイベントを受け取るための WithEvents 変数
    Set childCustomForm = New Form1
    Set childForm = childCustomForm
    
    '★ 1 : 子フォームに、操作対象のインスタンスを渡しておく★
    childCustomForm.Initialize UserDocument.Command1
    
    'フォームの呼び出し
    Load childCustomForm
    childCustomForm.Show
End Sub

Private Sub childForm_Unload(Cancel As Integer)
    '★ 2 : ボタンの Enabled を、自分自身で制御する★
    Command1.Enabled = True
    
    '使い終わった変数を破棄
    Set childForm = Nothing
    Set childCustomForm = Nothing
End Sub

Private Sub childCustomForm_ButtonClicked()
    '◎ 案3 : 操作が必要になるたびに子供から知らされるので、それに対応する ◎
    Command1.Enabled = Not Command1.Enabled
End Sub


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -