小弟最近要整一个动态菜单,就是菜单的名字以及对应的窗体的名字,都保存在数据库里,数据库还有的就是一个窗体的共用属性(一部分窗体有,),不同的窗体的属性的名字也不一样,属性不同表的意思也不同
比如说 
    我有一个窗体 Sel_SellDoc 是表示订单 有一个共用属性  DocType  如果等于 "01" 就表示是 内销的如果说是"02" 就表示是外销的     我现在保存在数据库里是
 菜单名        窗体名                共用属性名        值            说明Mnu01        Sel_SellDoc         DocType             01           内销订单
Mnu02        Sel_SellDoc         DocType             02           外销订单现在生成菜单的问题已经解决了,现在的问题是如何解决我的这个DocType的问题在Sel_SellDoc  中有
Public Property Let DocType(ByVal vNewValue As String)
     mDocType = vNewValue
End PropertyForm_Load  里有Sub Form_Load 
     if mDocType="01"     Elseif mDocType="02"     End if
End IF
现在我的问题就是我在调用窗体的时候  不管怎么做都会出现先做Form_Load 然后再做Public Property Let DocType(ByVal vNewValue As String)
     mDocType = vNewValue
End Property这样就没有意义了
我的要求就是在Form_Load的时候能够知道  mDocType的值,我又不想用Form_Initialize 来实现,因为那样有点问题下面我的调用Sel_SellDoc的几种方法也贴出来

