[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/10/01(Sun) 16:11
投稿者名:k1
Eメール:
URL :
タイトル:
ActiveXドキュメントEXE
はじめまして
ActiveXドキュメントを利用したアプリケーションで、
以下の方法を実施したいのですが、
エラーID=424(オブジェクトが必要です)が表示されます。

1.UserDocument1(.dob)に[Command1]を貼り付け
 このクリックイベントで別フォーム[Form1]を表示させる(Show)
 ※Form1には[Command2]を貼り付ける。

2.1で表示されたフォームの[Command2]クリックイベントで、
 上記UserDocument1のボタンを制御させる
 (例:Command1.Enabled = Falseなど)

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

ご教示の程よろしくお願い致します。

投稿時間: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