分享
 
 
 

VB6常用方法汇编

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

使用静态变量放置控件: Form1:Label1,Command1

属性设置: cLabel1.Autosize= true

代码:

Private Sub Command1_Click()

Static stflag As Boolean '使用静态变量来保存变量值

If stflag = False Then

Label1.Font.Size = 14

stflag = True

Else

Label1.Font.Size = 9

stflag = False

End If

End Sub

创建对象放置控件: Form1:Command1,text1

代码:

Private Sub Command1_Click()

Dim t1 As TextBox

Set t1 = Form1.Text1

If t1.Text = 0 Then

t1.BackColor = 0

t1.ForeColor = 255

End If

End Sub

运行时,只要在Text1中写入0,点击Command1,Text1框就变色了。

如不用t1对象,则程序中t1.BackColor要写成form1.text1.BackColor,比较麻烦。

自定义方法和属性放置控件: Form1:Command1,text1

代码:

Public tsize As Integer '定义属性

Public Sub textlarge() '定义方法

Text1.Width = Text1.Width * 1.1

Text1.Height = Text1.Height * 1.1

Text1.FontSize = Text1.FontSize + tsize

End Sub

Private Sub Command1_Click()

Form1.tsize = 4

Form1.textlarge

End Sub

遍历控件集合放置控件: Form1:Label1,Command1,text1,list1

代码:

Private Sub Form_Load()

Dim myc1 As Control

For Each myc1 In Controls

List1.AddItem myc1.Name

Next myc1

End Sub

集合寻址放置控件: Form1:Label1,Command1,text1,list1

代码:

Private Sub Command1_Click()

Text1 = Controls(3).Left

'Text1 = Controls("label1").Left

'Text1 = Controls!label1.Left

End Sub

代码换行和并行变量:

a1 = 2: a2 = 3: a3 = 4 '并行

b1 = a1 + a2 + _ '换行

a3

对于字符串:

s1 = “sadd” & c1 & “qwer” '联接

s1 = “sadd” & c1 & “qwer” & _ '换行

“fjkgjgj06”

打印和显示换行 s1 = ”fjdkkjd” & vbcrlf & “iioknno”

强迫变量声明 Option Explicit

还可以在菜单【工具】‖【选项】(编辑器)中选[要求变量声明],自动在每个模块上加Option Explicit

查找字符串显示长度Public Function len1(str As String) As Integer ‘公用函数

Dim si, i As Integer

Dim str1 As String

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2 ‘汉字长度为2

Else

si = si + 1

End If

Next

len1 = si

End Function

截取字符串定长Public Function len2(s2 As String, si As Integer) As String

Do While len1(s2) > si

s2 = Mid(s2, 1, Len(s2) - 1)

Loop

len2 = s2

End Function

截取并补齐定长字符串Public Function len3(s2 As String, si As Integer) As String

If len1(s2) > si Then

Do While len1(s2) > si

s2 = Mid(s2, 1, Len(s2) - 1) ‘长了截断

Loop

Else

Do While len1(s2) < si

s2 = s2 & " " ‘短了用空格补齐

Loop

End If

len3 = s2

End Function

模糊查找Sub shumlook(ByVal shu2 As String)

Dim shu3 As String

shu3 = Mid(shu3, 1, Len(shu2))

If shu3 = shu2 Then

End if

End Sub

清除字符串的所有空格Function Trimk(cc0)

Dim i, j, s1

j = Len(cc0)

i = 1

While i < j + 1

s1 = Mid(cc0, i, 1)

'MsgBox "s1=" & s1 & ";"

If s1 = " " Or s1 = "" Then

cc0 = Mid(cc0, 1, i - 1) + Mid(cc0, i + 1, j)

i = i - 1

'MsgBox "cc0=" & cc0

End If

i = i + 1

Wend

Trimk = cc0

End Function

读取当前日期和时间放置控件: Form1:Text1,Text2,Command1

代码:

Private Sub Command1_Click()

Dim d1 As Date

d1 = Date

Text1 = d1 '显示如00-6-24

d1 = Time

Text2 = d1 '显示如10:30:23

End Sub

输入日期并计算放置控件: Form1:Text1,Text2,Command1

代码:

Private Sub Command1_Click()

Dim d1 As Date

d1 = Text1

d1 = d1 - 100

Text2 = d1

Text1 = Weekday(d1)

End Sub

运行时先在Text1中输入日期(如00-5-30),再点击Command1,则在Text2中显示输入日期100天前的日期,并在Text1中显示该日期为星期几。

返回年、月、日、时、分、秒的函数为year,month,day,hour,minute,second。

注意Weekday返回1代表星期天,2代表星期一,7代表星期六。

初始化事件和终止事件当调用一个窗体时,一般首先引发initialize事件,再引发load事件。但只是引用窗体上数据或过程时,可能不引发load事件。只有当调用控件时,才引发load。

当终止窗体时,先引发unload事件,再引发terminate事件。但只用unload form1时,并不能引发terminate事件,这时窗体中的过程和变量仍然可以引用。只有用set form1=nothing才能引发ternimate事件。

不定长数组先定义数组Dim array1 ( )

使用时再用ReDim ( 3, 9 )

或 ReDim (1 to 3, 1 to 9 )

用FORMAT决定数据格式1.日期和时间

以系统设置的长日期格式返回当前系统日期。

Print Format(Date, "Long Date") ‘返回2001年10月29日

MyStr = Format(MyTime, "h:m:s") ' 返回 "17:4:23"。

MyStr = Format(MyTime, "hh:mm:ss AMPM") ' 返回 "05:04:23 PM"。

MyStr = Format(MyDate, "dddd, mmm d yyyy") ' 返回 "Wednesday, Jan 27 1993"。

2.数字

MyStr = Format(5459.4, "##,##0.00") ' 返回 "5,459.40"。

MyStr = Format(334.9, "###0.00") ' 返回 "334.90"。

MyStr = Format(0.5, "0.00%") ' 返回 "50.00%"。

简化:如aa = 1235432 / 3

Print Format(aa, "0.000") ‘返回411810.667

整数:Print Format(123, "00000") ‘返回00123

3.字符

小写:MyStr = Format("HELLO", "<") ' 返回 "hello"。

大写:MyStr = Format("This is it", ">") ' 返回 "THIS IS IT"。

如果没有指定格式,则返回原字符串。

MyStr = Format(23) ' 返回 "23"。

记录变量先在模块(如Module1)中定义:

Type QipuRec

qx As Integer

qy As Integer

qColor As string

End Type

再在Form1中添加:

Dim QiShu(1 To 400) As QipuRec

就可以引用QiShu.qx,QiShu.qy了。

二 常用控件调用不同的Form放置控件: Form1:Command1,Command2; Form2:Command1

属性设置: 〖Form1.Command1.Caption〗= 进入Form2

〖Form1.Command2.Caption〗= 退出

〖Form2.Command1.Caption〗= 返回Form1

Form1代码:

Private Sub Command1_Click()

Form2.Show

End Sub

Private Sub Command2_Click()

End

End Sub

Form2代码

Private Sub Command1_Click()

Form2.Hide

Form1.Show

End Sub

用OptionButton单选放置控件: Form1:Option1,Option2,Option3,Label1

属性设置: 〖Option1.Caption〗=BASIC

〖Option2.Caption〗=PASCAL

〖Option3.Caption〗=C

代码:

Private Sub Option1_Click()

Label1.Caption="BASIC"

End Sub

Private Sub Option2_Click()

Label1.Caption="PASCAL"

End Sub

Private Sub Option3_Click()

Label1.Caption="C"

End Sub

用Check复选放置控件: Form1:Text1,Check1,Check2

属性设置: 〖Text1.text〗=字体演示

代码:

Private Sub Check1_Click()

If Check1.Value=1 then '选中

Text1.FontSize=14 '字体为14号,大字

Else '取消

Text1.FontSize=9 '字体为9号,普通字

End If

End Sub

Private Sub Check2_Click()

If Check2.Value=1 then

Text1.FontItalic=True '设斜体

Else

Text1.FontItalic=False '恢复正常

End If

End Sub

选择ComboBox表值放置控件: Form1:Combo1(ComboBox)

代码:

Private Sub Combo1_Click()

s1 = Combo1.Text

Print "您选中的是: ";s1

End Sub

Private Sub Form_Load()

Combo1.AddItem "初中"

Combo1.AddItem "高中"

Combo1.AddItem "大学"

End Sub

ListBox从程序赋值放置控件: Form1:list1(ListBox),label1

代码:

Private Sub Form_Load()

List1.AddItem "a1" '用AddItem方法赋值

List1.AddItem "a2"

List1.AddItem "a3"

End Sub

Private Sub List1_Click()

Select Case List1.ListIndex 'ListIndex值为0,1,2

Case 0: Label1.Caption = "ok1"

Case 1: Label1.Caption = "ok2"

Case 2: Label1.Caption = "ok3"

End Select

End Sub

使用MsgBox双向选择放置控件: Form1:Command1

属性设置:〖Command1.Caption〗=Exit

代码:

Private Sub Command1_Click()

myexit = MsgBox("确实想退出吗?", VbOkCancel, "退出")

If myexit = VbOk Then

Unload Me

Else

Debug.Print “放弃退出”

End If

End Sub

用InputBox输入数值放置控件: Form1:Command1

属性设置:〖Command1.Caption〗=开始

代码:

Private Sub Command1_Click()

Dim string1 As String

Dim int1 As Integer

string1 = InputBox("Input")

int1 = Val(string1)

'可直接用int1 = Val(InputBox("input"))

Print "int1="; int1

End Sub

复杂InputBox输入Private Sub Command1_Click()

qs = 1.2

qs1 = 1.2

ts1 = "2001-2002年乡及乡以上工业增长" & qs & "%,修改后按‘确定’"

s1 = Val(InputBox(ts1, "计算修改", qs1))

If s1 <> "" And s1 <> "0" Then

MsgBox "2002年乡及乡以上工业用水=" & s1 * 123 & "亿立方米。"

Else

MsgBox "放弃修改。"

End If

End Sub

用Timer作定时器放置控件: Form1:Text1,Timer1

属性设置: 〖Timer1.Interval〗=1000 '1000ms

代码:

Private Sub Timer1_Timer()

If Text1.Text <> "10:02:00" Then

Text1.Text = Time

Else '时间到

Text1.Text = "OK"

Timer1.Enabled = False '不再显示时间

End If

End Sub

用Timer编制延时程序放置控件: Form1:Command1,Timer1

属性设置: 〖Timer1.Interval〗=10 '10ms

代码:

Sub delay(ss As Integer) '延时过程

Dim start, check

start = Timer

Do

check = Timer

Loop While check < start + ss * 0.001

End Sub

Private Sub Command1_Click()

Command1.Caption = "test1"

delay (1000)

Command1.Caption = "test2"

delay (2000)

Unload Me '退出

End Sub

使用File控件Private Sub Form_Load()

File1.Pattern = “*.txt”

File1.Path = “C:\fxfx\kfb”

End Sub

如果使用目录列表控件Dir1,则可以用

File1.Path = Dir1

接可以联动使用。

使用COMMONDIALOG控件在部件的控件中打开Microsoft Common Dialog Control 6.0 (SP),再添加CommonDialog1、Command1和Text1控件。运行时打开文件对话框,并将选中的文件显示在文本框中。

Private Sub Command1_Click()

On Error GoTo errhandler

CommonDialog1.Filter = "All Files(*.*)|*.*|Text Files(*.txt)|*.txt"

CommonDialog1.FilterIndex = 1 ‘缺省为All Files

CommonDialog1.ShowOpen

Text1 = CommonDialog1.FileName

Exit Sub

errhandler:

Exit Sub

End Sub

CommonDialog控件还可以显示颜色对话框(CommonDialog1.showcolor),字体对话框(CommonDialog1.showfont),打印对话框(CommonDialog1.printer),显示帮助对话框(用CommonDialog1.HelpFile=”C:\Windows\Cadio.hlp”设置,用CommonDialog1.ShowHelp调用)。

取消窗体的按钮组Form1.ControlBox = False

使用Microsoft Flex Grid 6.0控件绑定数据库直接添加后设置即可;

运行时动态改变控件数组先在FORM中添加一个COMBO控件,再复制一个成为控件数组,把COMBO1(1)删除,再把COMBO1(0)移到左上角,添加一个COMMAND在右边,编码如下:

Private Sub Command1_Click()

Unload Combo1(5) ‘去掉一个控件

End Sub

Private Sub Form_Load()

c1y = 600

For i = 1 To 5 ‘增加一组控件

Load Combo1(i)

Combo1(i).Top = c1y

Combo1(i).Left = 100

c1y = c1y + 500

Combo1(i).Visible = True

Next

End Sub

StatusBar使用在部件的控件中打开Microsoft Common Dialog Control 6.0 (SP),再添加Statusbar控件。右击添加窗格,并调整宽度。

添加文字时程序为:

StatusBar1.Panels(1).text = "比例 1 : " & Format$(sbScaleBar1.RFScale, "###,###,###,###,###")

VbModal调用方式采用VbModal方式调用FORM,可以在其运行完成后在执行下一语句,如:

frmTip.Show vbModal

MsgBox TipType

如果在frmTip中设定TipType=100,则可以显示出这个值来。

ProgressBar的使用在部件的控件中打开Microsoft Windows Common Control 6.0,再添加ProgressBar控件。

编程时,要先设ProgressBar1.Max(一般为最大循环数加1)和ProgressBar1.Min(一般为0),再在循环中加上一个和循环数同步的变量,如si,再用

ProgressBar1.Value = si

就可以实现进程条的结果了。

在FOR循环中的例子为:

Private Sub Command1_Click()

Dim i As Long

Dim j As Long

Dim si As Long

si = 0

ProgressBar1.Max = 10001

ProgressBar1.Min = 0

For i = 0 To 10000

For j = 0 To 1000

a = "sdf"

Next j

si = si + 1

ProgressBar1.Value = si

Next i

MsgBox "end"

End Sub

在数据库操作中的例子为:

ProgressBar1.Max = ri + 1 ‘ri为全部记录数;

ProgressBar1.Min = 0

Rst2.MoveFirst

While Not Rst2.EOF

……

rj = rj + 1

ProgressBar1.Value = rj

Wend

三 控件编程基本方法控件输入位置和聚焦放置控件: Form1:Text1,Command1

代码:

Private Sub Command1_Click()

Text1.SelStart = 3 '光标在第3个位置

Text1.SetFocus '使焦点回到Text1

End Sub

使用容器控件容器控件有:Frame,PictureBox和ToolBar。

使用容器控件包容其它控件的方法有:

1.先产生容器控件,在其上画其它控件;

2.把已有控件剪贴到容器控件上;

3.用程序 Command1.Container = Frame1

用一键来回设置放置控件: Form1:Command1,List1

代码:

Private Sub Command1_Click()

If Bzl then

List1.Visible = True

Command1.Cption = “Exit”

Bzl = false

Else

List1.Visible = False

Command1.Caption = “Display”

Bzl = True

End If

End Sub

Private Sub Form_Load()

Bzl = Ture

List1.Visiblae = False

Command1.Caption = “Display”

End Sub

列表控件的选择属性以List1 的属性为例,列表类控件如List,Combo,File,Dir等均可使用:

1.选中第I项 List1.Selected(i) (True)

2.返回第I项内容 List1.List(i)

3.返回列表总项数 List1.ListCount

4.返回最近一次点击位置 List1.ListIndex

注意:I均从零开始。

列表控件的全选 For i = 0 To File1.ListCount - 1

File1.Selected(i) = True

Next

列表控件的部份选择 Dim fscount, i, j

Dim fs1(100) As String

j = 0

For i = 0 To File1.ListCount - 1

If File1.Selected(i) Then

fs1(j) = File1.List(i)

j = j + 1

End If

Next

fscount = j

使用TreeView控件产生目录在【部件】中选择“Microsoft Windows Common Control 6.0(SP3)”,就可以打开一组控件,有Tabstrip、Toolbar、Statusbar、Progressbar、Treeview、Listview、Imagelist、Slider、Imagecombo。

把Treeview1和Imagelist1加入窗体;

右击Imagelist1,打开属性页,添加图形;

右击Treeview1,打开属性页,在【图像列表】中选择Imagelist1,还可以改变自目录的缩进;

改变Treeview1属性Linestyle为1;

添加代码:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)

Select Case Node.Key

Case "fx1"

Hyperlink.NavigateTo ("http://b4x5d1/faexcise/fa1/default1.asp")

Case "fx2"

Hyperlink.NavigateTo ("http://b4x5d1/faexcise/fa1/create1.asp")

End Select

End Sub

Private Sub UserDocument_Initialize()

Dim mynode As Node

Set mynode = TreeView1.Nodes.Add(, , "fx", "发行系统", 2)

Set mynode = TreeView1.Nodes.Add(, , "cb", "出版系统", 2)

Set mynode = TreeView1.Nodes.Add(, , "cw", "财务系统", 2)

Set mynode = TreeView1.Nodes.Add(, , "bw", "编务系统", 2)

Set mynode = TreeView1.Nodes.Add(, , "xt", "系统管理", 2)

'二级目录

Set mynode = TreeView1.Nodes.Add("fx", tvwChild, "fx1", "批销", 3)

Set mynode = TreeView1.Nodes.Add("fx", tvwChild, "fx2", "样书", 3)

Set mynode = TreeView1.Nodes.Add("fx", tvwChild, "fx3", "发行管理", 3)

Set mynode = TreeView1.Nodes.Add("fx", tvwChild, "fx4", "查询", 3)

mynode.EnsureVisible

End Sub

四 错误处理使用监视窗口调试的例子放置控件: Form1:Command1

属性设置: 〖Command1.Caption〗=开始计算

代码:

Private Sub Command1_Click()

n = 4

'm = 1

For i = 1 To n

m = m * i

Next i

Print "m="; m

End Sub

选【调试】‖【添加监视】进入后,在【表达式】中写入m,然后点击【确定】。这时屏幕下方出现了含有m的监视窗口。再重复以上过程,把n也加入到监视窗口。

按F8键进行单步调试(即每按一下F8运行一行),逐步检查监视窗口的变量变化。点击【Command1】后,再按F8继续运行。如果屏幕下部先出现【立即】窗口,则把它关掉,再从菜单上选取【窗口】‖【监视窗口】把监视窗口调出来。

用InputBox输入数值时的错误处理发生错误时继续调用InputBox,直到正确。

Private Sub Command1_Click()

Dim s11 As Integer

Dim s2 As String

On Error GoTo head

head1:

s2 = InputBox("请输入单价:")

If s2 <> "" Then

s11 = s2

End If

Exit Sub

head:

MsgBox "输入错!请重新输入"

Resume head1

End Sub

用Resume Next处理错误发生错误时退出Command1.

Private Sub Command1_Click()

Dim s11 as Integer

Dim s2 As String

On Error GoTo head

s2 = InputBox("请输入单价:")

If s2 <> "" Then

s11 = s2

End If

Exit Sub

head:

MsgBox "输入错!请重新输入"

Resume Next

End Sub

用Text控件输入数值时的错误处理Private Sub Command1_Click()

Dim i1 As Integer

On Error GoTo handle

i1 = Text1

MsgBox "输入正确,i1=" & i1

Exit Sub

handle:

MsgBox "输入错误!"

Text1 = ""

Exit Sub

End Sub

Private Sub Form_Load()

Text1 = ""

End Sub

用输入窗体时的错误处理放置控件: Form1:Command1, Form2:Command1,Text1,Module1

Module1代码:

Public i1 As Integer

Form1代码:

Private Sub Command1_Click()

Form2.Show vbModal

MsgBox "输入完成,i1=" & i1

End Sub

Form2代码:

Private Sub Command1_Click()

On Error GoTo handle

i1 = Text1

MsgBox "输入正确,i1=" & i1

Unload Me

Exit Sub

handle:

MsgBox "输入错误!"

Text1 = ""

Exit Sub

End Sub

Private Sub Form_Load()

Text1 = ""

End Sub

显示错误信息On Error Resume Next ' 改变错误处理的方式。

Err.Clear

Err.Raise 6 ' 生成一个溢出(Overflow)的错误。

' 检查错误代号,显示相关错误信息。

If Err.Number <> 0 Then

Msg = "Error # " & Str(Err.Number) & " was generated by " _

& Err.Source & Chr(13) & Err.Description

MsgBox Msg, , "Error", Err.Helpfile, Err.HelpContext

End If

五 打印用Currentx、y指定Print位置放置控件: Form1:Command1,command2,text1

代码:

Dim g1, g2 As Integer

Private Sub Command1_Click()

g1 = g1 + 200

Cwrite

End Sub

Private Sub Command2_Click()

g2 = g2 + 200

Cwrite

End Sub

Sub Cwrite()

Cls '清除上次字符串

CurrentX = g1

CurrentY = g2

Print "Position test."

End Sub

用Printer方法编程打印1.设页面坐标

pw = 400: ph = 650

Printer.Scale (0, 0)-(pw, ph)

注:以上设置只能设页面坐标,不能设置页面大小。要设置页面大小到Windows/打印机/属性/中去设置。对于标准连续打印纸,设Letter。

