我接触VB不久,刚按照书本上的步骤用VB编了个停车塔管理系统,刚做了一半,到某一步的时候编译报错,提示“无效外部过程”,书本上说:“以NWIND.MDB数据库中的Products数据表为例,读取所有的数据和字段,首先声明两个对象变量:
Public db As Database '定义一个数据库对象变量
Public rs As Recordset' 定义一个数据录集对象变量”
接着分别使用OpenDatabase 和 OpenRecordset 方法,读取NWIND.MDB数据库和Product
数据表,做法如下:
Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False)
Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset)”我编译的代码在下边,才做了一半,按钮还没编译,运行时提示“无效的外部过程”,可书上说到这一步运行可以看到有车辆图案和分组的界面了。还有,这个是用到MSFlextGrid控件的,还有DAO对象,另外我还下载了一个NWIND.MDB。
请高手修改下代码,或告知如何正确操作才能完成这个系统,小弟感激不尽!通用   声明
Option ExplicitConst TotalFloor As Byte = 15
Const TotalGrid As Byte = 4Public db As Database
Public rs As Recordset
Public pic As PictureSet db = OpenDatabase(App.Path & "\NWIND.MDB", True, False)
Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset)Form  Load
Private Sub Form_Load()
Dim i As IntegerOn Error GoTo LoadError
                       
                         '加载停车图案
   Set pic = LoadPicture(App.Path & "\cars.ico")
                         '开启数据库
   Set db = OpenDatabase(App.Path & "\Park.MDB", False, False)
                       
                       
                       
   SetGrid                  '设置停车塔结构
   
   Open_Table             '读取数据录集
   
   If rs.RecordCount > 0 Then  '是否有车辆停放
                   
   rs.MoveLast: rs.MoveFirst
   For i = 1 To rs.RecordCount
      ArrangeCar          '显示方格里的车辆图案
      rs.MoveNext         '换下个停车记录
    
    Next
    
    End If
    
    Exit SubLoadError:
    MsgBox Err.Description
    
    End SubPublic Sub SetGrid()               '设置停车塔结构
      Dim i As Integer
    MSFlexGrid1.Rows = TotalFloor + 1      '停车塔的总行数
    MSFlexGrid1.Cols = TotalGrid + 1       '停车塔的总列数
                                        '设置第0列文字标题    MSFlexGrid1.Row = 0
    MSFlexGrid1.Col = 0
    MSFlexGrid1.Text = "      楼层"
    MSFlexGrid1.Col = 1
    MSFlexGrid1.Text = "    第一格"
    MSFlexGrid1.Col = 2
    MSFlexGrid1.Text = "    第二格"
    MSFlexGrid1.Col = 3
    MSFlexGrid1.Text = "    第三格"
    MSFlexGrid1.Col = 4
    MSFlexGrid1.Text = "    第四格"
    
    MSFlexGrid1.Col = 0                 '各楼层的标示
    For i = 1 To TotalFloor
    MSFlexGrid1.Row = i
    MSFlexGrid1.Text = i    Next   End Sub    Public Sub Open_Table()             '读取数据录集
        Dim sql As String
        
        sql = "Select * From Car Order By LicensePlate"
        Set rs = db.OpenRecordset(sql, dbOpenDynaset)
    
    End Sub
 
   Public Sub ArrangeCar()             '显示方格里的车辆图案
        MSFlexGrid1.Row = rs![Floor]
        MSFlexGrid1.Col = rs![Grid]
        Set MSFlexGrid1.CellPicture = pic
        Exit Sub
  
    End SubCommand    Click1Private Sub Command1_Click()End SubCommand    Click2Private Sub Command1_Click()End SubMSFlexGrid1   ClickPrivate Sub MSFlexGrid1_Click()End Sub

解决方案 »

  1.   

    这两句不能放在通用段:Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False) 
    Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset) 另外,你必须有 Park.MDB 数据库文件。
      

  2.   

    2L你好,我按照书上的添加了个引用“Microsoft DAO 3.51 Object Library”的选项。
      

  3.   


     Form_Load() 事件,注意变量名称
      

  4.   

    Ding.........
    就放在:“ '开启数据库”的后面比较合适。
      

  5.   


    6L和7L的朋友,我把代码放到后面后可以运行了,但提示
    然后显示的程序为http://i.6.cn/tu.6.cn/f4/c5/bd/7c8b873fd5b0a55a27678034e23f8077.nail.jpg
    可书上显示的界面里,MSFlexGrid控件里有很多个表格和车辆的图案可我的都没有
      

  6.   

    9L。。代码都在上边了,我想表格应该是编译了的,为什么没有显示呢
    Public Sub SetGrid()              '设置停车塔结构 
          Dim i As Integer 
        MSFlexGrid1.Rows = TotalFloor + 1      '停车塔的总行数 
        MSFlexGrid1.Cols = TotalGrid + 1      '停车塔的总列数 
                                            '设置第0列文字标题     MSFlexGrid1.Row = 0 
        MSFlexGrid1.Col = 0 
        MSFlexGrid1.Text = "      楼层" 
        MSFlexGrid1.Col = 1 
        MSFlexGrid1.Text = "    第一格" 
        MSFlexGrid1.Col = 2 
        MSFlexGrid1.Text = "    第二格" 
        MSFlexGrid1.Col = 3 
        MSFlexGrid1.Text = "    第三格" 
        MSFlexGrid1.Col = 4 
        MSFlexGrid1.Text = "    第四格" 
        
        MSFlexGrid1.Col = 0                '各楼层的标示 
        For i = 1 To TotalFloor 
        MSFlexGrid1.Row = i 
        MSFlexGrid1.Text = i     Next   End Sub 
      

  7.   

    我知道了你的程序跳到了LoadError: 
        MsgBox Err.Description .....原因是  Set pic = LoadPicture(App.Path & "\cars.ico") 你是不是没有这个文件cars.ico的文件啊??你自己做一个吧...
      

  8.   


    做个图片放到生成的exe目录里,ico是个图片....你用mspaint做一个都成....大哥你是怎么看的书啊
      

  9.   

    http://www.bitbug.net/自己制作一个好了...jpeg可不成
      

  10.   

    楼上提示的对....cars...你的文件名错了
      

  11.   


    弄完后运行还是提示
    现在Form里的代码是这样的,不知道有没有问题:
    Private Sub Form_Load()
    Dim i As IntegerOn Error GoTo LoadError
                           
                             '加载停车图案
       Set pic = LoadPicture(App.Path & "\cars.ico")
                             '开启数据库
       Set db = OpenDatabase(App.Path & "\Park.MDB", False, False)
                           
       Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False)
       Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset)
               
                           
                           
       SetGrid                  '设置停车塔结构
       
       Open_Table             '读取数据录集
       
       If rs.RecordCount > 0 Then  '是否有车辆停放
                       
       rs.MoveLast: rs.MoveFirst
       For i = 1 To rs.RecordCount
          ArrangeCar          '显示方格里的车辆图案
          rs.MoveNext         '换下个停车记录
        
        Next
        
        End If
        
        Exit SubLoadError:
        MsgBox Err.Description
        
        End Sub
      

  12.   

    Set pic = LoadPicture(App.Path & "\cars.ico") 你到这步就错了.....错误原因 就是因为没有加载上cars.ico你用的是xp系统吧,把所有的文件的后缀名全部显示出来....看看 怀疑ico的格式不对,尝试换个bmp文件算了,要不就是后缀隐藏导致的,不过ico格式好像确实有变化了...loadpicture未必识别,你要不先用个bmp文件,稍微改下程序好了
      

  13.   

    我加了个bmp格式的图片进去,还是不行,如果修改程序该怎么改呢,另外运行后的窗体里根本没显示表格,这个如何修改?
      

  14.   


    on error resume next算了...把LoadError: 
        MsgBox Err.Description 注释掉,算了....看看其他情况再说
      

  15.   

    On Error GoTo LoadError 
    改成
    on error resume next你能不能注意看我的回答啊....
      

  16.   

    Set pic = LoadPicture(App.Path & "\cars.ico") 这个解决了,就能显示了...你自己研究一下吧....
      

  17.   

    下边是“停入”按钮的编译代码 运行完后点击“停入”然后输入车号后提示
    请问怎么修改呢,另外车辆图案还是没显示Command1   ClickPrivate Sub Command1_Click()   '停入
        Dim i, j As Byte
        Dim txt As String
        On Error GoTo CommandErr
                                   '是否已客满
        If rs.RecordCount = TotalFloor * TotalGrid Then
       MsgBox "目前停车塔已客满", vbExclamation + vbOKOnly, ""
               Exit Sub
        
    CommandErr:
         MsgBox Err.Description
        
        End If
                       '输入车牌号码,并检查是否6位
        txt = InputBox("请出入车牌号码(6位),如AH9124", "输入车号")
        If Len(txt) <> 6 Then
           MsgBox "输入车号错误", vbCritical + vbOKOnly, "错误"
           Exit Sub
        End If
        
                       '寻找空位及存储该车停车数据
        For i = 1 To TotalFloor
           For j = 1 To TotalGrid
              MSFlexGrid1.Row = i   '更换寻找目标
              MSFlexGrid1.Col = j
                               '检查是否为空位
              If MSFlexGrid1.CellPicture = 0 Then
        
                  '此格为空位,开始写入停车数据
               rs.AddNew   '新增一笔空白记录
                          '以上登陆数据至此空白记录
               rs![LicensePlata] = txt      '车牌
               rs![Floor] = i        '楼层
               rs![Grid] = j         '第几格
               rs![In_Time] = Now        '停车起始时间
                     rs.Update        '将此记录写入数据库
                               '告知停车信息
               MsgBox "这部车将停放在第" & Str(i) & "层第" & Str(j) & "格", vbInformation + vbOKOnly, "进场信息"
                               '显示该格已停车的图案
               Set MSFlexGrid1.CellPicture = pic
        
                  Exit Sub      '跳离程序
        
              End If
          Next
       Next
                
        
        
    End SubPrivate Sub Form_Load()
    Dim i As IntegerOn Error Resume Next
                           
                             '加载停车图案
       Set pic = LoadPicture(App.Path & "\cars.ico")
                             '开启数据库
       Set db = OpenDatabase(App.Path & "\Park.MDB", False, False)
                           
       Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False)
       Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset)
               
                           
                           
       SetGrid                  '设置停车塔结构
       
       Open_Table             '读取数据录集
       
       If rs.RecordCount > 0 Then  '是否有车辆停放
                       
       rs.MoveLast: rs.MoveFirst
       For i = 1 To rs.RecordCount
          ArrangeCar          '显示方格里的车辆图案
          rs.MoveNext         '换下个停车记录
        
        Next
        
        End If
        
        Exit SubLoadError:
        MsgBox Err.Description
        
        End Sub
      

  18.   

    Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False) 
    Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset) 你这两行要摆在事件里面,不能摆在通用区 (无效外部过程错误)
      

  19.   

    楼主,你的系统好象是“隐藏已知类型文件的扩展名”的,你的图标文件的文件名实际上是不是搞成了“cars.ico.ico”啊!你在‘我的电脑’中把图标文件名的 .ico 去掉试一下,看能不能正常加载图标。
      

  20.   


    你自己测试测试loadpicture,单独做个程序....
      

  21.   

    你的文件名还是 cars.ico 呀(说不定就是 cars.ico.ico ,所以‘文件未找到’),
    你重命名 cars.ico → cars
    再试试。
    (如果改为 cars 后,文件类型那儿没显示‘图标’了,则撤消重命名。你的加载图标的错误可能是“千古之谜”了)。
      

  22.   

    自己用ico制作软件重新从百度图片搜索下载或者画一个cars.ico试试。
      

  23.   

    注意将cars.ico放到程序要求的目录下。
      

  24.   

    刚才在 VB 中试了一下:
    Set pic = LoadPicture(App.Path & "\cars.ico")这一句没有任何错误!
      

  25.   

    我刚才的测试代码:
    Option ExplicitPrivate pic As PicturePrivate Sub Form_Load()    Me.AutoRedraw = True
        Set pic = LoadPicture(App.Path & "\Scenery.ico")
        Me.PaintPicture pic, 300, 420End Sub
      

  26.   

    我的图标是要在MSFlexGrid控件中的表格里显示的,会不会跟这个有关系。。
    Form1 里的代码Private Sub Form_Load()
    Dim i As IntegerOn Error Resume Next
                           
                             '加载停车图案
       Set pic = LoadPicture(App.Path & "\cars.ico")
                             '开启数据库
       Set db = OpenDatabase(App.Path & "\Park.MDB", False, False)
                           
       Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False)
       Set rs = db.OpenRecordset("Select * From Products Order By ProductID", dbOpenDynaset)
               
                           
                           
       SetGrid                  '设置停车塔结构
       
       Open_Table             '读取数据录集
       
       If rs.RecordCount > 0 Then  '是否有车辆停放
                       
       rs.MoveLast: rs.MoveFirst
       For i = 1 To rs.RecordCount
          ArrangeCar          '显示方格里的车辆图案
          rs.MoveNext         '换下个停车记录
        
        Next
        
        End If
        
        Exit SubLoadError:
        MsgBox Err.Description
        
        End Sub
      

  27.   

    楼主,你单独弄个工程来试一下加载图标吧。或者把你现在的代码中的那句改成:
    Set pic = LoadPicture("D:\停车塔模拟管理系统\cars.ico") 
    运行一下试试看。
      

  28.   

    楼主,你的代码这里有问题(跟加载图标无关):
    Set db = OpenDatabase(App.Path & "\Park.MDB", False, False) 
    Set db = OpenDatabase(App.Path & "\NWIND.MDB", True, False) 你的第一个数据库没用了啊!!!
    你得另外声明一个变量。
      

  29.   

    这段代码运行提示:缺少子程序 属性或指令,请问怎么修改。。
    Private Sub Command2_Click()      '驶出
     Dim i, j As Byte
     Dim txt As String
     On Error GoTo CommandErr
                         '目前塔内若没有车辆,就不能接受驶出动作
     If rs.RecordCount = 0 Then
        MsgBox "目前停车塔没有任何车辆", vbExclamation + vbOKOnly
        
        Exit Sub
     
     End If
                     '输入要驶出的车辆,并作车牌是否6位的判断
      txt = InputBox("请输入车牌号码(6位),如AH9124", "输入车号")
      If Len(txt) <> 6 Then
         MsgBox "输入车号错误", vbCritical + vbOKOnly, "错误"
          Exit Sub
      End If
                                      '要搜寻驶出的车辆位置
      txt "LicensePlate =" & "'" & txt & "'"
      rs.FindFirst txt
      If Not rs.NoMatach Then            '若找到该辆车子
                                       '产生该车停放在塔内的位置
          MsgBox "这部车停放在第" & Str(rs![Floor]) & "层第" & r(rs![Grid]) & "格", vbInformation + vbOKOnly, "出场信息"
                                       '将该车在方格的图案予以消除
          MSFlexGrid1.Row = rs![Floor]
          MSFlexGrid1.Col = rs![Grid]
          
          Set MSFlexGrid1.CellPicture = LoadPicture("")
          
          rs.Delete                     '删除该辆车的记录
          
      Else
                                  '该车牌的车子并没有停在塔里
          MsgBox "没有停放这辆车", vbCritical + vbOKOnly, ""
          
      End If
          
          
      Exit Sub
                                      
    CommandErr:
                                      
      MsgBox Err.DescriptionEnd Sub
      

  30.   

    接楼上的 我改好了运行 点击后提示
    翻译过来是:Microsoft Jet数据库引擎不能识别'LicensePlate'作为一个有效的字段名或表达式
    请问怎么解决。。