如下代码,是什么原因引起的,窗体名称相同怎么不会引起冲突,系统根据什么区分窗体实例?
看上去有点奇怪,在不同的窗体连续点击Command2,居然消息都堆积到一个窗体来处理。
Option ExplicitPublic i As Integer     '在标准模块中定义不会有这种现象Public Sub SetCaption(WithForm1 As Boolean)
Set Form1 = Nothing     'SetNothing后窗体可用,
Form1.Show              '全局变量 i 在新窗体与旧窗体间不是全局的Cls
Dim j As Integer
For j = 0 To Forms.Count - 1
  Form1.Print "Forms.Item(" & j & ").Name = "; Forms.Item(j).Name    '名称都是相同的,但句柄不同
NextIf WithForm1 Then
  Do While i < 500
    Form1.Caption = i
    i = i + 1
    DoEvents
  Loop
Else
  Do While i < 500
    Caption = i
    i = i + 1
    DoEvents
  Loop
End If
End SubPrivate Sub Command1_Click()
SetCaption False   'Caption前不加Form1.
End SubPrivate Sub Command2_Click()
SetCaption True    'Caption前加Form1.
End SubPrivate Sub Form_Load()
Me.AutoRedraw = True
End Sub

解决方案 »

  1.   

    窗口是按窗口类(使用RegisterClass或RegisterClassEx注册窗口类)进行消息处理的,每种窗口类都有一个的默认消息处理函数,每个线程都有一个消息循环,在消息循环里通过DispatchMessage函数将不同的窗口类的消息分发到窗口类的默认消息处理函数中,在默认消息处理函数里,再根据消息类型和消息来源(即窗口句柄)分别进行处理。同一个窗口类的不同实例,在没有子类化的情况下,它们都是由一个消息处理函数进行处理的。
      

  2.   

    你就认为VB为了向以前兼容的原因,隐式加了这么一个全局定义
    Public Form1 As New Form1
    所以
    Set Form1 = Nothing  '虽然释放了旧的实例'
    Form1.Show '但是 AS New 的定义只要有引用,如果当前是 Nothing,就会自动新建一个实例'
      

  3.   

    的确新建了实例。是不是Dim Class1 As New Class1
    也就是两个相同的名称,前者当作实例引用,后者用As关键词当作定义类的模板使用?
      

  4.   

    前者是变量名,后者是类名,因为是不同类别的命名,所以没有冲突。
    但是不建议这样用,毕竟相同的命名在读代码或讨论时容易混淆。
    Form1 只是历史原因。