vb弹出对话框代码报错。

fireegg 2016-12-27 10:20:06
我使用以下代码:

Dim oDLG
Set oDLG = CreateObject("MSComDlg.CommonDialog")
With oDLG
.DialogTitle = "保存文件"
‘其他脚本
end WITH

在本机有vb安装的电脑执行没问题,但是将程序编译后拷贝到另外的电脑,没有安装VB的电话则执行到 Set oDLG = CreateObject("MSComDlg.CommonDialog") 的时候报以下错误:


请教这是什么问题?网上搜的要注册comdlg32.ocx 也没用。

另外的方法说调用 api
Declare Function GetOpenFileName Lib "COMDLG32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
但是不知道引用哪个,编译时这个无法通过。谢谢
...全文
556 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiiiiloos 2017-01-09
  • 打赏
  • 举报
回复
引用 8 楼 fireegg的回复:
[quote=引用 7 楼 Chen8013 的回复:]
谢谢。


谢谢您的指导。看下我的图和脚本

输入不存在的文件名就报错了。
您的代码就是上方那些代码吗?
Option Explicit 如果不加行不行?貌似加到我的程序进来,有其他的程序,加这个会报错,不加的话可以编译,谢谢您[/quote] option explicit是引用显式变量 意思是指在代码中不允许出现未定义的变量使用
fireegg 2016-12-31
  • 打赏
  • 举报
回复
引用 14 楼 Chen8013 的回复:
[quote=引用 13 楼 fireegg 的回复:] ........... 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
你自己在主贴中,提到的就是“ GetOpenFileName” !  [/quote] 非常感谢老师。谢谢
舉杯邀明月 2016-12-31
  • 打赏
  • 举报
回复
引用 13 楼 fireegg 的回复:
........... 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
你自己在主贴中,提到的就是“ GetOpenFileName” !  如果用“保存”对话框,用另一个API: GetSaveFileName() 使用方面就名称不同,其它是一样的(当然在“对话框”中的一些行为细节也有所区别)。 如果要“保存”对话框,还有“添加默认文件名”,要改一下代码:
' 模块 增加API声明:
Private Declare Function GetSaveFileName Lib "Comdlg32" Alias "GetSaveFileNameW" _
                             (pOpenfilename As OPENFILENAME) As Long

' 增加接口函数:
Public Function ShowSave(hWndOwner As Long, FileOpen As String, _
                        Optional Title As String = "保存文件:", _
                        Optional Filter As String = "所有文件(*.*)|*.*", _
                        Optional FilterIndex As Long = 0&, _
                        Optional StartDir As String = vbNullChar, _
                        Optional Flags As Long = &H806&) As Long
      Dim OpenFN  As OPENFILENAME
      Dim strFilt As String
      Dim strName As String
      Dim strTemp As String
 
   ' 之前的“打开文件”如果要设置默认文件名,这句也这样改一下
   strName = FileOpen & vbNullChar & String$(264&, 0)
   strTemp = strName
   strFilt = Replace(Replace(Filter & vbNullChar, "|", vbNullChar), ",", vbNullChar)
   OpenFN.lStructSize = 76&
   OpenFN.hWndOwner = hWndOwner
   OpenFN.hInstance = App.hInstance
   OpenFN.lpstrTitle = StrPtr(Title)
   OpenFN.lpstrFilter = StrPtr(strFilt)
   OpenFN.nFilterIndex = FilterIndex
   OpenFN.lpstrDefExt = 5& + StrPtr(strFilt) + InStrB(1&, Filter, "|")
   OpenFN.lpstrInitialDir = StrPtr(StartDir)
   OpenFN.lpstrFile = StrPtr(strName)
   OpenFN.nMaxFile = 256&
   OpenFN.lpstrFileTitle = StrPtr(strTemp)
   OpenFN.nMaxFileTitle = 256&
   OpenFN.Flags = Flags
   If (GetSaveFileName(OpenFN)) Then
      FileOpen = Left$(strName, InStr(1&, strName, vbNullChar) - 1&)
      ShowSave = 0&
   Else
      ShowSave = -1&
   End If
End Function
调用示例:
Private Sub Command2_Click()
   Dim strFilt As String
   Dim strFile As String

   strFile = "ABCD123"
   ' ↑ 如果在在“对话框”中设置默认文件名,先把这个变量赋值
   strFilt = "文本文件(*.txt)|*.txt,所有文件(*.*)|*.*" & vbNullChar
   If (ShowSave(Me.hWnd, strFile, , strFilt)) Then
      MsgBox "用户选择了“取消”。", 64
   Else
      MsgBox "要保存的文件名是:" & strFile, 64
   End If
End Sub
fireegg 2016-12-31
  • 打赏
  • 举报
回复
引用 11 楼 Chen8013 的回复:
VB6代码,本来就应该加上“Option Explicit”才是最好的! 我给你的代码,有“Option Explicit”都是能编译通过的,你把它去掉了也不会有问题。 (除非你拿过去“改错了”…………)
老师,非常感谢,弱弱问一下,W版和A版是什么东东? 完全用你的代码可以了。再问下怎么传一个打开窗口的默认的文件名上去?我将strFile 赋值不行 这个定义的是Private Declare Function GetOpenFileName Lib 。。。。。 是OPENFILE,跳出窗口显示的是打开文件,是不是有个定义SAVEFILE的?用SAVE是不是会更好?谢谢
赵4老师 2016-12-30
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
舉杯邀明月 2016-12-29
  • 打赏
  • 举报
回复
VB6代码,本来就应该加上“Option Explicit”才是最好的! 我给你的代码,有“Option Explicit”都是能编译通过的,你把它去掉了也不会有问题。 (除非你拿过去“改错了”…………)
舉杯邀明月 2016-12-29
  • 打赏
  • 举报
回复
1. 你用的并不是我的代码!我用的是 W版的API代码。   就算你“没窗口”,那个窗口句柄是可以传0的。   我在回复你之前已经试过了,用你那样的“A版API代码”,在我这儿根本就不能正确执行,   调用API时直接就返回,根本就不弹框。   在调用语句后设置了一个断点,在执行调用后,查到的信息是“错误的参数”。 2. 你说“不能打开不存在的文件”,是你自己封装代码的问题!   你知道 ofn.flags = 6148 代表什么含义吗!!!!   这就是你自己要求“只能打开已经存在的文件”!    你可以把6148改成2052或者是4 ,再试试看!
fireegg 2016-12-29
  • 打赏
  • 举报
回复
而且我是没有窗口的cls文件。Me.hWnd 不能用。
fireegg 2016-12-29
  • 打赏
  • 举报
回复
引用 7 楼 Chen8013 的回复:
谢谢。


谢谢您的指导。看下我的图和脚本

输入不存在的文件名就报错了。
您的代码就是上方那些代码吗?
Option Explicit 如果不加行不行?貌似加到我的程序进来,有其他的程序,加这个会报错,不加的话可以编译,谢谢您
舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
给你一个截图看看:
我输入的文件名:123456abc 就是一个不存在的文件,
(如果有,它会排在图中 Adodb_Stream详解(属性及方法).txt 的前面)
但是在对话框中点“打开”之后,不会有任何提示,直接返回了相应的文件名。

舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
你的调用语句是怎么写的? (你的操作系统是哪个版本?难道跟操作系统有关…………但我在各个系统中都没这种问题啊)
fireegg 2016-12-28
  • 打赏
  • 举报
回复
引用 4 楼 Chen8013 的回复:
[quote=引用 3 楼 fireegg 的回复:] [quote=引用 2 楼 Chen8013 的回复:] 用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢[/quote] 胡说 !!! 这个代码,“不存在的文件”,也是“可以打开”的 ! (它实际上只是返回了文件的“路径+文件名”而已,并不执行真正的打开操作。跟用控件的效果是一样的。)[/quote] 会提示我文件不存在呀,呵呵。
舉杯邀明月 2016-12-28
  • 打赏
  • 举报
回复
引用 3 楼 fireegg 的回复:
[quote=引用 2 楼 Chen8013 的回复:] 用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢[/quote] 胡说 !!! 这个代码,“不存在的文件”,也是“可以打开”的 ! (它实际上只是返回了文件的“路径+文件名”而已,并不执行真正的打开操作。跟用控件的效果是一样的。)
fireegg 2016-12-28
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
用W版API的代码,给你一段参考: 。。。。。
请教你,这个open是要文件存在才行,如果不存在是怎么用呢?谢谢
舉杯邀明月 2016-12-27
  • 打赏
  • 举报
回复
用W版API的代码,给你一段参考:
' 标准模块中的代码:
Option Explicit

Private Declare Function GetOpenFileName Lib "Comdlg32" Alias "GetOpenFileNameW" _
                             (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
    lStructSize      As Long
    hWndOwner        As Long
    hInstance        As Long
    lpstrFilter      As Long
    lpstrCustFilter  As Long
    nMaxCustFilter   As Long
    nFilterIndex     As Long
    lpstrFile        As Long
    nMaxFile         As Long
    lpstrFileTitle   As Long
    nMaxFileTitle    As Long
    lpstrInitialDir  As Long
    lpstrTitle       As Long
    Flags            As Long
    nFileOffset      As Integer
    nFileExtension   As Integer
    lpstrDefExt      As Long
    lCustData        As Long
    lpfnHook         As Long
    lpTemplateName   As Long
End Type

Private Const OFN_HIDEREADONLY   As Long = 4&         ' 隐藏“只读”选项


Public Function ShowOpen(hWndOwner As Long, FileOpen As String, _
                        Optional Title As String = "打开文件:", _
                        Optional Filter As String = "所有文件(*.*)|*.*", _
                        Optional FilterIndex As Long = 0&, _
                        Optional StartDir As String = vbNullChar, _
                        Optional Flags As Long = OFN_HIDEREADONLY) As Long
      Dim OpenFN  As OPENFILENAME
      Dim strFilt As String
      Dim strName As String
      Dim strTemp As String

   strName = String$(264&, 0)
   strTemp = strName
   strFilt = Replace(Replace(Filter & vbNullChar, "|", vbNullChar), ",", vbNullChar)
   OpenFN.lStructSize = 76&
   OpenFN.hWndOwner = hWndOwner
   OpenFN.hInstance = App.hInstance
   OpenFN.lpstrTitle = StrPtr(Title)
   OpenFN.lpstrFilter = StrPtr(strFilt)
   OpenFN.nFilterIndex = FilterIndex
   OpenFN.lpstrDefExt = 5& + StrPtr(strFilt) + InStrB(1&, Filter, "|")
   OpenFN.lpstrInitialDir = StrPtr(StartDir)
   OpenFN.lpstrFile = StrPtr(strName)
   OpenFN.nMaxFile = 256&
   OpenFN.lpstrFileTitle = StrPtr(strTemp)
   OpenFN.nMaxFileTitle = 256&
   OpenFN.Flags = Flags
   If (GetOpenFileName(OpenFN)) Then
      FileOpen = Left$(strName, InStr(1&, strName, vbNullChar) - 1&)
      ShowOpen = 0&
   Else
      ShowOpen = -1&
   End If
End Function
' 窗体代码(调用示例)
Option Explicit

Private Sub Command1_Click()
   Dim strFilt As String
   Dim strFile As String
   
   strFilt = "文本文件(*.txt)|*.txt,所有文件(*.*)|*.*" & vbNullChar
   If (ShowOpen(Me.hWnd, strFile, , strFilt)) Then
      MsgBox "用户选择了“取消”。", 64
   Else
      MsgBox "选择的文件是:" & strFile, 64
   End If
End Sub
舉杯邀明月 2016-12-27
  • 打赏
  • 举报
回复
按理说,如果comdlg32.ocx注册成功,应该是可以用这段代码创建对象的。 用API打开文件,我用的是W版的,一直使用正常。 A版的“直接翻译”过来的代码,运行失败。 估计还是得把那些“字符串成员”换成Long类型(指针),   并把“字符串”转换成ANSI编码、数据首址赋给相应的指针值, 再把结构体传递给API才行。 与其这样,倒不如直接就用W版的API…………
DataGridView打印控件5.3版 窗口程序使用演示 包含多个打印控件在窗口程序使用的实例及源代码(有C#的,也有VB的),有源代码 打印控件 实际的打印控件(含.NET4.0的专用打印控件) 网页中使用演示 打印控件在网页中使用的演示程序(有源代码) 1、DGVPrint和VB2008Print 组件在分组打印时,可以在标题中打印当前组名(使用变量“$组名$”); 2、对DGVPrint组件的打印参数设置界面进行了重新排版,并去掉了说明页; 3、增加了DrawTitle和DrawTitleEx函数,方便打印标题行; 4、打印DGV表格时单元格的边距完全按DGV本身的设置进行打印(原来只能按DGV的DefaultCellStyle.Padding设置的大小打印); 5、DGVPrint组件增加了多个属性用于控制弹出的打印参数设置窗口中允许进行更改的项(请参数以EnableChange开头的属性,有9个); 6、解决在64位操作系统下无法弹出打印对话框的问题,去掉了打印处理进度窗口中的“.NET轻松打印控件”字样; 7、彻底解决了调用Excel后(导出为excel文件)Excel进程未关闭问题; 8、多表头组件MulHeaderDataGridView具有单元格内容合并显示功能; 9、新增DrawExpression函数,结合ExpressionDrawer类可以很方便对单变量表达式进行绘图打印 10、增加了网中使用的打印控件WebPrintServer的水印打印功能和装订线打印功能 11、增加了将报表文件(you结尾的文件)和报表模板生成的报表(用EasyReport组件的GetReportString方法得到的字符串)添加到VB2008Print组件的当前打印作业中的方法(详见AddReport和AddReportByString方法) 12、删除了PrintDataGrid函数(若要打印DataGrid,请先调用ConvertDataGridToDGV函数将DataGrid转换为DataGridView再以打印DGV的形式打印)和ChartGraph图表组件(图表打印请使用功能更强大且不依赖Excel的Chartlet图表组件) 13、其他一些完善,比如对DrawTextEx函数进行了完善,解决了有时出现“同一依赖程序集的不同版本之间出现冲突”警告的问题(如果出现,这个问题也并不影响程序的编译和运行,您不用太在意),如果电脑上未安装打印机驱动,程序会给出友好提示而不是像以前一样报错,对部分帮助文件内容进行了完善(如PrintDGV等函数)。 使用说明:只需要把dll引用到项目、添加打印事件 Private Sub Btn_Printer_Click(sender As System.Object, e As System.EventArgs) Handles Btn_Printer.Click '调用打印 DgVprint1.Alignment = StringAlignment.Center '表格居中 DgVprint1.MainTitle = "监控系统报表记录打印" DgVprint1.SubTitle = "苏州市华工照明科技有限公司" DgVprint1.TableHeaderLeft = "编制单位:路灯管理所" DgVprint1.TableFooterLeft = "制表:苏州市华工照明科技有限公司" DgVprint1.PrintType = VBprinter.DGVprint.mytype.GeneralPrint '在此还可以设置其他属性,当然,也可以DGVPRINT1的悔改窗口中进行设置,效果完全一样的 DgVprint1.Print(Me.DataGridView, False) End Sub 以下为导出excel方法实例: Private Sub BtnToExcel_Click(sender As System.Object, e As System.EventArgs) Handles BtnToExcel.Click 'Dim To_Excel As New To_Excel(Me.DataGridView) '方法一:导出excel Dim ToExcel As New VBprinter.DGVprint '方法二:导出excel ToExcel.ExportDGVToExcel(Me.DataGridView) ToExcel.Dispose() End Sub

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