DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数階層のUserControlより親フォームオブジェクトの取得

分類:[VB6以前]

ユーザーコントロールより親フォームを
取得したいと思っています。

まず、ユーザーコントロール(A)を作成し、
そのAを貼り付けたユーザーコントロール(B)を
作成します。
そして、フォームに(B)を貼り付け、
(A)から一番上位のフォームを検索したいと
思っています。

(B)からは
Dim frmParent As Form
Set frmParent = B.Parent
で取得できるのですが、
(A)からは
Dim frmParent As Form
Set frmParent = A.Parent.Parent
とすると
「実行時エラー'438'
 オブジェクトは、このプロパティまたは
 メソッドをサポートしていません。」
となってしまいます。

どなたかこのような複数層のユーザーコントロールの
最末端(もしくは中間)より
親フォームを取得する方法をご存知の方いませんか?

開発環境は
Win2K+VB6(SP6)です。
2004/12/02(Thu) 18:25:22 編集(投稿者)

// 書き方が悪かったので修正

■No7795に返信(ねくすかさんの記事)
> どなたかこのような複数層のユーザーコントロールの
> 最末端(もしくは中間)より
> 親フォームを取得する方法をご存知の方いませんか?

1回目の Parent プロパティ で、既に Form を取得できておりませんか?
回答ありがとうございます。

(A)の一回目のParentでは(B)ユーザーコントロールが
返って来ます。
なのでParentのさらにParentをと考えたのですが
うまく取れません。
実際に実行時エラーが発生する場所でウォッチウィンドウを
開き、(A).Parentを参照するとそのParentプロパティに
親フォームが入っているのですが。

どうにか、最末端のユーザーコントロールから
親フォームのオブジェクトを取得する方法はないでしょうか?
すみません、VBじゃないし親子関係じゃないし回答になってないかも知れません。

私はこのような時は強引に勝手に下記のようなチェインを作ってしまいます>.<

class classB{
  public classC c;
  public classB(classC X) {//クラスBのコンストラクタ X は局所変数
   c = X;
  }
}
class classA{
  public  classB b;
  public  classC c;
  public classA(classB X){//クラスAのコンストラクタ X は局所変数
    b = X;
    c = b.c;
  }
}

これじゃあ、クラスのスパゲッティ!!
もっとうまい方法があると思います。誰か教えて欲しいですね。
こんにちは、じゃんぬねっと です。

■No7801に返信(ねくすかさんの記事)
> (A)の一回目のParentでは(B)ユーザーコントロールが返って来ます。
親コンテナがユーザーコントロールならば、ユーザーコントロールが返ります。

> なのでParentのさらにParentをと考えたのですがうまく取れません。
そのコントロール自身の、Parent プロパティは取得できるのですが、
動的に、別のコントロールの Parent を見に行くことはできないようです。
ですので、親であるユーザーコントロールの Parent をプロパティで公開すれば良いです。

> 実際に実行時エラーが発生する場所でウォッチウィンドウを
> 開き、(A).Parentを参照するとそのParentプロパティに
> 親フォームが入っているのですが。
ええ、確かに入ってますね (w
しかし、コードで参照しようとするとコンパイルエラーになってしまいます。

> どうにか、最末端のユーザーコントロールから
> 親フォームのオブジェクトを取得する方法はないでしょうか?
こういう感じになりますね。

Source:-------------------------------------------------------------------

' ユーザーコントロール (親)
Option Explicit

' 親Formを返すプロパティ (読み取り専用)
Public Property Get ParentForm() As Form
    If TypeOf Parent Is Form Then
        Set ParentForm = Parent
    End If
End Property

---------------------------------------------------------------------------

' ユーザーコントロール (子)
Option Explicit

Private Sub Hoge()
    Dim hParent As CtrlParent
    Dim hForm   As Form

    ' 親コントロールがユーザーコントロール(親)か
    If TypeOf Parent Is CtrlParent Then
        ' CtrlParent を取得
        Set hParent = Parent

        ' CtrlParent の公開プロパティから、親フォームを取得
        Set hForm = hParent.ParentForm

        ' その親フォームのタイトルを表示してみるテスト
        Call MsgBox(hForm.Caption)
    End If
End Sub

---------------------------------------------------------------------------

DOBON.NET | プログラミング道 | プログラミング掲示板