VB程序员博客

VB程序开发

1、MDI下一共调用了十几个窗体,这样会影响速度吗?如果把每个窗体都做成一个单独的EXE文件,再进行调用是否会提高速度?
2、MDI如何调用目录下的另一个EXE程序?1、不会,为了显示速度,可不关窗体只隐藏
2、没有这样做的1、十几个窗体不算多,没有太大问题,但如果有100多个窗体就有影响,最多可以用通用窗体来处理。
2、可行,用shell,但不是好办法。一个程序就象一个人,
你要一个人干很多很多事,他就会忙死,最后还容易干错,这就要分给几个人作了

而如果你让很多很多人,每个人都只干一件很小的事,那么干得都是很快,可精力都浪费在沟通上了.

所以怎么分,如何分,是个经验问题, 只能具体问题具体分析,没有办法说明.

VB工程的窗体越多,加载越慢,这是无疑的.但十几个窗体的话,如果你不是在每个窗体上都加载了数量变态的控件的话,应该还是不成问题的.
至于每一个窗体楼拆成一个EXE,也不是不可以, 
楼上说的SHELL,只是让某个EXE运行,而通讯则是需要在几个正在运行着的程序之间建立某种数据交换,略微要复杂些.通讯方法也有很多, DDE, TCP等等都是最常用的通讯方法. 当然,你又要为此专门给每一个工程加上一个通讯模块不说,还得建立一个通讯管理,否则调度起来难免乱套.


模式窗体调用一个非模式窗体,怎么让这个非模式窗体一显示出来时就处于焦点状态(即标题栏不是灰色)

注:模式窗体调用非模式窗体,我已经实现了,不要给我说实现不了这些废话哈!楼主那么牛,围观一下…………
这还叫模式窗体吗?<
我晕,都不信邪说!
我真实现了!<
<
可以实现。
一种是设置WS_CHILD风格并激活该窗口。
另一种是子类化该窗口,在WM_NCACTIVATE事件里使用SendMessage hwnd, WM_NCACTIVATE, 1, ByVal 0&保持窗口标题栏活动状态。
以上我只是从理论上讲,并没有测试过,感兴趣的朋友不妨自己测试一下。mark 7楼的理论<
<


如果在窗体上放置一个文本输入框,放置一个按钮,并将按钮default属性设置为True,那么在文本输入框获是焦点时输入Enter键,回车,自动相当于点击按钮。
比如:
Private Sub Command1_Click()
  MsgBox Text1.Text
End Sub
当我在TextBox1中输入“ABC”时,输入回车,会弹出对话框“ABC”

但是当我用另一段程序来模拟这个动作时:
  Text1.Text = Text1.Text & vbCrLf
却不会弹出对话框,模拟不出这样的效果。问题出在什么地方?

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_CHAR = &H102

Private Sub Command2_Click()
  PostMessage Me.hwnd, WM_CHAR, 13, 1
End Sub

直接在同一个窗体中向窗体发送 回车符 也不能模拟出这个过程

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_CHAR = &H102

Private Sub Command2_Click()
  PostMessage Me.hwnd, WM_CHAR, 13, 1
End Sub

直接在同一个窗体中向窗体发送 回车符 也不能模拟出这个过程
这个做法为什么不行?终于搞明白了default=true后,响应的是key_down事件,把WM_CHAR改为WM_KEYDOWN就OK了
PostMessage Me.hwnd, WM_KEYDOWN, 13, 1

WM_CHAR消息–> Key_Press事件当命令按钮的 Default 设置为 True 而且其父窗体 是活动的,用户可以按 ENTER 键选择该按钮(激活其单击事件)。任何其它有焦点 的控件都不接受 ENTER 键的键盘事件(KeyDown,KeyPress或 KeyUp),除非用户将焦点移到同一窗体的另外一个命令按钮上。在这种情况下,按 ENTER 键选择有焦点的命令按钮而不是缺省命令按钮。

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Private Sub Command1_Click()
  MsgBox Text1
End Sub

Private Sub Form_Click()
PostMessage Me.hwnd, WM_KEYDOWN, 13, 0
End Sub


Public Sub Main()
  On Error GoTo errHandle
  LogPrint logInfo, "Sub Main", "Before Load frmMain"
  Load frmMain
  LogPrint logInfo, "Sub Main", "After Load frmMain"
  frmMain.Show
  Exit Sub
errHandle:
  LogPrint logError, "Sub Main", err.Description
End Sub

Private Sub Form_Load()
  LogPrint logInfo, "frmMain::Load", "Start"
End Sub

程序在大多数机器上运行没有问题,可是在其中一台winxp sp3的机器上程序无法运行,在代码中加入日志信息后,定位到Load frmMain出错了。出错的日志信息如下:
09-09-16 11:58:58[Info]:[Sub Main] Before Load frmMain
09-09-16 11:58:58[Error]:[Sub Main] Object variable or With block variable not set

这是什么原因造成的?要如何解决?

有几个组件版本确实不一样,COMCT332.OCX等。
怎么解决呢?把我机器上的文件copy过去覆盖他机器上的?正确做法是做安装包安装。手工复制容易影响其他软件并且无法卸载恢复。<
再来推荐这个软件:VB-PowerWrap 汉化版
直接自动包含需要的Dllocx,生成可执行文件。。。<
看你 form_load 里有什么错吧。。打包不完整,打包工具只会自动包含工程中直接引用的组件。
a)使用某些控件除了 OCX 还需要其他组件支持。
b)没有直接引用 dll,而是通过 CreateObject() 方式创建对象。
c)如果用 ADO,需要添加 MDAC_TYP.EXE


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


主窗体中有一按钮,点击该按钮,打开子窗体的同时关闭主窗体。然后,当点击子窗体右上角的“X”时,关闭子窗体的同时,又打开主窗体,这如何实现?

小弟是这样做的

在主窗体中写:

Private Sub cmd2_Click()
Unload Me
frm2.Show (1)
End Sub

在子窗体中写:

Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub

但是想法只实现前面一半,当我关闭子窗体时出现错误,提示:当打开有模式窗体时不能显示无模式窗体
实现不了。
Private Sub Form_Unload(Cancel As Integer)
frmMain.Show
End Sub
去掉。。。。。。。。。。。。。。可以了,把这个“(1)”去掉就搞定了

可能是我概念不清,不该说成是子窗体


专题:

栏目: