小弟最近要整一个动态菜单,就是菜单的名字以及对应的窗体的名字,都保存在数据库里,数据库还有的就是一个窗体的共用属性(一部分窗体有,),不同的窗体的属性的名字也不一样,属性不同表的意思也不同
比如说
我有一个窗体 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的几种方法也贴出来
比如说
我有一个窗体 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的几种方法也贴出来
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
'== 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
肯定先load事件先了.你象上面说的new的化就直接访问对象优先了.
还有用public变量使窗体在load时候访问就可以了.直接对public变量赋值就可以了.
办法多.还问n次.
作个公用sub public sub Loadfrm
'load 事件中的内容
end subform1.DocType aa
form1.loadfrm这样就绝对没问题
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
//肯定先load事件先了.你象上面说的new的化就直接访问对象优先了.
//还有用public变量使窗体在load时候访问就可以了.直接对public变量赋值就可以了.
//办法多.还问n次.呵呵,事情好象没有这么简单,在赋值的时候还有很多东西要做的,只是我是为了简单没有把那些过程写过来了,如果把那些代码全部都写在Form_Load里面,是不合理的
1、可用全局变量
2、同zlt982001(zhangle),将Form_Load事件中的代码移至某公共方法,外部显式调用。
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
mDocType = vNewValue
................'中间还有一些代码
这些我都不想移到Form_Load 里面
End Property
mDocType = vNewValue
................'中间还有一些代码
这些我都不想移到Form_Load 里面
End Property
//
这些都不需要了。或在"set F=Forms.Add("Sel_SellDoc") 这里已经启动了 Form_Load "之前做。
//
这部分也可以放在前面做,之后放在系统变量中。