VB的MDI表单只允许放置picturebox、childform等控件。有没有办法判断自定义控件放置的窗口的类,如果不符合环境要求就终止控件的初始化事件,从而防止用户将自定控件放置到不符合要求的容器控件内?
麻烦大家帮助一下。

解决方案 »

  1.   

    Option ExplicitPrivate Sub CheckParent()
        If TypeOf UserControl.Parent Is MDIForm Then
            Err.Raise 429, , "不能用在 MDIForm 中。"
        End If
    End SubPrivate Sub UserControl_InitProperties()
        CheckParent
    End SubPrivate Sub UserControl_ReadProperties(PropBag As PropertyBag)
        CheckParent
    End Sub
      

  2.   

    自定了一个应用于mdiform或form的控件,原本担心用户误放入picturebox等容器内,调试后却发现无论把它话在哪个容器内得到的parent属性都指向mdiform或form(在initproperties或readproperties事件里),怎样才能知道它真正放在哪一个容器控件里呢?
    另外,基于上述原因,tiger_zhao提供的代码是否能终止加载未能测试,但是从代码上看好象没有终止初始的功能。我想今后也许会遇到同样的问题,还请一并解决一下。
    这里先谢过了。
      

  3.   

    Option ExplicitPrivate Sub CheckContainer()
        If (Not (TypeOf UserControl.Extender.Container Is Form)) And _
           (Not (TypeOf UserControl.Extender.Container Is MDIForm)) Then
            Err.Raise 429, , "必须直接放在 Form 或 MDIForm 上。"
        End If
    End SubPrivate Sub UserControl_InitProperties()
        CheckContainer
    End SubPrivate Sub UserControl_ReadProperties(PropBag As PropertyBag)
        CheckContainer
    End Sub
    抛出错误就会终止控件的创建。
    UserControl_InitProperties 用来阻止设计模式下的添加控件,UserControl_ReadProperties 用来阻止设计模式下的剪贴复制。
      

  4.   

    您可能用的是.net吧,使用VB6行不通——提示无此属性。查看对象usercontrol和extender对象,也确实找不到container属性,MSDN这一块介绍的也比较少,好像这条路不通了。最后,我使用UserControl.ContainerHwnd属性和API函数getclassname解决的。
    如果有和我一样仍在使用VB6的还有好的解决办法,请告知一下。另外,还是非常感谢Tiger_zhao的热心回答,请稍等两天。如果您在艺术字的制作上有研究,欢迎您解答我在API分类内的问题,分数我一定会考虑的。
      

  5.   

    这是标准的VB6。你可以用新建控件测试。
    注意 extender 不是在所有事件中都有效。
      

  6.   

    Tiger_zhao:
    感谢您的回答。是的,extender不是在所有事件中都有效,在控件初始事件中就行不通,msdn中也是这样介绍的。但是,我也是放在您所说的两个事件中就是找不到这个对象——不去考虑啦。
    这20分铁定是您的啦。
    另外,请教一下,控件中如果有2个以上属性页,怎样才能避免属性调用其中一个时点击“应用”后所有属性页都显示。有人说是我在propertypages里添加了所有的属性页的缘故。但是不全部添加如何与控件关联啊。
    如果您能解决这个问题,我再加100分一并结帖。
    当然也欢迎其他朋友帮助解答。
      

  7.   

    单独关联这样做:
    在 UserControl 的代码中,光标定位在属性上,菜单“Tools\Procedure Attibutes”,在展开“Advanced >>” 后,中间的 Combo 选对应的属性页,确定。这样你在窗体设计时选中控件,F4 打开属性窗口(不是 Property Pages 对话框),焦点定位到该属性时,编辑框右边就有一个小按钮,点击后打开的 Property Pages 对话框中就始终只有关联的一页。
      

  8.   

    没出现你说的情况。
    如果有两个属性页,分别关联到两个属性,如果是通过属性窗口的小按钮后打开的 Property Pages 对话框只显示一页,修改后点击应用也一样。
      

  9.   

    怎么会没有这种现象呢?
    随便建个控件,添加一个a属性,两个属性页。
    在控件的propertypages属性中把两个属性页都选上,即把两个属性页与控件关联。
    再把属性a与任何一个属性页关联上,方法用你说的就行。
    别的都不用做了。
    添加一个新工程,在表单内把控件加上,设属性a试试。就是这种现象啦。
    随带说一下,我用的是vb6
      

  10.   

    就是 VB6,装 SP6 没有?
      

  11.   

    打上SP英文版的VB中文版还是这样啊,没有解决问题。
      

  12.   

    把所有的的 add-in 都关掉。
    重开 VB,新建工程做。
      

  13.   

    Tiger_zhao:
        不好意思,还是没有未实现。您能不能做一个简单的例子(只要能正常显示属性页就行,不需要其它功能),发过来让我学习一下。
      。
        麻烦您啦。
      

  14.   

    是你 VB-IDE 的问题,给代码没用。
    试试其它的 VB 安装盘。