解决方案 »

  1.   

    1.
        Dim F as Form     set F=Forms.Add("Sel_SellDoc")    这里已经启动了   Form_Load 
         CallbyName ........
        F.Show
    2              Set F= Forms.Add("Sel_SellDoc")    '这里也已经启动了   Form_Load                Set AA = CreateObject("MSScriptControl.ScriptControl")
                   AA.Language = "vbscript"
                   AA.AddObject "Sel_SellDoc", F
                   AA.ExecuteStatement ("Sel_SellDoc" & ".DOCType=""02""")
                   AA.ExecuteStatement ("Sel_SellDoc" & ".Show")
      这里引用了ScriptControl 要注意
    3
    Public Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unknownn1 As Long, ByVal Unknownn2 As Long, ByVal fCheckOnly As Long) As LongPublic Function ExecuteLine(sCode As String, Optional fCheckOnly As Boolean) As Boolean
           ExecuteLine = EbExecuteLine(ByVal StrPtr(sCode), 0&, 0&, ABS(fCheckOnly)) = 0
    End Function
                    ExecuteLine "Sel_SellDoc" & ".DOCType=""02"""
                    ExecuteLine "Sel_SellDoc" & ".Show"第三种最完美,但是是调试的时候,编译之后一运行这个ExecuteLine  整个系统就跳出来了
    因为都是从数据库里调出来所以我用"Sel_SellDoc" 和 ".DOCType"来代替变量各位要是有什么不明白可以联系,请各位一定帮忙呀   QQ38054489
      

  2.   

    单纯访问自定义属性不会触发Form_load,方法窗体的界面属性或窗体上的控件才会触发 Form_load
    '== Form1 ==
    Private Sub Command1_Click()
        Dim frm As Form2
        Set frm = New Form2
        frm.DocType = "Command2"
        frm.Show
    End Sub
    Private Sub Command2_Click()
        Dim frm As Form2
        Set frm = New Form2
        frm.Caption = "Command2"
        frm.Show
    End Sub
    '== Form 2 ==
    Private mdoctype As String
    Public Property Let DocType(ByVal vNewValue As String)
         mdoctype = vNewValue
    End Property
    Sub Form_Load()
        Debug.Print mdoctype, Caption
    End Sub
      

  3.   

    更正:单纯访问自定义属性不会触发Form_load访问窗体的界面属性或窗体上的控件才会触发 Form_load
      

  4.   

    昏.
    肯定先load事件先了.你象上面说的new的化就直接访问对象优先了.
    还有用public变量使窗体在load时候访问就可以了.直接对public变量赋值就可以了.
    办法多.还问n次.
      

  5.   

    不要方在 load 事件中
    作个公用sub public sub Loadfrm
    'load 事件中的内容
    end subform1.DocType aa
    form1.loadfrm这样就绝对没问题
      

  6.   


    to   Tiger_Zhao(TigerZhao(VB老鸟)) 
    单纯访问自定义属性不会触发Form_load,方法窗体的界面属性或窗体上的控件才会触发 Form2  没有办法这样声明的了,  Form2我是从数据库里读出来,  只有一个字符串,要声明的话那只有
       Frm= Forms.Add("Form2") 这样可是这要一做,就会做Form_Load事件    Dim frm As Form2
        Set frm = New Form2
        frm.DocType = "Command2"
        frm.Show
      

  7.   

    //昏.
    //肯定先load事件先了.你象上面说的new的化就直接访问对象优先了.
    //还有用public变量使窗体在load时候访问就可以了.直接对public变量赋值就可以了.
    //办法多.还问n次.呵呵,事情好象没有这么简单,在赋值的时候还有很多东西要做的,只是我是为了简单没有把那些过程写过来了,如果把那些代码全部都写在Form_Load里面,是不合理的
      

  8.   

    你可以把动态菜单的整个实现封装成DLL,也可以用文件存取的方式,不一一定要用数据库呀,这样应该问题会好做一点
      

  9.   

    用Forms.Add方法加载窗体?那么:
    1、可用全局变量
    2、同zlt982001(zhangle),将Form_Load事件中的代码移至某公共方法,外部显式调用。
      

  10.   

    2、同zlt982001(zhangle),将Form_Load事件中的代码移至某公共方法,外部显式调用。这样到是真的好像行呀,唉,这样的话,只怕我的程序交接给别人的时候要费很大的力气了,呵呵
      

  11.   

    1.
        
        Dim F as Form 
      '先将菜单id保存到系统变量中再做下面
        set F=Forms.Add("Sel_SellDoc")    这里已经启动了   Form_Load 
      '   CallbyName ........
        F.Show
    2.Sub Form_Load 
         '这里要加上:根据菜单id去查找到‘值’字段的值(菜单id应保存在系统变量中,你动态生成菜单后就应保留Recordset以方便根据菜单id去查一些相关设置的东西。)     if mDocType="01"     Elseif mDocType="02"     End if
    End IF
      

  12.   

    也可以不保留Recordset,直接去数据库里查这样要好些。
      

  13.   

    //也可以不保留Recordset,直接去数据库里查这样要好些。也就是全局变量的意思,
      

  14.   

    Public  Property  Let  DocType(ByVal  vNewValue  As  String)  
             mDocType  =  vNewValue  
              ................'中间还有一些代码
    这些我都不想移到Form_Load 里面
    End  Property
      

  15.   

    Public  Property  Let  DocType(ByVal  vNewValue  As  String)  
             mDocType  =  vNewValue  
              ................'中间还有一些代码
    这些我都不想移到Form_Load 里面
    End  Property
    //
    这些都不需要了。或在"set F=Forms.Add("Sel_SellDoc")    这里已经启动了   Form_Load "之前做。
      

  16.   

    2、同zlt982001(zhangle),将Form_Load事件中的代码移至某公共方法,外部显式调用。这样到是真的好像行呀,唉,这样的话,只怕我的程序交接给别人的时候要费很大的力气了,呵呵这种方式很平常,VB中不支持带参数构造,只有用这种方法代替。可以美名其曰:初始化:)
      

  17.   

    '这里要加上:根据菜单id去查找到‘值’字段的值(菜单id应保存在系统变量中,你动态生成菜单后就应保留Recordset以方便根据菜单id去查一些相关设置的东西。)
    //
    这部分也可以放在前面做,之后放在系统变量中。