还剩35页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
36第十一章 案例集锦
1111.1 我的桌面小闹钟案例集锦在前面的章节中讲述了使用VB创建数据库应用程序的几个范例,其实作为编程语言来说,VB易于掌握和提高,可以极为迅速和简洁的创建Windows应用程序,非常适合普通的用户来编写符合自己需要的实用小程序在接下来的内容中将向读者介绍几个用VB__实用小程序的方法,并且结合实例向读者介绍VB编程中的许多技巧案例一 我的桌面小闹钟
一、概述在本例中将创建一个可以自动跟随鼠标__的小闹钟,实时地显示当前计算机的时间,并且允许用户添加、删除和修改定时任务,这些任务将被保存在一个Ac__ss数据库中,在设置的时间到达时,闹钟将用音乐警报,并弹出消息框来提示用户其功能模块图如图
1.1所示图
1.1 系统的功能模块图
二、数据库的准备通过Ac__ss或者VB可视化数据管理器创建一个Ac__ss数据库,在其中添加一个名为“任务列表”的数据表该数据表的结构如表
1.1所示表
1.1 “任务列表”数据表的结构字段名称任务编号任务时间任务内容任务状态字段类型文本文本文本文本字段大小151510010主键是否否否
三、应用程序的编写在VB中创建一个新的“标准EXE”工程,将其命名为“我的小闹钟”在工程默认的窗体Form1中添加一个__控件,两个标签控件,一个时间控件,依表
11.2至表
11.5所示的内容设置窗体和控件的属性表
1.2 窗体Form1的属性名称BorderStyleShowInTaskBarForm10-NoneFalse表
1.3 __控件的属性名称Appearan__BackColorBorderStylePicture10-FlatH00FF80801-FixedSingle表
1.4 标签控件的属性名称Alig__entBackStyleBorderStyleCaptionForeColorLabel1Label22-__nter2-__nter0-Transparent0-Transparent0-None0-None我的小闹钟00:00:00H00FFFFFFH80000012表
1.5 时间控件的属性名称EnableIntervalTimer1True100在控件箱窗体的空白部分右键单击,在弹出的菜单中选择“部件”,将打开“部件”对话框,如图
1.2所示图
1.2 “部件”对话框在“部件”对话框中选择“控件”选项卡,在其列表中找到“MicrosoftMultimediaControl
6.0”,在其前方的复选框中打勾,单击“确定”按钮,向工程中添加对MutimediaMCI控件的引用在控件箱的最后将出现MutimediaMCI控件的图标,选中其图标,在Form1中绘出其实例,如图
1.3所示,其属性将在代码中设置图
1.3 添加MutimediaMCI控件的Form1在工程中添加一个普通窗体Form2,如表
1.7和表
1.8所示为其设置属性并添加菜单表
1.7 窗体Form2的属性名称BorderStyleCaptionShowInTaskBarForm21-FixedSingle任务列表True表
1.8 窗体Form2的菜单标题名称复选缩进等级菜单编辑任务列表跟随鼠标退出mnu__inmnuRWmnuGSmnuQuit不选中不选中选中不选中无缩进缩进缩进缩进在窗体上添加一个框架控件,两个标签控件,一个文本框控件和4个按钮控件,并且同添加MutimediaMCI控件一样,在窗体中添加__skedEdit控件、ADOData控件和DataGrid控件并创建其实例按照表
1.9至表
1.15所示内容设置这些控件的属性表
1.9 框架控件的属性名称CaptionFrame2任务表
1.10 标签控件的属性名称Alig__entCaptionLabel1Label20-LeftJustfiy0-LeftJustfiy闹响时间任务内容表
1.11 文本框控件的属性名称TextText1请输入任务内容表
1.12 按钮控件的属性名称CaptionCom__nd1新增任务Com__nd2Com__nd3Com__nd4删除任务修改任务关闭表
1.13 __skedEdit的属性名称For__t__skPromptChar__skEdBox1hh:mmAM/PM99:99_表
1.14 ADOData控件的属性名称Alig__entVisibleAdodc12-vbAlignBottomFalse表
1.15DataGrid控件的属性名称AllowAddNewAllowDelectAllowUpdateCaptionDataSour__DataGrid1FalseFalseFalse任务列表Adodc1完成后的窗体Form2如图
1.4所示图
1.4 完成后的窗体Form2
四、程序的代码详解本例中的代码主要功能有3个界面控制、数据库控制和闹铃控制其中界面控制主要的内容为控制窗体的显示和__;数据库控制的主要内容是任务的添加、删除、编辑和保存;闹铃控制的主要内容为显示当前时间并同任务的时间比较,在设置的时间闹铃下面将结合程序的界面介绍程序的内容和功能1.主模块的代码在工程中添加一个模块,将其命名为Mdl___in,其主要功能为声明函数和全局变量在模块中添加以下的代码DeclareFunctionSetWindowPosLibuser32ByValH%ByValhb%ByValX%ByValY%ByValcx%ByValcy%ByValF%AsInteger声明API函数,功能是设置窗口的位置PublicDeclareFunctionGetCursorPosLibuser32lpPointAsPOINTAPIAsLong声明API函数,功能是得到当前鼠标的位置,以像素为单位PublicTypePOINTAPI声明用户变量类型,用于传递鼠标位置XAsLong鼠标的X坐标YAsLong鼠标的Y坐标EndTypePublicOldxAsLong旧窗体的X坐标PublicOldyAsLong旧窗体的Y坐标PublicNewxAsLong新窗体的X坐标PublicNewyAsLong新窗体的Y坐标PublicPntAsPOINTAPI声明变量,用于传递鼠标位置PublicGSAsBoolean声明变量,指明是否窗体跟随鼠标__PublicconstrAsString声明变量,传递数据库连接字符串PublicTypeAlarmtype声明变量类型,用于传递任务的设置AlarmHourAsInteger任务时间的小时部分AlarmMinAsInteger任务时间的分钟部分alarmAsBoolean是否闹铃alarmRWAsString任务的内容EndTypePublicalarmTimeAsAlarmtype声明变量,用于传递任务的设置PublicnoalarmAsBoolean声明变量,指明是否需要闹铃PublicmusicnameAsString声明变量,传递音乐文件名称PublicSub__in启动过程constr=PROVIDER=Microsoft.Jet.OLEDB.
3.51;DataSour__=App.Path\databases\任务列表
97.mdb;设置数据库连接字符串musicname=App.Path\music\alarmmusic.mid设置音乐文件名称Form
1.Show显示闹钟窗体EndSubPublicSubGetAlarmtime得到任务列表的函数IfForm
2.Adodc
1.Recordset.RecordCount0Then有任务时noalarm=False闹响为开ReDimalarmTime1ToForm
2.Adodc
1.Recordset.RecordCount重设任务列表数组长度Form
2.Adodc
1.Recordset.MoveFirst__至最前记录Fori=1ToForm
2.Adodc
1.Recordset.RecordCount循环设置设置任务列表的内容alarmTimei.AlarmHour=HourForm
2.Adodc
1.Recordset1alarmTimei.AlarmMin=MinuteForm
2.Adodc
1.Recordset1IfForm
2.Adodc
1.Recordset3=已执行ThenalarmTimei.alarm=FalseElsealarmTimei.alarm=TrueEndIfalarmTimei.alarmRW=Form
2.Adodc
1.Recordset2Form
2.Adodc
1.Recordset.MoveNext__至下一个记录NextiElsenoalarm=True没有任务时无需闹响EndIfEndSub
2.窗体Form1的代码窗体Form1的代码如下:DimHourNowAsInteger声明窗体级变量,表示当前小时DimMinNowAsInteger声明窗体级变量,表示当前分钟DimalarmIDAsInteger声明窗体级变量,表示触发的任务序号PrivateSubForm_Load窗体加载GS=True初始设置窗体为跟随鼠标Me.Height=Picture
1.Height设置窗体高度Me.Width=Picture
1.Width设置窗体宽度CallSetWindowPosMe.hWnd-100003设置窗体为最上层以下设置MCI控件MMControl
1.Notify=False多媒体命令执行完毕不返回Done__MMControl
1.Wait=False让程序在多媒体命令完成前就得到控制权MMControl
1.Shareable=False媒体设备不共享MMControl
1.FileName=musicname设置闹响播放的音乐名称MMControl
1.Com__nd=Open打开设备CallGetAlarmtime设置初始的任务列表EndSubPrivateSubForm_QueryUnloadCan__lAsIntegerUnloadModeAsIntegerMMControl
1.Com__nd=Close窗体卸载前关闭多媒体设备,释放资源EndSub在标签控件上单击鼠标时PrivateSubLabel1_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfButton=2Then右键单击Form
1.PopupMenuForm
2.mnu__in显示窗体Form2的菜单EndIfEndSub在标签控件上单击鼠标时PrivateSubLabel2_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfButton=2Then右键单击Form
1.PopupMenuForm
2.mnu__in显示窗体Form2的菜单EndIfEndSub在标签控件上单击鼠标时PrivateSubPicture1_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfButton=2Then右键单击Form
1.PopupMenuForm
2.mnu__in显示窗体Form2的菜单EndIfEndSub在标签控件上单击鼠标时PrivateSubPicture2_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfButton=2Then右键单击Form
1.PopupMenuForm
2.mnu__in显示窗体Form2的菜单EndIfEndSubPrivateSubTimer1_Timer时间控件的代码Label
2.Caption=Time显示当前时间HourNow=HourTime获得当前时间的小时MinNow=MinuteTime获得当前时间的分钟检查任务列表,决定是否闹铃IfForm
2.Visible=FalseAndnoalarm=FalseThenFori=1ToForm
2.Adodc
1.Recordset.RecordCount逐项对比IfHourNow=alarmTimei.AlarmHourAndMinNow=alarmTimei.AlarmMinAndalarmTimei.alarm=TrueThen时间正好alarmID=i传递任务序号Callalarm调用闹响过程ExitSubEndIfNextiEndIf窗体跟随的代码IfGS=TrueAndForm
2.Visible=FalseThen需要跟随GetCursorPosPnt得到鼠标位置Oldx=Form
1.Left将窗__置传递给变量Oldy=Form
1.TopNewx=Pnt.X*Screen.TwipsPerPixelX得到窗体的新位置,数据由像素转为缇Newy=Pnt.Y*Screen.TwipsPerPixelYincx=Newx-Oldx/80*Screen.TwipsPerPixelX+10计算偏移量incy=Newy-Oldy/80*Screen.TwipsPerPixelYForm
1.MoveOldx+incxOldy+incy__窗体EndIfEndSubPublicSubalarm闹响过程MMControl
1.Com__nd=play播放音乐MsgBox您有任务!CStrHourNow时CStrMinNow分,alarmTimealarmID.alarmRWvbInfor__tion+vbOKOnly提醒显示消息alarmTimealarmID.alarm=False设置已闹铃MMControl
1.Com__nd=Stop停止闹铃音乐修改数据库中的记录Form
2.Adodc
1.Recordset.MovealarmID-11Form
2.Adodc
1.Recordset3=已执行EndSub
3.窗体Form2的代码窗体Form2的代码主要功能为数据操作,以下为窗体Form2的代码PrivateSubForm_Load加载窗体设置数据源Adodc
1.ConnectionString=constrAdodc
1.RecordSour__=select*from任务列表orderby任务时间Adodc
1.Refresh设置当前任务IfNotAdodc
1.Recordset.RecordCount=0ThenAdodc
1.Recordset.MoveFirst__skEdBox
1.Text=Adodc
1.Recordset1Text
1.Text=Adodc
1.Recordset2EndIfEndSubPrivateSubCom__nd1_Click新增任务按钮IfCom__nd
1.Caption=新增任务Then新增任务__skEdBox
1.SetFocus格式文本框得到焦点Text
1.Text=请输入任务内容Com__nd
1.Caption=保存Com__nd
2.Enabled=FalseCom__nd
3.Enabled=FalseCom__nd
4.Caption=取消Adodc
1.Recordset.AddNew添加记录ElseIfText
1.TextAnd__skEdBox
1.Text__skEdBox
1.For__ttedTextThen输入数据有效Com__nd
1.Caption=新增任务Com__nd
2.Enabled=TrueCom__nd
3.Enabled=TrueCom__nd
4.Caption=关闭设置字段的值Adodc
1.Recordset0=CStrTimeAdodc
1.Recordset1=__skEdBox
1.TextAdodc
1.Recordset2=Text
1.TextAdodc
1.Recordset3=未执行Adodc
1.Recordset.UpdateBatch保存记录Adodc
1.Refresh刷新数据Adodc
1.RecordSour__=select*from任务列表orderby任务时间Adodc
1.RefreshAdodc
1.Recordset.MoveFirstCallDataGrid1_ClickElseMsgBox输入错误!vbOKOnly输入错误EndIfEndIfEndSubPrivateSubCom__nd2_Click删除按钮IfMsgBox确实删除当前任务吗?vbYesNo+vbQuestion确认删除=vbYesThenAdodc
1.Recordset.Delete删除记录Adodc
1.Recordset.MoveNextIfAdodc
1.Recordset.EOFThen检查任务列表为空IfAdodc
1.Recordset.RecordCount=0ThenIfMsgBox当前列表中没有任务添加任务吗?vbQuestion+vbYesNo添加任务?=vbYesThenCallCom__nd1_Click添加记录EndIfExitSubEndIfAdodc
1.Recordset.MoveFirstEndIfCallDataGrid1_ClickEndIfEndSubPrivateSubCom__nd3_Click修改任务按钮IfCom__nd
3.Caption=修改任务ThenCom__nd
1.Enabled=FalseCom__nd
2.Enabled=FalseCom__nd
3.Caption=保存修改Com__nd
4.Caption=取消__skEdBox
1.SetFocusElse保存修改IfText
1.TextAnd__skEdBox
1.Text__skEdBox
1.For__ttedTextThenCom__nd
1.Enabled=TrueCom__nd
2.Enabled=TrueCom__nd
3.Caption=修改任务Com__nd
4.Caption=关闭更新数据Adodc
1.Recordset1=__skEdBox
1.TextAdodc
1.Recordset2=Text
1.TextAdodc
1.Recordset3=未执行Adodc
1.Recordset.UpdateBatch保存修改Adodc
1.Refresh刷新数据Adodc
1.RecordSour__=select*from任务列表orderby任务时间Adodc
1.RefreshAdodc
1.Recordset.MoveFirstCallDataGrid1_ClickElseMsgBox输入错误!vbOKOnly输入错误EndIfEndIfEndSubPrivateSubCom__nd4_Click关闭按钮IfCom__nd
4.Caption=关闭Then关闭窗口UnloadMeElse取消修改Com__nd
1.Enabled=TrueCom__nd
2.Enabled=TrueCom__nd
3.Enabled=TrueCom__nd
4.Enabled=TrueCom__nd
1.Caption=新增任务Com__nd
2.Caption=删除任务Com__nd
3.Caption=修改任务Com__nd
4.Caption=关闭Adodc
1.Recordset.Can__lBatchadAffectAllChapters取消修改Adodc
1.Recordset.MoveFirstCallDataGrid1_ClickEndIfEndSubPrivateSubDataGrid1_Click__当前的任务IfNotAdodc
1.Recordset.RecordCount=0Then__skEdBox
1.Text=Adodc
1.Recordset1Text
1.Text=Adodc
1.Recordset2EndIfEndSubPrivateSubForm_QueryUnloadCan__lAsIntegerUnloadModeAsIntegerCallGetAlarmtime刷新任务列表EndSubPrivateSubmnuGS_Click跟随菜单GS=NotGSmnuGS.Checked=GSEndSubPrivateSubmnuQuit_Click退出菜单卸在所有窗体,结束程序的一种方法ForEachFormInFormsUnloadFormNextFormEndSubPrivateSubmnuRW_Click显示任务窗体Form
2.Left=Screen.Width-Form
2.Width/2Form
2.Top=Screen.Height-Form
2.Height/3Form
1.Left=Form
2.Left-Form
1.WidthForm
1.Top=Form
2.TopForm
2.ShowIfAdodc
1.Recordset.RecordCount=0ThenIfMsgBox当前列表中没有任务添加任务吗?vbQuestion+vbYesNo添加任务?=vbYesThenCallCom__nd1_ClickEndIfExitSubEndIfEndSub
五、程序的运行结果在运行工程之前,需要将工程的启动对象设为Sub__in,并且在工程所在目录的music子目录中添加一个名为alarmmusic.mid的MIDI文件单击F5功能键启动工程如图
1.5所示为运行中的闹钟窗体窗体将实时地显示当前时刻,并且跟随鼠标在窗体中__在窗体的任何部分右键单击,将弹出如图
1.6所示的快捷菜单图
1.5运行中的闹钟窗体图
1.6 在闹钟窗体上右键单击弹出的快捷菜单在菜单中选择“跟随鼠标”命令,使其不被选中,则闹钟窗体将停在屏幕中,不再跟随鼠标__重新选中“跟随鼠标”,则会恢复跟随状态在菜单中选择“任务列表”命令,将显示任务窗体,如图
1.7所示可以在该窗体中编辑任务列表,设置后的任务列表如图
1.8所示图
1.7 运行中的任务列表窗体图
1.8 运行中的任务列表当到达设置时刻时,程序将播放闹铃音乐,并显示提示窗口,如图
1.9所示,单击“确定”按钮后可以结束闹铃状态,任务列表中相应的记录将被显示为“已执行”选择菜单中的“退出”命令将结束程序图
1.9 闹铃响时的提醒信息小结本例调用了VB中附带的MultimediaMCI控件、__skedBox控件等非标准控件和VB编程的高级技巧——API函数,并且结合数据库等其他技巧,创建了一个有创意且十分实用的闹钟程序,显示了VB在编写Windows应用程序的优点希望读者可以从中有所收获案例二 我的日记本
一、概述本节将设计一个具有WindowsXP界面风格,名为“我的日记本”的应用程序这是一个以Ac__ss数据库为基础的小巧的日记本程序,通过ADO数据控件和其相应的数据操作,实现新建、查找、修改和删除日记等操作通过一些并不复杂的技巧的应用,本例实现了对WindowsXP界面的仿真,大大美化了应用程序的界面,使软件的吸引力倍增
二、数据库的设计使用MicrosoftAc__ss创建一个Ac__ss数据库,命名为“我的日记本
97.mdb”,保存于本例所在目录的databases子目录中在数据库中增加一个数据表,名为“日记本”,用于保存本例中的数据该数据表的结构如表
2.1所示表
2.1 日记本数据表的结构字段名称日期天气心情内容字段类型日期/时间文本文本备注字段大小短日期2020主键是否否否保存数据库和数据表,数据库的设计和创建工作完成
三、应用程序界面设计本例将创建一个WindowsXP的仿真窗体,并在该窗体上实现所有的操作完成后的窗体界面如图
2.1所示图
2.1 设计完毕的主窗体以下是窗体的详细建立过程1在VB中新建一个“标准EXE”工程,命名为“我的日记本”2选中工程默认的窗体Form1,将其BorderStyle属性设置为“0-None”,即无边框窗体,并将其ShowInTaskBar属性设置为“True”,即在任务栏中显示,该窗体将作为整个系统界面的基础3在绘图软件中打开事先准备好的WindowsXP窗体轮廓的__,如图
2.2所示,将其__至剪贴板中返回VB窗口,选中窗体Form1,右键单击该窗体,在快捷菜单中选择“粘贴”命令,将其Picture属性设置为选定的图像调整其窗体大小至适合__4在窗体上添加两个__框控件Picture1和Picture2,用于作为其他控件的容器如表
2.2所示设置这两个__框控件的属性此时窗体如图
2.3所示表
2.2 __框控件的属性名称Appearan__BackColorBorderStylePicture1Picture20-Flat0-FlatH00FFC0C0H00FFC0C01-FixedSingle0-None图
2.2 WindowsXP窗体轮廓的__图
2.3 添加__框控件后的窗体5在Picture1中添加3个标签控件、一个日期控件DTPicker
1、一个文本框控件Text1和一个组合框Combo1控件,用于显示数据在Picture2中添加两个__框控件和一个框架控件,作为下一步将添加的控制按钮的容器在窗体上添加一个RichTextBox控件RichTextBox1,用于显示日记的正文这些控件的属性设置如下表
2.3至表
2.5所示此时的窗体界面如图
2.4所示表
2.3 日期控件的属性名称CheckBoxFor__tUpDownDTPicker1False1-dtpShortDateFalse表
2.4 __框控件的属性名称Appearan__BackColorBorderStyleIndexPicBoxPicBox0-Flat0-FlatH00FFC0C0H00FFC0C01-FixedSingle1-FixedSingle01表
2.5 框架控件的属性名称Appearan__BackColorBorderStyleCaptionFrame10-FlatH00FFC0C01-FixedSingle消息图
2.4 添加数据显示控件后的窗体6在窗体上添加9个图像控件,用于保存程序中需要的三种按钮的__,这些__的说明如表
2.6所示此时的窗体如图
2.5所示图
2.5 在窗体上添加图像控件表
2.6 图像控件的属性和说明名称BorderStyleIndex__说明I__geButton1I__geButton1I__geButton1I__geButton2I__geButton2I__geButton2I__geButton3I__geButton3I__geButton30-None0-None0-None0-None0-None0-None0-None0-None0-None012012012普通按钮正常状态普通按钮焦点状态普通按钮按下状态标题按钮正常状态标题按钮焦点状态标题按钮按下状态关闭按钮正常状态关闭按钮焦点状态关闭按钮按下状态7在PicBox0和PicBox1中添加8个__框控件,并在这8个__框控件中添加8个标签按钮,从而实现用__框来模拟按钮,这些控件的属性如表
2.7所示在窗体中添加一个ADO数据控件,作为整个程序的数据源,其属性将有代码来设置设置好的窗体如图
2.6所示表
2.7 控件的属性标签控件名称IndexBackStyleCaption所在__框Label5Label4Label4Label5Label4Label4Label4Label4001123450-Transparent0-Transparent0-Transparent0-Transparent0-Transparent0-Transparent0-Transparent0-Transparent我想写新日记保存新日记取消保存我要查旧日记修改日记删除日记保存修改取消修改Pictitle0Picbutton0Picbutton1Pictitle1Picbutton2Picbutton3Picbutton4Picbutton5图
2.6 在窗体中添加__框模拟按钮对窗体中的控件调整大小和布局,即可完成窗体界面的设计
四、程序的代码本例的代码分为两个部分,窗体Form1的代码和模块的代码其中模块的代码主要功能为创建不规则窗口,以下是两部分的代码1.窗体Form1的代码DimmoveformAsBoolean声明变量,窗体是否__Dimmou___AsLong声明变量,鼠标的X坐标DimmouseYAsLong声明变量,鼠标的Y坐标DimnewDiaryAsBoolean声明变量,是否正在编辑新日记DimOpenDiaryAsBoolean声明变量,是否有日记文件打开PrivateSubForm_LoadCallShapeFormMeRGB2550255调用过程,创建不规则窗口声明数据源Adodc
1.ConnectionString=PROVIDER=Microsoft.Jet.OLEDB.
3.51;DataSour__=App.Path\databases\我的日记本
97.mdb;Adodc
1.RecordSour__=select日期天气心情内容from日记表Orderby日期Adodc
1.Refresh变量的初始赋值moveform=FalsenewDiary=FalseOpenDiary=False设置控件的属性LblMessage.Caption=欢迎使用!!!!!Text
1.Locked=TrueCombo
1.Locked=TrueRichTextBox
1.Locked=TrueFori=1To1050PicBox
0.Height=PicBox
0.Height-1NextiFori=1To2000PicBox
1.Height=PicBox
1.Height-1NextiEndSubPrivateSubDTPicker1_Change日期控件内容改变时IfnewDiary=TrueThen编辑新日记ExitSub退出过程Else查找日记IfAdodc
1.Recordset.RecordCount0Then存在日记文件时搜索日记Adodc
1.Recordset.MoveFirstAdodc
1.Recordset.Find日期=CStrDTPicker
1.ValueIfAdodc
1.Recordset.EOFThen未找到日记BeepLblMessage.Caption=未找到相应记录DTPicker
1.Value=DateText
1.Text=Combo
1.Text=RichTextBox
1.Text=Else找到了日记LblMessage.Caption=找到了!费了我好大的劲…显示信息DTPicker
1.Value=Adodc
1.Recordset0显示数据Text
1.Text=Adodc
1.Recordset1显示数据Combo
1.Text=Adodc
1.Recordset2显示数据RichTextBox
1.Text=Adodc
1.Recordset3显示数据OpenDiary=True设置变量EndIfElse不存在任何日记BeepLblMessage.Caption=没有日记存在!EndIfEndIfEndSub在窗体上按下鼠标按钮时PrivateSubForm_MouseDownButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfButton=1Then如果是鼠标左键moveform=True设置变量mou___=X得到当前鼠标位置mouseY=YEndIfEndSub在窗体上__鼠标时PrivateSubForm_MouseMoveButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleIfmoveformThen如果是__窗口(鼠标按钮按下)计算新的窗体坐标值CurrX=Me.Left-mou___+XCurrY=Me.Top-mouseY+Y__窗体到新的位置Me.MoveCurrXCurrYElse不是__窗口PicClose.Picture=I__gebutton
30.Picture设置关闭按钮的__EndIfEndSub在窗体上抬起鼠标按钮PrivateSubForm_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSinglemoveform=False设置变量EndSubPrivateSubLabel4_MouseDownIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicButton_MouseDownIndexButtonShiftXYEndSubPrivateSubLabel4_MouseMoveIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicButton_MouseMoveIndexButtonShiftXYEndSubPrivateSubLabel4_MouseUpIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicButton_MouseUpIndexButtonShiftXYEndSubPrivateSubLabel5_MouseDownIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicTitle_MouseDownIndexButtonShiftXYEndSubPrivateSubLabel5_MouseMoveIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicTitle_MouseMoveIndexButtonShiftXYEndSubPrivateSubLabel5_MouseUpIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingleCallPicTitle_MouseUpIndexButtonShiftXYEndSubPrivateSubPicBox_MouseMoveIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle在控件数组上__鼠标设置__PicTitle
0.Picture=I__geButton
20.PicturePicTitle
1.Picture=I__geButton
20.PictureFori=0To5PicButtoni.Picture=I__geButton
10.PictureNextiEndSubPrivateSubPicButton_MouseDownIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicButtonIndex.Picture=I__geButton12EndSubPrivateSubPicButton_MouseMoveIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__IfButton=1ThenPicButtonIndex.Picture=I__geButton12ElsePicButtonIndex.Picture=I__geButton11EndIfEndSubPrivateSubPicButton_MouseUpIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicButtonIndex.Picture=I__geButton10执行操作SelectCaseIndexCase0保存新日记IfnewDiary=TrueThen检查是否已存在日记IfAdodc
1.Recordset.RecordCount0ThenAdodc
1.Recordset.MoveFirstEndIfAdodc
1.Recordset.Find日期=CStrDTPicker
1.ValueIfNotAdodc
1.Recordset.EOFThen当天日记已存在BeepLblMessage.Caption=当天的日记已经存在!ExitSubEndIf当天日记不存在,添加记录Adodc
1.Recordset.AddNewAdodc
1.Recordset0=DTPicker
1.ValueAdodc
1.Recordset1=Text
1.Text Adodc
1.Recordset2=Combo
1.TextAdodc
1.Recordset3=RichTextBox
1.TextAdodc
1.Recordset.UpdateBatchadAffectAllChaptersLblMessage.Caption=保存日记成功!newDiary=FalseText
1.Locked=TrueCombo
1.Locked=TrueRichTextBox
1.Locked=TrueOpenDiary=TrueElse没有新建日记BeepLblMessage.Caption=没有事请别乱点!添乱!EndIfCase1取消新日记IfnewDiary=TrueThen存在新日记Adodc
1.Recordset.Can__lBatchadAffectAllChaptersLblMessage.Caption=已经取消新日记!newDiary=FalseDTPicker
1.Value=DateText
1.Text=Combo
1.Text=RichTextBox
1.Text=Text
1.Locked=TrueCombo
1.Locked=TrueRichTextBox
1.Locked=TrueElse不存在新日记BeepLblMessage.Caption=没有事请别乱点!添乱!EndIfCase2修改日记IfOpenDiary=FalseThenLblMessage.Caption=没有打开任何日记!ExitSubElseText
1.Locked=FalseCombo
1.Locked=FalseRichTextBox
1.Locked=FalseLblMessage.Caption=现在可以修改日记了!EndIfCase3删除日记IfOpenDiary=FalseThenLblMessage.Caption=没有打开任何日记!ExitSubElseAdodc
1.Recordset.DeleteAdodc
1.RefreshLblMessage.Caption=删除日记成功!OpenDiary=FalseEndIfCase4保存修改IfOpenDiary=FalseThenLblMessage.Caption=没有打开任何日记!ExitSubElseAdodc
1.Recordset0=DTPicker
1.ValueAdodc
1.Recordset1=Text
1.TextAdodc
1.Recordset2=Combo
1.TextAdodc
1.Recordset3=RichTextBox
1.TextAdodc
1.Recordset.UpdateBatchadAffectAllChaptersLblMessage.Caption=保存修改日记成功!EndIfCase5取消修改IfOpenDiary=FalseThenLblMessage.Caption=没有打开任何日记!ExitSubElseLblMessage.Caption=已经取消修改日记!Text
1.Locked=TrueCombo
1.Locked=TrueRichTextBox
1.Locked=TrueEndIfEndSelectEndSubPrivateSubPicClose_MouseDownButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicClose.Picture=I__gebutton
32.PictureEndSubPrivateSubPicClose_MouseMoveButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__IfButton=1ThenPicClose.Picture=I__gebutton
32.PictureElsePicClose.Picture=I__gebutton
31.PictureEndIfEndSubPrivateSubPicClose_MouseUpButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicClose.Picture=I__gebutton
30.Picture执行动作IfnewDiary=TrueThenLblMessage.Caption=当前日记没有保存!请您保存修改或者取消修改ExitSubElseUnloadMeEndIfEndSubPrivateSubPicTitle_MouseDownIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicTitleIndex.Picture=I__geButton
22.PictureEndSubPrivateSubPicTitle_MouseMoveIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__IfButton=1ThenPicTitleIndex.Picture=I__geButton
22.PictureElsePicTitleIndex.Picture=I__geButton
21.PictureEndIfEndSubPrivateSubPicTitle_MouseUpIndexAsIntegerButtonAsIntegerShiftAsIntegerXAsSingleYAsSingle设置__PicTitleIndex.Picture=I__geButton
20.Picture执行动作SelectCaseIndexCase0新建日记IfnewDiary=TrueThenBeepLblMessage.Caption=当前还有未保存的日记!ExitSubEndIfIfPicBox
0.Height500Then弹出列表Fori=1To1050PicBox
0.Height=PicBox
0.Height+1NextiEndIfIfPicBox
1.Height500Then缩回列表Fori=1To2000PicBox
1.Height=PicBox
1.Height-1NextiEndIf添加日记newDiary=TrueText
1.Locked=FalseCombo
1.Locked=FalseRichTextBox
1.Locked=FalseLblMessage.Caption=准备开动写日记!DTPicker
1.Value=DateText
1.Text=天气如何Combo
1.Text=心情好吗RichTextBox
1.Text=今天要写什么呢?告诉我啊!Case1查找日记IfnewDiary=TrueThenBeepLblMessage.Caption=当前还有未保存的日记!ExitSubEndIfIfPicBox
0.Height500Then收回列表Fori=1To1050PicBox
0.Height=PicBox
0.Height-1NextiEndIfIfPicBox
1.Height500Then弹出列表Fori=1To2000PicBox
1.Height=PicBox
1.Height+1NextiEndIfLblMessage.Caption=请在日期栏中选择日期EndSelectEndSub
2.模块的代码在工程中添加一个模块,命名为Mdl_shapeform其代码为PublicDeclareFunctionGetPixelLibGdi32ByValhdcAsLongByValXAsLongByValYAsLongAsLongAPI函数,得到像素的颜色PublicDeclareFunctionSetWindowRgnLibuser32ByValhWndAsLongByValhRgnAsLongByValbRedrawAsBooleanAsLongAPI函数,设置窗体边界PublicDeclareFunctionCreateRectRgnLibGdi32ByValX1AsLongByValY1AsLongByValX2AsLongByValY2AsLongAsLongAPI函数,生成对象边界PublicDeclareFunctionCombineRgnLibGdi32ByValhDestRgnAsLongByValhSrcRgn1AsLongByValhSrcRgn2AsLongByValnCombineModeAsLongAsLongAPI函数,合并边界PublicDeclareFunctionDeleteO__ectLibGdi32ByValhO__ectAsLongAsLongAPI函数,删除对象DimCurRgnTempRgnAsLong声明窗体边界变量PublicFunctionShapeFormbgAsFormtransColorDimXYAsIntegerCurRgn=CreateRectRgn00bg.ScaleWidthbg.ScaleHeight以当前窗体的边界为范围生成初始边界WhileY=5对每行的像素进行检查WhileX=bg.ScaleWidth遍历每个像素IfGetPixelbg.hdcXY=transColorThen如果像素的颜色是屏蔽色TempRgn=CreateRectRgnXYX+1Y+1以透明点创建区域将透明点从初始边界中去除suc__ss=CombineRgnCurRgnCurRgnTempRgnRGN_DIFFDeleteO__ectTempRgn释放资源EndIfX=X+1WendY=Y+1X=0Wendsuc__ss=SetWindowRgnbg.hWndCurRgnTrue设置窗体的边界DeleteO__ectCurRgn释放资源EndFunction
五、程序的运行结果在VB中按下F5功能键运行当前工程图
2.7所示为运行中的窗体Form1,请读者注意通过对模块中过程的调用,窗体Form1的左上角和右上角均为圆角,即实现了不规则窗体图
2.7 运行初始的窗体单击“我想写新日记”按钮,对应的列表将展开,显现“保存新日记”和“取消保存”按钮,同时各个数据显示控件的内容均会变为有关的问候语如图
2.8所示图
2.8 “添加新日记”的操作界面日记写入完毕后,可以单击“保存新日记”按钮保存,也可以单击“取消保存”按钮来取消添加系统将根据不同的操作给予提示单击“我要查旧日记”按钮,对应的列表将打开,而“我要写新日记”对应的列表会关闭系统显示提示信息“请在日期栏中选择日期”,如图
2.9所示在日期栏中选择日期,程序将在数据库中查找相应的记录,如果不存在相应记录,则给出错误信息,反之则显示数据,如图
2.10所示在查找到旧日记后,可以单击“修改日记”进入修改状态,修改完毕可以选择“保存修改”或者“取消修改”,也可以删除当前的日记单击窗体上的关闭按钮,如果还有未被保存的日记,则会出现提示信息;反之,则退出系统图
2.9 查询日记的界面图
2.20 查找到记录的界面小结在本例中向读者介绍了使用各种图形控件和对鼠标的不同__进行编程,从而实现特殊窗体效果的方法,并且介绍了使用API函数创建不规则窗体的方法仔细研究这些代码和方法,对于读者更好的了解VB以及提高编程能力都会有很大的帮助案例三 Ac__ss数据库简单报表的创建
一、概述本案例将创建一个简单数据报表,该报表使用数据环境设计器作为数据源数据环境设计器使用和VisualBasic一起提供的NorthWind数据库(Ac__ss数据库)创建一个简单的层次结构游标该游标包含Customers、Orders、OrderDetails和Products等4个表,并使用表与表之间的相关字段进行表的链接完成的数据环境设计结构图如图
3.1和图
3.2所示最后完成的报表结构图如图
3.3所示在开始逐步处理之前,确保计算机上存在Northwind数据库(Nwind.mdb)如果MicrosoftVisualStudio的__路径为D:\MicrosoftVisualStudio,则该数据库应该在D:\MicrosoftVisualStudio\VB98下如果不存在,从VisualBasicCD__一份文件到计算机的硬盘上图
3.1 数据环境设计结构示意图
(一)图
3.2 数据环境设计结构示意图
(二)图
3.3 报表结构示意图
二、单层次结构报表首先介绍的是利用“CustomerID”字段链接表Customers和Orders,从而创建一个单层次结构游标,其具体步骤如下1创建一个新的“标准EXE”工程;2在“工程”菜单上,选择“添加数据环境”命令,向工程中添加一个数据环境设计器;3右键单击“Connection1”图标,选择“属性”命令,弹出“数据链接属性”对话框,如图
3.4所示;图
3.4 “数据链接属性”对话框4在“数据链接属性”对话框上单击“MicrosoftJet
3.51OLEDBProvider”,这是为访问Jet数据库选择正确的OLEDB供应商;5单击“下一步”按钮进入“连接”选项卡,单击第一个文本框旁边的按钮,打开“选择Ac__ss数据库”对话框,搜索到nwind.mdb文件,它__在D:\MicrosoftVisualStudio\VB98目录下,单击“确定”按钮关闭对话框;6右键单击“Connection1”图标,单击“重命名”,把图标名改为“”;7右键单击“Northwind”图标,然后单击“添加命令”显示“Com__nd1”图标右键单击“Com__nd1”图标,选择“属性”命令,弹出“Com__nd1属性”对话框,如图
3.5所示;图
3.5 “Com__nd1属性”对话框8参照表
3.1所示各个数据设置“Com__nd1属性”对话框中相应属性的属性值,单击“确定”结束对话框表
3.1 “Com__nd1属性”属性表属性属性值Com__ndNameConnectionDataBaseO__ectO__ectNameCustomersNorthwindTableCustomers9右键单击“Customers”图标,然后单击“AddChildCom__nd”显示“Com__nd1”图标;右键单击“Com__nd1”图标,选择“Properties”,弹出“Com__nd1属性”对话框;10参照表
3.2所示数据设置“Com__nd1属性”对话框中相应属性的属性值;表
3.2 “Com__nd1属性”属性表属性属性值Com__ndNameDataBaseO__ectO__ectNameOrdersTableOrders11选择“Relation”选项卡,单击“Add”按钮,这样通过“CustomerID”字段将表Customers和Orders链接起来了,其结果如图
3.6所示;图
3.6 表链接的创建12单击“确定”按钮结束对话框;13参照表
3.3所示数据设置工程和设计器的属性;表
3.3 工程和设计器的属性表对象属性属性值Project1DataEnviro__ent1Form1NameNameNamePrjNwindDeNwindFrmShowReport14保存工程创建了数据环境设计器后,下面就可以创建一个数据报表因为并不是数据环境中所有的字段在一个数据报表中都有用,所以创建的报表可能只显示几个字段创建一个新的数据报表只包含“客户的订单日期”,其具体步骤如下1在“工程”菜单上,选择“添加DataReport”命令,向工程中添加一个报表设计器;2根据表
3.4所示设置DataReport1对象的属性;表
3.4 DataReport1的属性表属性属性值NameCaptionRptNwindNorthwindDataReport3“属性”窗口上,单击“数据源(DataSour__)”,然后单击“DeNwind”然后单击“数据成员(DataMember)”并单击“Customers”;4右键单击数据报表设计器,单击“RetrieveStructure”,并单击“确定”按钮;5从数据环境设计器中把“CompanyName”字段(在“Customers”命令下)拖到数据报表设计器GroupHeader(Customers_Header)部分;6删除名为“Label1”的Label控件(rptLabel);7从数据环境设计器中把“OrderDate”字段(在Orders命令下)拖到数据报表设计器Detail(Orders_Detail)部分,并删除Label控件;8重新调整数据报表设计器部分的大小,使之如图
3.7所示;图
3.7 数据报表设计图9保存工程下面将介绍两种方法来显示报表一是利用代码调用rptNwind窗体,其步骤如下1在窗体frmShowReport中添加控件Com__nd1;2将其“Name”属性改为“CmdShow”,“Caption”属性改为“ShowReport”;3在其Click__中添加代码“rptNwind.Show”;4保存工程此外可以在没有代码的情况下,也可以显示报表,其步骤如下1在“工程(Project)”菜单上,单击“PrjNwind属性(PrjNwindProperties)”;2在“启动对象(StartupO__ect)”框中,选择“rptNwind”;3保存工程如果使用这种方法,可以从工程中把Form对象删除运行该工程,其最后的结果显示如图
3.8所示图
3.8 单层次结构报表结果显示
三、多层次结构报表(单层次结构报表的扩展)在上边的单层次结构数据报表的基础上很容易将其扩展,并生成一个更加复杂的报表在下面的过程中,数据环境最先扩展OrderDetails和Products表,扩展的报表包括在一个特定日期定货的产品名称扩展数据环境的具体步骤如下1在数据环境设计器中,右键单击“Orders”图标,然后单击“AddChildCom__nd(添加子命令)”显示“Com__nd1”图标;2右键单击“Com__nd1”图标,选择“属性(Properties)”,弹出“Com__nd1属性”对话框;3参照表
3.5各个数据设置“Com__nd1属性”对话框中相应属性的属性值;表
3.5“Com__nd1属性”属性表属性属性值Com__ndNameDataBaseO__ectO__ectNameOrderDetailsTableOrderDetails4单击“关联(Ralation)”选项卡,单击“添加(Add)”,单击“确定”,这样通过“OrderID”字段将表Orders和OrderDetails链接起来了;5右键单击“OrderDetails”图标,然后单击“AddChildCom__nd(添加子命令)”显示“Com__nd1”图标;6右键单击“Com__nd1”图标,选择“属性(Properties)”,弹出“Com__nd1属性”对话框;7参照表
3.6各个数据设置“Com__nd1属性”对话框中相应属性的属性值;表
3.6“Com__nd1属性”属性表属性属性值Com__ndNameDataBaseO__ectO__ectNameProductsTableProducts8单击“关联(Ralation)”选项卡,单击“添加(Add)”按钮,单击“确定”按钮,这样通过“ProductID”字段将表OrderDetails和Products链接起来了9保存数据环境设计器扩展数据环境的具体步骤如下1右键单击数据设计器DataReport,并清除弹出选择项“显示页标头/页脚(ShowPageHeader/Footer)”前的“√”;2右键单击数据设计器DataReport,选择弹出选择项“插入组标头/页脚(InsertGroupHeader/Footer)”;3在弹出的对话框中单击“确定”按钮,选择新的标头和注脚对的缺省位置,并关闭对话框;4选择新添加的分组标头,在属性窗口上将它的名字由Section1改成“Orders_Header”,将对应的注脚名字由Section2改为“Orders_Footer”;5重复步骤
2、3;6选择新添加的分组标头,并在属性窗口上将它的“Name”属性由Section1改成“OrderDetails_Header”,将对应的注脚名字由Section2改为“OrderDetails_Footer”;7单击细节(Orders_Detail)部分选择它在“属性”窗口上,把部分名更改为“Products_Detail”;8使用鼠标把“OrderDate”字段从细节(Products_Detail)部分拖到Orders_Header部分;9从数据环境设计器中,把ProductName字段(在Products命令下)拖到细节Products_Detail部分中;10删除名为Label1的Label控件;11重新调整分组标头的大小,并重新排列文本框控件,保存工程运行工程,其最后的结果显示如图
3.9所示图
3.9 多层次结构报表结果显示
四、创建数据环境连接SQL2000数据库本案例将创建一个简单数据环境,连接SQL2000数据库pubs(SQL2000自带的数据库),并对该数据库中的表titles.dbo进行浏览操作设置SQL2000数据库的主机名为“__STER5470”,用户名为“sa”__为“111111”其具体步骤如下1创建一个新的“标准EXE”工程;2在“工程”菜单上,单击“添加DataEnviro__ent(AddDataEnviro__ent)”向工程中添加一个数据环境设计器;3右键单击“Connection1”图标,选择“属性(Properties)”,弹出“数据链接属性”对话框,如图
3.10所示;图
3.10 “数据链接属性”对话框
(一)4在“数据链接属性”对话框上单击“MicrosoftOLEDBProviderforSQLServer”,这是为访问SQL数据库选择正确的OLEDB供应商;5单击“下一步”按钮进入“连接”选项卡;6在其各个选项框中依次选择或填写服务器名称“__STER5470”、用户名称“sa”、__“111111”和数据库名称“pubs”,并单击“测试连接”,其结果如图
3.11所示;图
3.11“数据链接属性”对话框
(二)7右键单击“Connection1”图标,然后单击“AddCom__nd(添加命令)”,显示“Com__nd1”图标;8右键单击“Com__nd1”图标,选择“属性(Properties)”,弹出“Com__nd1属性”对话框;9将其“DataBaseO__ect”属性改为“Table”,“O__ectName”改为“dbo.titles”,结果如图
3.12所示;图
3.12“Com__nd1属性”对话框10将数据环境设计器中Com__nd1对象的各个字段拖放到窗体Form1中,并添加Com__nd1和Com__nd2两个控件;11将Com__nd1的“Name”属性改为“cmdPrevious”,“Caption”属性改为“Previous”;12将Com__nd2的“Name”属性改为“cmdNext”,“Caption”属性改为“Next”,其结果如图
3.13所示;图
3.13 Form1的控件设计图13在cmdPrevious的Click__中输入下列代码WithDataEnviro__ent
1.rsCom__nd
1.MovePrevious访问前一条记录If.BOFThen.MoveLast访问最后一条记录EndIfEndWith在这需要说明的是在数据环境中创建一个Com__nd对象后,其对应的记录集自动命名为“rs+Com__nd对象名”,所以在此Com__nd1对象对应的记录集名为“rsCom__nd1”14在cmdNext的Click__中输入下列代码WithDataEnviro__ent
1.rsCom__nd
1.MoveNext访问后一条记录If.EOFThen.MoveFirst访问第一条记录EndIfEndWith15保存工程运行工程,首先弹出SQLServer登录窗体,需要填写用户名和__,如图
3.14所示,这样能提高数据操作的安全性图
3.14 SQLServer登录窗体输入正确的用户名和__后,直接进入数据浏览窗体,如图
3.15所示图
3.15 数据浏览窗体小 结本部分收集了一些生活中常用的一些小案例,这些案例功能比较单一,但很有用希望VB的初级读者可以从本章出发,编写一些类似的小案例,以熟悉一些VB的基本功能和操作。