2.设字体

Printer.FontName = “黑体”

Printer.FontSize = 10 '5号字

Printer.FontBold = True '粗体

3.打印位置

Printer.CurrentX = 110

Printer.CurrentY = 30

4.打印数据

Printer.Print "中国水利水电出版社入库单"

Printer.Print "单号: " & tnum

5.画表格线

Printer.DrawWidth = 3 '线宽

Printer.Line (20,20) – (300,300)

6.打印份数

Printer.Copies = 2

7.换页

Printer.NewPage

8.打印开始

Printer.EndDoc

注意:只要使用Printer方法,不管是否用Printer.EndDoc,程序运行完时均要打印。

改变页面位置

如用 Printer.Scale (0, 0)-(pw, ph)

增大左边界 Printer.Scale (-50, 0)-(pw, ph)

整体左移 Printer.Scale (-50, 0)-(pw-50, ph)

增大上边界 Printer.Scale (0, -50)-(pw, ph)

增大下边界 Printer.Scale (0, 0)-(pw, ph+50)

整体下移 Printer.Scale (0, -50)-(pw, ph-50)

直接用printer打印表格Private Sub cmdprint_Click()

Dim n As Integer

Dim rs As New ADODB.Recordset

rs.Open "SELECT * FROM jggz", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\jggz\jggz.mdb;Persist Security Info=False", adOpenStatic, adLockPessimistic

n = 0

rs.MoveFirst

Form1.Print "┌────┬────┐"

While Not rs.EOF

Printer.Print "│" & rs.Fields("姓名").Value; Tab(11); "│"; rs.Fields("课时工资"); Tab(21); "│"

rs.MoveNext

n = n + 1

If n / 5 = Int(n / 5) Or rs.EOF Then

Printer.Print "└────┴────┘"

Printer.Print "┌────┬────┐"

Else

Printer.Print "├────┼────┤"

End If

Wend

Printer.Print "└────┴────┘"

rs.Close

End Sub

附件1:制表符号区位对照

区位

0904

0906

0916

0920

0924

0940

0948

符号

区位

0956

0964

0905

0907

0919

0931

0939

符号

区位

0947

0955

0963

0979

0936

0959

符号

六 绘图使用Pset画点

放置控件: Form1:Command1

属性设置: 〖Command1.Caption〗=开始

代码:

Private Sub Command1_Click()

Const pi = 3.14159

Dim x0, y0 As Single

Dim x1, y1 As Integer

x0 = 0

Do While x0 <= 4 * pi '画两个相位

y0 = Sin(x0)

x1 = x0 * 400 '放大400倍

y1 = y0 * 400 + 1000

PSet (x1, y1) '画点

x0 = x0 + 0.01 '步长为0.01

Loop

End Sub

使用Line画线

放置控件: Form1:Command1

属性设置: 〖Command1.Caption〗=开始画图

代码:

Private Sub Command1_Click()

Line (100, 100)-(1000, 1000)

Line -(0, 500) '第一点缺省采用当前点,即(1000,1000)

Line -(100, 100) '完成一个三角形

End Sub

使用Line擦除线段

放置控件: Form1:Command1,Command2

属性设置: 〖Command1.Caption〗=画线,〖Command2.Caption〗=擦除

代码:

Private Sub Command1_Click()

DrawMode = 1

Line (0, 0)-(1000, 1000)

End Sub

Private Sub Command2_Click()

DrawMode = 7

Line (0, 0)-(1000, 1000), BackColor

End Sub

使用Circle画弧放置控件: Form1:Command1

属性设置: 〖Command1.Caption〗=开始画图

代码:

Private Sub Command1_Click()

Const Pi = 3.1416

Circle (1000, 1000), 500, , 0, Pi '画一个从0度到π(180)度的弧

End Sub

用鼠标画园饼并擦除放置控件: Form1

代码:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Static x0, y0 As Integer '保存上一个鼠标位置的参数

FillStyle = 0 '设置填充模式

Circle (x0, y0), 200, BackColor '擦除上一个园饼

Refresh '重画

DrawMode = 1 '绘图方式还原

Circle (X, Y), 200

x0 = X '保存当前鼠标位置

y0 = Y

DrawMode = 7 '使用XOR绘图方式准备擦图

End Sub

如果要在已有背景上擦除,用以下程序:

Private Sub Command1_Click()

DrawMode = 1

Line (0, 0)-(1000, 1000)

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Static x0, y0 As Integer '保存上一个鼠标位置的参数

FillStyle = 0 '设置填充模式

DrawMode = 7 '使用XOR绘图方式准备擦图

Circle (x0, y0), 200, BackColor '擦除上一个园饼

Refresh '重画

Command1_Click

DrawMode = 1 '绘图方式还原

Circle (X, Y), 200

x0 = X '保存当前鼠标位置

y0 = Y

End Sub

用PictureBox做简单的动画放置控件: Form1:Picture1,Picture2,Picture3,Command1,timer1

属性设置: 〖Picture1.Autosize〗=true,〖Picture1.Picture〗=bfly1.bmp

〖Picture2.Autosize〗=true,〖Picture2.Picture〗=bfly2.bmp

〖Picture3.Autosize〗=true

〖Command1.Caption〗=开始

〖timer1.Interval〗=10

注意:bmp文件从c:\program files\microsoft visual\msdn98\98vs\vcr\选取

代码:

Option Explicit

Sub delay(ss As Integer) '延时程序,ss单位为毫秒(ms)

Dim start, check

start = Timer

Do

check = Timer

Loop While check < start + ss * 0.001

End Sub

Private Sub Command1_Click()

Dim i As Integer

For i = 1 To 10 '蝴蝶扇动10下翅膀

Picture3.Picture = Picture1.Picture '显示图1

delay (100) '延时100毫秒

Picture3.Picture = Picture2.Picture '显示图2

delay (100)

Next i

End Sub

用PictureBox做动画(用DoEvents中断)放置控件: Form1:P1,P2,P3(PictureBox),Command1,Command2,timer1

属性设置: 〖P1.Autosize〗=true,〖P1.Picture〗=bfly1.bmp

〖P2.Autosize〗=true,〖P2.Picture〗=bfly2.bmp

〖P3.Autosize〗=true

〖Command1.Caption〗=开始

〖Command2.Caption〗=退出,〖Command2.Visible〗=False

〖timer1.Interval〗=10

〖Form1.BackColor〗=白 '从调色板上选取

注意:bmp文件从c:\program files\microsoft visual\msdn98\98vs\vcr\选取

代码:

Option Explicit

Sub delay(ss As Integer)

Dim start, check

start = Timer

Do

check = Timer

Loop While check < start + ss * 0.001

End Sub

Sub flying() '飞翔过程

Const d1 = 30

P3.Picture = P1.Picture

delay (d1)

P3.Picture = P2.Picture

delay (d1)

End Sub

Private Sub Command1_Click()

Dim mx0, my0 As Integer '随机产生的x,y方向的步长

Dim mx, my As Integer '转换方向后的步长

Dim k As Integer '步长系数

Dim bl As Integer '中断检测计数

k = 400

mx0 = k * Rnd: my0 = k * Rnd '赋初始值

mx = mx0: my = my0

Do

Command1.Visible = False

If P3.Left < 0 Then '如果碰到左边界

mx0 = k * Rnd: my0 = k * Rnd '向右飞

mx = mx0: my = 2 * (my0 - k / 2)

End If

If P3.Left > Form1.Width - P3.Width Then '如果碰到右边界

mx0 = k * Rnd: my0 = k * Rnd '向左飞

mx = -mx0: my = 2 * (my0 - k / 2)

End If

If P3.Top < 0 Then '如果碰到上边界

mx0 = k * Rnd: my0 = k * Rnd '向下飞

mx = 2 * (mx0 - k / 2): my = my0

End If

If P3.Top > Form1.Height - P3.Height Then '如果碰到下边界

mx0 = k * Rnd: my0 = k * Rnd '向上飞

mx = 2 * (mx0 - k / 2): my = -my0

End If

P3.Picture = LoadPicture '清除上一幅图

P3.Move P3.Left + mx, P3.Top + my '按设定的步长移动

flying '调用飞翔过程

Form1.Refresh '重画

bl = bl + 1 '中断程序

If bl > 100 Then '设飞动100次中断1次

Command2.Visible = True '显示"退出"按钮

Refresh

delay (3000) '停3秒等待用户点击"退出"按钮

DoEvents '中断处理

Command2.Visible = False '如用户没有选退出,再将按钮隐藏

bl = 0 '重新计数

End If

Loop Until 1 = 2 '无限循环

End Sub

Private Sub Command2_Click()

End

End Sub

用Image做复杂一点的动画

放置控件: Form1:P1,P2,P3(Image),Command1,timer1

属性设置: 〖P1.Stretch〗=true,〖P1.Picture〗=bfly1.bmp

〖P2.Stretch〗=true,〖P2.Picture〗=bfly2.bmp

〖P3.Stretch〗=true

〖timer1.Interval〗=10

〖Form1.BackColor〗=白 '从调色板上选取

注意:bmp文件从c:\program files\microsoft visual\msdn98\98vs\vcr\选取

代码:

Option Explicit '强制变量说明

Dim mx0, my0 As Integer '随机产生的x,y方向的步长

Dim mx, my As Integer '转换方向后的步长

Dim k As Integer '步长系数

Dim doflag As Boolean '检测Command1的Click的标记

Sub delay(ss As Integer) '延时过程

Dim start, check

start = Timer

Do

check = Timer

Loop While check < start + ss * 0.001

End Sub

Sub flying() '飞翔过程

Const d1 = 40

p3.Picture = LoadPicture '清除上一幅图

p3.Move p3.Left + mx, p3.Top + my '按设定的步长移动

p3.Picture = p1.Picture '显示第一幅图

Refresh

delay (d1 * 3)

p3.Picture = p2.Picture '显示第二幅图

Refresh

delay (d1)

End Sub

Sub fly_direction()

If p3.Left < 0 Then '如果碰到左边界

mx0 = k * Rnd: my0 = k * Rnd '向右随机方向飞

mx = mx0: my = 2 * (my0 - k / 2)

End If

If p3.Left > Form1.Width - p3.Width Then '如果碰到右边界

mx0 = k * Rnd: my0 = k * Rnd '向左随机方向飞

mx = -mx0: my = 2 * (my0 - k / 2)

End If

If p3.Top < 0 Then '如果碰到上边界

mx0 = k * Rnd: my0 = k * Rnd '向下随机方向飞

mx = 2 * (mx0 - k / 2): my = my0

End If

If p3.Top > Form1.Height - p3.Height Then '如果碰到下边界

mx0 = k * Rnd: my0 = k * Rnd '向上随机方向飞

mx = 2 * (mx0 - k / 2): my = -my0

End If

flying '调用飞翔过程

End Sub

Private Sub Command1_Click()

Select Case doflag

Case True

Command1.Caption = "开始"

doflag = False

Cls

Case False

Command1.Caption = "停止"

doflag = True

mx0 = k * Rnd: my0 = k * Rnd '赋初始值

mx = mx0: my = my0

End Select

End Sub

Private Sub Form_Load()

k = 600

doflag = False

End Sub

Private Sub Timer1_Timer() '时钟控件随时检测,如果没有点击

If doflag Then 'Command1(停止),则继续调用动画程序

fly_direction

End If

End Sub

七 报表用数据库控件产生简单的数据报表放置控件: Form1:Data1,Command1

属性设置: 〖Data1.DatabseName〗="Nwind.mdb",〖Data1.Recordsource〗=categories

说明:1.Data1中可设置任何普通数据库

2.输出报表到一个.txt文件,可以在WORD或其它编辑软件中编辑.

3.编辑时设行距为零(WORD中设固定值=10磅).

代码:

Option Explicit

Dim f1 As Field '字段变量

Dim fi As Integer '字段数

Dim pagerow As Integer '每页行数

Dim rptcaption As String '报表标题字符串

Dim repage As Integer '报表页数

Dim repfield() As Integer '字段宽度数组

Dim maxwidth as integer '最大字段宽度

Dim repwidth As Integer '报表总宽

Dim leftspace As Integer '报表左边起始位置

Dim chi As Integer '中文字符数

Function len1(str1 As String) As Integer

'返回字符串绝对长度(如len1("你好!")=5)

Dim l1 As String

Dim i, ln1 As Integer

len1 = 0

For i = 1 To Len(str1)

l1 = Mid$(str1, i, 1)

If Asc(l1) < 0 Then '中文字符

ln1 = 2

Else

ln1 = 1

End If

len1 = len1 + ln1

Next i

End Function

Sub CreateRptField()

'比较字段名和字段长度,决定字段宽度并计算报表总宽

ReDim repfield(fi) As Integer '使用变长数组

Dim fname, fsize As Integer

Dim fi1 As Integer

repwidth = leftspace + 2

For fi1 = 0 To fi - 1

Set f1 = Data1.Recordset.Fields(fi1)

fname = Int((len1(f1.Name) + 1) / 2 + 0.5) * 2

fsize = Int((f1.Size + 1) / 2 + 0.5) * 2

If fsize > maxwidth Then fsize = maxwidth '限定字段宽度

If fname > fsize Then

repfield(fi1) = fname

Else

repfield(fi1) = fsize

End If

repwidth = repwidth + repfield(fi1) + 2

Next fi1

End Sub

Sub repline(str1, str2, str3, str4 As String) '打印表线

Dim fi1, fi2 As Integer

Dim rl As Integer

For fi1 = 1 To leftspace

Print #1, " ";

Next fi1

Print #1, str1;

For fi2 = 1 To Int(repfield(0) / 2)

Print #1, str2;

Next fi2

For fi1 = 1 To fi - 1

Print #1, str3;

For fi2 = 1 To Int(repfield(fi1) / 2)

Print #1, str2;

Next fi2

Next fi1

Print #1, str4

End Sub

Sub rptheadline(str1 As String) '打印标题和页码

Dim start, fi1 As Integer

Print #1,

If Int(repwidth / 2) - Int(len1(str1) / 2) > 10 + leftspace Then

start = Int(repwidth / 2) - Int(len1(str1) / 2) + leftspace

For fi1 = 1 To start

Print #1, " ";

Next fi1

Print #1, str1, " -"; repage; "-"

Else

For fi1 = 1 To leftspace

Print #1, " ";

Next fi1

Print #1, str1, " -"; repage; "-"

End If

Print #1,

End Sub

Function leftstr(str1 As String, fsize As Integer) As String

'返回字符串str1左边fsize(绝对长度)长子串

If len1(str1) <= fsize Then

leftstr = str1

Else

Do While len1(str1) > fsize

str1 = Left$(str1, Len(str1) - 1)

Loop

leftstr = str1

End If

End Function

Function checkfield(str1 As Variant, int1 As Integer) As String

'检查记录变量str1的类型,并使它的绝对长度不超过int1

Dim str2 As String

If IsNull(Data1.Recordset(f1.SourceField)) Then '处理空记录

checkfield = ""

ElseIf f1.Type = 11 Then '处理binary类型记录

checkfield = ""

Else

str2 = str1 '强制转换为string

checkfield = leftstr(str2, int1)

End If

End Function

Sub rpthead() '打印表头

Dim fi1, ti, chi As Integer

Call repline("┏", "━", "┳", "┓")

For fi1 = 1 To leftspace

Print #1, " ";

Next fi1

ti = leftspace + 1

For fi1 = 0 To fi - 1

Print #1, "┃";

Set f1 = Data1.Recordset.Fields(fi1) '取出当前字段

ti = ti + repfield(fi1) + 2

chi = len1(f1.SourceField) - Len(f1.SourceField) '设置打印变换

ti = ti - chi - 1 '设置打印变换

Print #1, f1.SourceField; Tab(ti); '打印当前字段名

Next fi1

Print #1, "┃"

Call repline("┣", "━", "╇", "┫")

End Sub

Sub rptrecord() '打印记录行

Dim fi1, ti As Integer

Dim temp As String '记录内容

For fi1 = 1 To leftspace '以下先打印第一字段

Print #1, " ";

Next fi1

Print #1, "┃";

ti = leftspace + 3

Set f1 = Data1.Recordset.Fields(0) '取出第一个字段

ti = ti + repfield(0)

temp = checkfield(Data1.Recordset(f1.SourceField), repfield(0))

chi = len1(temp) - Len(temp) '设置打印变换

ti = ti - chi - 1 '设置打印变换

Print #1, temp; Tab(ti); '打印记录内容

For fi1 = 1 To fi - 1 '以下打印其余字段

Print #1, "│";

Set f1 = Data1.Recordset.Fields(fi1)

ti = ti + repfield(fi1) + 2

temp = checkfield(Data1.Recordset(f1.SourceField), repfield(fi1))

chi = len1(temp) - Len(temp) '设置打印变换

ti = ti - chi - 1 '设置打印变换

Print #1, temp; Tab(ti);

Next fi1

Print #1, "┃"

End Sub

Sub repform() '打印报表

Dim li As Integer '报表行数变量

Dim pbl As Boolean '表行类型标记

repage = 1

li = 1

pbl = True

Do While Not Data1.Recordset.EOF

If pbl Then '表行为起始行,要打印表头

Call rptheadline(rptcaption)

Call rpthead

pbl = False

Else '表行为普通记录

Call repline("┠", "─", "┼", "┨")

End If

Call rptrecord

li = li + 1

If li = pagerow Then '到达页尾

Call repline("┗", "━", "┷", "┛")

Print #1,

repage = repage + 1

li = 1

pbl = True '设置起始行标记

End If

Data1.Recordset.MoveNext '移动到下一记录

Loop

If Not pbl Then '全报表完时打印表底线

Call repline("┗", "━", "┷", "┛")

Print #1,

End If

End Sub

Private Sub Command1_Click() '主程序

Open "test.txt" For Output As #1 '打开报表文件

leftspace = 0 '设置报表左边距

fi = Data1.Recordset.Fields.Count '找到当前记录集的字段数

Call CreateRptField '决定每个字段宽度

rptcaption = "报 表 示 例" '给出标题

maxwidth=10 '给出最大字段宽度

pagerow = 20 '给出每页行数

Call repform '打印报表

Close #1 '关闭报表文件

End Sub

用数据库打印报表放置控件: Form1:Command1,Command2

说明:读mdb数据库rst1打印表格,表格参数在daima数组中。

代码:

Option Explicit

Dim pw, ph '纸宽和纸高的坐标

Dim px, py

Dim ti '报表字段数

Dim wh, ww '字宽和字高

Dim table1 '第一页表格开始高度

Dim daima(100, 3) as String

Sub finput()

ti = 7

daima(1, 1) = "序号"

daima(1, 2) = 6 '表格宽度

daima(1, 3) = "序号"

daima(2, 1) = "代码"

daima(2, 2) = 8

daima(2, 3) = "scode" '字段名

daima(3, 1) = "库位号"

daima(3, 2) = 8

daima(3, 3) = "skwh"

daima(4, 1) = "书名"

daima(4, 2) = 36

daima(4, 3) = "sname"

daima(5, 1) = "单价"

daima(5, 2) = 8

daima(5, 3) = "sdanjia"

daima(6, 1) = "出版日期"

daima(6, 2) = 10

daima(6, 3) = "syear"

daima(7, 1) = "备注"

daima(7, 2) = 10

daima(7, 3) = "空白"

End Sub

Sub printhead()

Printer.CurrentX = 150: Printer.CurrentY = 30

Printer.FontSize = 19: Printer.FontBold = True

Printer.Print "中国水利水电出版社业务清单"

table1 = 50

End Sub

Sub printframe(ByVal pp1 As Integer, pp2 As Integer, pp3 As Integer)

Dim py1 As Integer

Dim pxm, pxi, px1, bi

Dim daim1, daim2 As String

pxm = 0 '计算报表宽度

For pxi = 1 To ti

pxm = pxm + daima(pxi, 2) * ww

Next

Printer.DrawWidth = 3

Printer.FontSize = 11

Printer.FontBold = True

py = pp1 + (pp3 + 2 - pp2) * wh '计算报表高度

Printer.Line (0, pp1)-(pxm, pp1) '打印边框

Printer.Line (pxm, pp1)-(pxm, py)

Printer.Line (pxm, py)-(0, py)

Printer.Line (0, py)-(0, pp1)

Printer.DrawWidth = 1 '打印表头

px = 0

For pxi = 1 To ti

daim2 = daima(pxi, 1)

px1 = Int((daima(pxi, 2) - len1(daim2)) / 2)

Printer.CurrentX = px + px1 * ww

Printer.CurrentY = pp1 + Int(0.2 * wh)

Printer.Print daima(pxi, 1) '打印字段名

px = px + daima(pxi, 2) * ww

Printer.Line (px, pp1)-(px, py) '打印竖线

Next

Printer.FontBold = False

py = pp1 + wh

For bi = pp2 To pp3

px = 0

For pxi = 1 To ti

Printer.CurrentX = px + 2

Printer.CurrentY = py + Int(0.2 * wh)

daim1 = daima(pxi, 3)

Select Case daim1

Case "序号": daim2 = bi '打印序号

