分享

Vb常用内部函数

 网络摘记 2014-12-26
Vb常用内部函数
  请单击要查看的函数组:
  类型转换函数 数学函数 日期与时间函数 随机数函数
  字符串函数 文件操作函数 窗体输入输出函数
  
  单击下面的大标题可以返回此处:
   类型转换函数
  1、 Int(x):求不大于自变量x的最大整数
  2、 Fix(x):去掉一个浮点数的小数部分,保留其整数部分
  3、 Hex$(x):把一个十进制数转换为十六进制数
  4、 Oct$(x):把一个十进制数转换为八进制数
  5、 Asc(x$):返回字符串x$中第一个字符的ASCII字符
  6、 CHR$(x):把x的值转换为相应的ASCII字符
  7、 Str$(x):把x的值转换为一个字符串
  8、 Cint(x):把x的小数部分四舍五入,转换为整数
  9、 Ccur(x):把x的值转换为货币类型值,小数部分最多保留4 位且自动四舍五入
  10、 CDbl(x):把x值转换为双精度数
  11、 CLng(x):把x的小数部分四舍五入转换为长整数型数
  12、 CSng(x):把x值转换为单精度数
  13、 Cvar(x):把x值转换为变体类型值
  14、 VarPtr(var):取得变量var的指针
   数学函数
  1、 Sin(x):返回自变量x的正弦值
  2、 Cos(x): 返回自变量x的余弦值
  3、 Tan(x): 返回自变量x的正切值
  4、 Atn(x): 返回自变量x的反正切值
  5、 Abs(x): 返回自变量x的绝对值
  6、 Sgn(x): 返回自变量x的符号,即当x为负数时,返回-1;当x为0时,返回
   0;当x为正数时,返回1
  7、 Sqr(x):返回自变量x的平方根,x必须大于或等于0
  8、 Exp(x):返回以e为底,以x为指数的值,即求e的x次方
   日期与时间函数
  1、 Day(Now):返回当前的日期
  2、 WeekDay(Now):返回当前的星期
  3、 Month(Now):返回当前的月份
  4、 Year(Now):返回当前的年份
  5、 Hour(Now):返回小时(0~23)
  6、 Minute(Now):返回分(0~59)
  7、 Second(Now):返回秒 (0~59)
   随机数函数
  1、 Rnd[(x)]:产生一个0~1之间的单精度随机数
  2、 Randmize[(x)]:功能同上,不过更好
   字符串函数
  1、 LTrim$(字符串):去掉字符串左边的空白字符
  2、 Rtrim$(字符串):去掉字符串右边的空白字符
  3、 Left$(字符串,n):取字符串左部的n个字符
  4、 Right$(字符串,n):取字符串右部的n个字符
  5、 Mid$(字符串,p,n):从位置p开始取字符串的n个字符
  6、 Len(字符串):测试字符串的长度
  7、 String$(n,字符串):返回由n个字符组成的字符串
  8、 Space$(n):返回n个空格
  9、 InStr(字符串1,字符串2):在字符串1中查找字符串2
  10、 Ucase$(字符串):把小写字母转换为大写字母
  11、 Lcase$(字符串):把大写字母转换为小写字母
  
   窗体输入输出函数
  1、 Print(字符串):在窗体输出字符串,可以用”&”对变量进行连接后输出
  2、 Tab(n):把光标移到该行的n开始的位置
  3、 Spc(n):跳过n个空格
  4、 Cls:清除当前窗体内的显示内容
  5、 Move 左上角x,左上角y,宽度,高度:移动窗体或控件
  6、 InputBox(prompt,…):跳出一个数据输入窗口,返回值为该窗口的输入值
  7、 MsgBox(msg,[type]…):跳出一个提示窗口
  
   文件操作函数
  1、 Open 文件名 [For方式] [Access存取类型] [锁定] AS [#]文件号 [Len=记录长度]
  功能:为文件的输入输出分配缓冲区,并确定缓冲区所使用的存取方式
  说明:
  1) 方式:指定文件的输入输出方式,可选,默认是Random,可以是以下值
  a、 Output:指定顺序输出方式,将覆盖原有内容
  b、 Input:指定顺序输入方式
  c、 Append:指定顺序输出方式,在文件未尾追加内容
  d、 Random:指定随机存取方式,也是默认方式,在Random方式时,如果没有Access子句,则在执行Open语句时,VB将按下列顺序打开文件:读/写、只读、只写
  e、 指定二进制文件。在这种方式下,可以用Get和Put语句对文件中任何字节位置的信息进行读写。在Binary方式中,如果没有Access子句,则打开文件的类型与Random方式相同
  2)、存取类型:放在关键字Access之后,用来指定访问文件的类型。可以是下列类型之一
  a、 Read:打开只读文件
  b、 Write:打开只写文件
  c、 Read Write:打开读写文件。这种类型只对随机文件、二进制文件及用Append方式打开的文件有效
   3)、锁定:该子句只在多用户或多进和环境中使用,用来限制其他用户或其他进程对打开进行读写操作。锁定类型包括:
  a、 默认:如不指定锁定类型,则本进程可以多次打开文件进行读写;在文件打开期间,其他进程不能对该文件执行读写操作
  b、 Lock Shared:任何机器上的任何进程都可以对该文件进行读写操作
  c、 Lock Read:不允许其他进程读该 文件。只在没有其他Read存取类型的进程访问该文件时,才允许这种锁定。
  d、 Lock Write:不允许其他进程写这个文件。只在没有其他Write存取类型的进程访问该文件时,才允许这种锁定
  e、 Lock Read Write:不允许其他进程读写这个文件
  如果不使用lock子句,则默认为Lock Read write
  4)、文件号:由用户自行指定一个由1~511之间的整数,只要该文件号未被使用就合法;打开文件后,可以用该文件号进行读写等操作
  5)、记录长度:是一个整型表达式。当选择该参量时,为随机存取文件设置记录长度。对于用随机访问方式打开的文件,该值是记录长度;对于顺序文件,该值是缓冲字符数。”记录长度”不能超过32767字节。对于二进制文件,将忽略Len子句
  举例:Open “price.dat” for Output as #1
  Open “C:\abc.dat” for radom as #1 len=256
  
  2、 Close [#文件号][,#文件号]……:关闭文件
  3、 Seek #文件号,位置:文件指针跳到指定位置,以字节为单位。取值1~pow(2,31)-1
  4、 Seek (文件号):返回当前文件指针的位置
  5、 FreeFile():取得一个未使用的文件号
  6、 Loc(文件号):返回指定文件的当前读写位置
  7、 LOF(文件号):返回文件长度
  8、 EOF(文件号):用来测试文件是否结束,结束返回true
  9、 Print #文件号,变量1,变量2,…变量n:按顺序将各变量的值写入顺序文件
  如果是print #文件号,则写入空行
  10、 Write #文件号,表达式表…:作用同 Print
  11、 Input #文件号,变量表….:读顺序文件,进行与Print相反的操作
  12、 Line Input #文件号,字符串变量:从顺序文件中读入一行
  13、 Input$(n,#文件号):从顺序文件读出 n个字符的字符串
  14、 Put #文件号,[记录号],变量:把除对象变量和数组变量外的任何变量(包括号含有单个数组元素的下标变量)的内容写入随机文件。
  例如:Put #2,,filebuff
  15、 Get #文件号,[记录号],变量:读随机文件,执行与put相反的操作
  16、 Get|put #文件号,[位置],变量:读写二制文件,位置是指下一次读写操作的位置。
  17、 Kill 文件名:删除文件
  18、 FileCopy 源文件名,目标文件名:复制文件
  19、 Name原文件名 as 新文件名:重命令文件
  
  
  
  msflexgrid中设置内容显示方式? [转贴 2006-11-15 15:59:58]
   字号:大 中 小
  使用
   .FixedAlignment (设置指定列的对齐方式)
   .ColAlignment (设置指定固定列的对齐方式)
  
   常数 值 描述
   flexAlignLeftTop 0 单元格的内容左、顶部对齐。
   flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。
   flexAlignLeftBottom 2 单元格的内容左、底部对齐。
   flexAlignCenterTop 3 单元格的内容居中、顶部对齐。
   flexAlignCenterCenter 4 单元格的内容居中、居中对齐。
   flexAlignCenterBottom 5 单元格的内容居中、底部对齐。
   flexAlignRightTop 6 单元格的内容右、顶部对齐。
   flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。
   flexAlignRightBottom 8 单元格的内容右、底部对齐。
   flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按
  “右、居中”显示。
  FormatString 属性
  
   设置 MSHFlexGrid的列宽、对齐方式、固定行文本和固定列文本。
   语法
   object.FormatString [= string]
   FormatString 属性的语法包含如下部分:
   部分 描述
   object 一个对象表达式,其值为“应用于”列表中的一个对象。
   string 一个字符串表达式,为格式化在行和列中的文本。如在说明中所述。
   说明 在设计时,MSHFlexGrid 语法分析和解释 FormatString 来获得如下信息:行和列的数目、行和列标头的文本、列宽和列对齐方式。
   FormatString 属性包含由管道字符 (|) 分隔的段。管道字符之间的文本定义一列并且也可能包含特定的对齐字符。这些字符使整个列左对齐(<)、居中(^)或右对齐(>)。另外,根据缺省规定文本被指定给行 0,且文本宽度定义每一列的宽度。
   FormatString 属性可能包含一个分号 (;)。这使得字符串的余下部分被解释为行标头和行宽度信息。另外,根据缺省规定文本被指定给列 0,且最长的字符串定义列 0 的宽度。 MSHFlexGrid 创建附加的行和列来驻留由 FormatString 定义的所有字段。如果只有几个字段被指定,附加的行和列不被删除。要删除附加的行和列,设置 Rows 和 Cols 属性。
  
   FormatString 属性示例
   下面的示例举例说明 FormatString 属性如何工作。
   注意 如果正在使用 MSFlexGrid,用“MSFlexGrid1”代替“MSHFlexGrid1”。 '设置列标头。 s$ = "Sales "
   MSHFlexGrid1.FormatString = s$
   ' 设置行标头(注意开始的分号)。
   s$ = ";Name|Address|Telephone|Social Security#"
   MSHFlexGrid1.FormatString = s$
   ' 设置列和行标头。
   s$ = "|Name|Address|Telephone|Social Security#"
   s$ = s$ + ";|Robert|Jimmy|Bonzo|John Paul"
   MSHFlexGrid.FormatString = s$
   MSHFlexGrid MSFlexGrid 都适用
   Private Sub Form_Load()
   With MSFlexGrid1
   .Rows = 10
   .Cols = 5
   For j = 0 To 4
   .ColAlignment(j) = 1 '--------->as this
   For i = 0 To 9
   .TextMatrix(i, j) = i * j
   Next
   Next
   End With
   End Sub
  首先,msflexgrid1.cellalignment=0 只是设置了当前单元格的显示方式
   让每个单元格都居左显示,有两种方法
   楼上是一种
   另外:
   With MSHFlexGrid1
   .Rows = 5
   .Cols = 4
   For i = 0 To .Rows - 1
   For j = 0 To .Cols - 1
   .Row = i
   .Col = j
   '在这了可以对单元格进行各种操作
   .Text = i & "|" & j
   .CellAlignment = 1
   Next j
   Next i
   End With
   这种方法对于fixed的行和列也有效
  MSFlexGrid控件的CellAlignment 属性是设置单元格对齐方式的。
  例如:
  MSFlexGrid.Col=2
  MSFlexGrid.Row=3
  MSFlexGrid.CellAlignment=3''''把第2列,第3行设置为中间对齐。
  ColAlignment属性是设置该列对齐方式的。
  例如:MSHFlexGrid1.ColAlignment(3)=3''''把第3设置为中间对齐.
  
  后面数字解释如下:
  flexAlignLeftTop 0 单元格的内容左、顶部对齐。
  flexAlignLeftCenter 1 字符串的缺省对齐方式。单元格的内容左、居中对齐。
  flexAlignLeftBottom 2 单元格的内容左、底部对齐。
  flexAlignCenterTop 3 单元格的内容居中、顶部对齐。
  flexAlignCenterCenter 4 单元格的内容居中、居中对齐。
  flexAlignCenterBottom 5 单元格的内容居中、底部对齐。
  flexAlignRightTop 6 单元格的内容右、顶部对齐。
  flexAlignRightCenter 7 数值的缺省对齐方式。单元格的内容右、居中对齐。
  flexAlignRightBottom 8 单元格的内容右、底部对齐。
  flexAlignGeneral 9 单元格的内容按一般方式进行对齐。字符串按“左、居中”显示,数字按“右、居中”。
  VB编程经验之谈----打印篇
  打印多页Rich Text
    打印对象在处理RichTextBox时由于忽视了Rich Text代码将不会工作得很好。为了打印RichTextBox,要使用SelPrint命令,但是SelPrint不是非常得友好,它按照自己的方式打印然后产生退纸动作。为了打印多页Rich Text,要找到每一页的开始和结束点,然后依此设置SelStart和SelLength,最后使用SelPrint打印出每一页。以下是工作的每一个步骤:
    1、使用SaveFile命令保存编辑版本的文件。
    2、转换编辑版本为打印版本:   
    遍历这个文档,修改SelIndent和SelRightIndent的数值,使之适合于打印机(注意:编辑时的缩进数值对于屏幕是合适的,但不适用于打印机)。
    做些其他的修改,比如:添加页眉,消除行号。
    3、使用SelPrint循环一次打印一个页面。这里,计算行数是一个技巧,找到LFCRs是容易的,但是,也必须要计算一下行缠绕,它也算在了行统计中,以及绝对不允许发生的页面溢出情况。
    4、使用SelRTF=""删除打印版本。
    5、使用LoadFile重新启动编辑版本。
    打印MSFlexGrid
    这里有一个快速打印MSFlexGrid控件内容的方法:
    Printer.PaintPicture MSFlexGrid_Name.Picture, 0, 0
    Printer.EndDoc
    如果想打印满页面的整个长度,请在前面添加下面2个语句:
    Dim old_width as Integer
    MSFlexGrid_Name.width=printer.width
    然后,再在尾部添加:
    MSFlexGrid_Name.width=old_width  
    快速打印多个拷贝
    当以TrueType字体打印一个文档时,系统将下载打印机需要的字体,这样做将花费很长的时间。你可以通过在一个打印机文档中打印所有的拷贝实现快速打印多个拷贝内容:  
    For i = 1 To num_copies
    注释: Print the document here...  
    Printer.NewPage
    Next i
    Printer.EndDoc
    打印灰色行和区域
    黑白打印机不能打印灰色行,但是能通过发抖处理来创建灰色区域。为了创建围绕一个区域的一个灰色边界,使用DrawStyle=vbInvisible(5)来绘制一个窄灰色框,这样就没有了边界。
    设置打印的边界
    使用打印的scale熟悉来设置边界。设置了这个属性后,坐标(0,0)就映射到你需要加边的地方。比如,下面的代码设置左边界为0.5英寸,上边界为0.75英寸。然后再乘以1440转换为twip。
    Printer.ScaleLeft = -0.5 * 1440
    Printer.ScaleTop = -0.75 * 1440
    Printer.CurrentX = 0
    Printer.CurrentY = 0
    很遗憾,打印机不能精确地按照你所想的进行打印。试一试使用下面的命令在左上角打印一个1英寸大小的方块:
    Printer.Line (1440, 1440)-Step(1440, 1440)
    看看偏离了多少。试一试多打印几次,如果发现打印机有一定规律的偏离,你就可以按照一定的差额进行增减来达到最佳的效果。
    提供打印预览
    建立打印程序时,先设置一个要绘制的对象做为参数,然后传递给程序一个打印的对象。
    为了实现预览效果,传递给程序一个隐藏PictureBox。然后,根据需要的比例,使用PaintPicture拷贝这个隐藏图形到一个可见的PictureBox。在隐藏PictureBox上按照全尺寸绘制图形,首先允许你按比例决定了字体,并且,也实现了不失真地完成其他图形的描述。
   2008-6-11 来源:eNet论坛
  
  
  
  msflexgrid打印
  Option Explicit
  Private Const ColDistance = 400
  Private Const RowDistance = 150
  Private Totalwidth As Long
  Private FixedX As Long
  Private FixedY As Long
  Private LinesPerPage As Integer
  Private Lineheight As Integer
  Private Curx As Long
  Private Cury As Long
  Private LineStartx As Long
  Private LineStarty As Long
  Private LineEndy As Long
  Private MaxColWidth As Long
  \'区别于PrintGridNormal: 它打印时题头为第一列而不是第一行
  \'Title: 标题, 将被醒目打印
  \'GridToPrint: 待打印的 控件名称
  \'SubTitle: 附加标题
  Public Sub PrintGridRoutate(Title As String, Gridtoprint As MSFlexGrid, SubTitle As String)
  On Error GoTo PrinTErr
  If MsgBox("请准备好打印机,单击[确定]开始打印...", vbExclamation + vbOKCancel, "准备打印") = vbOK Then
   Dim T_str As String
   Dim P As Integer
   Dim i As Integer
   Dim j As Integer
   Dim k As Integer
   Dim StartRow As Long
   Dim EndRow As Long
   Dim L As Integer
   \'Printer.PaperSize = 9 \'A4纸 210 x 297 毫米
   P = 0
   With Gridtoprint
   StartRow = 1
   EndRow = .Rows - 1
   i = 0
   Printer.Orientation = 1
   LinesPerPage = 3
   For k = 0 To EndRow - StartRow
   If (k Mod LinesPerPage) = 0 Then
  \' Call PrintTitleRoutate(Gridtoprint, Title, SubTitle)
   End If
   Cury = FixedY
   .row = k + StartRow
   Printer.CurrentY = Cury
   For j = 0 To .Cols - 1
   If .ColWidth(j) <> 0 Then
   .col = j
   Printer.CurrentX = Curx
   Printer.Print .Text
   Cury = Printer.CurrentY + RowDistance * 2
   Printer.CurrentY = Cury
   End If
   Next j
   Curx = Curx + ColDistance * 1.5 + MaxColWidth
   Cury = Printer.CurrentY + Lineheight
   i = i + 1
   If i = LinesPerPage Then
   i = 0
   P = P + 1
   T_str = "第" & P & "/" & (EndRow - StartRow + 1) \\ LinesPerPage + 1 & "页"
   Call PrintFooter(FixedX, Cury, T_str)
   Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
   Printer.EndDoc
   Printer.Orientation = 1
   LinesPerPage = 3
   End If
   Next k
   End With
   P = P + 1
   T_str = "第" & P & "/" & (EndRow - StartRow + 1) \\ LinesPerPage + 1 & "页"
   Call PrintFooter(FixedX, Cury, T_str)
   Call PrintTableRoutate(Gridtoprint, Gridtoprint.Cols)
   Printer.EndDoc
  End If
  Exit Sub
  PrinTErr:
   On Error GoTo 0
   Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
   Printer.KillDoc
  End Sub
  
  \'区别于PrintTitleRoutate: 它打印时题头为第一行而不是第一列
  Private Sub PrintTitleNormal(Gridtoprint As MSFlexGrid, Title As String, SubTitle As String)
  Dim j As Integer
  On Error GoTo PrinTErr
   Title = Trim(Title)
   Printer.FontSize = 16
   Totalwidth = 0
   For j = 0 To Gridtoprint.Cols - 1
   If Gridtoprint.ColWidth(j) <> 0 Then
   Gridtoprint.col = j
   Totalwidth = Totalwidth + Gridtoprint.ColWidth(j) + ColDistance
   End If
   Next j
   FixedX = (Printer.Width - Totalwidth) \\ 2
   FixedX = IIf(FixedX > 500, FixedX - 200, FixedX)
   Curx = (Printer.Width - Len(Title) * Printer.FontSize * 20.2) \\ 2
   Cury = 1000
   Printer.CurrentX = Curx
   Printer.CurrentY = Cury
   Printer.Print Title
   Printer.FontSize = 10
   Lineheight = RowDistance + Printer.FontSize * 20.2
   Gridtoprint.row = 0
   Curx = FixedX
   Cury = Cury + 1000
   LineStartx = FixedX - ColDistance \\ 2
   LineStarty = Cury - RowDistance \\ 2
   If SubTitle <> "" Then
   Printer.CurrentX = Curx
   Printer.CurrentY = Cury - RowDistance - Printer.FontSize * 20.2
   Printer.Print SubTitle
   End If
   Printer.CurrentX = Curx
   Dim OldFontSize As Single
   OldFontSize = Printer.FontSize
   Printer.FontSize = 11
   Printer.Font.Bold = True
   For j = 0 To Gridtoprint.Cols - 1
   If Gridtoprint.ColWidth(j) <> 0 Then
   Gridtoprint.col = j
   Printer.CurrentY = Cury
   Printer.Print Gridtoprint.Text
   Curx = Curx + Gridtoprint.ColWidth(j) + ColDistance
   Printer.CurrentX = Curx
   End If
   Next j
   Printer.Font.Bold = False
   Printer.FontSize = OldFontSize
  Exit Sub
  PrinTErr:
   On Error GoTo 0
   Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
   Printer.KillDoc
  End Sub
  
  Private Sub PrintFooter(X As Long, Y As Long, MyStr As String)
  On Error GoTo PrinTErr
   Printer.CurrentX = X
   Printer.CurrentY = Y
   Printer.Print "打印时间:" & Format(Date, "yyyy-mm-dd") & " " & Format(Time, "hh:mm:ss")
   Printer.CurrentX = X + Totalwidth - Printer.FontSize * 10.1 * LenB(MyStr)
   Printer.CurrentY = Y
   Printer.Print MyStr
  Exit Sub
  PrinTErr:
   On Error GoTo 0
   Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
   Printer.KillDoc
  End Sub
  
  Private Sub PrintTableRoutate(Gridtoprint As Control, R As Integer)
  Dim L As Integer
  Dim TableRowCol As Long
  On Error GoTo PrinTErr
   TableRowCol = LineStarty
   For L = 0 To R
   Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
   TableRowCol = TableRowCol + Lineheight
   Next L
   Printer.Line (LineStartx, TableRowCol)-(LineStartx + Totalwidth, TableRowCol)
   LineEndy = TableRowCol
   TableRowCol = LineStartx
   Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
   TableRowCol = TableRowCol + Totalwidth - 3 * MaxColWidth - ColDistance * 3
   For L = 0 To 3
   Printer.Line (TableRowCol, LineStarty)-(TableRowCol, LineEndy)
   TableRowCol = TableRowCol + ColDistance + MaxColWidth
   Next L
  Exit Sub
  PrinTErr:
   On Error GoTo 0
   Call MsgBox("打印机未准备好或有故障!", vbCritical + vbOKOnly, "错误")
   Printer.KillDoc
  End Sub
  
  码多了些,变量也没定义,不能直接用,参考而已
   总体思想就是把Grid的图形发到pictureBox中去,按分页的次数发。
   然后重设Grid,再发一次
   SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEUP, 1
   滚动来实现重设Grid
   以下代码供参考
   Private Sub ScrollDown5()
   '第五个按钮的集合代码
   Dim i As Integer
  nMFGridCurRowTop = 1 'MFGridPrv当显示行顶行row值记录下一将显示的row
  nMFGridCurPos = 0 '当前位置标识,0首,1尾,-1 中间,初始化为0
  nMFGridFullType = -2 '当前所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
  nMFGridRowNum = 0 '记录MFGridPrv中显示的行数,滚动依据,显示不全的不在其中
   nMFGridDisplayHeight = 0 '记录MFGridPrv所有显示出来的行的总行高
  nMFGridCurPosLat = 0 '下一步位置标识,0首,1尾,-1 中间,初始化为0
   nMFGridFullTypeLat = -2 '下一步所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
  nMFGridRowNumLat = 0 '记录下一步MFGridPrv中显示的行数,滚动依据,显示不全的不在其中
  nMFGridDisplayHeightLat = 0 '记录下一步MFGridPrv所有显示出来的行的总行高
  '重设高度
  MFGridPrv.Height = nMFGridHeightOri
   '移回首行
   For i = 0 To MFGridPrv.Rows - 1
   SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEUP, 1
  Next i
  If nMFGridCurPage = 0 Then
   Me.ToolbarPtn.Buttons(4).Enabled = False
   End If
  Me.ToolbarPtn.Buttons(5).Enabled = True
   For i = 0 To nMFGridCurPage - 1
   subScrollDown
   If nMFGridCurPos = 1 Then
   nMFGridCurPage = i
   Exit For
   End If
   Next i
   End Sub
  
   Private Sub subScrollDown()
   Dim i As Integer
   If nMFGridCurPos <> 1 Then '不到尾部时
   Me.ToolbarPtn.Buttons(4).Enabled = True
  
   '检查当前状态
   subGetMFGridDisplayRow
   'MsgBox nMFGridRowNumRe & " " & MFGridPrv.Height
   'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
   '当前所有行与MFGridPrv关系,0刚好相等,-1没有占满,1多出
   If nMFGridFullType = 1 Then '多出
   '检查下一步的状态
   subGetMFGridDisplayRowLat
   If nMFGridCurPosLat = 1 Then
   MFGridPrv.Height = nMFGridDisplayHeightLat
   Me.ToolbarPtn.Buttons(5).Enabled = False
   Me.ToolbarPtn.Buttons(4).Enabled = True
   End If
   For i = 0 To nMFGridRowNum - 1
   SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEDOWN, 1
   Next i
  
   'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
   End If
   If nMFGridFullType = 0 Then '刚好
   '检查下一步的状态
   subGetMFGridDisplayRowLat
   If nMFGridCurPosLat = 1 Then
   MFGridPrv.Height = nMFGridDisplayHeightLat
   Me.ToolbarPtn.Buttons(5).Enabled = False
   Me.ToolbarPtn.Buttons(4).Enabled = True
   End If
   For i = 0 To nMFGridRowNum - 1
   SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_LINEDOWN, 1
   Next i
   End If
   If nMFGridFullType = -1 Then '没占满
   Me.ToolbarPtn.Buttons(5).Enabled = False
   Me.ToolbarPtn.Buttons(4).Enabled = True
   End If
  
   'SendMessage MFGridPrv.hwnd, WM_VSCROLL, SB_PAGEDOWN, 1
   End If
   End Sub
   Private Sub subGetMFGridDisplayRow()
   '函数名:subGetMFGridDisplayRow
   '入口参数:无
   '出口参数:无
   '功能:得到MFGridPrv当前显示的行数,显示一半的不在其中,此为前滚
   '编写日期:2002.9.4
   '编写人:yuiee
   '备注:只对MFGridPrv使用
   Dim nRowHeightTmp As Integer '当前行高 ,为动态变量
   Dim nCaluHeight As Integer '动态行高nRowHeight相加的和
   Dim nMFGridHeight As Integer '控件高
   Dim nNumTmp As Integer '行数
   Dim nDisplayHeightTmp '显示出来的行的总行高
   Dim nTypeTmp As Integer '数据与MFGridPrv关系
   Dim bExitNo As Boolean '
   Dim i As Integer
   '初始高度在调用此过程前设定
   nMFGridHeight = nMFGridHeightOri
  
  
  
   nRowHeightTmp = MFGridPrv.RowHeight(0) '标头高
   nMFGridFullType = -2
   bExitNo = True
   For i = nMFGridCurRowTop To MFGridPrv.Rows - 1
   MFGridPrv.Row = i
  
   nDisplayHeightTmp = nRowHeightTmp
   nMFGridRowNumRe = nRowHeightTmp
   nRowHeightTmp = nRowHeightTmp + MFGridPrv.RowHeight(i)
   If nRowHeightTmp > nMFGridHeight Then
   nMFGridFullType = 1
   bExitNo = False
   Exit For
   Else
   nNumTmp = nNumTmp + 1
   End If
  
   Next i
   If nMFGridFullType = 1 Then
   If nMFGridCurRowTop <> 1 Then
   nMFGridCurPos = -1 '中间
   Else
   nMFGridCurPos = 0
   End If
   End If
   If nMFGridFullType = -2 Then
   nMFGridRowNumRe = nRowHeightTmp
   If nRowHeightTmp < nMFGridHeight Then
   nMFGridFullType = -1 '小于
   Else
   nMFGridFullType = 0 '刚好
   End If
   nMFGridCurPos = 1 '到尾部
   End If
   nMFGridRowNum = nNumTmp
  
   If nMFGridCurPos <> 1 Then
   '得到下一步起始点
   nMFGridCurRowTop = i
   End If
  
  
  
   End Sub
  
  用Printer对象的PaintPicture方法可以输出图象。
  其语法格式如下:
  object.PaintPicture picture,x1,y1,width1,height1, x2,y2,width2,height2,opcode
  object可以是窗体Form、PictureBox控件和Printer对象。其余的参数说明如下:
  picture:这是一个必选参数,用于指定要输出的图象。它必须是窗体Form或PictureBox控件的Picture属性。
  x1,y1:这是必选参数,用于指定要输出图象的左上角坐标,单位的ScaleMode属性决定。
  width1,height1:这是可选参数,用于指定输出图象的宽和高。如果源图的宽和高比这里指定的宽和高要大或小,则输出的图象会相应地压缩或放大到Width1和height1指定的大小。如果省略则按源图的大小输出。
  x2,y2这是可选参数,用于在Picture参数指定的图象中指定一个剪切区域的左上角坐标。如果省略,则按取值为0处理。
  width2,height2:这是可选参数,用于指定剪取区域的宽和高。如果省略,则width2取值为原图的宽度减去x2,height2取值为原图的高度减去y2。
  opcode:这是可选参数,用于指定光栅操作码。它决定源图象以何种方式写到目标图象中。常用的值有vbSrcCopy,vbSrcAnd等。其它的常量值及其说明可以在Visual Basic的联机帮助中通过查找"RasterOp Constants"得到。
   在上述参数中指定可选参数时,最后一个可选参数前的所有参数必须指定,如果最后一个可选参数后的可选参数省略时,无须添加逗号。
   width1,height1两个参数的取值可以是负数,当它们取负值时,会输出一个扳反的图象。为了测试方便可以在PictureBox控件上输出结果以观察不同参数下的各种效果。
  实例:
  (1)程序功能:将PictureBox控件Picture1中的图象用PaintPicture方法以三种不同方式输出到PictureBox控件Picture2中。
  (2)界面设计和控件属性设置:
  ------------------------------------------------------
  工程名:PP
  ======================================================
  窗体 Name frmPP
   Caption "图象输出演示"
   WindowState 2-Maximized
   StartupPosition 2-屏幕中心
  ------------------------------------------------------
  命令按钮 Name cmdPrint
   Caption "打印图象"
  ------------------------------------------------------
  命令按钮 Name cmdPP
   Caption "打印"
  ------------------------------------------------------
  图片框 Name picOld
   ScaleMode 6-Millimeter
   Picture WinLogo.bmp
  ------------------------------------------------------
  图片框 Name picNew
   ScaleMode 6-Millimeter
   AutoRedraw True
  ------------------------------------------------------
  (3)程序清单:
  Private Sub cmdPrint_Click()
  picNew.PaintPicture picOld.Picture,0,0,29,12
  picNew.PaintPicture picOld.Picture,30,30,29,12
  picNew.PaintPicture picOld.Picture,30,70,29,-12
  End Sub
  
  Private Sub cmdPP_Click()
  ' 对打印机进行初始设置
  Printer.Orientation = vbPRORPortrait
  Printer.PaperSize = vbPRPSA4
  Printer.ScaleMode = vbMillimeters
  
  ' 设置打印参数和打印内容
  Printer.CurrentX = 50
  Printer.CurrentY = 50
  Printer.FontName = "宋体"
  Printer.FontSize = 12
  strContents = "基本打印流程演示"
  
  ' 打印输出内容
  Printer.Print strContents
  Printer.CurrentX = 0
  Printer.CurrentY = 0
  Printer.PaintPicture picNew.Image, 0, 0, 29, 12
  Printer.CurrentX = 29
  Printer.CurrentY = 12
  Printer.PaintPicture picOld.Picture, 0, 0, 29, 12
  Printer.EndDoc
  
  End Sub
  (4)小结:
   由于第三个输出语句中使用于指定输出图像高度的参数使用了负数,所以输出的结果是一个垂直折反的图像。
   命令按钮cmdPP中Printer.PaintPicture方法,将整个打印印作用图片输出目标,因此,它的输出位置由后面的参数决定,而不受Printer.CurrentX和Printer.CurrentY的影响。
   尽管使用Printer对象进行打印输出存在着需要编写大量代码、逻辑上较为复杂的缺点,但是,程序员却有更大的灵活性,可以掌握打印过程中的每一个细节,使得在执行一些复杂的打印输出任务时仍然可以应付自如。
  
  
  
  
  '让VB6的MSFlexGrid表格控件支持鼠标滚轮的代码2008年05月27日 星期二 10:34
  Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Private Const GWL_WNDPROC As Long = (-4)
  Private Const WM_MOUSEWHEEL As Long = &H20A
  Public LineNum As Integer
  Private m_OldWindowProc As Long
  Public CtlWheel As Object
  
  
  
  
  这个问题困惑了我两天了。我把我现在写的代码贴上来,请各位高手帮小弟看一下
  此段代码在 model中
  Public Type POINTL
   x As Long
   y As Long
   End Type
  
   Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" _
   (ByVal lpPrevWndFunc As Long, _
   ByVal hwnd As Long, _
   ByVal Msg As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long
  
   Declare Function SetWindowLong _
   Lib "USER32" Alias "SetWindowLongA" _
   (ByVal hwnd As Long, _
   ByVal nIndex As Long, _
   ByVal dwNewLong As Long) As Long
  
   Declare Function SystemParametersInfo _
   Lib "USER32" Alias "SystemParametersInfoA" _
   (ByVal uAction As Long, _
   ByVal uParam As Long, _
   lpvParam As Any, _
   ByVal fuWinIni As Long) As Long
  
   Declare Function ScreenToClient Lib "USER32" (ByVal hwnd As Long, xyPoint As POINTL) As Long
  
   Public prewndpro As Long
   Public Const GWL_WNDPROC = -4
   Public Const SPI_GETWHEELSCROLLLINES = 104
   Public Const WM_MOUSEWHEEL = &H20A
   Public WHEEL_SCROLL_LINES As Long
  
  
   Public Sub changedefort(ByVal hwnd As Long) '修改消息处理过程的地址, 将消息发送给newWindowProc函数,
   prewndpro = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf newWindowProc)
   Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
   If WHEEL_SCROLL_LINES > Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight) Then
   WHEEL_SCROLL_LINES = Int(mainform.MSFlexGrid1.Height / mainform.MSFlexGrid1.CellHeight)
   End If
  
   End Sub
  
   Public Sub undochangedefort(ByVal hwnd As Long) '将消息处理过程的地址复原
   Dim returnvalue As Long
   returnvalue = SetWindowLong(hwnd, GWL_WNDPROC, prewndpro)
  
   End Sub
  
   '用newWindowProc处理鼠标滚动事件
   Public Function newWindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Dim pt As POINTL
   Select Case uMsg
   Case WM_MOUSEWHEEL '如果是鼠标的滚轮事件
   Dim wzDelta, wKeys As Integer 'fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)
   wzDelta = HIWORD(wParam)
   wKeys = LOWORD(wParam)
   If Sgn(wzDelta) = 1 Then '大于零,鼠标前滚
   mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row - WHEEL_SCROLL_LINES
   mainform.MSFlexGrid1.“refresh”
   Else '小于零,库表后滚
   mainform.MSFlexGrid1.row = mainform.MSFlexGrid1.row + WHEEL_SCROLL_LINES
   mainform.MSFlexGrid1.“refresh”
   End If
   Case Else
   newWindowProc = CallWindowProc(prewndpro, hw, uMsg, wParam, lParam)
   End Select
  
   End Function
  
   Public Function HIWORD(ByVal LongIn As Long) As Integer
   ' 取出32位值的高16位
   HIWORD = (LongIn And &HFFFF0000) \ &H10000
   End Function
  
   Public Function LOWORD(ByVal LongIn As Long) As Integer
   ' 取出32位值的低16位
   LOWORD = LongIn And &HFFFF&
   End Function
  
   下面是在mainform 中的调用过程
   Private Sub MSFlexGrid1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
   '判断鼠标的移动范围是不是在msflexgrid中
   If x > mainform.Frame1.Left And x < mainform.Frame1.Left + mainform.MSFlexGrid1.Width Then
   If y > mainform.Frame1.Top And y < mainform.Frame1.Top + mainform.MSFlexGrid1.Height Then
   changedefort mainform.MSFlexGrid1.hwnd
   undochangedefort mainform.MSFlexGrid1.hwnd
   End If
   End If
   End Sub
  
   现在执行到 changedefort 后没有转到我定义的 newWindowProc函数中去执行,为什么呢,还有就是我觉得在mousemove事件中添加这段代码邮点不合适, 但是我也不知道该放在那个是里面更合适
   哎! 真是困惑阿
  
  在模块中
  Public Function FlexScroll(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case wMsg
   Case WM_MOUSEWHEEL
   Select Case wParam
   Case -7864320 '向下滚
   SendKeys "{PGDN}"
   Case 7864320 '向上滚
   SendKeys "{PGUP}"
   End Select
  
   End Select
   FlexScroll = CallWindowProc(Oldwinproc, hWnd, wMsg, wParam, lParam)
   End Function
  
   在窗体中:
   Private Sub MSHFlexGrid1_GotFocus()
   Oldwinproc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
   SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf FlexScroll
   End Sub
  
   Private Sub MSHFlexGrid1_LostFocus()
   SetWindowLong Me.hWnd, GWL_WNDPROC, Oldwinproc
   End Sub
  
   使用过很多次,好像还没发生过系统崩溃的显现...
  
  
  
  MouseDown、MouseUp、MouseMove。VB 似乎提供了很好的 Mouse 事件。但好象还缺少什么!对!还差 MouseExit(鼠标移出)事件。在 VB 中,我们要捕捉 MouseExit 事件,必须用 API 函数:
  Private Declare Function SetCapture Lib "user32" (ByVal hWnd As Long) As Long
  Private Declare Function ReleaseCapture Lib "user32" () As Long
  然后,我们可以在控件(以 Picture1 为例)的 MouseMove 事件上加上以下代码:
  
  With Picture1 'Change this to the name of the control
  If Button = 0 Then
  If (X < 0) Or (Y < 0) Or (X > .Width) Or (Y > .Height) Then
  'Mouse pointer is outside button, so let other controls receive
  'mouseevents too:
  ReleaseCapture
  ' 放入鼠标离开的代码
  Else
  ' Mouse pointer is over button, so we'll capture it, thus
  ' we'll receive mouse messages even if the mouse pointer is
  ' not over the button
  SetCapture .hwnd
  ' 放入鼠标进入的代码
  End If
  
  
  
  模拟MouseEnter,MouseExit事件
  
  p>  很多第三方的控件都提供的 MouseEnter 和 MouseExit 事件来补充 MouseMove 事件的不足(MouseMove 事件不能有效的捕获鼠标是否已在控件外),但是这些控件或要注册,或集合了其他实际没有什么作用控件,另外在程序中加入太多的控件也会影响程序的性能,利用 Windows 的 API 函数,我们可以在 MouseMove 中模拟 MouseEnter 和 MouseExit,虽然我提供的源代码中没有真正的这两个事件,但的确提供了这两个事件所具备的功能。好了!让我们实现吧。
    首先加载一个模块,在模块中声明以下两个 API 函数:
  Public Declare Function SetCapture Lib "user32" _
  (ByVal hwnd As Long) As Long
  Public Declare Function ReleaseCapture Lib "user32" () As Long
    SetCapture 的功能是:设置鼠标捕获指定的窗口(Windows 每个控件都是一个窗口。比如桌面上显示的图标就是一个窗口,其实是两个,另一个显示描述这个图标的文本),系统将收到这个窗口所有的鼠标移动或击按的所有信息。
  ReleaseCapture 的功能是:取消捕获鼠标信息。
    Windows 系统就是一个消息系统,系统一直在等待用户的消息,并加一相应,但处理完一个消息后,系统有处以下一轮的等待。消息传递是 Windows 的核心。
    让我们在 Form1 中放置一个按钮或其他控件,但此控件必须具有窗口句柄(hWnd),比如 VB 提供的 Image 控件是一个次图形控件,没有窗口句柄,而 Picture,Command Button 等控件就有窗口句柄,我们就拿 Command Button 来作示范,在 Form1 上放置一个 Command Button,在 Command1_MouseMove()事件内加入以下代码:
  Private Sub Command1_MouseMove(Button As Integer, _
  Shift As Integer, X As Single, Y As Single)
  With Command1
  当鼠标在越出控件外
  If Not ((X $#@60; 0) Or (Y $#@60; 0) Or _
  (X $#@62; .Width) Or (Y $#@62; .Height)) Then
  鼠标指针在按钮外时,让其他控件也收到标事件
  ReleaseCapture
  为了不让 MouseMove 事件反复触发
  If .Caption $#@60;$#@62; "outside" Then
  .Caption = "outside"
  E If
  | 鼠标指针在按钮上,捕获他但鼠标移出是我们将收到鼠标事件
  SetCapture .hwnd
  Else
  .Caption = "inside"
  End If
  End With
  End Sub
  
  
  
  
  
  
  
  我设计了一个系统 考虑的安全方面的问题,想进行如下功能:
  当鼠标停止的时候TIMER开始工作,当鼠标停止的的时间超过一个时间(比如20分钟)就会出现一个提示筐:提示“已经20分钟无任何造作,是否退出系统”的提示。
  
  
  请哪位大侠帮帮我 重金酬谢!!!!!!!
  问题补充:
  当关闭系统的时候点击右上角的小X 就直接退出系统了
  能不能写段代码 当点击小X(关闭按钮)的时候弹出提示筐 确认是否关闭系统??
  
  Option Explicit
  
  Private mChkMin As Long
  Private mTmrCount As Long
  
  
  Private Sub Form_Load()
  Timer1.Interval = 60000 '1 min
  Timer1.Enabled = True
  mChkMin = 20 '
  End Sub
  
  Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  
   mTmrCount = 0 'reset count to 0
  
  End Sub
  
  ''当关闭系统的时候点击右上角的小X 就直接退出系统了
  '能不能写段代码 当点击小X(关闭按钮)的时候弹'出提示筐 确认是否关闭系统??
  Private Sub Form_Unload(Cancel As Integer)
  dim ret as long
  ret = MsgBox(" 是否退出系统 ?", vbYesNo + vbInformation)
  If ret = vbNo Then
   Cancel = True
  End If
  End Sub
  
  Private Sub Timer1_Timer()
  mTmrCount = mTmrCount + 1
  Dim ret As Long
  
  If mTmrCount >= mChkMin Then
   ret = MsgBox("已经" & mChkMin & "分钟无任何造作,是否退出系统", vbYesNo + vbInformation)
   If ret = vbYes Then
   End
   End If
   mTmrCount = 0
  End If
  End Sub
  
  如何用VB制作安装包_百度知道
  可以利用外接程序。。。
  打开需要打包的工程,选择菜单栏中的“外接程序”->外接程序管理器,在对话框中选择“打包和展开向导”,在“加载行为”选项组中选中“加载/卸载”复选框,然后单击确定按钮
  然后选择菜单栏中的"外接程序",发现比刚才多了一个“打包和展开向导”,选择它在对话框中单击打包按钮,后边的事情就简单多了(向导一般做的都很容易的)
  1.选择安装包保存位置
  默认情况下安装包会放到工程文件目录下的“包”目录。可以根据需要进行修改。单击“下一步”
  2.选择包含文件
  “包含文件”对话框已经自动找出了工程中应用的控件、DLL等文件,检查一下有没有一楼的文件。如果有,可以通过“添加”按钮增加用户需要的文件,例如帮助文件Help.chm
  3.选择打包文件类型
  单击“下一步”显示压缩文件选项对话框。现在的安装程序一般都用光盘作为载体,选中单个压缩文件即可
  4.设置安装程序标题
  单击“下一步”显示“安装程序标题”对话框,输入安装程序标题,它会显示在安装背景上。
  5.创建启动菜单项
  单击“下一步”显示“启动菜单项”对话框。在这里创建“开始菜单”中显示的项目,默认只有运行程序。
  6.指定安装位置
  单击“下一步”显示“安装位置”对话框,在这里设置安装包中的文件具体的安装目录,同样是用宏来指定还可以设置子目录,安装时会自动创建不存在的子目录。
  7.共享文件
  单击“下一步”显示“共享文件”对话框选择可能被多个文件使用的文件如ActiveX控件,这样当程序卸载时,不会把共享文件也删除。
  
  另外,可以向楼上说的用第三方打包工具。“打包和展开向导”虽然功能不够强大但简单易用
  多试两次就会了,针对一般的应用已经足够了。
  ,有不会的在用QQ问我吧 412331088
  参考资料:http://zhidao.baidu.com/question/42181647.html?si=5
  
  实现“绿色”软件(影子版主)
  现在非常流行“绿色”软件,不需要什么安装程序只要一个 EXE 文件就可以运行程序
  了,而在 VB 的编程中有许多地方需要调用第三方的控件(很难用 API 函数搞定所有的功能),这就需要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了,那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看:
  示例:
  1、主程序.EXE
  用 VB6.0 编写的程序,调用了 Winsock 控件,如果在没有安装 VB5.0、6.0 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,只有把这个程序用 VB5.0、6.0 的安装程序进行打包,不然只有用用2的方法来解决了。
  2、注册程序.EXE
  用 VB6.0 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序.EXE之前,先运行本程序,通过 API 函数 GetSystemDirectory 取得系统的 WinddowsSystem 的目录,然后把 Winsock 控件复制到该目录下,并用 Shell 来完成控件的注册。
  ⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
  ⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:WinddowsSystemMswinsck.ocx),再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:
  
  类型:
  “OCX”
  
  标识号:
  101
  
  语言:
  中文(中国)
  
  ⑶保存资源文件,写如下代码:
  Option Explicit
  Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  Const MAX_PATH = 260 '定义足够长的字符串
  Private Sub Form_Load()
  Dim TempFile() As Byte
  Dim FileNum As Integer
  Dim TempDir As String
  TempDir = GetWinSysDir '自定义函数取得系统的 WinddowsSystem 的目录
  TempFile = LoadResData(101, "OCX") '用以从资源 (.res) 文件装载若干可能类型的数据,并返回一个 Byte 数组
  FileNum = FreeFile
  Open TempDir & "Mswinsck.ocx" For Binary Access Write As #FileNum '新建文件(把 Winsock 控件复制到指定目录下)
  Put #FileNum, , TempFile
  Close #FileNum
  
  'Shell "regsvr32 " & TempDir & "Mswinsck.ocx ", vbNormalFocus '注册控件,有弹出对话框
  Shell "regsvr32 " & TempDir & "Mswinsck.ocx /s", vbNormalFocus '注册控件,无弹出对话框
  
  MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"
  
  Unload Me
  End Sub
  
  Public Function GetWinSysDir() '定义读取WinddowsSystem 的所在目录的函数
  Dim S As String, Length As Long
  S = String(MAX_PATH, 0) '赋值
  Length = GetSystemDirectory(S, MAX_PATH) 'S为取得目录,MAX_PATH 为长度
  S = Left(S, InStr(S, Chr(0)) - 1) '去掉多余的空格
  GetWinSysDir = S
  End Function
  '补充:S 和 MAX_PATH 的值是可以随便赋的,
  '如: Dim S As String * 20
  ' Length = GetSystemDirectory(S, 20)
  3、补充说明
  在用 VB6.0 保存上述两个程序后,请再使用 VB5.0 重新打开这两个程序,并编译为主程序.EXE、注册文件.EXE。(用 VB5.0 编译的程序,在 Win98、2000 下不需要任何 DLL 文件)
  程序运行
  4、程序运行
  将主程序.EXE、注册文件.EXE两个文件,复制到任意机器上,先运行注册文件.EXE注册第三方的控件,再运行主程序.EXE,就不会有任何的错误了,一个变通的“绿色”软件就完成了。Edited by: LionCSQ
  
  StrConv 函数
  
   返回按指定类型转换的 Variant (String)。
  
   语法
   StrConv(string, conversion, LCID)
   StrConv 函数的语法有下面的命名参数:
   部分 说明
   string 必要参数。要转换的字符串表达式。
   conversion 必要参数。Integer。其值的和决定转换的类型。
   LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。)
  
   设置值
   conversion 参数的设置值为:
   常数 值 说明
   vbUpperCase 1 将字符串文字转成大写。
   vbLowerCase 2 将字符串文字转成小写。
   vbProperCase 3 将字符串中每个字的开头字母转成大写。
   vbWide* 4* 将字符串中单字节字符转成双字节字符。
   vbNarrow* 8* 将字符串中双字节字符转成单字节字符。
   vbKatakana** 16** 将字符串中平假名字符转成片假名字符。
   vbHiragana** 32** 将字符串中片假名字符转成平假名字符。
   vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。
   vbFromUnicode 128 将字符串由 Unicode 转成系统的缺省码页。
  
   *应用到远东国别。
   **仅应用到日本。
   注意 这些常数是由 VBA 指定的。可以在程序中使用它们来替换真正的值。其中大部分是可以组合的,例如 vbUpperCase + vbWide,互斥的常数不能组合,例如 vbUnicode + vbFromUnicode。当在不适用的国别使用常数 vbWide、vbNarrow、vbKatakana,和 vbHiragana 时,就会导致运行时错误。
   下面是一些一般情况下的有效分界符:Null (Chr$(0)),水平制表符 (Chr$(9)),换行 (Chr$(10)),垂直制表符 (Chr$(11)),换页 (Chr$(12)) ,回车 (Chr$(13)),空白 (SBCS) (Chr$(32))。在 DBCS中,空白的实际值会随国家/地区而不同。
  
   说明
   在把 ANSI 格式的 Byte 数组转换为字符串时,您应该使用 StrConv 函数。当您转换 Unicode 格式的这种数组时,使用赋值语句。
  
  
   我的理解是:
   vb中的字符串都是unicode编码,即:任何一个字符都是用双字节表示。
   LenB("12魏家台")=8,说明占用8个字节
   用strConv(str,vbfromunicode)可以将串转换为ansi的,即gb2312或者gbk,特点是,中文双字节,英文单字节。
   得到的ansi仍然是字符串,不过在vb下显示是乱码,因为vb会按照unicode的编码去理解它的。如,这时“12”只有2个字节,但vb会认为这时一个unicode字符。
   为了分析这个ansi串,需要将其转换为字节数组。很简单
   dim byt() as byte
   byt=sAnsi
   为了比较,我在baidu里百度了一下"12魏家台",得到了其编码是“12%CE%BA%BC%D2%CC%A8”,经验证,每2个16进制数,就是相应的中文的ansi编码。
  
   终于得到一个结论/办法:把中文转换为ansi,编码为文本串,发送到服务器。在服务器端用GB2312或者GBK代码页解析。
   我没有用大量中文进行测试,只选择了“镕”字测试了一下,结果,可以被服务器正确的识别。
  
  感受:
   vb的确不复当年之勇了,找资料感觉越来越困难了。
   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多