Case "空白": daim2 = "" '打印空白字段

Case Else: daim2 = rst1(daim1)

End Select

Printer.Print len2(daim2, Int(daima(pxi, 2))) '打印字段内容

px = px + daima(pxi, 2) * ww

Next pxi

Printer.Line (0, py)-(pxm, py) '打印横线

py = py + wh

rst1.MoveNext

Next bi

End Sub

Sub printfoot(pp1 As Integer, pp2 As Integer) '打印页码

px = pw - 300: py = ph - 5 * wh

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print "总页数:" & pp2 & " 当前页数:" & pp1

End Sub

Sub printail(ByVal p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer, p5 As Integer)

Call printframe(p1, p2, p3)

Call printfoot(p4, p5)

End Sub

Sub printbody()

Dim page As Integer '页码数

Dim pi As Integer

Dim p1y As Integer '第一页记录数

Dim p2y As Integer '第二页记录数

Dim table2 '第二页起始位置

p2y = 37

table2 = 20

table1 = table1 + wh

p1y = (ph - table1 - 100) / wh

rst1.MoveFirst

If bnum < p1y + 1 Then

Call printail(table1, 1, bnum, 1, 1) '只有一页

Else

page = Int(((bnum - p1y) / p2y) + 1.9999) '计算页码

Call printail(table1, 1, p1y, 1, page) '打印第一页

If page > 2 Then

For pi = 1 To page - 2

Printer.NewPage

Call printail(table2, p1y + (pi - 1) * p2y + 1, p1y + pi * p2y, pi + 1, page)

Next pi

Printer.NewPage

Call printail(table2, p1y + (page - 2) * p2y + 1, bnum, page, page) '打印最后一页

Else

Printer.NewPage

Call printail(table2, p1y + 1, bnum, page, page) '打印最后一页

End If

End If

End Sub

Sub printp()

Dim sp ‘左边距

pw = 850: ph = 600

wh = 13

ww = 9

sp = 40 Printer.Scale (-sp, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc

End Sub

Private Sub Command1_Click()

bnum = rst1.RecordCount

finput

printp

End Sub

Private Sub Command3_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim str1, strcnn

strcnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;" & _

"Data Source=" & fpath1 & "shukux.mdb"

Set cnn2 = New ADODB.Connection

cnn2.Open strcnn

Set rst1 = New ADODB.Recordset

rst1.CursorType = adOpenKeyset

rst1.LockType = adLockOptimistic

rst1.Open "shu00", cnn2, , , adCmdTable

End Sub

用数据库转数组打印报表放置控件: Form1:Command1,Command3

说明:读mdb数据库转数组打印表格,daima数组放表格参数,dai1数组放纪录参数。

代码:

Option Explicit

Dim pw, ph, px, py As Integer

Dim ti '报表字段数

Dim wh, ww 'word height and width

Dim table1 '第一页表格起始位置

Dim dai1(400, 8) As String

Sub finput()

ti = 7

daima(1, 1) = "序号"

daima(1, 2) = 6

daima(1, 3) = 0

daima(2, 1) = "代码"

daima(2, 2) = 8

daima(2, 3) = 1

daima(3, 1) = "库位号"

daima(3, 2) = 8

daima(3, 3) = 2

daima(4, 1) = "书名"

daima(4, 2) = 36

daima(4, 3) = 3

daima(5, 1) = "单价"

daima(5, 2) = 8

daima(5, 3) = 4

daima(6, 1) = "出版日期"

daima(6, 2) = 10

daima(6, 3) = 5

daima(7, 1) = "备注"

daima(7, 2) = 10

daima(7, 3) = 6

End Sub

Sub finput2()

Dim di

di = 0

rst1.MoveFirst

Do While Not rst1.EOF

di = di + 1

dai1(di, 0) = di

dai1(di, 1) = rst1!scode

dai1(di, 2) = rst1!skwh

dai1(di, 3) = rst1!sname

dai1(di, 4) = rst1!sdanjia

dai1(di, 5) = rst1!syear

dai1(di, 6) = ""

rst1.MoveNext

Loop

End Sub

Sub printhead()

Dim x1, x2, x3

Printer.CurrentX = 150: Printer.CurrentY = 30

Printer.FontSize = 19: Printer.FontBold = True

Printer.Print "中国水利水电出版社业务清单"

table1 = 50

clh = "k0405"

x1 = 20: x2 = 270: x3 = 520

Printer.CurrentX = x1: Printer.CurrentY = table1

Printer.FontSize = 9: Printer.FontBold = False

Printer.Print "处理单号: " & clh

Printer.CurrentX = x2: Printer.CurrentY = table1

Printer.Print "制单日期: 20" & Now

Printer.CurrentX = x3: Printer.CurrentY = table1

Printer.Print "制单人 : "

table1 = table1 + wh

End Sub

Sub printframe(ByVal pp1 As Integer, pp2 As Integer, pp3 As Integer)

Dim py1 As Integer

Dim pxm, pxi, px1, bi

Dim daim1, daim2 As String

pxm = 0

For pxi = 1 To ti

pxm = pxm + daima(pxi, 2) * ww

Next

Printer.DrawWidth = 3

Printer.FontSize = 11

Printer.FontBold = True

py = pp1 + (pp3 + 2 - pp2) * wh

Printer.Line (0, pp1)-(pxm, pp1)

Printer.Line (pxm, pp1)-(pxm, py)

Printer.Line (pxm, py)-(0, py)

Printer.Line (0, py)-(0, pp1)

Printer.DrawWidth = 1

px = 0

For pxi = 1 To ti

daim2 = daima(pxi, 1)

px1 = Int((daima(pxi, 2) - len1(daim2)) / 2)

Printer.CurrentX = px + px1 * ww

Printer.CurrentY = pp1 + Int(0.2 * wh)

Printer.Print daima(pxi, 1)

px = px + daima(pxi, 2) * ww

Printer.Line (px, pp1)-(px, py)

Next

Printer.FontBold = False

py = pp1 + wh

For bi = pp2 To pp3

px = 0

For pxi = 1 To ti

Printer.CurrentX = px + 2

Printer.CurrentY = py + Int(0.2 * wh)

daim1 = daima(pxi, 3)

daim2 = dai1(bi, daim1)

Printer.Print len2(daim2, Int(daima(pxi, 2)))

px = px + daima(pxi, 2) * ww

Next pxi

Printer.Line (0, py)-(pxm, py)

py = py + wh

rst1.MoveNext

Next bi

End Sub

Sub printfoot(pp1 As Integer, pp2 As Integer)

px = pw - 300: py = ph - 5 * wh

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print "总页数:" & pp2 & " 当前页数:" & pp1

End Sub

Sub printail(ByVal p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer, p5 As Integer)

Call printframe(p1, p2, p3)

Call printfoot(p4, p5)

End Sub

Sub printbody()

Dim page As Integer

Dim pi As Integer

Dim p1y As Integer

Dim p2y As Integer 'first page lines and other page lines

Dim table2

p2y = 37 '44

table2 = 20

table1 = table1 + wh

p1y = (ph - table1 - 100) / wh

rst1.MoveFirst

If bnum < p1y + 1 Then

Call printail(table1, 1, bnum, 1, 1)

Else

page = Int(((bnum - p1y) / p2y) + 1.9999)

Call printail(table1, 1, p1y, 1, page)

If page > 2 Then

For pi = 1 To page - 2

Printer.NewPage

Call printail(table2, p1y + (pi - 1) * p2y + 1, p1y + pi * p2y, pi + 1, page)

Next pi

Printer.NewPage

Call printail(table2, p1y + (page - 2) * p2y + 1, bnum, page, page)

Else

Printer.NewPage

Call printail(table2, p1y + 1, bnum, page, page)

End If

End If

End Sub

Sub printp()

Dim sp

pw = 850: ph = 600

wh = 13

ww = 9

sp = 40

Printer.Scale (-sp, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc

End Sub

Private Sub Command1_Click()

bnum = rst1.RecordCount

finput

finput2

printp

End Sub

Private Sub Command3_Click()

Unload Me

End Sub

Private Sub Form_Load()

Dim str1, strcnn

strcnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;" & _

"Data Source=" & fpath1 & "shukux.mdb"

Set cnn2 = New ADODB.Connection

cnn2.Open strcnn

Set rst1 = New ADODB.Recordset

rst1.CursorType = adOpenKeyset

rst1.LockType = adLockOptimistic

rst1.Open "shu00", cnn2, , , adCmdTable

End Sub

用数组打印报表建立模块Module1:

Dim wh, ww 'word height and width

Dim pw, ph, px, py As Integer

Dim table1 '第一页表格起始位置

Dim pxm '表宽

Sub printhead()

Dim i

'计算表宽

pxm = 0

For i = 0 To txI - 1

pxm = pxm + tx(i, 2) * ww

Next

'打印标题

table1 = 0

For i = 0 To tyI - 1

Printer.FontName = ty(i, 0)

Printer.FontSize = ty(i, 1)

Printer.FontBold = ty(i, 2)

Printer.CurrentX = ty(i, 3)

Printer.CurrentY = ty(i, 4)

Printer.Print ty(i, 5)

table1 = ty(i, 4)

'画下划线

If ty(i, 6) = 1 Then

Printer.DrawWidth = 2

Printer.Line (0, table1 + 10)-(pxm, table1 + 10)

End If

Next

End Sub

Sub printa(ByVal p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer, p5 As Integer)

Dim py1 As Integer

Dim pxi, px1, bi

Dim daim1, daim2 As String

'打印表格线

Printer.DrawWidth = 3

py = p1 + (p3 + 2 - p2) * wh

Printer.Line (0, p1)-(pxm, p1)

Printer.Line (pxm, p1)-(pxm, py)

Printer.Line (pxm, py)-(0, py)

Printer.Line (0, py)-(0, p1)

'打印表头

Printer.DrawWidth = 1

Printer.FontSize = 11

Printer.FontBold = True

px = 0

For pxi = 0 To txI - 1

daim2 = tx(pxi, 1)

px1 = Int((tx(pxi, 2) - len1(daim2)) / 2)

Printer.CurrentX = px + px1 * ww

Printer.CurrentY = p1 + Int(0.2 * wh)

Printer.Print tx(pxi, 1)

px = px + tx(pxi, 2) * ww

Printer.Line (px, p1)-(px, py)

Next

'打印表格内容

Printer.FontBold = False

py = p1 + wh

For bi = p2 To p3

px = 0

For pxi = 0 To txI - 1

Printer.CurrentX = px + 2

Printer.CurrentY = py + Int(0.2 * wh)

daim1 = tx(pxi, 3)

daim2 = tz(bi - 1, daim1)

Printer.Print daim2 'len2(daim2, Int(tx(pxi, 2)))

px = px + tx(pxi, 2) * ww

Next pxi

Printer.Line (0, py)-(pxm, py)

py = py + wh

Next bi

'打印页码

px = Int(0.6 * pw): py = ph - 7 * wh

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print "总页数:" & p5 & " 当前页数:" & p4

End Sub

Sub printbody()

Dim page As Integer

Dim pi As Integer

Dim p1y As Integer

Dim p2y As Integer 'first page lines and other page lines

Dim table2

'p2y = 38

table2 = 0

table1 = table1 + wh

p1y = (ph - table1 - 115) / wh

p2y = (ph - 115) / wh

MsgBox p2y

If tzI < p1y + 1 Then

Call printa(table1, 1, tzI, 1, 1)

Else

page = Int(((tzI - p1y) / p2y) + 1.9999)

Call printa(table1, 1, p1y, 1, page)

If page > 2 Then

For pi = 1 To page - 2

Printer.NewPage

Call printa(table2, p1y + (pi - 1) * p2y + 1, p1y + pi * p2y, pi + 1, page)

Next pi

Printer.NewPage

Call printa(table2, p1y + (page - 2) * p2y + 1, tzI, page, page)

Else

Printer.NewPage

Call printa(table2, p1y + 1, tzI, page, page)

End If

End If

End Sub

Sub printp()

Dim sp

If tzI < 1 Then Exit Sub

pw = 850: ph = 600

wh = 13

ww = 9

sp = 40

Printer.Scale (0, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc

End Sub

在其它模块中调用时,只要先给出tx,ty,tz数组值和txI,tyI,tzI,再调用Module1.printp即可。例如:

Sub tabledatax()

txI = 10 ‘10列

tx(0, 1) = "序号" ‘表标题

tx(0, 2) = 4 ‘表宽(4个字)

tx(0, 3) = 0 ‘序号

tx(1, 1) = "代码"

tx(1, 2) = 8

tx(1, 3) = 1

tx(2, 1) = "库位号"

tx(2, 2) = 8

tx(2, 3) = 2

tx(3, 1) = "单价"

tx(3, 2) = 7

tx(3, 3) = 3

tx(4, 1) = "书 名"

tx(4, 2) = 33

tx(4, 3) = 4

tx(5, 1) = "册数"

tx(5, 2) = 6

tx(5, 3) = 5

tx(6, 1) = "码洋"

tx(6, 2) = 7

tx(6, 3) = 6

tx(7, 1) = "折扣"

tx(7, 2) = 5

tx(7, 3) = 7

tx(8, 1) = "实洋"

tx(8, 2) = 7

tx(8, 3) = 8

tx(9, 1) = "包+册"

tx(9, 2) = 8

tx(9, 3) = 9

End Sub

Sub tabledatay()

Dim px1, px2, px3, py

Dim wh0

wh0 = 10

tyI = 10

px1 = 20

px2 = 370

px3 = 620

ty(0, 0) = "宋体" ‘字体

ty(0, 1) = 17 ‘字号

ty(0, 2) = 1 ‘加粗

ty(0, 3) = 180 ‘Current X

ty(0, 4) = 10 ‘Current Y

ty(0, 5) = "中国水利水电出版社批销业务清单"

ty(0, 6) = 0 ‘是否加线

py = 30

ty(1, 0) = "宋体"

ty(1, 1) = 10

ty(1, 2) = 0

ty(1, 3) = px1

ty(1, 4) = py

ty(1, 5) = "处理单号: " & clh

ty(1, 6) = 0

ty(2, 0) = "宋体"

ty(2, 1) = 10

ty(2, 2) = 0

ty(2, 3) = px2

ty(2, 4) = py

ty(2, 5) = "制单日期: 20" & ddate

ty(2, 6) = 0

ty(3, 0) = "宋体"

ty(3, 1) = 10

ty(3, 2) = 0

ty(3, 3) = px3

ty(3, 4) = py

ty(3, 5) = "提书单编号: " & numb

ty(3, 6) = 1 ‘加下划线

py = py + 20

ty(4, 0) = "宋体"

ty(4, 1) = 10

ty(4, 2) = 0

ty(4, 3) = px1

ty(4, 4) = py

ty(4, 5) = "购货单位: " & len2(uname, 36)

ty(4, 6) = 0

ty(5, 0) = "宋体"

ty(5, 1) = 10

ty(5, 2) = 0

ty(5, 3) = px2

ty(5, 4) = py

ty(5, 5) = "总册数: " & zce

ty(5, 6) = 0

ty(6, 0) = "宋体"

ty(6, 1) = 10

ty(6, 2) = 0

ty(6, 3) = px3

ty(6, 4) = py

ty(6, 5) = "制单人: "

ty(6, 6) = 0

py = py + wh0

ty(7, 0) = "宋体"

ty(7, 1) = 10

ty(7, 2) = 0

ty(7, 3) = px1

ty(7, 4) = py

ty(7, 5) = "地址: " & add

ty(7, 6) = 0

ty(8, 0) = "宋体"

ty(8, 1) = 10

ty(8, 2) = 0

ty(8, 3) = px2

ty(8, 4) = py

ty(8, 5) = "总码洋: " & zma

ty(8, 6) = 0

ty(9, 0) = "宋体"

ty(9, 1) = 10

ty(9, 2) = 0

ty(9, 3) = px3

ty(9, 4) = py

ty(9, 5) = "计算件数: " & zl

ty(9, 6) = 0

End Sub

Sub tabledataz()

Dim i, bb As Integer, dd1 As Single

tzI = bnum

For i = 0 To tzI - 1

tz(i, 0) = i + 1

tz(i, 1) = code(i)

tz(i, 2) = kwh(i)

tz(i, 3) = Xiao2(danjia(i))

tz(i, 4) = len2(bname(i), 35)

tz(i, 5) = " " & shice(i)

dd1 = danjia(i) * shice(i)

tz(i, 6) = Xiao2(dd1)

tz(i, 7) = "0" & bzhe(i)

dd1 = danjia(i) * shice(i) * bzhe(i)

tz(i, 8) = Xiao2(dd1)

bb = Int(shice(i) / bag(i))

tz(i, 9) = bb & "+" & shice(i) - bb * bag(i) & "(" & bag(i) & ")"

Next

End Sub

Sub print_pxd()

tabledatax

tabledatay

tabledataz

Module1.printp ‘调用打印表格模块

End Sub

用REPORT产生报表1.新建标准工程1;

2.添加数据环境:选择菜单【工程】/【更多ActiveX设计器】/【DataEnvironment】,添加DataEnvironment1;

3.建立ODBC连接:

(1)在【控制面板】/【ODBC数据源】/【系统DNS】中设置数据库连接,如test0;

(2)右击【Connection1】,选择【属性】,出现“数据链接”对话框:

(3)在“提供者”属性页中选择【…for ODBC Drivers】;

(4)在“连接”属性页中选择【使用连接字符串】,单击【编译】/【机器数据源】,选中需要的数据连接,如test0,单击【确定】;

(5)单击【测试连接】,如通过,可以进行下一步;

4.添加连接命令:右击【Connection1】,选择【添加命令】,出现“Command1”;

5.设置连接命令:右击【Command1】,选择【属性】,出现“属性”对话框,设【数据库对象】为【表】,【对象名称】为所需要的表名,如“取水户基本信息表”,单击+号,可以展开表,如图所示:

6.添加报表:选择菜单【工程】/【添加DataReport】,添加DataReport1;

7.设置报表连接:在右边的属性面板中设【DataSource】为【DataEnvironment1】,【DataMember】为【Command1】;

8.设置报表数据:把各字段从DataEnvironment1拖到DataReport1,再加以排列;注意:拖动的字段有2块,左边是字段名(可以放在“页标头”栏中),右边是字段值(要放在“细节”栏中);

9.设置报表标题:右击报表,选择【插入控件】/【标签】,在报表标头栏中放置;还可以在“页注脚”栏中插入页码;

10.设置报表边框:右击报表,选择【插入控件】/【形状】,调整矩形大小,在每个字段和字段名上放置一个复制控件(Shape);

11.显示报表:在工程的Form1(或UserControl1)中添加一个按钮,在其上添加代码:

DataReport1.Show

然后就可以运行了。运行时既可以显示,也可以打印报表。

如建立ActiveX控件,要先建立一个标准EXE工程(用于调试),再建立一个ActiveX控件,在其上如上操作。

八 数据库控件用数据库控件实现数据库浏览放置控件: Form1:Data1,Combo1,Text1,Text2,Lbel1,Label2,Label3

属性设置: 〖Combo1.Datasource〗=data1

〖Text1.Datasource〗=data1

〖Text2.Datasource〗=data1

其余Text1,Text2,Label1,Label2,Label3的属性见图8.4

Data1的RecordsetType属性为0(table)

代码:

Private Sub Form_Load()

Data1.DatabaseName = "biblio.mdb" '调入"图书管理数据库"

Data1.RecordSource = "select distinct STATE from publishers "

Data1.Refresh

Do While Not Data1.Recordset.EOF '给Combo1赋值

temp = Data1.Recordset("State")

If IsNull(temp) Then temp = ""

Combo1.AddItem CStr(temp)

Data1.Recordset.MoveNext

Loop

Data1.RecordSource = "publishers" '改变Recordset为全表

Data1.Refresh

Text1.DataField = "name"

Text2.DataField = "city"

Combo1.DataField = "state"

End Sub

在控件DATAI中显示总记录和当前记录先设置全局变量firstflag,并在FormLoad中设为True,

Private Sub Data1_Reposition() '重新定位记录时显示记录号

If firstflag Then '如果是首次使用

Data1.Caption = "" 'data1标题框显示空白

firstflag = False

Else '如果不是首次使用,则在

' data1标题框显示记录号

Data1.Caption = "总记录数:" & Data1.Recordset.RecordCount _

& " 当前记录:" & Data1.Recordset.AbsolutePosition + 1

End If

用数据库控件实现数据录入/删除放置控件: Form1:Data1;Text1,2;Lbel1,2;Command1,2,3,4,5;Frame1

属性设置:

Data1:〖DatabseName〗="Nwind.mdb",〖Recordsource〗=products

Text1:〖Datasource〗=data1,〖Datafield〗=produtID,〖TabIndex〗=0

Text2:〖Datasource〗=data1,〖Datafield〗=produtName,〖TabIndex〗=1

Command1:〖Name〗=Cmdadd,〖Caption〗=增加

Command2:〖Name〗=Cmddelete,〖Caption〗=删除

Command3:〖Name〗=Cmdexit,〖Caption〗=退出

Command4:〖Name〗=Cmdupdate,〖Caption〗=确定

Command5:〖Name〗=Cmdcancel,〖Caption〗=放弃

Frame1中包含Command4,5

其余Text1,2,Label1,2和Command1,2,3,4,5的位置属性见图8.5

代码:

Option Explicit

Dim firstflag As Boolean '首次使用标记

Private Sub Cmdadd_Click() '增加记录

Data1.Recordset.AddNew

Frame1.Visible = True '使主按钮组不可见

Data1.Caption = "记录:" & Data1.Recordset.RecordCount + 1

Text1.SetFocus

End Sub

Private Sub Cmdcancel_Click() '放弃录入的记录

Data1.Recordset.CancelUpdate

Frame1.Visible = False '使主按钮组可见

Data1.Recordset.MoveLast '回到最后一个记录

End Sub

Private Sub Cmdupdate_Click() '确定录入的记录有效

Data1.Recordset.Update

Frame1.Visible = False '使主按钮组可见

Data1.Recordset.MoveLast '显示录入内容

End Sub

Private Sub Data1_Reposition() '重新定位记录时显示记录号

If firstflag Then '如果是首次使用

Data1.Caption = "" 'data1标题框显示空白

firstflag = False

Else '如果不是首次使用,则在

' data1标题框显示记录号

Data1.Caption = "总记录数:" & Data1.Recordset.RecordCount _

& " 当前记录:" & Data1.Recordset.AbsolutePosition + 1

End If

End Sub

Private Sub Cmddelete_Click() '删除

Data1.Recordset.Delete

Data1.Recordset.MovePrevious '回到前一个记录

End Sub

Private Sub cmdexit_Click()

Unload Me

End Sub

Private Sub Form_Load()

firstflag = True '首次使用

Frame1.Visible = False '使主按钮组可见

End Sub

几个控件联动的例子放置控件: Form1:Data1;Text1,Combo1,List1

属性设置:

Data1:〖DatabseName〗="db2.mdb",内有测站信息、径流量表等2个表。

Private Sub Combo1_Click()

Dim li, lstr, lstr1

For li = 1 To List1.ListCount

List1.Clear

Next

Data1.RecordSource = "select 测站代码 from 测站信息 where 测站名称='" & Combo1 & "'"

Data1.Refresh

lstr = Data1.Recordset!测站代码

Data1.RecordSource = "径流量表"

Data1.Refresh

Do While Not Data1.Recordset.EOF

lstr1 = Data1.Recordset!测站代码

If lstr1 = lstr Then

List1.AddItem Data1.Recordset!测量日期

End If

Data1.Recordset.MoveNext

Loop

End Sub

Private Sub List1_Click()

Dim lstr, sql1

Data1.RecordSource = "select 测站代码 from 测站信息 where 测站名称='" & Combo1 & "'"

Data1.Refresh

lstr = Data1.Recordset!测站代码

sql1 = "select * from 径流量表 where 测站代码='" & lstr & "' and 测量日期='" & List1 & "'"

Data1.RecordSource = sql1

Data1.Refresh

Text1 = Data1.Recordset!径流量

End Sub

Private Sub Form_Load()

Text1 = ""

Data1.RecordSource = "测站信息"

Data1.Refresh

Combo1 = Data1.Recordset!测站名称

Do While Not Data1.Recordset.EOF

Combo1.AddItem Data1.Recordset!测站名称

Data1.Recordset.MoveNext

Loop

End Sub

注:测量日期是字符型;

使用DATAGRID控件使用FLEXGRID控件不能连接ADODC数据控件,这时就要用DATAGRID控件了。使用时只要在DATASOURCE属性中设置了ADODC控件名,就可以自动显示整个数据表了。

要取消DATAGRID的改动记录的功能,右击控件,在【属性】中把【允许更新】取消。要使第一个单元数据出现,在【拆分】选项卡中选【锁定】即可。

还可以在界面设计中改变字段名和字体。这时要用【添加】添加字段,然后选取或输入即可。

设置MSHFlexGrid每行的颜色Public Sub SetRowColor(ByRef MSHFlexGrid As Object)

Dim j, i, objName

objName = TypeName(MSHFlexGrid)

If StrConv(Trim(objName), vbUpperCase) <> "MSHFLEXGRID" Then

Exit Sub

End If

MSHFlexGrid.FillStyle = 1

For i = 1 To MSHFlexGrid.Rows - 1

MSHFlexGrid.Row = i

If i Mod 2 = 0 Then

MSHFlexGrid.Col = 0

MSHFlexGrid.ColSel = MSHFlexGrid.Cols - 1

MSHFlexGrid.CellBackColor = &H80FFFF

End If

Next i

MSHFlexGrid.FillStyle = 0

MSHFlexGrid.Row = 0

MSHFlexGrid.Col = 0

End Sub

查询结果在DATAGRID控件中的显示Dim rs1

Private Sub Form_Load()

Dim fpath2

'fpath2 = "DBQ=\\Sans\office2000\demo\db1.mdb;DefaultDir=c:\VB\demo;Driver = {Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize= 2048;MaxScanRows =8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

fpath2 = "DBQ=c:\vb\demo\db1.mdb;DefaultDir=c:\VB\demo;Driver={Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize= 2048;MaxScanRows =8;PageTimeou t=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Adodc1.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & fpath2

Adodc1.RecordSource = "addvdata"

Adodc1.Refresh

Do While Not Adodc1.Recordset.EOF

List1.AddItem Adodc1.Recordset!Year

Adodc1.Recordset.MoveNext

Loop

End Sub

Private Sub List1_Click()

Text1 = List1.ListIndex

Adodc1.Refresh

Set rs1 = Adodc1.Recordset

While Not rs1.EOF

If rs1!Year = List1 Then

DataGrid1.SelBookmarks.Add rs1.Bookmark

End If

rs1.MoveNext

Wend

DataGrid1.Scroll 0, -3

End Sub

使用DATAGRID控件的高级实例本例使用DATAGRID1控件显示前几个月的实际降水量,再用历史数据推算后几个月的降水量,在DATAGRID2控件中显示。最后把全年数据写到第二个表中。

放置控件: Form1:Command1,Command2,List1,Adodc1,Datagrid1,Adodc2,Datagrid2, Text1等。

'估算当年降水量,并用DATAGRID控件实现显示功能 by Xue Wei 10/20/2001

Option Explicit

Const mmax = 13

Dim mj '有数据的截止月份

'退出

Private Sub Command1_Click()

'加入前面输入数据

Dim ii

Adodc1.RecordSource = "HYDNETDATA1"

Adodc1.Refresh

Adodc2.RecordSource = "HYDNETDATA2"

Adodc2.Refresh

While Not Adodc2.Recordset.EOF

For ii = 2 To mj + 1

Adodc2.Recordset.Fields(ii) = Adodc1.Recordset.Fields(ii)

Next ii

Adodc1.Recordset.MoveNext

Adodc2.Recordset.MoveNext

Wend

Unload Me

End Sub

'计算本年已有月份降水量的算术平均值

Function CalYp() As Integer

Dim mi, ii, qi

'Adodc1.Recordset.MoveFirst

'While Not Adodc1.Recordset.EOF

mi = 2

mj = 0

qi = 0

For ii = mi To mmax

If Not IsNull(Adodc1.Recordset.Fields(ii)) Then

qi = qi + Adodc1.Recordset.Fields(ii)

mj = mj + 1

End If

Next ii

CalYp = Int(qi / mj)

'Adodc1.Recordset.MoveNext

'Wend

End Function

'计算已有月份多年平均降水量的算术平均值

Function CalYd() As Integer

Dim ii, yd1

yd1 = 0

'MsgBox "cal=" & CalYm(1, 2)

For ii = 1 To mj

yd1 = yd1 + CalYm(ii, 2)

Next ii

CalYd = yd1 / mj

End Function

Private Sub Command2_Click()

Dim ii

For ii = 0 To 4

List1.Selected(ii) = True

CalList1 (List1.List(ii))

Next ii

End Sub

Sub CalList1(Listselected)

Dim mi, ii, qi

Dim yp '当年已有月份降水量的算术平均值

Dim ym '月多年平均降水量

Dim yd '相应月份多年平均降水量的算术平均值

Dim yk '比例系数

Dim ydn '多年平均降水量

Dim yy '估算的当年降水量

Dim ymj '估算的月降水量

'检查第一个月是否有值

Adodc1.Recordset.MoveFirst

If IsNull(Adodc1.Recordset("1月")) Then

MsgBox "没有当年的前几个月数据,不能进行当年降水量估算"

Unload Me

End If

'根据选择的流域名找到所在记录

While Adodc1.Recordset("流域名") <> Listselected

Adodc1.Recordset.MoveNext

Wend

Adodc2.RecordSource = "HYDNETDATA2"

Adodc2.Refresh

While Adodc2.Recordset.Fields(0) <> Adodc1.Recordset("代码")

Adodc2.Recordset.MoveNext

Wend

'估算当年降水量

yp = CalYp

yd = CalYd

ydn = CalYdn(2)

yk = yp / yd

'yy = Int(ydn * yk)

'Adodc2.Recordset.Fields(mmax + 1) = yy

Adodc2.Recordset!total = yy

Adodc2.Recordset.Update

'MsgBox "yY=" & yy & " mj=" & mj

'估算后续每月降水量

yy = 0

For ii = mj + 1 To mmax - 1

ymj = CalYm(ii, 2) * yk

yy = yy + ymj

Adodc2.Recordset.Fields(ii + 1) = ymj

Adodc2.Recordset.Update

Next ii

'合计得到估算年降水量

yy = yy + yp * mj

Adodc2.Recordset.Fields(mmax + 1) = yy

Adodc2.Recordset.Update

Adodc2.Refresh

Adodc2.RecordSource = "select HYDNETDATA2.hydnetcd as 代码,HYDNET.hydnetnm as 流域名 ,HYDNETDATA2.jan as 1月,HYDNETDATA2.feb as 2月,HYDNETDATA2.mar as 3月" & _

",HYDNETDATA2.apr as 4月,HYDNETDATA2.may as 5月,HYDNETDATA2.jun as 6月,HYDNETDATA2.jul as 7月,HYDNETDATA2.aug as 8月,HYDNETDATA2.sep as 9月,HYDNETDATA2.oct as 10月" & _

",HYDNETDATA2.nov as 11月,HYDNETDATA2.dec as 12月,HYDNETDATA2.total as 年降水量" & _

" from HYDNETDATA2,HYDNET where HYDNET.hydnetcd= HYDNETDATA2.hydnetcd " 'and HYDNET.hydnetcd='01'"

Adodc2.Refresh

End Sub

Private Sub list1_Click()

CalList1 (List1)

End Sub

Private Sub Form_Load()

Dim ii, Temp

Adodc1.ConnectionString = "Provider=MSDASQL.1;Persist Security Info= False;Extended Properties=" & fpath2

Adodc1.RecordSource = "HYDNETDATA1"

Adodc1.Refresh

Text1 = Adodc1.Recordset!year1

Adodc2.ConnectionString = "Provider=MSDASQL.1;Persist Security Info= False;Extended Properties=" & fpath2

Adodc2.RecordSource = "HYDNETDATA2"

Adodc2.Refresh

While Not Adodc2.Recordset.EOF

Adodc2.Recordset.Delete

Adodc2.Recordset.MoveNext

Wend

While Not Adodc1.Recordset.EOF

Adodc2.Recordset.AddNew

Adodc2.Recordset.Fields(0) = Adodc1.Recordset.Fields(0)

Adodc2.Recordset.Fields(1) = Adodc1.Recordset.Fields(1)

Adodc2.Recordset.Update

Adodc1.Recordset.MoveNext

Wend

Adodc1.RecordSource = "select HYDNETDATA1.hydnetcd as 代码,HYDNET.hydnetnm as 流域名 ,HYDNETDATA1.jan as 1月,HYDNETDATA1.feb as 2月,HYDNETDATA1.mar as 3月" & _

",HYDNETDATA1.apr as 4月,HYDNETDATA1.may as 5月,HYDNETDATA1.jun as 6月,HYDNETDATA1.jul as 7月,HYDNETDATA1.aug as 8月,HYDNETDATA1.sep as 9月,HYDNETDATA1.oct as 10月" & _

",HYDNETDATA1.nov as 11月,HYDNETDATA1.dec as 12月,HYDNETDATA1.total as 年降水量" & _

" from HYDNETDATA1,HYDNET where HYDNET.hydnetcd= HYDNETDATA1.hydnetcd " 'and HYDNET.hydnetcd='01'"

Adodc1.Refresh

While Not Adodc1.Recordset.EOF

List1.AddItem Adodc1.Recordset("流域名")

Adodc1.Recordset.MoveNext

Wend

Adodc2.Refresh

Adodc2.RecordSource = "select HYDNETDATA2.hydnetcd as 代码,HYDNET.hydnetnm as 流域名 ,HYDNETDATA2.jan as 1月,HYDNETDATA2.feb as 2月,HYDNETDATA2.mar as 3月" & _

",HYDNETDATA2.apr as 4月,HYDNETDATA2.may as 5月,HYDNETDATA2.jun as 6月,HYDNETDATA2.jul as 7月,HYDNETDATA2.aug as 8月,HYDNETDATA2.sep as 9月,HYDNETDATA2.oct as 10月" & _

",HYDNETDATA2.nov as 11月,HYDNETDATA2.dec as 12月,HYDNETDATA2.total as 年降水量" & _

" from HYDNETDATA2,HYDNET where HYDNET.hydnetcd= HYDNETDATA2.hydnetcd " 'and HYDNET.hydnetcd='01'"

Adodc2.Refresh

Gflag = False

If GisCD <> "" Then

Gflag = True

SetDb

Set Rst2 = New ADODB.Recordset

Rst2.Open "select * from HYDNET where trim(hydnetcd)='" & Trim(GisCD) & "'", Cnn

On Error Resume Next

Temp = Rst2("hydnetnm")

If err.Number > 0 Then

MsgBox "调用错误,返回"

Unload Me

End If

List1.Enabled = False

CalList1 (Temp)

End If

End Sub

在公用模块中用到代码如下:

Public Const fpath2 = "DBQ=\\WEBGIS\share\降水量文件\raindb.mdb;DefaultDir= c:\VB\demo;Driver={Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN = C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions =0;Threads =3;UID=admin;UserCommitSync=Yes;"

Public Cnn As ADODB.Connection '数据库连接

Public Rst1 As ADODB.Recordset '记录集,和set联合使用

Public Rst2 As ADODB.Recordset '记录集,和set联合使用

Public Const year0 = 1950 '最早记录年份

Public GisCD As String 'GIS调用的计算分区号

Public Gflag As Boolean '判断是否为GIS调用

'连接数据库

Public Sub SetDb()

Dim fpath2

Set Cnn = New ADODB.Connection

fpath2 = "DBQ=\\WEBGIS\share\降水量文件\raindb.mdb;DefaultDir= c:\VB\demo;Driver={Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn; MaxBufferSize =2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID= admin;UserCommitSync=Yes;"

Cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & fpath2

End Sub

'月多年平均降水量,ym1为月份数字,ym2为类型:1-测站、2-流域、3-水库、4-区县

Public Function CalYm(ym1, ym2) As Single

Dim rst0 As New ADODB.Recordset

Dim Temp, Ti

SetDb

Select Case ym2

Case 2

rst0.Open "select * from HYDNETDATA", Cnn

Temp = 0

Ti = 0

While Not rst0.EOF

If IsNull(rst0.Fields(ym1 + 1)) Then rst0.Fields(ym1 + 1) = 0

Temp = Temp + rst0.Fields(ym1 + 1)

Ti = Ti + 1

'MsgBox "TI=" & Ti & " TEMP=" & Temp

rst0.MoveNext

Wend

End Select

rst0.Close

CalYm = Int(Temp * 100 / Ti) / 100

End Function

用数据库控件实现图表显示在FORM上添加选项卡控件SSTAB1,在其中放入MSCHART控件(Chart0,1,2)和MSFLEXGRID (MfGrid0,1,2) 控件:

代码:

Option Explicit

Dim codetype(2) As String

Dim colfield(7) As String

Dim collabel(5) As String

Dim strsum(50)

Dim arrChartData()

Private Sub Command1_Click()

Unload Me

End Sub

Private Sub Form_Load()

'调用公共连接数据库

SetDb

'选项卡数组

codetype(0) = "流域"

codetype(2) = "水库"

codetype(1) = "区县"

'GRID横坐标数组

colfield(1) = "计算面积 "

colfield(2) = "多年平均降水量 "

colfield(3) = "多年平均降水总量 "

colfield(4) = "20%"

colfield(5) = "50%"

colfield(6) = "75%"

colfield(7) = "95%"

'CHART控件横坐标数组

collabel(1) = "多年平均降水总量"

collabel(2) = "20%"

collabel(3) = "50%"

collabel(4) = "75%"

collabel(5) = "95%"

End Sub

Private Sub SSTab1_Click(PreviousTab As Integer)

Dim strsql As String

Dim i

Select Case SSTab1.Tab

'流域表

Case 0

Set Rst1 = New ADODB.Recordset

strsql = "select * from hydnet where hydnetcd in (select hydnetcd from hydnetdata)"

Rst1.Open strsql, cnn

ReportSet 0, MfGrid0, Chart0

Rst1.Close

'区县表

Case 1

Set Rst1 = New ADODB.Recordset

strsql = "select * from addv where addvcd in (select addvcd from addvdata)"

Rst1.Open strsql, cnn

ReportSet 1, mfgrid1, Chart1

Rst1.Close

'水库表

Case 2

Set Rst1 = New ADODB.Recordset

strsql = "select * from shuiku where shuikucd in (select shuikucd from shuikudata)"

Rst1.Open strsql, cnn

ReportSet 2, mfgrid2, Chart2

Rst1.Close

End Select

End Sub

'计算和赋值

Sub ReportSet(k, mfgrid, Chart As Object)

Dim i, j, h

With mfgrid

.Col = 0

.Row = 0

.Text = codetype(k)

For i = 1 To 7

.Col = i

.ColWidth(i) = 1450

.Text = colfield(i)

Next i

End With

j = 0

If Rst1.EOF Then

MsgBox "no data"

Exit Sub

Else

Rst1.MoveFirst

Do While Not Rst1.EOF

j = j + 1

Rst1.MoveNext

Loop

End If

ReDim arrChartData(1 To j, 1 To 5)

Rst1.MoveFirst

i = 1

Do While Not Rst1.EOF

strsum(8) = Rst1.Fields(0) 'code

'多年平均降水总量计算

strsum(0) = Rst1.Fields(1) 'name

strsum(1) = Rst1!area 'area

strsum(2) = CalYdn2(strsum(8), k + 2) '调用计算多年平均降水量函数

strsum(3) = CLng(strsum(2)) * CLng(strsum(1)) / 100000

strsum(4) = calduoping(strsum(8), strsum(1), 0.2, k) '调用计算某频率下降水量的函数

strsum(5) = calduoping(strsum(8), strsum(1), 0.5, k)

strsum(6) = calduoping(strsum(8), strsum(1), 0.75, k)

strsum(7) = calduoping(strsum(8), strsum(1), 0.95, k)

'向CHART控件赋值

arrChartData(i, 1) = strsum(3)

arrChartData(i, 2) = strsum(4)

arrChartData(i, 3) = strsum(5)

arrChartData(i, 4) = strsum(6)

arrChartData(i, 5) = strsum(7)

Chart.ChartData = arrChartData

'表格显示

With mfgrid

.Row = i

For h = 0 To 7

.Col = h

.Text = Format(strsum(h), "0.00")

Next h

End With

i = i + 1

Rst1.MoveNext

Loop

'写CHART右边系列标签

Chart.RowCount = j

Chart.ColumnLabelCount = j

Rst1.MoveFirst

For i = 1 To j

Chart.Row = i

Chart.RowLabel = Rst1.Fields(1)

Rst1.MoveNext

Next i

'写CHART横坐标

Chart.ColumnCount = 5

For i = 1 To 5

Chart.Column = i

Chart.ColumnLabel = colfield(i + 2)

Next i

Chart.Refresh

End Sub

数据库控件卸载Set Data1.Recordset = Nothing

九 ADO数据库编程打开mdb数据库设置: 在【工程】‖【引用】中选”MS Dao 2.5/3.51 Compatibility Library”

代码:

Public cnn1 As ADODB.Connection

Public rst1 As Recordset

Public rst2 As Recordset

Sub mdbopen()

Dim strcnn As String

Text2 = "panx.mdb"

Fpath2 = “C:\fxfx\pan\”

strcnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;" & _

"Data Source=" & Fpath2 & Text2

Set cnn1 = New ADODB.Connection

cnn1.Open strcnn

End Sub

打开dbf数据库设置: 在【工程】‖【引用】中选”MS Dao 2.5/3.51 Compatibility Library”

代码:

Public cnn2 As ADODB.Connection

Public rst1 As Recordset

Public rst2 As Recordset

Sub dbfopen()

Dim strcnn As String

Fpath2 = “C:\fxfx\pan\”

strcnn = "Provider=MSDASQL.1;Persist Security Info=False;" & _

"Data Source=FoxPro Files; Initial Catalog=" & fpath2

Set cnn2 = New ADODB.Connection

cnn2.Open strcnn

End Sub

连接SQL数据库Dim cnn As ADODB.Connection '数据库连接

Dim Rst2 As ADODB.Recordset

Private Sub Command1_Click()

Set cnn = New ADODB.Connection

si = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" & _

Text5.Text & ";Data Source=" & Text4.Text

cnn.Open si

Set Rst2 = New ADODB.Recordset

si = "select * from " & Text3.Text

Rst2.Open si, cnn, adOpenDynamic, adLockOptimistic ‘打开一个可写入的表

……

End Sub

Private Sub Form_Load()

Text3.Text = "biao2" ‘表名

Text4.Text = "temp" ‘数据库组

Text5.Text = "xue01" ‘数据库

End Sub

读数据库 mdbopen

Set rst1 = New ADODB.Recordset

rst1.Open "shuku", cnn1

Do While Not rst1.EOF

If rst1!sdanjia = 100 Then

List1.AddItem rst1!sname

End If

rst1.MoveNext

Loop

rst1.Close

写数据库mdbopen

Set rst2 = New ADODB.Recordset

rst2.CursorType = adOpenKeyset

rst2.LockType = adLockOptimistic

rst2.Open "shu0", cnn1, , , adCmdTable

Do While Not rst1.EOF

If rst1!sdanjia < 0 Then

rst1!sdanjia = 0

rst1.Update

End If

rst1.MoveNext

Loop

rst2.Close

清数据库mdbopen

Set rst2 = New ADODB.Recordset

rst2.CursorType = adOpenKeyset

rst2.LockType = adLockOptimistic

rst2.Open "shu0", cnn1, , , adCmdTable

Do While Not rst2.EOF

rst2.Delete

rst2.MoveNext

Loop

把dbf库倒入mdb库先按照dbf的字段建立mdb数据库,再把两库打开。

Do While Not rst2.EOF

rst1.AddNew

For i = 0 To rst1.Fields.Count - 1

rst1.Fields(i) = rst2.Fields(i)

Next i

rst1.Update

rst2.MoveNext

Loop

rst1.Close

rst2.Close

使用SQL语言mdbopen

s1 = “select * from shuku where sdanjia = 100”

Set rst1 = New ADODB.Recordset

rst1.Open s1, cnn1

Do While Not rst1.EOF

List1.AddItem rst1!sname

rst1.MoveNext

Loop

rst1.Close

逆向查询Rst1.Open "select distinct 雨量测站数据表.年度 from 雨量测站数据表 order by 年度 desc",cnn

添加新记录SetDb

Set Rst1 = New ADODB.Recordset

Rst1.Open "决策信息表", cnn, adOpenKeyset, adLockOptimistic, adCmdTable ‘(1,3,2)

Rst1.AddNew

Rst1!决策代码 = JcDaima

Rst1!注册名 = Zhuce

Rst1!决策开始时间 = Date

Rst1.Update

Set Rst1 = Nothing

其中setdb程序为:

Public Sub SetDb()

Set cnn = New ADODB.Connection

fpath3 = "C:\My Documents\decision"

fpath2 = "DBQ=" & fpath3 & ";DefaultDir=c:\VB\demo;Driver={Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize=2048; MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & fpath2

End Sub

修改记录STRN = "select * from 决策信息表 where 决策代码 = '" & JcDaima & "'"

Rst1.Open STRN, cnn, 1, 3

Rst1!Fanwei0 = Fanwei

Rst1!year0 = Dyear

Rst1.Update

Set Rst1 = Nothing

查找记录公用过程Public Sub rseek(ss1 As String, ss2 As String, rst As ADODB.Recordset)

Dim bbb

bbb = True

rst.MoveFirst ‘rst不可为空,否则出现错误

Do While Not rst.EOF And bbb

If rst(ss1) = ss2 Then

bbb = False

Else

rst.MoveNext

End If

Loop

If bbb Then

'MsgBox "没有找到记录!"

brsl = True

End If

End Sub

调用时,只要用

rseek(“单价”,”51.5”,rst1)

就可把单价为51.5元的记录(第一个)找到了。

如果要用

brsl 判别是否找到,要先设

brsl = False。

注意,rst不可为空,可用

If rst1.RecordNum > 0 then rseek(“单价”, ”51.5”, rst1)

加以判别。

要多次使用rseek时,速度较慢。这时最好用SQL查询:

ss1 = "select * from shu0 where scode = '" & rst2!scode & "'"

Set rst1 = New ADODB.Recordset

rst1.Open ss1, cnn1

查询并修改数据放置控件: Form1:Command1(按价格查), Command2(按书名查), Command3(按代码查),List1

代码:

Option Explicit

Dim s11 As Single, s12 As String

Sub inputp1()

Dim s2

s2 = ""

On Error GoTo head

head1:

s2 = InputBox("请输入单价:")

If s2 = "" Then

MsgBox "按‘确定’放弃"

Else

s11 = s2

End If

Exit Sub

head:

MsgBox "输入错!请重新输入"

Resume head1

End Sub

Sub listdelete()

Dim i

For i = 0 To List1.ListCount - 1

List1.Clear

Next

End Sub

Sub listshow1()

Dim st, s3, i

rst1.MoveFirst

i = 1

Do While Not rst1.EOF

If rst1!sdanjia = s11 Then

s3 = len3(str(i), 8) & len3(rst1!scode, 10) & len3(rst1!sname, 42) & _

" " & len3(str(s11), 8) & len3(rst1!syear, 12) & len3(rst1!skwh, 12) & len3(rst1!sbag, 6)

List1.AddItem s3

i = i + 1

End If

rst1.MoveNext

Loop

If (i = 1) Then

MsgBox "没找到!"

End If

End Sub

Private Sub Command1_Click()

inputp1

listdelete

If s11 <> 0 Then

listshow1

End If

End Sub

Sub listshow2()

Dim st, s3, i

rst1.MoveFirst

i = 1

Do While Not rst1.EOF

st = Mid(Trim(rst1!sname), 1, Len(s12))

If st = s12 Then

s3 = len3(str(i), 8) & len3(rst1!scode, 10) & len3(rst1!sname, 42) & _

" " & len3(rst1!sdanjia, 8) & len3(rst1!syear, 12) & len3(rst1!skwh, 12) & len3(rst1!sbag, 6)

List1.AddItem s3

i = i + 1

End If

rst1.MoveNext

Loop

If i = 1 Then

MsgBox "没找到!"

End If

End Sub

Sub inputp2()

Dim s2

s12 = ""

s2 = InputBox("请输入书名的前几个字:")

If s2 = "" Then

MsgBox "按‘确定’放弃"

Else

s12 = s2

End If

End Sub

Private Sub Command2_Click()

inputp2

listdelete

If s12 <> "" Then

listshow2

End If

End Sub

Sub listshow3()

Dim st, s3, i

rst1.MoveFirst

i = 1

Do While Not rst1.EOF

st = Mid(Trim(rst1!scode), 1, Len(s12))

If st = s12 Then

s3 = len3(str(i), 8) & len3(rst1!scode, 10) & len3(rst1!sname, 42) & _

" " & len3(rst1!sdanjia, 8) & len3(rst1!syear, 12) & len3(rst1!skwh, 12) & len3(rst1!sbag, 6)

List1.AddItem s3

i = i + 1

End If

rst1.MoveNext

Loop

If i = 1 Then

MsgBox "没找到!"

End If

End Sub

Sub inputp3()

Dim s2

s12 = ""

s2 = InputBox("请输入代码的前几个字:")

If s2 = "" Then

MsgBox "按‘确定’放弃"

Else

s12 = s2

End If

End Sub

Private Sub Command3_Click()

inputp3

listdelete

If s12 <> "" Then

listshow3

End If

End Sub

Private Sub Command4_Click()

cnn1.Close

Unload Me

End Sub

Private Sub List1_Click()

Dim li1, s1, s2

li1 = Mid(List1, 9, 8)

s1 = InputBox("请输入书" & Trim(li1) & "的新库位号 : ")

If s1 = "" Then

MsgBox "未输入库位号,请重新输入。"

Exit Sub

Else

Call rseek("scode", Trim(li1), rst1)

s2 = rst1!skwh

rst1!skwh = s1

rst1.Update

rst2.AddNew

rst2!knum = tnum

rst2!kdate = Date

rst2!kcode = rst1!scode

rst2!kh1 = s2

rst2!kh2 = s1

rst2.Update

End If

rst1.Close

rst2.Close

cnn1.Close

Load fkuweip

fkuweip.pp1

MsgBox ("本次入库单处理完毕。按“确定”退出")

Unload Me

End Sub

Private Sub Form_Load()

Dim strcnn

Dim it As Integer

Dim k, s2

strcnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;" & _

"Data Source=" & fpath1 & "shukux.mdb"

Set cnn1 = New ADODB.Connection

cnn1.Open strcnn

Set rst1 = New ADODB.Recordset

rst1.CursorType = adOpenKeyset

rst1.LockType = adLockOptimistic

rst1.Open "shu0", cnn1, , , adCmdTable

Set rst2 = New ADODB.Recordset

rst2.CursorType = adOpenKeyset

rst2.LockType = adLockOptimistic

rst2.Open "kwh", cnn1, , , adCmdTable

If rst2.RecordCount < 1 Then

tnum = "K00001"

Else

rst2.MoveLast

s2 = rst2!knum

s2 = Mid(s2, 2, 6)

s2 = Trim(str(Int(s2) + 1))

Do While Len(s2) < 5

s2 = "0" + s2

Loop

tnum = "K" & s2

End If

End Sub

连接远程数据库1.用ADODC控件连接远程数据库用文件DSN连接,建立连接后,再添加一个ADODC控件,一个List1控件,程序如下:

Private Sub Form_Load()

fpath2 = "DBQ=\\Sans\office2000\demo\db1.mdb;DefaultDir=c:\VB\demo;Driver = {Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize = 2048;MaxScanRows =8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Adodc1.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False; Extended Properties=" & fpath2

Adodc1.RecordSource = "addvdata"

Adodc1.Refresh

Do While Not Adodc1.Recordset.EOF

List1.AddItem Adodc1.Recordset!addvcd

Adodc1.Recordset.MoveNext

Loop

End Sub

2.用程序连接远程数据库在【工程】‖【引用】中选”MS Dao 2.5/3.51 Compatibility Library”和“MS ADO 2,0 Library”,再添加一个List1控件,程序如下:

Public Cnn As ADODB.Connection

Private Sub Form_Load()

Dim strcnn, fpath2

Dim rst1 As New ADODB.Recordset

Set Cnn = New ADODB.Connection

fpath2 = "DBQ=\\Sans\office2000\demo\db1.mdb;DefaultDir=c:\VB\demo;Driver = {Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize = 2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & fpath2

rst1.Open "select * from addvdata ", Cnn

Do While Not rst1.EOF

List1.AddItem rst1!addvcd

rst1.MoveNext

Loop

rst1.Close

End Sub

数据录入实例这是一个在几个控件选择(测站和年度)条件下用TEXT进行录入,如果该记录有值,进入UPDATE状态,如果没有值,进入ADDNEW状态。最后的总和可以输入,也可以计算。按【确认】可以根据计算结果提示用户输入的总和相差太大(超过5%),然后写入数据库,并使测站翻到下一个。

'测站年度数据录入

Option Explicit

Dim RainstatCd As String

Dim flag As Boolean '判断记录是否有值

Private Sub cmdcancel_Click(Index As Integer)

combo_year_Click

End Sub

Private Sub cmdexit_Click()

Unload Me

End Sub

Private Sub cmdjisuan_Click(Index As Integer)

Dim i As Integer

Dim txtbox As TextBox

For Each txtbox In Me.Text1

If txtbox.Text = "" Then

txtbox.Text = "0"

End If

Next

Text1(12) = "0"

For i = 0 To 11

Text1(12) = Val(Text1(12)) + Val(Text1(i))

Next i

Text1(12).SetFocus

End Sub

Private Sub cmdSubmit_Click(Index As Integer)

Dim i As Integer

Dim sum As Long

Dim txtbox As TextBox

On Error GoTo err

For Each txtbox In Me.Text1

If txtbox.Text = "" Then

txtbox.Text = "0"

End If

Next

sum = 0

For i = 0 To 11

sum = sum + Val(Text1(i))

Next i

If sum = 0 Then

MsgBox "没有数据不能提交", , "提示"

Exit Sub

End If

If (sum - Val(Text1(12))) / sum > 0.05 Or (Val(Text1(12)) - sum) / sum > 0.05 Then

If MsgBox("年降水量与各月累加相差5%,是否修正?", vbQuestion + vbYesNo, "提示") = vbYes Then

Text1(12).Text = Trim(Str$(sum))

Text1(12).SetFocus

Exit Sub

End If

End If

Set Rst2 = New ADODB.Recordset

Set Rst1 = New ADODB.Recordset

Rst1.Open "select rainstat.* from rainstat where rainstat.rainstatnm='" & Combo_nm.Text & " ' ", Cnn

RainstatCd = Rst1("rainstatcd")

Rst1.Close

'Cnn.BeginTrans

If flag = False Then

Rst2.Open "select * from statdata", Cnn, adOpenStatic, adLockOptimistic

'Rst2.MoveLast

Rst2.AddNew

Else

Rst2.Open "select * from statdata where rainstatcd='" & RainstatCd & "' and year1=" & Val(combo_year), Cnn, adOpenStatic, adLockOptimistic

End If

Rst2("rainstatcd") = RainstatCd

Rst2("year1") = combo_year

For i = 0 To 12

Rst2.Fields(i + 2) = Text1(i).Text

Next i

Rst2.Update

'rst2.Requery

'Cnn.CommitTrans

If Combo_nm.ListIndex < Combo_nm.ListCount - 1 Then

Combo_nm.ListIndex = Combo_nm.ListIndex + 1

Else

Combo_nm.ListIndex = 0

End If

If Gflag Then

'MsgBox "gflag=" & Gflag

Unload Me

Exit Sub

Else

CalEnter2 Combo_nm.List(Combo_nm.ListIndex) '换到下一个测站

End If

Text1(0).SetFocus

Exit Sub

err:

MsgBox err.Description

End Sub

Private Sub combo_nm_Change()

'combo_year_Click

End Sub

Private Sub combo_nm_Click()

combo_year_Click

End Sub

Private Sub combo_year_Click()

Dim i

flag = False

Set Rst1 = New ADODB.Recordset

Rst1.Open "select * from rainstat where rainstatnm='" & Combo_nm & "'", Cnn

Set Rst2 = New ADODB.Recordset

Rst2.Open "select * from statdata where rainstatcd='" & Rst1!RainstatCd & "' and year1=" & Val(combo_year), Cnn

i = 0

While Not Rst2.EOF

i = i + 1

Rst2.MoveNext

Wend

If i > 0 Then

Rst2.MoveFirst

RainstatCd = Rst2("rainstatcd")

flag = True

For i = 0 To 12

If Not IsNull(Rst2.Fields(i + 2)) Then

Text1(i) = Rst2.Fields(i + 2)

Else

Text1(0) = ""

End If

Next i

Else

For i = 0 To 12

Text1(i) = ""

Next i

flag = False

End If

Rst1.Close

Rst2.Close

End Sub

Sub CalEnter2(RainName)

Combo_nm = RainName

combo_year_Click

End Sub

Private Sub Form_Load()

Dim j As Integer

Dim Temp

SetDb

Set Rst2 = New ADODB.Recordset

Rst2.Open "RAINSTAT", Cnn

While Not Rst2.EOF

Combo_nm.AddItem Rst2("rainstatnm")

Rst2.MoveNext

Wend

combo_year = Year(Date) - 1

For j = year0 To Year(Date) - 1

combo_year.AddItem j

Next j

Rst2.MoveFirst

Temp = Rst2("rainstatnm")

Combo_nm.ListIndex = 0

'从外部调用这个FORM

Gflag = False

If GisCD <> "" Then

Gflag = True

Set Rst2 = New ADODB.Recordset

Rst2.Open "select * from RAINSTAT where trim(rainstatcd)='" & Trim(GisCD) & "'", Cnn

On Error Resume Next

Temp = Rst2("rainstatnm")

If err.Number > 0 Then

MsgBox "调用错误,返回"

Unload Me

End If

Combo_nm.Enabled = False

End If

'Rst2.Close

CalEnter2 Temp

End Sub

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)

Dim strvalid As String

strvalid = "0123456789."

If KeyAscii > 26 Then

If InStr(strvalid, Chr(KeyAscii)) = 0 Then

KeyAscii = 0

End If

End If

If KeyAscii = 13 Then

If Index < 11 Then

Text1(Index + 1).SetFocus

End If

If Index = 11 Then

cmdjisuan(0).SetFocus

End If

If Index = 12 Then

cmdSubmit(1).SetFocus

End If

End If

End Sub

程序还用到公用模块代码:

Public Rst1 As ADODB.Recordset '记录集,和set联合使用

Public Rst2 As ADODB.Recordset '记录集,和set联合使用

Public Const year0 = 1950 '最早记录年份

Public GisCD As String 'GIS调用的计算分区号

Public Gflag As Boolean '判断是否为GIS调用

Public Sub SetDb()

Dim fpath2

Set Cnn = New ADODB.Connection

fpath2 = "DBQ=\\WEBGIS\share\降水量文件\raindb.mdb;DefaultDir=c:\VB\demo;Drive r={Microsoft Access Driver (*.mdb)};DriverId=281;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test00.dsn;MaxBufferSize=2048;MaxScanRows =8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=" & fpath2

End Sub

十 文件处理用open方法读文件open s1 for input as #1

do while not eof(1)

line input #1, s2

msgbox s2

loop

close #1

用open方法写文件重写

open s1 for output as #1

print #1, s2

close #1

附加

open s1 for append as #1

print #1, s2

close #1

用FSO对象读写文件使用FSO对象前要引用Microsoft Scripting Runtime

Dim fso As New FileSystemObject

Dim ts1, ts2 As TextStream

Set ts1 = fso.OpenTextFile(fs1, ForReading)

Set ts2 = fso.OpenTextFile(fs2, ForWriting)

i = 0

Do While Not ts1.AtEndOfStream

s0 = ts1.ReadLine

ts2.WriteLine s0

i = i + 1

Loop

m = i

ts1.Close

ts2.Close

删除文件Dim fso As New FileSystemObject

fso.DeleteFile fname1

Set File2 = fso.GetFile(t1)

File2.Delete

文件更名把文件t1换名变成t2

t1 = "c:\logs\station.dbf..dbf"

t2 = "c:\logs\station1.dbf"

If fso.FileExists(t1) Then

Set File2 = fso.GetFile(t1)

If Not fso.FileExists(t2) Then

File2.Move t2

End If

Else

MsgBox "数据库文件" & t1 & "不存在!"

End

End If

复制文件把文件t1复制成t2

t1 = "c:\logs\station.dbf..dbf"

t2 = "c:\logs\station1.dbf"

If fso.FileExists(t1) Then

Set File2 = fso.GetFile(t1)

If Not fso.FileExists(t2) Then

File2.Copy t2

End If

Else

MsgBox "数据库文件" & t1 & "不存在!"

End

End If

删除过期文件添加File1控件,用来管理所有文件。先要设File1.Path

For i = 0 To File1.ListCount - 1

fn = File1.Path + "\" + File1.List(i)

Set File2 = fso.GetFile(fn)

tt = File2.DateLastModified

If today - tt > 10 Then ‘删除10天前的文件

File2.Delete

End If

Next

十一 收发E-mail发送E-mail调用: 【部件】下的Microsoft MAPI Control 6.0

放置控件: Form1:Command1, MAPISession1, MAPIMessages1

属性设置: 〖MAPISession1.名称〗=MAPIS,〖MAPIMessages1.名称〗=MAPIM

说明: 1. MAPISession控件用来进行联接和登录,MAPIMessages控件用来进行收发E-mail的操作。

2. 发送时向MAPIMessages.MsgNoteText输入E-mail内容。要输入多行,用MAPIMessages.MsgNoteText = line1 & vbCrLf & line2 即可。

代码:

Private Sub Command1_Click()

With MAPIS

.DownLoadMail = True '使用开机下载

.LogonUI = True '发送地址不对时可以手工设置

.SignOn '建立会话

End With

With MAPIM

.SessionID = MAPIS.SessionID '用SessionID指定对话序列号,缺省为0

.Compose '写新消息

.RecipAddress = "shuku@waterpub.com.cn" '写收件人地址

.AddressResolveUI = True '使用验证方式

.ResolveName '验证收件人地址

.MsgSubject = "head" '写E-mail主题

.MsgNoteText = "text" '写E-mail内容

.Send '发送

End With

MAPIS.SignOff '结束会话

MsgBox ("发送完毕。")

End Sub

接收E-mail调用: 【部件】下的Microsoft MAPI Control 6.0

放置控件: Form1:Command1, MAPISession1, MAPIMessages1,Text1,Text2,Text3

属性设置: 〖MAPISession1.名称〗=MAPIS,〖MAPIMessages1.名称〗=MAPIM

说明::1.本例为接收一份E-mail的例子;

2.要先打开Outlook Express,并自动接受了邮件。程序从Outlook Express的收件箱中读取信件。

代码:

Private Sub Command1_Click()

With MAPIS

.DownLoadMail = True '使用开机下载

.LogonUI = True '发送地址不对时可以手工设置

.SignOn '建立会话

End With

With MAPIM

.SessionID = MAPIS.SessionID '用SessionID指定对话序列号,缺省为0

.Fetch '取信

Text3 = .MsgCount '信件数量

Text1 = .MsgSubject '主题

Text2 = .MsgNoteText '内容

'.Delete '取后删除

End With

MAPIS.SignOff '结束会话

End Sub

接收多封E-mail放置控件和属性设置同前。

要先打开Outlook Express,并自动接受了邮件。程序从Outlook Express的收件箱中读取信件。

Dim i

Fpath3 = “C:\asp\temp\”

With MAPIS

.DownLoadMail = True

.LogonUI = True

.SignOn

End With

With MAPIM

.SessionID = MAPIS.SessionID

.Fetch

For i = 0 To .MsgCount - 1

.MsgIndex = i

s1 = fpath3 & .MsgSubject

Open s1 For Output As #1

Print #1, .MsgNoteText

Close #1

Next

For i = 0 To .MsgCount - 1

.Delete

Next

End With

MAPIS.SignOff

选择发送多封E-mail放置控件和属性设置同前,增加Fiel1控件。

利用拨号上网时,要先打开Outlook Express,并已拨号上网,这样速度较快。否则每发送一封要拨一次号。

Option Explicit

Dim fscount, i, j

Dim fs1(200) As String

Dim fso As New FileSystemObject

Dim File2 As File

Function disfile(ss1 As String)

Dim sk

disfile = ""

Open File1.Path & "\" & ss1 For Input As #1

Do While Not EOF(1)

Line Input #1, sk

disfile = disfile & sk & vbCrLf

Loop

Close #1

End Function

Sub MAPIsend()

Dim fs2 As String

With MAPIS

.DownLoadMail = False

.LogonUI = True

.SignOn

End With

With MAPIM

.SessionID = MAPIS.SessionID

.Compose

For i = 0 To fscount - 1

'.MsgIndex = i

.RecipAddress = "wrf@waterpub.com.cn"

.AddressResolveUI = True

.ResolveName

fs2 = fs1(i)

'fs2 = "4bu0020.ppp"

.MsgSubject = fs2

.MsgNoteText = disfile(fs2)

.Send

Next i

End With

MsgBox "发送完毕"

End Sub

Sub mfilemove()

Dim fname1

For i = 0 To fscount - 1

fname1 = File1.Path & "\" & fs1(i)

'MsgBox fname1

fso.DeleteFile fname1

Next

End Sub

Private Sub Command1_Click()

j = 0

For i = 0 To File1.ListCount - 1

If File1.Selected(i) Then

fs1(j) = File1.List(i)

j = j + 1

End If

Next

fscount = j

If fscount < 1 Then

MsgBox "没有要发送的文件!"

Exit Sub

Else

For i = 0 To fscount - 1

fs1(i) = File1.List(i)

Next i

End If

MAPIsend

Mfilemove

MAPIS.SignOff

Unload Me

End Sub

Private Sub Command2_Click()

Unload Me

End Sub

Private Sub Form_Load()

Fpath1=”c:\fxfx\kfb\”

File1.Path = fpath1 & "email"

End Sub

十二 ActiveX控件建立简单的ActiveX控件这是一个显示时间的例子。

1.新建一个ActiveX控件工程

放置控件: UserControl1:Frame1,Timer1,Label1(小时),Label2(分),Label3(秒),使框架包容其它控件

属性设置: 〖Timer1.Interval〗=100 'ms

代码:

Private Sub Timer1_Timer()

Label1.Caption = Hour(Time) & ";"

Label2.Caption = Minute(Time) & ";"

Label3.Caption = Second(Time)

End Sub

Private Sub UserControl_Initialize()

Label1.Caption = Hour(Time) & ";"

Label2.Caption = Minute(Time) & ";"

Label3.Caption = Second(Time)

End Sub

然后保存文件,并生成OCX文件。

2.新建一个标准EXE工程,单击【工程】/【部件】,找到刚才生成的“工程1”部件,把它选中,然后从工具箱中把它添加到Form1中。这时就可以看见这个控件已经在运行了。然后就可以发布使用这个控件了。

改进ActiveX控件的接口 在【外接程序】/【外接程序管理器】中选择“ActiveX接口向导”的加载,再打开向导对话框,按照提示去做即可。

发布和应用ActiveX控件 在【外接程序】/【外接程序管理器】中选择“打包和展开向导”的加载,再打开向导对话框,选择【打包】,再选择【Internet】,在选项中选择“发布到没有VB的计算机上”,然后就可以在指定的文件夹中产生一个CAB文件,可以安装到其它计算机上使用。

这时还产生了一个同名的HTML文件,把其上的OBJECT代码拷贝下来,放到其它网页上,就可以在网上应用这个控件了。

建立一个复杂一点的例子这是一个添加新的属性和方法的例子。

新建一个ActiveX控件工程,放置控件: UserControl1:command1,label1。

打开“ActiveX接口向导”,只选择caption(对应label1)和click(对应Command1),再新建一个属性leftx(对应label1)。

这时在UserControl1自动产生了几段代码,修改如下,然后再用下节的调试方法来进行在线调试。

'设置leftx的属性(用let和get分别设置赋值和被赋值的情况)

Public Property Let leftx(ByVal New_leftx As Integer)

Label1.Left = New_leftx

PropertyChanged "leftx"

End Property

'注意!不要删除或修改下列被注释的行!

'MemberInfo=7,0,0,0

Public Property Get leftx() As Integer

leftx = Label1.Left

End Property

'修改Click事件

Private Sub Command1_Click()

Me.Caption = Me.leftx

Me.leftx = Me.leftx + 50

RaiseEvent Click

End Sub

'添加一个初始值设置(没有大用处,只是练习)

Private Sub UserControl_Initialize()

Me.Caption = ""

End Sub

开发调试先单击【工程】/【添加工程】,添加一个测试工程;

关闭 UserControl,这时工具箱中出现 UserControl控件,把它加入到Form1中,就可以运行这个程序了。

如果没有测试工程,也可以调用IE运行。

要在网页上加入这个控件,运行时查看HTML源文件,把下列说明复制下来,粘贴到网页中:

<OBJECT classid="clsid:0C174E17-67F5-11D5-98FB-BCF7F45EF11E">

</OBJECT>

其余的语句运行时自动产生。

安装和发布对于DLL文件,拷贝到一个目录后,在【运行】中键入:

C:\WINDOWS\SYSTEM\REGSVR32.EXE C:\MYASP\ASPPING.DLL

或在NT中:

C:\WINNT\SYSTEM32\REGSVR32.EXE C:\MYASP\ASPPING.DLL

对于OCX文件,则要安装。步骤是:

1.编制程序(ACTIVEX控件);

2.在【工程】/【工程。。属性】中选“要求许可证关键字”;

3.编译成OCX文件;

4.打包。

十三 总体结构用Timer控件控制程序运行放置控件: Form1:Command1,Timer1

属性设置: 〖Timer1.Interval〗=10 '10ms

代码:

Dim i As Integer '循环变量

Dim doflag As Boolean '用户是否按键标志

Sub delay 同前

Private Sub example()

Form1.Print i

delay (500)

i = i + 1

End Sub

Private Sub Command1_Click()

Select Case doflag

Case True

Command1.Caption = "开始"

doflag = False

Cls

Case False

Command1.Caption = "停止"

doflag = True

End Select

End Sub

Private Sub Timer1_Timer() '时钟控件随时检测,如果没有点击

If doflag Then 'Command1(停止),则继续调用example过程

example

End If

End Sub

Private Sub Form_Load()

doflag = False

Command1.Caption = "开始"

End Sub

在过程中调用Form的模式方法Form2.Show VbModal

在过程中调用Form的后台中断方法放置控件: Form1:Command1, Form2:Command2

代码:

Private Sub Command1_Click()

Bl = True

Form2.show

Do While Bl do

DoEvents

Loop

End Sub

Private Sub Command2_Click()

Unload Me

Bl = False

End Sub

调用其它窗体中的过程调用Form2的pp1过程:

Load Form2

Form2.pp1

定时播放提醒声以下程序每隔10分钟播放提醒声,按COMMAND2停止。

Option Explicit

Dim s1, s2

Dim stopb As Boolean

Sub delay(ss As Long)

Dim start, check

start = Timer

Do

check = Timer

Loop While check < start + ss * 60

End Sub

Private Sub Command1_Click()

Dim i

s1 = "C:\Program Files\Windows Media Player\MPLAYER2.EXE"

s2 = " C:\windows\media\乐曲默认值.wav"

Do While Not stopb

Shell (s1 & s2)

delay 10

DoEvents

Loop

End Sub

Private Sub Command2_Click()

stopb = True

End Sub

Private Sub Form_Load()

stopb = False

End Sub

十四 加密简单的密码框放置控件: Form1:Text1,Command1;Form2

属性设置: 〖Form1.Command1.Caption〗=确定

〖Form1.Text1.text〗=""

〖Form2.Command1.Caption〗=Exit

Form1代码:

Private Sub Command1_Click()

If Text1.text = "123" then '设密码为123

Print "You are right!"

Else

Print "Sorry ! Input again."

Text1.Text = "" '清除以前输入内容

End If

Text1.SetFocus '焦点重新回到文本框

End Sub

Form2代码:

Private Sub Command1_Click()

End

End Sub

加密Form放置控件: Form1:Text1,Command1;Form2

属性设置: 〖Form1.Command1.Caption〗=确定

〖Form1.Text1.text〗=""

〖Form2.Command1.Caption〗=Exit

Form1代码:

Dim s1 As Integer

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then

If Text1 = "123" Then '密码为123

Form1.Hide

Form2.Show

Else

If s1 = 3 Then '只能试3次

MsgBox ("密码错误,系统退出!")

Unload Me

Else

MsgBox ("输入错!请重新输入密码:")

Text1 = ""

s1 = s1 + 1

End If

End If

End If

End Sub

Private Sub Form_Load()

Text1 = ""

s1 = 1

End Sub

十五 其它编程调用外部程序本例用shell调用记事本程序,在其中写入几行字后保存,最后返回VB。

放置控件: Form1:Text1,Command1

代码:

Private Sub Command1_Click()

Shell ("C:\PWIN98\NOTEPAD.EXE"), 1

'AppActivate "无标题 - 记事本" ’指定窗口

SendKeys "The text1 is : ", True

SendKeys "{ENTER}", True

SendKeys Text1, True

SendKeys "%(F)", True ’按Alt+F

SendKeys "X", True ’按X退出记事本

SendKeys "{ENTER}", True

SendKeys "123", True ’输入文件名

SendKeys "{ENTER}", True

SendKeys "Y", True

Unload Me

End Sub

运行时先在文本框中输入一行字,再按Command1,就可以把这行字和前面的提示写到一个名为“123”的文件中了。

调用VB外部程序并传递参数建立工程2,其中FORM2代码为:

Private Sub Command1_Click()

MsgBox "g2=" & Command()

End Sub

再建立工程1,其中FORM1代码为:

Private Sub Command1_Click()

Shell ("C:\VB\LIAN\工程2.exe cmmm 123456"), 1

MsgBox "ok"

End Sub

动态调整各测站的加权值工程由FORM0和FORM1组成;FORM0根据选择流域值,再调用FORM1;FORM1先根据流域值查流域代码,根据代码查找测站数,然后动态产生各控件和FORM尺寸。拉动SLIDER控件可以调整各测站的权重。

FORM0:DATA1,COMMAND1,COMBO1

Private Sub Combo1_Click()

Data1.RecordSource = "SELECT * FROM HYDNET WHERE HYDNETNM='" & Combo1 & "'"

Data1.Refresh

SELHYDNET = Data1.Recordset!HYDNETCD

Data1.Recordset.Close

End Sub

Private Sub Command1_Click()

'Form0.Hide

Form1.Show

End Sub

Private Sub Form_Load()

Data1.RecordSource = "HYDNET"

Data1.Refresh

Do While Not Data1.Recordset.EOF

Combo1.AddItem Data1.Recordset!HYDNETNM

Data1.Recordset.MoveNext

Loop

End Sub

FORM1:产生SLIDER1、LABEL2、TEXT1数组(包括第一个控件),再产生一个标题LABEL1、DATA1、COMMAND1、COMMAND2;

Option Explicit

Dim Imax '控件数(从0开始)

Const Smax = 100 '权重总计

Const Topy = 600 '每个控件间距

Private Sub Command1_Click() '关闭

Unload Me

End Sub

Private Sub Form_Load()

Dim j, Stemp

Data1.RecordSource = "SELECT * FROM RAINSTAT WHERE HYDNETCD='" & SELHYDNET & "'"

Data1.Refresh

Imax = 0

Do While Not Data1.Recordset.EOF

Imax = Imax + 1

Data1.Recordset.MoveNext

Loop

If Imax > 1 And Imax < 21 Then

Data1.Refresh

Label2(0) = Data1.Recordset!RAINSTATNM

If Imax < 10 Then

Form1.Width = 5800

Form1.Height = 4500 + Topy * (Imax - 2)

For j = 1 To Imax - 1

Load Slider1(j)

Slider1(j).Left = 1000

Slider1(j).Top = 1200 + Topy * j

Slider1(j).Visible = True

Load Text1(j)

Text1(j).Left = 4200

Text1(j).Top = 1200 + Topy * j

Text1(j).Visible = True

Data1.Recordset.MoveNext

Load Label2(j)

Label2(j).Left = 240

Label2(j).Top = 1300 + Topy * j

Label2(j).Caption = Data1.Recordset!RAINSTATNM

Label2(j).Visible = True

Next j

Command2.Left = 1400

Command2.Top = 3000 + Topy * (Imax - 2)

Command1.Left = 3300

Command1.Top = 3000 + Topy * (Imax - 2)

Else '如果控件数大于10,则要分2栏

Form1.Width = 11500

Form1.Height = 4500 + Topy * 9

Label1.Left = 4500

For j = 1 To 9

Load Slider1(j)

Slider1(j).Left = 1000

Slider1(j).Top = 1200 + Topy * j

Slider1(j).Visible = True

Load Text1(j)

Text1(j).Left = 4200

Text1(j).Top = 1200 + Topy * j

Text1(j).Visible = True

Data1.Recordset.MoveNext

Load Label2(j)

Label2(j).Left = 240

Label2(j).Top = 1300 + Topy * j

Label2(j).Caption = Data1.Recordset!RAINSTATNM

Label2(j).Visible = True

Next j

For j = 10 To Imax - 1

Load Slider1(j)

Slider1(j).Left = 7000

Slider1(j).Top = 1200 + Topy * (j - 10)

Slider1(j).Visible = True

Load Text1(j)

Text1(j).Left = 10200

Text1(j).Top = 1200 + Topy * (j - 10)

Text1(j).Visible = True

Data1.Recordset.MoveNext

Load Label2(j)

Label2(j).Left = 6240

Label2(j).Top = 1300 + Topy * (j - 10)

Label2(j).Caption = Data1.Recordset!RAINSTATNM

Label2(j).Visible = True

Next j

Command2.Left = 4400

Command2.Top = 2500 + Topy * 9

Command1.Left = 6300

Command1.Top = 2500 + Topy * 9

End If

For j = 0 To Imax - 1

Slider1(j).Max = Smax

Next

Stemp = Int(Smax / Imax)

For j = 0 To Imax - 2

Text1(j) = Stemp

Slider1(j).Value = Stemp

Next

Text1(Imax - 1) = Smax - Stemp * (Imax - 1)

Slider1(Imax - 1) = Smax - Stemp * (Imax - 1)

Else

If Imax < 2 Then

MsgBox "测站数为" & Imax & ",不能设定权重。"

Else '>20

MsgBox "测站数为" & Imax & ",超出程序设置范围,不能设定权重。"

End If

Command2.Enabled = False

Slider1(0).Visible = False

Label2(0).Visible = False

Text1(0).Visible = False

End If

End Sub

Private Sub Slider1_Click(Ix As Integer)

Dim j, S0

Dim Stemp

Dim Sx

S0 = Text1(Ix)

If Imax - Ix < 2 Then

MsgBox "不能改变!"

Slider1(Ix).Value = S0

Exit Sub

End If

Sx = 0

If Ix > 0 Then

For j = 0 To Ix - 1

Sx = Sx + Text1(j)

Next j

End If

Text1(Ix) = Slider1(Ix).Value

If Smax - Sx < Int(Text1(Ix)) Then

MsgBox "超出范围!"

Text1(Ix) = S0

Slider1(Ix) = S0

Else

Stemp = Int((Smax - Sx - Int(Text1(Ix))) / (Imax - 1 - Ix))

MsgBox "stemp=" & Stemp

If Imax - Ix = 0 Then

Text1(Imax - 1) = Stemp

Slider1(Imax - 1).Value = Stemp

Else

For j = Ix + 1 To Imax - 2

Text1(j) = Stemp

Slider1(j) = Stemp

Next j

Text1(Imax - 1) = (Smax - Sx - Int(Text1(Ix))) - Stemp * (Imax - Ix - 2)

Slider1(Imax - 1) = (Smax - Sx - Int(Text1(Ix))) - Stemp * (Imax - Ix - 2)

End If

End If

End Sub

用MSCHART产生图表在【部件】中使用:

1. MS ADO Data Control 6.0;

2. MS Chart Control 6.0;

3. MS Datalist Control 6.0;

然后建立List(Liststation)、MSChart(ChartDemo)、Combo(ComboYear,ComboChartType)、Label1~Label4,程序为:

Option Explicit

Public iChartType As Integer '当前图表类型

Public cnn As ADODB.Connection

'双击数据点可以更改数据,并反馈到图形上

Private Sub ChartDemo_PointActivated(Series As Integer, DataPoint As Integer, MouseFlags As Integer, Cancel As Integer)

Dim vtPoint

With ChartDemo

.Column = Series

.Row = DataPoint

vtPoint = InputBox("更改数据点:", , .Data)

If vtPoint <> "" Then

If IsNumeric(vtPoint) Then

.Data = vtPoint

Else

MsgBox "没有有效的数据点!"

End If

End If

End With

End Sub

'单击数据点在Label4上反映该点的值

Private Sub ChartDemo_PointSelected(Series As Integer, DataPoint As Integer, MouseFlags As Integer, Cancel As Integer)

' 允许用户在序列中通过选择特别的数据点来查阅它的值。

' 数据点的值被显示在名为 lblDatapoint 的标签中。

ChartDemo.Column = Series

ChartDemo.Row = DataPoint

Label4.Caption = "序列的值 " & Series & ", 点 " & DataPoint & " = " & ChartDemo.Data

End Sub

'选择图形类型

Private Sub ComboChartType_click()

Dim i As Integer

Dim strType As String

strType = ComboChartType.Text

Select Case strType

Case "饼图"

iChartType = 14

Case "折线图"

iChartType = 3

Case "立体图"

iChartType = 0

Case "柱状图"

iChartType = 9

End Select

ChartDemo.chartType = iChartType

ComboYear_click

End Sub

'选择年份

Private Sub ComboYear_click()

Dim strYear, strStation As String

Dim i As Integer

Dim arrChartData()

Dim strSql As String

Dim rstChartData As New ADODB.Recordset

strYear = ComboYear.Text

If strYear = "" Then

Exit Sub

End If

ChartDemo.Visible = True

strStation = Liststation.Text

strSql = "select * from addvdata where addvcd='" _

& strStation & "' and year=" & strYear

rstChartData.Open strSql, cnn ', adOpenDynamic, adLockOptimistic

If iChartType = 3 Then

ReDim arrChartData(1 To 12, 1 To 1)

For i = 1 To 12

arrChartData(i, 1) = rstChartData.Fields(i + 1)

Next i

With ChartDemo

.ChartData = arrChartData

.RowCount = 12

.ColumnLabelCount = 12

For i = 1 To 12

.Row = i

.RowLabel = rstChartData.Fields(i + 1).Name

Next i

.ColumnCount = 1

.Column = 1

.ColumnLabel = ""

.Refresh

End With

Else

ReDim arrChartData(1 To 1, 1 To 12)

For i = 1 To 12

arrChartData(1, i) = rstChartData.Fields(i + 1)

Next i

With ChartDemo

.ChartData = arrChartData

.ColumnCount = 12

.ColumnLabelCount = 12

For i = 1 To 12

.Column = i

.ColumnLabel = rstChartData.Fields(i + 1).Name

Next i

.RowCount = 1

.Row = 1

.RowLabel = ""

.Refresh

End With

End If

rstChartData.Close

strSql = ""

End Sub

Private Sub Form_Load()

Dim rst1 As New ADODB.Recordset

Set cnn = New ADODB.Connection

cnn.Open "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Demo"

If Err Then

MsgBox "数据库打开失败", vbOKOnly, "提示"

End

End If

ComboChartType.AddItem "饼图"

ComboChartType.AddItem "折线图"

ComboChartType.AddItem "立体图"

ComboChartType.AddItem "柱状图"

rst1.Open "select * from addvdata ", cnn

Do While Not rst1.EOF

Liststation.AddItem rst1!addvcd

rst1.MoveNext

Loop

rst1.Close

ChartDemo.Refresh

End Sub

'测站代码列表

Private Sub ListStation_Click()

Dim strScode As String

Dim rstYear As New ADODB.Recordset

strScode = Liststation.Text

If strScode = "" Then

Exit Sub

End If

ComboYear.Clear

rstYear.Open "select distinct year from addvdata where addvcd='" + strScode + "'", cnn ', adOpenDynamic, adLockOptimistic

Do While Not rstYear.EOF

ComboYear.AddItem rstYear.Fields("year")

rstYear.MoveNext

Loop

rstYear.Close

End Sub

用剪贴板向WORD中添加图形和文字建立一个COMMAND1和一个PICTURE1,在PICTURE1中添加一幅图。

Option Explicit

Dim objWord As Object

Private Sub Command1_Click()

Const CLASSOBJECT = "Word.Application"

On Error GoTo objError

Set objWord = CreateObject(CLASSOBJECT)

objWord.Visible = True

objWord.Documents.Add

With objWord

.ActiveDocument.paragraphs.Last.Range.Bold = False

.ActiveDocument.paragraphs.Last.Range.Font.Size = 14

.ActiveDocument.paragraphs.Last.Range.Font.Name = "黑体"

.ActiveDocument.paragraphs.Last.Range.Font.colorindex = 0

'.ActiveDocument.paragraphs.Last.Range.Text = Chr(13) & "向WORD中传递数据和图形练习"

End With

Clipboard.Clear

Clipboard.SetData Picture1.Picture

objWord.Selection.Paste

Clipboard.Clear

Clipboard.SetText "通过剪帖板向WORD传递字符"

objWord.Selection.Paste

objWord.PrintPreview = True '打印预览

'objWord.PrintOut '打印

'objWord.Quit '结束Word

Exit Sub

objError:

If Err <> 429 Then

MsgBox Str$(Err) & Error$

Set objWord = Nothing

Exit Sub

Else

Resume Next

End If

End Sub

在WORD中产生表格和文字Private Sub Command3_Click()

Dim objWord As Object

Set objWord = CreateObject("Word.Application")

objWord.Visible = True '取消此行最后加上.Quit在后台运行

objWord.Documents.Add '可以加上路径,打开指定文件

With objWord

.Selection.Font.Name = "黑体"

.Selection.Font.Size = 14

.Selection.Font.Bold = True

.Selection.TypeText Text:="xuewei"

.Selection.Font.Name = "宋体"

.Selection.Font.Size = 10.5

.Selection.Font.Bold = False

.Selection.TypeParagraph '换行

'产生一个2行5列的表格

.ActiveDocument.Tables.Add Range:=.Selection.Range, NumRows:=2, NumColumns:=5

.Selection.TypeText Text:="12"

.Selection.MoveRight '向右移动光标,移到最后一个后自动到下行的第一个

.Selection.TypeText Text:="34"

.Selection.MoveDown '向下移动光标

.Selection.TypeText Text:="56"

.Selection.MoveDown

.Selection.TypeParagraph

.Selection.TypeText Text:="end"

.Selection.TypeParagraph

End With

End Sub

向WORD中传送SELECT表和CHART控件图形添加PictureBox控件PicGraph,运行时先使Chart1控件有图形,然后点击Command3。

Private Sub Command3_Click()

Dim intWinState As Integer

Dim objWord As Object

Dim sql, i

Dim str1 As String

Dim Rows1, Columns1

On Error GoTo objError

Set objWord = CreateObject("Word.Application")

With objWord

.Visible = True

.Documents.Add '"c:\My Document\test1.doc"

.Selection.TypeText Text:="表标题"

.Selection.TypeParagraph

.Selection.TypeParagraph

.Selection.MoveUp , Count:=2

.Selection.Style = .ActiveDocument.Styles("标题 1")

.Selection.ParagraphFormat.Alignment = 1

.Selection.MoveDown

.Selection.TypeText Text:="插入表"

.Selection.TypeParagraph

End With

sql = "select * from hydnet"

rst0.Open sql, cnn

i = 0

While Not rst0.EOF

i = i + 1

rst0.MoveNext

Wend

Rows1 = i

Columns1 = rst0.Fields.Count

If i > 0 Then

objWord.ActiveDocument.Tables.Add Range:=objWord.Selection.Range, NumRows:=Rows1, NumColumns:=Columns1

rst0.MoveFirst

While Not rst0.EOF

For i = 0 To rst0.Fields.Count - 1

str1 = rst0.Fields(i)

objWord.Selection.TypeText Text:=str1

objWord.Selection.MoveRight

Next i

rst0.MoveNext

Wend

End If

objWord.Selection.MoveRight , Count:=2

objWord.Selection.TypeText Text:="图形显示"

objWord.Selection.TypeParagraph

objWord.Selection.TypeParagraph

Chart1.EditCopy

PicGraph.Picture = Clipboard.GetData

Clipboard.Clear

Clipboard.SetData PicGraph.Picture

objWord.Selection.Paste

'objWord.PrintPreview = True '打印预览

'objWord.PrintOut '打印

'objWord.Quit '结束Word

Set objWord = Nothing

rst0.Close

Exit Sub

objError:

If Err <> 429 Then

MsgBox Str$(Err) & Error$

Set objWord = Nothing

Exit Sub

Else

Resume Next

End If

End Sub

通过剪贴板打印CHART控件图形添加CommonDialog控件Common1,PictureBox控件PicGraph,运行时先使Chart1控件有图形,然后点击Command30。

Private Sub Command30_Click()

Dim intWinState As Integer

Dim intCopies As Integer

Dim intCopy As Integer

On Error GoTo errPrint

With Common1

.CancelError = True

.ShowPrinter

intCopies = .Copies

End With

'Expand to full screen to get large graph

intWinState = WindowState

WindowState = vbMaximized

Chart1.EditCopy

'Return to prior mode

WindowState = intWinState

PicGraph.Picture = Clipboard.GetData

For intCopy = 1 To intCopies

Printer.Print ""

Printer.PaintPicture PicGraph.Picture, 0, 0

'Add a caption at mid page

Printer.CurrentY = Printer.ScaleHeight / 2

Printer.FontSize = 18

Printer.CurrentX = 1500

'Printer.Print "Northwind Traders - " & frmMDIGraph.Caption

Printer.EndDoc

Next intCopy

errPrint:

Exit Sub

End Sub

写入HTML文件要引用“Microsoft Word 9.0 Object Library”,然后编程如下:

Private Sub Command1_Click()

Dim objWord As Object

Set objWord = CreateObject("Word.Application")

objWord.Visible = True

objWord.Documents.Add '"c:\My Documents\X2.HTM"

With objWord

.Selection.MoveDown

.Selection.Font.Name = "黑体"

.Selection.Font.Size = 14

.Selection.Font.Bold = True

.Selection.TypeText Text:="xuewei"

.Selection.Font.Name = "宋体"

.Selection.Font.Size = 10.5

.Selection.Font.Bold = False

.Selection.TypeParagraph '换行

'产生一个2行5列的表格

.ActiveDocument.Tables.Add Range:=.Selection.Range, NumRows:=2, NumColumns:=5

.Selection.TypeText Text:="12"

.Selection.MoveRight '向右移动光标,移到最后一个后自动到下行的第一个

.Selection.TypeText Text:="34"

.Selection.MoveDown '向下移动光标

.Selection.TypeText Text:="56"

.Selection.MoveDown

.Selection.TypeParagraph

.Selection.TypeText Text:="end6"

.Selection.TypeParagraph

.ActiveDocument.SaveAs FileName:="x1.htm", FileFormat:=wdFormatHTML, WritePassword _

:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _

SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _

False

.quit

End With

End Sub

十六 ActiveX 编程调用简单DLL的例子本例是一个ActiveX dll编程和调试的例子。实现简单的加法。

(1)建立工程1,其中有Form1:Command1;

(2)建立一个ActiveX dll控件(名为xdll02),类模块xclass2;

(3)在xclass2中代码如下:

Public den As Integer

Public Sub add(num2, num1 As Integer)

den = num1 + num2

End Sub

(4)生成xdll02.dll;

(5)选择【工程】/【引用】,选用xdll02;

(6)在Form1中添加Command1,Text1,Text2,Text3,代码如下:

Public xx1 As New xdll02.xClass2

Private Sub Command1_Click()

xx1.Add Text2, Text1

Text3 = xx1.den

End Sub

Private Sub Form_Load()

Text1 = 2

Text2 = 4

Text3 = 0

End Sub

(7)运行。运行时单击Command1,Text3中出现答案6。

注意,调试时,直接改动ActiveX dll中的代码即可,不需要重新安装dll。

调用DLL的另一个例子工程1:Form1:Command1

Tingdemo2(ActiveX dll):Class1,并形成组1。

运行前还要右击工程1,选择【设置为启动】,再引用Tingdemo2。

Class1代码:

Option Explicit

Public Name As String

Private mdtmCreated As Date

Public Property Get created() As Date

created = mdtmCreated

End Property

Public Sub ReverseName()

Dim intCt As Integer

Dim strNew As String

For intCt = 1 To Len(Name)

strNew = Mid$(Name, intCt, 1) & strNew

Next

Name = strNew

End Sub

Private Sub Class_Initialize()

mdtmCreated = Now

MsgBox "Name=" & Name & vbCrLf & "Created:" & created, , "thing initialize"

End Sub

Private Sub Class_Terminate()

MsgBox "Name = " & Name & vbCrLf & "Created:" & created, , "thing terminate"

End Sub

Form1代码:

Option Explicit

Private mth As New tingdemo2.Class1

Private Sub Command1_Click()

MsgBox "Name=" & mth.Name & vbCrLf & "Created:" & mth.created, , "from thing"

End Sub

。。。。。。

Private Sub Form_Load()

mth.Name = InputBox("Enter a name for the Thing:")

End Sub

简单ActiveX控件编程先打开标准EXE工程,再填加一个ActiveX控件工程,再在Usercontrol1中填加控件如下:

代码:

Private Sub Command1_Click()

If List1.ListIndex >= 0 Then

List2.AddItem List1.List(List1.ListIndex)

List1.RemoveItem (List1.ListIndex)

End If

End Sub

Private Sub Command2_Click()

If List2.ListIndex >= 0 Then

List1.AddItem List2.List(List2.ListIndex)

List2.RemoveItem (List2.ListIndex)

End If

End Sub

Private Sub List1_Click()

Command1.Enabled = True

Command2.Enabled = False

End Sub

Private Sub List2_Click()

Command1.Enabled = False

Command2.Enabled = True

End Sub

Private Sub UserControl_Initialize()

List1.AddItem "AAA"

List1.AddItem "BBB"

List1.AddItem "CCC"

List1.AddItem "DDD"

End Sub

功能为:单击Command1,List1中的选择项右移,单击Command2,List2中的选择项左移;

关闭工程2,在Form1中填加ActiveX控件Control11,就可以运行了。

ActiveX控件的事件和方法回到Control1,填加一个Command3,再打开菜单中的“ActiveX控件接口向导”,先单击“<<”清除所有选定名称,单击“下一步”,单击“新建”,填加如下表:

公有名称

类型

映射

成员

CtlEnd

Event

Command3

Click

Clear1

Method

List1

Clear

Add1

Method

List1

AddItem

Sub1

Method

List1

RemoveItem

完成后,代码变成:

……

Event ctlend() 'MappingInfo=Command3,Command3,-1,Click

'注意!不要删除或修改下列被注释的行!

'MappingInfo=List1,List1,-1,AddItem

Public Sub add1(ByVal Item As String, Optional ByVal Index As Variant)

List1.AddItem Item, Index

End Sub

'注意!不要删除或修改下列被注释的行!

'MappingInfo=List1,List1,-1,RemoveItem

Public Sub sub1(ByVal Index As Integer)

List1.RemoveItem Index

End Sub

'注意!不要删除或修改下列被注释的行!

'MappingInfo=List1,List1,-1,Clear

Public Sub clear1()

List1.Clear

End Sub

Private Sub Command3_Click()

RaiseEvent ctlend

End Sub

再关闭Control1,到Form1中添加Control11,再填加3个按钮如下:

代码为:

Private Sub Command4_Click()

Dim inItem As String

inItem = InputBox("Please input data:")

UserControl11.add1 inItem

End Sub

Private Sub Command5_Click()

Dim ItemNum As String

ItemNum = InputBox("Please input Num:")

UserControl11.sub1 ItemNum

End Sub

Private Sub Command6_Click()

UserControl11.Clear1

End Sub

Private Sub Form_Load()

UserControl11.add1 "new 1"

End Sub

Private Sub UserControl11_ctlend()

End

End Sub

运行后,产生效果为:单击Add,在List1中可以添加一项,单击Sub,在List1中输入序号可以减少一行,单击Clear,清除List1中所有数据,单击Quit退出。

ActiveX属性和事件调用同前,先产生一个普通工程,再产生一个ActiveX控件工程,其上添加一个Command和Text控件,再打开菜单中的“ActiveX控件接口向导”,先单击“<<”清除所有选定名称,单击“下一步”,单击“新建”,填加如下表:

公有名称

类型

映射

成员

pclick

Event

Command1

Click

Text0

Property

Text1

Text

完成后,代码变成:

'事件声明:

Event pclick() 'MappingInfo=Command1,Command1,-1,Click

'注意!不要删除或修改下列被注释的行!

'MappingInfo=Text1,Text1,-1,Text

Public Property Get text0() As String

text0 = Text1.Text

End Property

Public Property Let text0(ByVal New_text0 As String)

Text1.Text() = New_text0

PropertyChanged "text0"

End Property

Private Sub Command1_Click()

RaiseEvent pclick

MsgBox Me.text0 ‘自己添加

End Sub

'从存贮器中加载属性值

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

Text1.Text = PropBag.ReadProperty("text0", "Text1")

End Sub

'将属性值写到存储器

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

Call PropBag.WriteProperty("text0", Text1.Text, "Text1")

End Sub

其中msgbox一行是另外添加的。再在普通工程的form1中加上这个控件,如下编写:

Private Sub Form_Load()

UserControl11.text0 = "print123"

End Sub

Private Sub UserControl11_pclick()

'Print UserControl11.text0

End Sub

就可以调用ActiveX控件的属性和事件了。

十七 面向对象的编程调用类模块的对象本例可以看出一个对象在初始化和释放时的过程。

放置控件: Form1:Command1, Command2, Command3, Command4, Command5,

Class1(类模块):name=Thing

属性设置:

Class1代码:

Option Explicit

Public Name As String

Private mdtmCreated As Date

Public Property Get created() As Date

created = mdtmCreated

End Property

Public Sub ReverseName()

Dim intCt As Integer

Dim strNew As String

For intCt = 1 To Len(Name)

strNew = Mid$(Name, intCt, 1) & strNew

Next

Name = strNew

End Sub

Private Sub Class_Initialize()

mdtmCreated = Now

MsgBox "Name=" & Name & vbCrLf & "Created:" & created, , "thing initialize"

End Sub

Private Sub Class_Terminate()

MsgBox "Name = " & Name & vbCrLf & "Created:" & created, , "thing terminate"

End Sub

Form1代码:

Option Explicit

'对 Thing 对象的引用。

Private mth As thing

'按钮“Create New Thing”。

Private Sub Command1_Click()

MsgBox "Name=" & mth.Name & vbCrLf & "Created:" & mth.created, , "from thing"

End Sub

'按钮“Reverse the Thing's Name”。

Private Sub Command2_Click()

mth.ReverseName

'通过设置值来单击“Show the Thing”。

Command1.Value = True

End Sub

'新建

Private Sub Command3_Click()

Set mth = New thing

mth.Name = InputBox("Enter a name for new Thing:")

End Sub

'暂存

Private Sub Command4_Click()

Dim thTemp As New thing

thTemp.Name = InputBox("Enter a name for the temporary Thing:")

End Sub

'释放

Private Sub Command5_Click()

Set mth = Nothing

End Sub

Private Sub Form_Load()

Set mth = New thing

mth.Name = InputBox("Enter a name for the Thing:")

End Sub

属性过程编程用Property Get读属性,Property Let写(改变)属性,Property Set来给一个对象设置引用。

放置控件: Form1:Command1, Command2, Command3

代码:

Private Sizestatus As Boolean

Property Get Sizer() As Boolean

Sizer = Sizestatus

End Property

Property Let Sizer(x As Boolean)

Sizestatus = x

If x = False Then

Width = Width / 1.5

Else

Width = Width * 1.5

End If

End Property

Private Sub Command1_Click()

Sizer = False

End Sub

Private Sub Command2_Click()

Sizer = True

End Sub

Private Sub Command3_Click()

If Sizer = False Then Print "lessen form, Sizer=" & Sizer

If Sizer = True Then Print "larger form, Sizer=" & Sizer

End Sub

注意,在点击Command1时,调用Property Let过程。这时x作为sizer的值,带入进去计算。点击Command2时,调用Property Get过程。

十八 ActiveX控件网络实用编程建立一个简单的ADO连接1.在【控制面板】/【ODBC数据源】建立一个文件DSN,如test02.dsn,连接到本地的一个数据库,如C:\My Documents\共享\test1.mdb;

2.在VB中建立一个ActiveX控件工程(Gxue20)和一个用户控件(Uxue20.ctl);

3.添加部件Microsoft ADO Data Control 6.0,把控件实例ADODC1加到Uxue20上;再添加一个Text1;

4.添加ADODC1属性ConnectionString,单击【。。。】,在对话框中选择【使用连接字符串】,选择test02.dsn,再将生成的字符串的本地地址DBQ=C:\My Documents\共享\test1.mdb….改为服务器地址,如DBQ=\\xuewei\共享\test1.mdb…;再将RecordSource属性设为一个表名(如表1);

5.把Text1绑定到ADODC1的表的“代码”字段上(设DataSource=ADODC1;DataField=代码);

6.保存工程和控件;

7.使用【外接程序】/【打包和展开向导】,把Gxue20做成一个Internet包,放在一个WEB文件夹中。

8.这时可以在网络上运行自动生成文件Gxue20.htm了。

简单数据库打印同前,把ADODC1加到Uxue20上;再添加一个Command1;

把上例ADODC1的ConnectinString值复制到程序中,再加上简单打印语句:

Private Sub Command1_Click()

Dim dbq1 As String

Dim pw, ph As Integer

Dim px, py As Integer

Dim temp As String

dbq1 = "DBQ=\\xuewei\共享\test1.mdb;DefaultDir=c:\My Documents\共享\t;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test03.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Adodc1.ConnectionString = "MSDASQL.1;Persist Security Info=False;Extended Properties=" & dbq1

Adodc1.RecordSource = "select * from 表1"

Adodc1.Refresh

pw = 400: ph = 650

px = 20: py = 100

Printer.Scale (0, 0)-(pw, ph)

temp = Adodc1.Recordset(2)

py = py + 30

Printer.CurrentX = px

Printer.CurrentY = py

Printer.Print temp

Printer.EndDoc

MsgBox "打印完毕"

End Sub

程序运行结果,打印一行数据。

数据表直接打印ActiveX控件制作:

1.新建ActiveX控件工程;

2.添加ADODC1控件和COMMAND1控件;

3.代码:

Option Explicit

Dim pw, ph '纸宽和纸高的坐标

Dim px, py

Dim ti '报表字段数

Dim wh, ww '字宽和字高

Dim table1 '第一页表格开始高度

Dim daima(100, 3) As String

Dim bnum As Integer

Private Function len1(str As String) As Integer

Dim si, i As Integer

Dim str1 As String

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2

Else

si = si + 1

End If

Next

len1 = si

End Function

Private Function len2(s2 As String, si As Integer) As String

Do While len1(s2) > si

s2 = Mid(s2, 1, Len(s2) - 1)

Loop

len2 = s2

End Function

Private Sub finput()

Dim i As Integer

ti = Adodc1.Recordset.Fields.Count

For i = 1 To ti

daima(i, 1) = Adodc1.Recordset.Fields(i - 1).Name

daima(i, 2) = len1(daima(i, 1)) + 2 '表格宽度

daima(i, 3) = Adodc1.Recordset.Fields(i - 1).Name

Next i

End Sub

Private Sub printhead()

Dim pp0, tpp, i

Printer.CurrentX = 150: Printer.CurrentY = 30

Printer.FontSize = 19: Printer.FontBold = True

pp0 = 20 - (len1(Thead))

tpp = ""

For i = 1 To pp0

tpp = tpp + " "

Next i

Printer.Print tpp & Thead

table1 = 50

End Sub

Private Sub printframe(ByVal pp1 As Integer, pp2 As Integer, pp3 As Integer)

Dim py1 As Integer

Dim pxm, pxi, px1, bi

Dim daim1, daim2 As String

pxm = 0 '计算报表宽度

For pxi = 1 To ti

pxm = pxm + daima(pxi, 2) * ww

Next

Printer.DrawWidth = 3

Printer.FontSize = 11

Printer.FontBold = True

py = pp1 + (pp3 + 2 - pp2) * wh '计算报表高度

Printer.Line (0, pp1)-(pxm, pp1) '打印边框

Printer.Line (pxm, pp1)-(pxm, py)

Printer.Line (pxm, py)-(0, py)

Printer.Line (0, py)-(0, pp1)

Printer.DrawWidth = 1 '打印表头

px = 0

For pxi = 1 To ti

daim2 = daima(pxi, 1)

px1 = Int((daima(pxi, 2) - len1(daim2)) / 2)

Printer.CurrentX = px + px1 * ww

Printer.CurrentY = pp1 + Int(0.2 * wh)

Printer.Print daima(pxi, 1) '打印字段名

px = px + daima(pxi, 2) * ww

Printer.Line (px, pp1)-(px, py) '打印竖线

Next

Printer.FontBold = False

py = pp1 + wh

For bi = pp2 To pp3

px = 0

For pxi = 1 To ti

Printer.CurrentX = px + 2

Printer.CurrentY = py + Int(0.2 * wh)

daim1 = daima(pxi, 3)

'Select Case daim1

'Case "序号": daim2 = bi '打印序号

'Case "空白": daim2 = "" '打印空白字段

'Case Else: daim2 = Adodc1.Recordset(daim1)

'End Select

If IsNull(Adodc1.Recordset(daim1)) Then

daim2 = ""

Else

daim2 = Adodc1.Recordset(daim1)

End If

Printer.Print len2(daim2, Int(daima(pxi, 2))) '打印字段内容

px = px + daima(pxi, 2) * ww

Next pxi

Printer.Line (0, py)-(pxm, py) '打印横线

py = py + wh

Adodc1.Recordset.MoveNext

Next bi

End Sub

Private Sub printfoot(pp1 As Integer, pp2 As Integer) '打印页码

px = pw - 300: py = ph - 5 * wh

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print "总页数:" & pp2 & " 当前页数:" & pp1

End Sub

Private Sub printail(ByVal p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer, p5 As Integer)

Call printframe(p1, p2, p3)

Call printfoot(p4, p5)

End Sub

Private Sub printbody()

Dim page As Integer '页码数

Dim pi As Integer

Dim p1y As Integer '第一页记录数

Dim p2y As Integer '第二页记录数

Dim table2 '第二页起始位置

p2y = 37

table2 = 20

table1 = table1 + wh

p1y = (ph - table1 - 100) / wh

Adodc1.Recordset.MoveFirst

If bnum < p1y + 1 Then

Call printail(table1, 1, bnum, 1, 1) '只有一页

Else

page = Int(((bnum - p1y) / p2y) + 1.9999) '计算页码

Call printail(table1, 1, p1y, 1, page) '打印第一页

If page > 2 Then

For pi = 1 To page - 2

Printer.NewPage

Call printail(table2, p1y + (pi - 1) * p2y + 1, p1y + pi * p2y, pi + 1, page)

Next pi

Printer.NewPage

Call printail(table2, p1y + (page - 2) * p2y + 1, bnum, page, page) '打印最后一页

Else

Printer.NewPage

Call printail(table2, p1y + 1, bnum, page, page) '打印最后一页

End If

End If

End Sub

Private Sub printp()

Dim sp '左边距

pw = 850: ph = 600

wh = 13

ww = 9

sp = 40

Printer.Scale (-sp, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc ‘开始打印

End Sub

Private Sub Command1_Click()

Dim dbq1

dbq1 = "DBQ=\\xuewei\共享\test1.mdb;DefaultDir=c:\My Documents\共享\t;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test03.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Adodc1.ConnectionString = "MSDASQL.1;Persist Security Info=False;Extended Properties=" & dbq1

Adodc1.RecordSource = Tname

Adodc1.Refresh

bnum = Adodc1.Recordset.RecordCount

finput

printp

MsgBox "打印完毕。共有" & bnum & "条记录"

Adodc1.Recordset.Close

Command1.Enabled = False

End Sub

4.产生Tname和Thead属性的接口;

5.打成INTERNET包;

6.在网页上代码如下:

<HTML>

<HEAD>

<TITLE>Gxue32.CAB</TITLE>

</HEAD>

<BODY>

数据库表格打印示例

<p></p>

<OBJECT ID="Uxue32"

CLASSID="CLSID:0DF80DF0-B268-11D5-9C19-0010D70B5752"

CODEBASE="Gxue32.CAB#version=1,0,0,0" width="79" height="33">

<param name="_ExtentX" value="2090">

<param name="_ExtentY" value="873">

<param name="Tname" value="表1">

<param name="Thead" value="数据简表">

</OBJECT>

</BODY>

</HTML>

数据表格式打印ActiveX控件制作步骤同上,增加一个Tarray属性,代码:

Option Explicit

Dim pw, ph '纸宽和纸高的坐标

Dim px, py

Dim ti '报表字段数

Dim wh, ww '字宽和字高

Dim table1 '第一页表格开始高度

Dim daima(100, 3) As String ‘打印数组

Dim tax(100, 2) As String ‘格式数组

Dim bnum As Integer ‘总记录数

Private Function len1(str As String) As Integer

Dim si, i As Integer

Dim str1 As String

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2

Else

si = si + 1

End If

Next

len1 = si

End Function

Private Function len2(s2 As String, si As Integer) As String

Do While len1(s2) > si

s2 = Mid(s2, 1, Len(s2) - 1)

Loop

len2 = s2

End Function

Private Function midx(taa) As String

Dim ii As Integer

Dim char1 As String

char1 = Mid(taa, 1, 1)

midx = ""

ii = 1

Do While char1 <> "{" And ii <= Len(taa) + 1

midx = midx & char1

ii = ii + 1

char1 = Mid(taa, ii, 1)

Loop

'If ii = Len(taa) Then midx = taa

'MsgBox "taa=" & taa & " midx=" & midx

End Function

Private Sub toarray(tt)

Dim ii As Integer

Dim tt0

tax(0, 0) = midx(tt)

tt0 = Mid(tt, Len(tax(0, 0)) + 2, Len(tt))

If tax(0, 0) > 0 Then

For ii = 1 To tax(0, 0)

tax(ii, 1) = midx(tt0)

tt0 = Mid(tt0, Len(tax(ii, 1)) + 2, Len(tt0))

tax(ii, 2) = midx(tt0)

tt0 = Mid(tt0, Len(tax(ii, 2)) + 2, Len(tt0))

Next ii

End If

End Sub

Private Sub finput()

Dim i As Integer

toarray (Tarray)

ti = Adodc1.Recordset.Fields.Count

If ti > tax(0, 0) Then ti = tax(0, 0)

For i = 1 To ti

daima(i, 1) = tax(i, 1)

daima(i, 2) = tax(i, 2) '表格宽度

daima(i, 3) = Adodc1.Recordset.Fields(i - 1).Name

Next i

End Sub

Private Sub printhead()

Dim pp0, tpp, i

Printer.CurrentX = 150: Printer.CurrentY = 30

Printer.FontSize = 19: Printer.FontBold = True

pp0 = 20 - (len1(Thead))

tpp = ""

For i = 1 To pp0

tpp = tpp + " "

Next i

Printer.Print tpp & Thead

table1 = 50

End Sub

Private Sub printframe(ByVal pp1 As Integer, pp2 As Integer, pp3 As Integer)

Dim py1 As Integer

Dim pxm, pxi, px1, bi

Dim daim1, daim2 As String

pxm = 0 '计算报表宽度

For pxi = 1 To ti

pxm = pxm + daima(pxi, 2) * ww

Next

Printer.DrawWidth = 3

Printer.FontSize = 11

Printer.FontBold = True

py = pp1 + (pp3 + 2 - pp2) * wh '计算报表高度

Printer.Line (0, pp1)-(pxm, pp1) '打印边框

Printer.Line (pxm, pp1)-(pxm, py)

Printer.Line (pxm, py)-(0, py)

Printer.Line (0, py)-(0, pp1)

Printer.DrawWidth = 1 '打印表头

px = 0

For pxi = 1 To ti

daim2 = daima(pxi, 1)

px1 = Int((daima(pxi, 2) - len1(daim2)) / 2)

Printer.CurrentX = px + px1 * ww

Printer.CurrentY = pp1 + Int(0.2 * wh)

Printer.Print daima(pxi, 1) '打印字段名

px = px + daima(pxi, 2) * ww

Printer.Line (px, pp1)-(px, py) '打印竖线

Next

Printer.FontBold = False

py = pp1 + wh

For bi = pp2 To pp3

px = 0

For pxi = 1 To ti

Printer.CurrentX = px + 2

Printer.CurrentY = py + Int(0.2 * wh)

daim1 = daima(pxi, 3)

'Select Case daim1

'Case "序号": daim2 = bi '打印序号

'Case "空白": daim2 = "" '打印空白字段

'Case Else: daim2 = Adodc1.Recordset(daim1)

'End Select

If IsNull(Adodc1.Recordset(daim1)) Then

daim2 = ""

Else

daim2 = Adodc1.Recordset(daim1)

End If

Printer.Print len2(daim2, Int(daima(pxi, 2))) '打印字段内容

px = px + daima(pxi, 2) * ww

Next pxi

Printer.Line (0, py)-(pxm, py) '打印横线

py = py + wh

Adodc1.Recordset.MoveNext

Next bi

End Sub

Private Sub printfoot(pp1 As Integer, pp2 As Integer) '打印页码

px = pw - 300: py = ph - 5 * wh

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print "总页数:" & pp2 & " 当前页数:" & pp1

End Sub

Private Sub printail(ByVal p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer, p5 As Integer)

Call printframe(p1, p2, p3)

Call printfoot(p4, p5)

End Sub

Private Sub printbody()

Dim page As Integer '页码数

Dim pi As Integer

Dim p1y As Integer '第一页记录数

Dim p2y As Integer '第二页记录数

Dim table2 '第二页起始位置

p2y = 37

table2 = 20

table1 = table1 + wh

p1y = (ph - table1 - 100) / wh

Adodc1.Recordset.MoveFirst

If bnum < p1y + 1 Then

Call printail(table1, 1, bnum, 1, 1) '只有一页

Else

page = Int(((bnum - p1y) / p2y) + 1.9999) '计算页码

Call printail(table1, 1, p1y, 1, page) '打印第一页

If page > 2 Then

For pi = 1 To page - 2

Printer.NewPage

Call printail(table2, p1y + (pi - 1) * p2y + 1, p1y + pi * p2y, pi + 1, page)

Next pi

Printer.NewPage

Call printail(table2, p1y + (page - 2) * p2y + 1, bnum, page, page) '打印最后一页

Else

Printer.NewPage

Call printail(table2, p1y + 1, bnum, page, page) '打印最后一页

End If

End If

End Sub

Private Sub printp()

Dim sp '左边距

pw = 850: ph = 600

wh = 13

ww = 9

sp = 40

Printer.Scale (-sp, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc

End Sub

Private Sub Command1_Click()

Dim dbq1

dbq1 = "DBQ=\\xuewei\共享\test1.mdb;DefaultDir=c:\My Documents\共享\t;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Program Files\Common Files\ODBC\Data Sources\test03.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UID=admin;UserCommitSync=Yes;"

Adodc1.ConnectionString = "MSDASQL.1;Persist Security Info=False;Extended Properties=" & dbq1

Adodc1.RecordSource = Tname

Adodc1.Refresh

bnum = Adodc1.Recordset.RecordCount

finput

printp

MsgBox "打印完毕。共有" & bnum & "条记录"

Adodc1.Recordset.Close

Command1.Enabled = False

End Sub

打包后在网页上编程为:

<script language="vbscript">

<!--

Option Explicit

dim ta0(100,2)

Private Function len1(str)

Dim si, i

Dim str1

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2

Else

si = si + 1

End If

Next

len1 = si

End Function

Private Function tostring ()

Dim ii

tostring = Ta0(0, 0) & "{"

For ii = 1 To Ta0(0, 0)

If IsNull(Ta0(ii, 1)) Then Ta0(ii, 1) = ""

tostring = tostring & Ta0(ii, 1) & "{"

If IsNull(Ta0(ii, 2)) Then Ta0(ii, 2) = 0

If Ta0(ii, 2) < len1(Ta0(ii, 1)) + 2 Then

Ta0(ii, 2) = len1(Ta0(ii, 1)) + 2

End If

tostring = tostring & Ta0(ii, 2) & "{"

Next

End Function

Private Sub window_onload()

form1.Uxue33.Tname = "注册登记表"

form1.Uxue33.Thead = "取水许可证系统注册登记表"

Ta0(0, 0) = "10"

Ta0(1, 1) = "注册名"

Ta0(1, 2) = "8"

Ta0(2, 1) = "密码"

Ta0(2, 2) = "8"

Ta0(3, 1) = "姓名"

Ta0(3, 2) = "8"

Ta0(4, 1) = "性别"

Ta0(4, 2) = "4"

Ta0(5, 1) = "单位"

Ta0(5, 2) = "16"

Ta0(6, 1) = "注册用途"

Ta0(6, 2) = "11"

Ta0(7, 1) = "电子信箱"

Ta0(7, 2) = "10"

Ta0(8, 1) = "批准"

Ta0(8, 2) = "6"

Ta0(9, 1) = "权限"

Ta0(9, 2) = "6"

Ta0(10, 1) = "取水用途"

Ta0(10, 2) = "10"

'Ta0(11, 1) = "fdsfd"

'Ta0(11, 2) = "8"

'Ta0(12, 1) = "123fdsfd"

'Ta0(12, 2) = "1"

form1.Uxue33.Tarray = tostring

msgbox form1.Uxue33.Tarray

end sub

-->

</script>

<form method="POST" action="" name="form1">

带参数打印示例<p>

<OBJECT ID="Uxue33"

CLASSID="CLSID:8083B900-B2AD-11D5-9C19-0010D70B5752"

CODEBASE="gxue33/Gxue33.CAB#version=1,0,0,0" width="82" height="34">

<param name="_ExtentX" value="2170">

<param name="_ExtentY" value="900">

<param name="Tname" value="0">

<param name="Thead" value="0">

<param name="Tarray" value="0">

</OBJECT>

文件打印ActiveX控件制作步骤同上,增加Thead属性(传递文件标题)和Tarray属性(传递文件内容,第一个分解元素为文件内容行数)。

代码:

Option Explicit

Dim pw, ph '纸宽和纸高的坐标

Dim px, py

Dim sp '左边距

Dim table1 '正文开始高度

Dim tax(100, 2) As String

Private Function len1(str As String) As Integer

Dim si, i As Integer

Dim str1 As String

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2

Else

si = si + 1

End If

Next

len1 = si

End Function

Private Function midx(taa) As String

Dim ii As Integer

Dim char1 As String

char1 = Mid(taa, 1, 1)

midx = ""

ii = 1

Do While char1 <> "{" And ii <= Len(taa) + 1

midx = midx & char1

ii = ii + 1

char1 = Mid(taa, ii, 1)

Loop

End Function

Private Sub toarray(tt)

Dim ii As Integer

Dim tt0

tax(0, 0) = midx(tt)

tt0 = Mid(tt, Len(tax(0, 0)) + 2, Len(tt))

If tax(0, 0) > 0 Then

For ii = 1 To tax(0, 0)

tax(ii, 1) = midx(tt0)

tt0 = Mid(tt0, Len(tax(ii, 1)) + 2, Len(tt0))

tax(ii, 2) = midx(tt0)

tt0 = Mid(tt0, Len(tax(ii, 2)) + 2, Len(tt0))

'MsgBox tax(ii, 1)

Next ii

End If

End Sub

Private Sub printhead()

Dim pp0, tpp, i

Printer.CurrentX = 150: Printer.CurrentY = 30

Printer.FontSize = 19: Printer.FontBold = True

pp0 = 20 - (len1(Thead))

tpp = ""

For i = 1 To pp0

tpp = tpp + " "

Next i

Printer.Print tpp & Thead

table1 = 70

End Sub

Private Sub printbody() '打印文字

Dim i

Printer.FontSize = 12: Printer.FontBold = False

px = sp: py = table1

For i = 1 To tax(0, 0)

Printer.CurrentX = px: Printer.CurrentY = py

Printer.Print tax(i, 1)

py = py + 20

Next i

End Sub

Private Sub printp()

pw = 850: ph = 600

sp = 40

Printer.Scale (-sp, 0)-(pw, ph)

printhead

printbody

Printer.EndDoc

End Sub

Private Sub Command1_Click()

toarray (Tarray)

printp

MsgBox "打印完毕"

Command1.Enabled = False

End Sub

网页程序为:

<script language="vbscript">

<!--

Option Explicit

Dim Ta0(100, 2)

Private Function len1(str)

Dim si, i

Dim str1

si = 0

For i = 1 To Len(str)

str1 = Mid(str, i, 1)

If Asc(str1) < 0 Then

si = si + 2

Else

si = si + 1

End If

Next

len1 = si

End Function

Private Function tostring()

Dim ii

tostring = Ta0(0, 0) & "{"

For ii = 1 To Ta0(0, 0)

If IsNull(Ta0(ii, 1)) Then Ta0(ii, 1) = ""

tostring = tostring & Ta0(ii, 1) & "{"

tostring = tostring & " {"

Next

End Function

Private Sub window_onload()

form1.Uxue34.Thead = "取水许可证通知书"

Ta0(0, 0) = 8

Ta0(1, 1) = "北京市第9水厂:"

Ta0(2, 1) = " 你的取水许可证申请已经通过,请于近期前来我局领取取水许可证。"

Ta0(3, 1) = " "

Ta0(4, 1) = " "

Ta0(5, 1) = " 北京市水利局水资源处"

Ta0(6, 1) = " "

Ta0(7, 1) = "电话:66666666 EMAIL :ziyuan@jwcb.gov.cn"

Ta0(8, 1) = "地址:海淀区翠微路甲3号 经办人:孟虹"

'Ta0(9, 1) = ""

'Ta0(10, 1) = ""

form1.Uxue34.Tarray = tostring

'MsgBox Uxue34.Tarray

End Sub

-->

</script>

<form method="POST" action="" name="form1">

<OBJECT ID="Uxue34"

CLASSID="CLSID:6502D511-B37F-11D5-9C19-0010D70B5752"

CODEBASE="Gxue34.CAB#version=1,0,0,0" width="82" height="34">

<param name="_ExtentX" value="2170">

<param name="_ExtentY" value="900">

<param name="Tarray" value="0">

<param name="Thead" value="0">

</OBJECT>

十九 编程实例数据库冗余记录删除'操作步骤:

'1.运行本程序,输入数据库组名、数据库名;

'2.输入判断冗余的主键的字段序号,第一个为0;

'3.输入表名;

'4.点击“删除”,可以在数据表中删除所有冗余的记录。

如图添加控件:

Option Explicit

Dim cnn As ADODB.Connection '数据库连接

Dim Rst1 As ADODB.Recordset

Dim Rst2 As ADODB.Recordset

Private Sub Command1_Click()

Dim i As Long 'delete records number

Dim j As Long 'records series number

Dim si As String

Dim ts As String 'mast key value

Dim ti As Integer 'mast key position

Dim pi As Long 'progressBar value

Dim ri As Long 'records number

Dim rj As Long

Set cnn = New ADODB.Connection

si = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=" & _

Text5.Text & ";Data Source=" & Text4.Text

cnn.Open si

Set Rst2 = New ADODB.Recordset

si = "select * from " & Text3.Text

Rst2.Open si, cnn, adOpenDynamic, adLockOptimistic

ti = Text1.Text

ri = 0

While Not Rst2.EOF

Rst2.MoveNext

ri = ri + 1

Wend

i = 0

j = 1

pi = 0

rj = 0

ProgressBar1.Max = ri + 1

ProgressBar1.Min = 0

Rst2.MoveFirst

While Not Rst2.EOF

ts = Rst2.Fields(ti)

If tfind(ts, ti, j, Rst2) Then

Rst2.Delete

i = i + 1

j = j - 1

End If

Rst2.MoveNext

j = j + 1

rj = rj + 1

ProgressBar1.Value = rj

Wend

MsgBox "一共删除了" & i & "条记录。"

End Sub

Function tfind(ii As String, tti As Integer, jj As Long, rst As ADODB.Recordset) As Boolean

Dim bll As Boolean

Dim i As Long

tfind = False

bll = True

i = 0

rst.MoveNext

While Not rst.EOF And bll

If rst.Fields(tti) = ii Then

tfind = True

bll = False

End If

rst.MoveNext

Wend

rst.MoveFirst

For i = 0 To jj - 2

rst.MoveNext

Next i

End Function

Private Sub Command2_Click()

End

End Sub

Private Sub Command3_Click()

Dim si As String

si = "数据库冗余数据删除工具,by xuewei,04/20/2003"

frmSplash.Show

End Sub

Private Sub Form_Load()

Text1.Text = 0

Text3.Text = "biao2"

Text4.Text = "temp"

Text5.Text = "xue01"

End Sub

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有