菜单工具栏及数据共享.ppt

上传人:小飞机 文档编号:6487511 上传时间:2023-11-05 格式:PPT 页数:93 大小:381KB
返回 下载 相关 举报
菜单工具栏及数据共享.ppt_第1页
第1页 / 共93页
菜单工具栏及数据共享.ppt_第2页
第2页 / 共93页
菜单工具栏及数据共享.ppt_第3页
第3页 / 共93页
菜单工具栏及数据共享.ppt_第4页
第4页 / 共93页
菜单工具栏及数据共享.ppt_第5页
第5页 / 共93页
点击查看更多>>
资源描述

《菜单工具栏及数据共享.ppt》由会员分享,可在线阅读,更多相关《菜单工具栏及数据共享.ppt(93页珍藏版)》请在三一办公上搜索。

1、2023/11/5,1,第7章 菜单、工具栏及数据共享,菜单是用户和应用程序的接口。菜单设计的好坏不但反映了应用程序中的功能模块组织的水平,同时也反映了应用程序的用户友善性。数据共享技术允许多用户共享数据。数据加锁与解锁以及更新数据的方法是实现数据共享的重要方法。,2023/11/5,2,7.1 菜单和工具栏,7.1.1 设计菜单菜单具有较好的组织形式和内容,是应用程序的一种直观的反映。用户通过菜单很好地理解应用程序,方便地使用应用程序。,2023/11/5,3,7.1.1 设计菜单,1创建一个完整菜单系统的步骤(1)规划菜单系统,确定需要哪些菜单、出现在界面的何处及哪几个菜单要有子菜单等。(

2、2)创建菜单及子菜单,用菜单设计器定义菜单标题、菜单项和子菜单。图7-1 菜单系统组成(3)指定菜单所要执行的任务,例如显示表单或对话框等。如果需要,还可以包括初始化代码或清理代码。(4)选择“预览”按钮预览菜单系统。(5)从“菜单”菜单上选择“生成”命令,生成菜单程序以及运行菜单程序,对菜单系统进行测试。(6)从“程序”菜单中选择“执行”命令,然后选择已生成的菜单程序运行。,2023/11/5,4,2菜单系统结构及组成,一个完整的菜单系统如图7-1所示。主要包括菜单栏、菜单标题、下拉菜单、菜单项和子菜单。菜单项中可包括VFP命令或者子菜单。,图7-1 菜单系统组成,2023/11/5,5,7

3、.1.2 使用菜单设计器创建菜单,使用菜单设计器可快速开发出菜单。可用以下几种方法打开菜单设计器:单击“常用”工具栏上的“新建”按钮,从文件类型列表中选择“菜单”,然后单击“新建文件”按钮。选择“文件”菜单的“新建”命令。应用项目管理器,即从项目管理器中选择“菜单”,然后单击“新建”按钮。,2023/11/5,6,7.1.2 使用菜单设计器创建菜单(续),在打开“菜单设计器”之前,系统将打开“新建”对话框,如图7-2所示,可以创建两种形式的菜单:普通菜单和快捷菜单,单击其中任何一个按钮可打开菜单设计器。普通菜单和快捷菜单的菜单设计器在外观上并无区别,只是两者的设计方法略有不同。,图7-2“新建

4、菜单”对话框,2023/11/5,7,1.创建普通菜单和快捷菜单,如图7-3所示是一个快捷菜单示例。在快捷菜单中,可将若干选定的系统菜单项加入到自己的菜单系统中。方法是单击“插入栏”按钮打开“插入系统菜单栏”对话框,如图7-4所示,然后从中选择所需要的菜单项,并单击“插入”按钮即可。快捷菜单的调用方法和普通菜单相同,用户只需要在程序中加入命令“DO菜单名称.mpr”即可。,2023/11/5,8,1.创建普通菜单和快捷菜单(续),图7-3 快捷菜单示例,图7-4“插入系统菜单栏”对话框,2023/11/5,9,1.创建普通菜单和快捷菜单(续),在普通菜单设计器中,也可利用VFP菜单为模板来创建

5、自己的菜单系统。方法是从“菜单”菜单中选择“快速菜单”选项。“菜单设计器”中即出现VFP系统菜单,如图7-5所示。,图7-5 已添加菜单系统的菜单设计器,2023/11/5,10,2.菜单设计器的使用,(1)菜单设计窗口组成“菜单名称”栏用于输入菜单的提示字符串。若要设定菜单项的热键,可在要设定为热键的字母前面加上号。如果没有给出这个符号,则菜单提示字符串的第一个字母即自动被定义为热键。执行菜单时,按“Alt+热键”即可打开该菜单项。在图7-3中,“输入”菜单的热键是Alt+I,“查询”菜单的热键是Alt+S,“退出”菜单的热键是Alt+Q。在菜单名的左边有一个小方框按钮,称为“移动指示器”,

6、当鼠标移动到它的上面时形状会变成上下双箭头的样子。用鼠标拖动“移动指示器”即可改变当前菜单项在菜单列表中的位置。,2023/11/5,11,1)“结果”栏,该项中共有4个选项,用于选定菜单项的功能类别。子菜单(Submenu):如果用户定义的当前菜单项还有子菜单,应选这一项。命令(Command):若当前菜单项的功能是执行某种动作的话应选这一项。主菜单名/菜单项#(Pad Name/Bar#):“主菜单名”出现在定义主菜单时,“菜单项#”出现在定义子菜单项时。过程(Procedure):用于定义一个与菜单项相关联的过程,当用户选择了该菜单项将执行这一过程。,2023/11/5,12,2)“选项

7、”按钮,单击该按钮将弹出“提示选项”对话框,如图7-6所示。使用该对话框可设置用户定义的菜单系统中各菜单项的属性。例如,定义菜单项的快捷键,控制如何禁止或允许使用菜单项,选取菜单项时是否在系统状态条上显示对菜单项的说明信息,指定菜单项的名字以及在编辑OLE对象期间控制菜单项的位置等。,图7-6“提示选项”对话框,2023/11/5,13,2)“选项”按钮(续),该对话框主要有以下几个选项:“快捷方式”区:用于指定菜单或菜单项的快捷键(即Ctrl键和其他键的组合)。“位置”选项区:当用户在应用程序中编辑一个OLE对象时,可在该区指定菜单项的位置。跳过:单击这个编辑框右侧的“”按钮将调出表达式生成

8、器,用户可在表达式生成器中输入允许/禁止菜单项的条件。如表达式为真,则菜单项不可用。信息:单击这个编辑框右侧的“”按钮也将调出表达式生成器。在表达式生成器的“信息”编辑框中输入对菜单项的说明信息,这些信息将出现在系统状态条上。菜单项:允许指定可选的菜单标题,用户可以在程序中通过该标题引用菜单项。备注:在这里输入对菜单项的注释。,2023/11/5,14,3)菜单级,菜单级弹出列表显示出当前所处的菜单级别。当菜单的层次较多时,利用这一项可快速返回任意一级菜单。4)“预览”按钮使用这个按钮可查看正在设计的菜单的形象,并可在所显示的菜单中进行选择,检查菜单的层次关系及提示等是否正确,但这种选择不执行

9、各菜单的相应动作。5)“插入”按钮在当前菜单项的前面插入一新的菜单项。6)“删除”按钮删除当前的菜单项。,2023/11/5,15,(2)“常规选项”对话框,当用户选择“显示”菜单中的“常规选项”时将显示“常规选项”对话框,如图7-7所示。该对话框用于为整个菜单系统输入代码,它主要由以下几个部分组成:1)“过程”编辑框:在这里输入菜单过程的代码。2)“编辑”按钮:单击“编辑”按钮将打开一个编辑窗口,用户可在编辑窗口中输入菜单过程的代码。,图7-7“常规选项”对话框,2023/11/5,16,(2)“常规选项”对话框(续),3)“位置”区:共有4个按钮,它们的含义分别是:替换:将现有的菜单系统替

10、换成新的(用户定义的)菜单系统。追加:将用户定义的菜单附加在现有菜单的后面。在之前:将用户定义的菜单插入到指定菜单的前面。选中这一选项将出现一个弹出列表,在其中列出了当前菜单系统的菜单名。从这里选择一个菜单名,用户定义的菜单将出现在该菜单的前面。在之后:将用户定义的菜单插入到指定菜单的后面。4)菜单代码:它包括如下两个复选框:设置:为菜单系统加入一段初始化代码。单击“设置”复选框可打开初始化代码编辑窗口,即可编辑初始化代码;单击“确定”按钮关闭“常规选项”对话框。清理:为菜单系统加入一段结束代码。单击“清理”按钮进入结束代码编辑窗口,即可编辑结束代码;单击“确定”按钮关闭“常规选项”对话框。5

11、)顶层菜单:如果选定该复选框,将允许该菜单在顶层表单(SDI)中使用。如果未选定,则只允许该菜单在VFP页框中使用。,2023/11/5,17,(3)“菜单选项”对话框,单击“显示”菜单中的“菜单选项”命令,出现“菜单选项”对话框,如图7-8所示。该对话框用于为菜单栏(即顶层菜单)或各子菜单项输入代码,它包括以下几个选项:1)名称:显示菜单的名称,如果用户当前正在编辑主菜单,则此处的文件名是不可改变的(其名称为“菜单栏”)。如果用户当前正在编辑子菜单,则此处的文件名可以改变。默认时这里的文件名与用户在菜单设计窗口提示列的内容一样。2)过程:“过程”编辑框用于输入或显示菜单的过程代码。3)“编辑

12、”按钮:单击“编辑”按钮将打开一个文本编辑窗口,它实际上是放大了的过程框。,2023/11/5,18,(3)“菜单选项”对话框(续),图7-8“菜单选项”对话框,2023/11/5,19,7.1.3 在应用程序中使用菜单,菜单创建好后,可用于实际应用程序中,也就是用菜单将编制好的应用程序有机地组织起来。形成一个界面友好的应用程序。1.为菜单或菜单项指定任务(1)为菜单项指定一个命令该命令可以是任何有效的VFP命令,包括对程序和过程的调用。过程应该在“常规选项”对话框的“清理”选项中定义。为菜单指定命令应符合下列的语法格式:DO procname&procname是过程名称。例如,在图7-3的菜

13、单的查询子菜单中,在“结果”项选择“命令”项。在“选项”中输入下述语句:DO e:txtvfp60统计学生成绩.qpr该命令将已经建立“统计学生成绩”的查询功能加入菜单。,2023/11/5,20,(2)为菜单项指定一个过程,当为不含有子菜单的菜单或菜单项指定过程时,可在“结果”菜单框中,选择“过程”,单击“创建”按钮或“编辑”按钮,在打开的编辑窗口中输入过程代码。当为含有子菜单的菜单或菜单项指定过程时,应首先在“菜单级”框中选择要指定过程的菜单项。然后从“显示”菜单中选择“菜单选项”菜单项,显示“菜单选项”对话框,如图7-9所示。,图7-9 为含有子菜单的菜单指定过程,2023/11/5,2

14、1,(2)为菜单项指定一个过程(续),用下述方法之一可指定下一个过程:在“过程”框中编写或调用过程;单击“编辑”按钮,再单击“确定”按钮,打开独立的编辑窗口并编辑或调用过程。在图7-3中,为增加输入功能,可以在输入菜单添加下述过程语句:USE e:txtvfp60 xk.dbf EXCLUSIVEAppenduse,2023/11/5,22,2.添加初始化代码,菜单的初始化代码可包含:创建环境的代码定义内存变量的代码打开所需要文件的代码用PUSH MENU和POP MENU保存或恢复菜单系统的代码。向菜单系统添加初始化代码的方法是:(1)从“显示”菜单中选择“常规选项”(“常规选项”对话框如图

15、7-7所示)。(2)在“常规选项”对话框的“菜单代码”区域,选择“设置”复选框。(3)单击“确定”按钮,打开一个初始化代码编辑窗口。(4)在初始化代码编辑窗口输入适当的初始化代码。对所建的菜单,当多次执行时,会发出“表已打开”的错误,为此可以添加下述初始化代码:CLOSE ALL,2023/11/5,23,3.添加清理代码,菜单清理代码的作用是在菜单初次启用时启用菜单或菜单项,或在菜单使用过程中,根据用户的选择废止或启用菜单系统中的菜单或菜单项。菜单清理代码一般放在初始化代码及菜单定义代码后,菜单的指定任务过程代码之前。添加菜单清理代码的步骤是:在“常规选项”对话框的“菜单代码”区域选择“清理

16、”复选框。在打开的编辑窗口中输入清理代码。,2023/11/5,24,4.释放菜单,当应用程序结束时,菜单的使命也宣告完成。这时,需要释放菜单,以节约内存。释放菜单的命令为:RELEASE MENUS例如,在“退出”菜单中,输入如下过程语句:RELEASE MENUSSET SYSMENU TO DEFAULT最后完成的菜单设计器如图7-10所示。,图7-10 最后完成的菜单设计器画面,2023/11/5,25,4.释放菜单(续),完成菜单设计后,单击“菜单”菜单的“生成”命令,在“另存为”对话框中为新设计的菜单程序命名,单击“保存”按钮,在“生成菜单”对话框中单击“生成”按钮。菜单生成后,自

17、动生成两个文件:.mnx文件,用来保存菜单系统,该文件的作用是可以将其加入项目中并同其余模块连编成一个应用程序。.mpr文件,这个文件是生成的VFP菜单程序,用户可自行修改,并可将其加入.prg程序文件中。运行菜单程序,其执行结果如图7-11所示。,图7-11 已完成的菜单,2023/11/5,26,7.1.4 创建自定义工具栏,用户应用程序中有一些任务使用非常频繁,如果通过菜单系统选择执行,用户会感到不方便。VFP允许将这些高频率的重复任务定制在工具栏上,即一个任务增添一个按钮,以简化和加速任务的执行。本节主要介绍定制工具栏、定义工具栏类、在表单集中添加自定义工具栏等内容。值得注意的是,虽然

18、可以新建工具栏,但用户不能重置创建的工具栏按钮。,2023/11/5,27,1.定制Visual FoxPro工具栏,(1)制定VFP工具栏的步骤1)从“显示”菜单选择“工具栏”选项,出现“工具栏”对话框,如图7-12所示。2)选择要定制的工具栏使其显示在当前屏幕上,然后单击“定制”按钮,打开“定制工具栏”对话框,如图7-13所示。,图7-12“工具栏”对话框,图7-13“定制工具栏”对话框,2023/11/5,28,(1)制定VFP工具栏的步骤,3)选择“定制工具栏”对话框中的分类,然后将选定按钮拖动到制定工具栏上。例如,如果将“编辑”工具栏中的“剪切”和“复制”工具拖到“报表设计器”工具栏

19、上,则这两个工具就成为了“报表设计器”工具栏中的两个工具。4)单击“关闭”选项,关闭工具栏窗口,完成工具栏的定制。,2023/11/5,29,(2)创建自己的工具栏的步骤,1)从“显示”菜单中选择“工具栏”选项打开“工具栏”对话框。2)在“工具栏”对话框中单击“新建”按钮,出现如图7-14所示的“新工具栏”对话框。3)在“新工具栏”对话框中为工具栏命名,如“我的工具栏”。然后单击“确定”按钮,此时系统将打开“定制工具栏”对话框。4)选择“定制工具栏”对话框中的一个分类,然后拖动适当的按钮到新建的工具栏上。5)选择“定制工具栏”对话框的“关闭”选项,关闭工具栏窗口,完成新建工具栏。,图7-14“

20、新工具栏”对话框,2023/11/5,30,(3)删除创建的工具栏步骤,1)从“显示”菜单中选择“工具栏”打开“工具栏”对话框。2)在“工具栏”对话框选择要删除的工具栏。3)单击“删除”按钮。4)单击“确定”按钮以确定删除。,2023/11/5,31,2.定义工具栏类,定义一个自定义工具栏类的步骤如下:(1)从“文件”菜单中选择“新建”命令,在“新建”对话框中选定“类”,然后单击“新建文件”按钮。(2)在“类名”框中键入新类的名称。(3)从“派生于”框中选择Toolbar,以使用工具栏基类。(4)在“存储于”框中输入类库名,保存创建新类。此时“新建类”对话框画面如图7-15所示。,图7-15“

21、新建类”对话框,2023/11/5,32,2.定义工具栏类(续),(5)单击“确定”按钮,出现如图7-16所示的类设计器。(6)在该工具栏中放置三个控件,通过“布局”工具栏将它们调整至等宽和等高。最后通过属性窗口为控件对象设置属性和代码,其最终的设计结果如图7-17所示。(7)保存所设计的类,新建类命名为“新类.vcx”。,图7-16 类设计器,图7-17 设计好的工具栏,2023/11/5,33,3.在表单集中添加自定义工具栏,可在表单设计器中协调工具栏和表单。可以在表单中添加工具栏,让工具栏与表单中的各表单一起打开。步骤如下:(1)打开要使用上述工具栏类的表单集,如“学生花名册”表单集。再

22、从“表单控件”工具栏选择“查看类”,然后从其快捷菜单中选择“添加”命令。系统此时将打开“打开”对话框,从中选择刚创建的自定义工具栏的可视类库文件“新类.vcx”,并单击“打开”按钮,则“表单控件”工具栏将选定可视类库文件中的类图表所代替。(2)从“表单控件”工具栏中选择工具栏类。(3)在表单设计器单击,VFP将在表单上添加工具栏,如果尚未创建表单集,VFP将提示用户创建一个。,2023/11/5,34,3.在表单集中添加自定义工具栏(续),(4)为工具栏及其按钮定义操作,此时表单设计器画面中新添加一个TOOLBAR1工具栏。(5)运行表单,其结果如图7-18所示。可看到添加的工具栏随表单的打开

23、或关闭而打开或关闭。,图7-18 包含TOOLBAR1工具栏的表单运行画面,2023/11/5,35,7.2 定制和调测菜单系统,菜单系统的测试与调试定制菜单系统,2023/11/5,36,7.2.1 菜单系统的测试与调试,调试菜单一般有两个过程:在设计菜单时,可通过预览功能进一步完善菜单系统;在生成菜单程序后,可使用诊断工具进行调试。只要单击“预览”按钮即可在屏幕上预览整个菜单系统。该菜单可模拟执行,此方法前面已经讲述,本节重点介绍用诊断工具进行调试菜单系统的方法。在测试中发现菜单程序有错误后,可使用VFP的调试环境逐步找到错误,具体有如下几个步骤:跟踪代码挂起程序的执行查看存储的值。,20

24、23/11/5,37,1.启动调试器,调试器是用来调试VFP程序的工具,打开调试器的方法是从“工具”菜单中选择“调试器”。调试器如图7-19所示。,图7-19 调试器应用程序外观,2023/11/5,38,2.跟踪代码,跟踪代码可观察每一行代码的运行,同时检查所有的变量、属性和环境设置的值:(1)在调试器中打开菜单应用程序。从调试器的“文件”菜单中选择“打开”命令,可打开一个需要调试的菜单应用程序。图7-19的调试器中打开了“菜单3.mpr”的菜单程序。(2)在调试器中连续执行程序。从调试器的“调试”菜单中选择“执行”命令。菜单可连续执行。当遇到断点时程序会自动停止执行,并停在断点处。(3)在

25、调试器中单步执行程序。单击工具栏“单步”按钮。(4)定位修改错误代码。当发现错误时,进行修改的方法:从“调试”菜单中选择“定位修改”命令,将挂起执行程序然后打开代码编辑器,编辑器中的代码定位在“跟踪”窗口中光标所在位置的代码。,2023/11/5,39,3.挂起程序的执行,挂起程序实际上就是在程序的适当地方设置断点。根据要分析的代码错误的原因,有几种设置断点的方法:(1)在某行代码处设置断点。1)在“跟踪”窗口中,找到要设置断点的行。2)将光标放置在该代码行上。3)按F9键或者单击“调试器”工具栏上的“切换断点”按钮;或者双击该代码行左边的灰色区域。此时,该代码行左边的灰色区域中会显示一个实心

26、点,表明该行已经设置了一个断点。,2023/11/5,40,(1)在某行代码处设置断点(续),还可使用断点对话框设置断点,从“工具”菜单中选择“断点”命令,打开“断点”对话框,如图7-20所示。在“断点”对话框中断点的设置方法请参见表7-1。,图7-20“断点”对话框,2023/11/5,41,(2)对表达式设置断点,了解运行条件何时发生改变,可对表达式设置断点:1)在图7-20所示的“断点”对话框中,从“类型”列表中选择“当表达式值改变时中断”。2)在“表达式”对话框中输入相应的表达式。表7-2给出了各种表达式断点的设置方法。,表7-2 断点表达式示例1,2023/11/5,42,(2)对表

27、达式设置断点(续),(3)有条件地将程序挂起。调试程序时,当满足某种条件时将程序挂起的方法:1)在图7-20所示的“断点”对话框中,从“类型”列表中,选择“当表达式值为真时中断”。2)在“表达式”对话框中输入相应的表达式。断点表达式示例如表7-3所示。3)单击“添加”按钮,将断点添加到“断点”列表中。,表7-3 断点表达式示例2,2023/11/5,43,(4)有条件地在某代码行上将程序挂起,当某条件为真时,才挂起某代码行。1)从“类型”列表中选择“如果表达式为真则在定位处中断”。2)在“定位”框中,输入适当的位置。3)在“表达式”框中,输入相应的表达式。4)单击“添加”按钮。5)单击“确定”

28、按钮。(5)移去断点1)在“断点”对话框中,选择要删除的断点,单击“删除”按钮即可删除断点。2)在“跟踪”窗口中,找到要删除的断点,双击该代码行左边的灰色区域。或者单击“调试器”工具栏上的“切换断点”按钮。,2023/11/5,44,4.查看存储的值,(1)在“跟踪”窗口中,将光标定位到任何一个变量、数组或属性上,即可在提示条中显示它的当前值。(2)在“监视”窗口的“监视”框中,输入任意有效的VFP表达式。该表达式的值和类型就会出现在“监视”窗口的列表中。,2023/11/5,45,7.2.2 定制菜单系统,本节主要介绍状态栏、标题位置、保存与还原和创建默认过程、设置系统菜单。创建一个基本的菜

29、单系统后,可对它进行定制。例如创建状态栏信息、定义菜单的位置、添加与菜单相匹配的工具栏按钮等。,2023/11/5,46,1.显示状态栏信息,在选到一个菜单或菜单项时,可在状态栏显示一些说明该菜单或菜单项的信息。这种信息可帮助用户了解所选菜单的有关情况。添加提示信息的方法是:,在“提示”栏中单击相应的菜单标题或菜单项。单击“选项”栏中的按钮,显示“提示选项”对话框,如图7-21所示。在该对话框中已输入了提示信息,并已定义了键标签和键说明。,图7-21“提示选项”对话框,2023/11/5,47,2.定义菜单标题的位置,在应用程序中可预先设置用户自定义菜单标题位置。首先打开“常规选项”对话框,根

30、据提示可设置菜单相对于活动菜单系统的相对位置。在“常规选项”对话框中,有几个位置选项:“替换”、“追加”、“在.之前”和“在.之后”。如图7-21所示,在每一个菜单对应的“提示选项”对话框中,“对象”下拉列表中也有几个选项可控制菜单标题位置,其含义已在7.1.2节介绍。,2023/11/5,48,3.保存与还原菜单,有时需要暂时将正在使用的菜单移去,而用另一个菜单替换,使用完成后再将原来的菜单恢复过来。VFP提供了压栈与出栈技术可实现这种替换。压栈与出栈技术主要由下述两条命令完成:PUSH MENU和POP MENU。下面的程序段从系统菜单栏上删除“窗口”菜单标题:PUSH MENU _MSY

31、SMENURELEASE PAD MSMWINDO OF _MSYSMENUWAIT WINDO“按任一键还原默认菜单”POP MENU _MSYSMENU,2023/11/5,49,4.创建菜单系统默认过程,默认过程就是一段程序代码,是一种全局过程。可以被程序中的各程序或过程调用。例如,一个正在开发的应用程序,其中有一些未开发设计好的子菜单或过程,可以为这些菜单或过程创建一个临时占位过程,当选定这些菜单时,执行这个默认过程,这样有利于调试。下面的代码就是用于这一目的的:=MESSAGEBOX(此功能不可用)将上述代码输入“常规选项”的过程窗口即完成了创建默认过程。图7-22是上述默认过程的运

32、行结果。,图7-22 默认过程执行结果,2023/11/5,50,7.3 数据共享访问程序设计,在共享环境中,一般有两种方式访问数据:从独占文件中访问从共享文件中访问独占方式是指只有打开表的用户有权使用数据,其他用户不能对该文件进行读写。显然,这种方式不适合大量用户共享数据的环境。从共享文件中访问数据是指当一个用户访问某文件数据时,允许其他用户对该文件数据进行访问。,2023/11/5,51,7.3.1 控制对数据的访问,1.访问数据对于共享方式,允许多个用户在同一时刻打开同一个数据文件。如果某一用户想要更新数据,例如对某一条记录进行修改或添加一条新的记录,则必须首先将该记录占用,不允许其他用

33、户读或写该记录。在数据库中,这种行为称为给记录加锁。其他用户仍有权读或写其他未加锁的记录。该用户将数据写入该加锁的记录,写完后,再释放该记录,即开锁。实际上,所谓的共享,是通过对记录或表的不断加锁和开锁完成的。,2023/11/5,52,(1)以独占方式使用表,打开一个文件最严格的限制方式是独占方式。在默认情况下,通过界面打开的表都是独占方式的。也可以使用VFP命令明确声明以独占打开一个表,其方法是在“命令”窗口或在程序中使用下述命令:SET EXCLUSIVE ONUSE 或者USE EXCLUSIVE,2023/11/5,53,(1)以独占方式使用表(续),另外,下述命令要求以独占方式打开

34、一个表:ALTER TABLE INDEX,当创建、添加或删除一个复合索引标识时INSERT BLANKMODIFY STRUCTUREPACKREINDEXZAP可以使用FLOCK()函数来限制对表的访问。使用该函数锁定一个表,则其他用户不能对该表进行写操作,只能读。,2023/11/5,54,(2)以共享访问的方式使用表,以共享方式打开一个表时,多个工作站可同时访问该表。通过界面打开表时,可以不考虑SET EXCLUSIVE默认的ON设置,而明确使用VFP命令打开一个表供共享使用。若要打开一个共享方式的表,可在“命令”窗口中键入下列命令:SET EXCLUSIVE OFFUSE 或者USE

35、 SHARED,2023/11/5,55,2.数据的加锁与解锁,如果要共享访问文件,必须通过锁定表和记录来对这种访问进行管理。锁定不同于访问权限,它既可以对数据进行长期控制,也可以短期控制。VFP提供自动和人工两种锁定方式。(1)选择记录或表锁定无论是自动记录锁定还是人工记录锁定,目的都是为了防止两个用户同时写一个记录。表锁定用来防止其他用户在表中进行写入操作,但允许读取整个表。由于表锁定阻止其他用户更新表中的记录,因而很少使用。,2023/11/5,56,(2)选择自动或人工锁定,除了选择记录锁定或者表锁定,还可以选择自动锁定或者人工锁定。许多VFP命令在执行之前都会自动锁定一个记录或一个表

36、,如果成功锁定了记录或表,则执行该命令,然后再解锁。表7-4列出一些具有能自动锁定记录和表功能的命令。,2023/11/5,57,2)表头和表锁定的特点,一些VFP命令锁定整个表,而有些命令则只锁定表头。表锁定命令比表头锁定命令更严格。锁定表头时,其他用户不能添加或删除记录,但可以修改字段内的数据。在任一时刻,只允许一个用户对表执行APPEND BLANK 命令,否则,用户将得到错误信息:“其他用户正在使用文件”。这个信息表明有两个或多个用户正在执行APPEND BLANK命令。,2023/11/5,58,(3)人工锁定记录和表,可以用锁定函数人工锁定一个记录或一个表。包括:RLOCK()、L

37、OCK()和FLOCK()。RLOCK()函数等同于LOCK()函数,都可以锁定一个或多个记录。FLOCK()锁定一个文件。LOCK()和RLOCK()函数可以用于锁定表头。如果把0作为记录编号提供给LOCK()或RLOCK(),而且测试表明表头未锁定,则该函数将锁定表头并返回“真”(.T.)。,2023/11/5,59,(4)数据解锁,在共享环境下锁定记录或文件并完成了相应的数据操作之后,应及时解锁。几种解锁的办法:只需简单地移动到下一个记录就能解锁其他情况则需要明确的命令要解锁被自动锁定的记录,只需移动记录指针,甚至在设置MULTILOCKS ON的情况下也是如此。对于人工锁定的记录,必须

38、明确地对记录解锁,仅仅移动记录指针是不够的。,2023/11/5,60,(4)数据解锁(续),对人工和自动的记录锁定和表锁定进行解锁的命令:UNLOCK:解锁当前工作区内的记录和文件。UNLOCK ALL:对当前工作期内所有的工作区解锁。SET MULTILOCKS OFF:建立新锁定的同时自动解锁当前锁定。FLOCK():在锁定文件之前解锁文件中的所有记录。CLEAR ALL、CLOSE ALL、USE、QUIT:对所有记录和文件解锁。END TRANSACTION:对所有的自动锁定项解锁。TABLEUPDATE():在更新表之前解锁所有锁定项。注意:如果记录在UDF中被自动锁定,那么当移开

39、记录指针然后又移回该记录时,锁定将被解除。可以使用表缓冲避免这个问题。,2023/11/5,61,7.3.2 使用数据工作期,为确保共享环境中的每个用户都具有安全、正确的环境副本,确保表单的多个实例能独立操作,VFP 提供了数据工作期。数据工作期是对当前动态工作环境的描述。可以将数据工作期看成是一个小型的数据环境,这个环境运行在同一机器上一个开放的VFP工作期内。每个数据工作期包括:表单的数据环境中各项的备份。临时表代表打开的表、索引及其关系。,2023/11/5,62,1.使用私有数据工作期,如果想更多地控制表单的多个实例,可以使用私有数据工作期。当表单使用私有数据工作期时,VFP为应用程序

40、创建的表单、表单集或工具栏控件的每个实例新建一个数据工作期。每个私有数据工作期包括:表单的数据环境中每个表、索引和关系的独立备份。数目不限的工作区。独立于表单基表的每个备份表的记录指针。,2023/11/5,63,1.使用私有数据工作期(续),可用数据工作期数目只受可用的系统内存和磁盘空间的限制。通过设置表单的DataSession属性可使用数据工作期。DataSession的含义是:DataSession=1默认的数据工作期(缺省设置)DataSession=2私有数据工作期。若要使用私有数据工作期,可以:在“表单设计器”中,将表单的DataSession属性设置为“2私有数据工作期”;或者

41、在程序代码中将DataSession属性设置为2:frmFormName.DataSession=2注意:只能在设计时设置DataSession属性。在运行时刻DataSession为只读属性。,2023/11/5,64,1.使用私有数据工作期(续),当表单使用的是私有数据工作期时,在单个的机器上,一个VFP工作期中打开表单的每个实例都使用自己的数据环境。使用私有数据工作期类似于在不同的工作站上同时运行同一个表单,如图7-23所示。,图7-23 等价的多个数据工作期,2023/11/5,65,2.识别数据工作期,每个私有数据工作期是单独识别的。可在“数据工作期”窗口中查看每个数据工作期内容;也

42、可通过在Load事件代码中的命令改变数据工作期说明。使用DataSessionID运行时刻属性,可以查看每个数据工作期的识别号。示例显示名为frmMyForm的表单的DataSessionID属性。DO FORM frmMyForm?frmMyForm.DataSessionID如果使用NAME子句激活表单,可使用该表单的名称访问DataSessionID属性,如下面的代码所示:DO FORM MyForm NAME one?one.DataSessionID,2023/11/5,66,3.使用多个表单实例更新数据,私有数据工作期生成各自独立的工作区,工作区包含了表单的开启表、索引和关系的独立

43、备份,表单的每个备份引用了相同的基表和索引文件。当用户从表单的一个实例中更新记录时,将同时更新该表单引用的基表。当定位到更改的记录时,就可以看到表单另一个实例所作的更改。如果在一个私有数据工作期对记录或表进行了锁定,其他私有数据工作期就不能再进行锁定。通过遵守其他数据工作期所作的锁定,VFP可以保护基表更新的完整性。,2023/11/5,67,4.定制数据工作期的环境,由于数据工作期控制着某些SET命令的范围,可以在单一的VFP工作期中使用私有数据工作期以建立自定义的SET命令设置。例如,SET EXACT命令控制比较不同长度字符串时使用的规则,作用于当前数据工作期。SET EXACT命令的默

44、认设置为OFF,规定表达式右边直到末尾的每个字符都完全匹配时,两个表达式才算相等。通过在默认的数据工作期中将SET EXACT命令设置为OFF,可以使用“模糊”搜索或相似查找。但是,应用程序可能包含特殊的表单,它需要精确匹配。可以将需要精确匹配的表单的DataSession属性设置为2,使用私有数据工作期,然后将SET EXACT命令设置为ON。由于仅在使用私有数据工作期的表单时,使用SET命令,则当为一个特定的表单启用自定义工作期设置时,可以保留整个VFP工作期设置。,2023/11/5,68,5.使自动私有数据工作期的设置无效,在使用表单的私有数据工作期时,在一个表单中对数据所作的更改不会

45、自动地体现到相同表单的其他实例中。如果想让表单的所有实例都访问相同的数据,并且立即反映对公共数据所作的更改,则可以取消自动数据工作期的设置。要使自动数据工作期的设置无效,可使用命令:SET DATASESSION TO 1或者SET DATASESSION TO这两个命令都将启用命令窗口以及项目管理器所控制的默认数据工作期。,2023/11/5,69,7.3.3 缓冲访问数据,在多用户环境下,VFP的记录缓冲和表缓冲技术可以保护对单个记录或多个记录所做的数据更新以及数据维护操作。缓冲区可以自动测试、锁定及解锁记录或表。缓冲技术用来解决数据更新操作过程中所遇到的冲突。,2023/11/5,70,

46、1.缓冲方法和锁定方式,VFP提供两种缓冲:记录缓冲:用于一次只对一个记录进行的访问、修改或写操作。表缓冲:用于对多个记录的更新操作。在使用缓冲时,有两种锁定方式:保守式开放式锁定方式用来决定一个或多个记录被锁定的时机和方法,2023/11/5,71,1.缓冲方法和锁定方式(续),保守式缓冲:在多用户环境中,保守式缓冲能防止其他用户在对某一特定记录或表正进行修改时访问它。保守式缓冲为单个记录的修改提供最安全的工作环境,但是会降低用户的操作速度。这种缓冲方式非常类似于FoxPro以前版本的标准锁定机制,此外它还带有内在数据缓冲等更多的好处。开放式缓冲:开放式缓冲是更新记录的有效方法,因为锁定只在

47、写记录时生效,这样在多用户环境中使单个用户独占系统的时间最少。在视图上使用记录或表缓冲时,VFP将强制使用开放式锁定。,2023/11/5,72,2.启用缓冲,使用函数CURSORSETPROP(Buffering,Num)可设置缓冲和锁定方法,表7-5列出了Num函数的有效值。,表7-5 缓冲方式及设定方法,2023/11/5,73,7.3.4 更新数据,1.使用缓冲更新数据(1)在表缓冲区中追加和删除记录1)追加记录。使用APPEND或APPEND BLANK命令。当追加了一条记录之后,在表缓冲区中刚增加的记录的记录序号为负值。可使用RECNO()函数返回记录序号,使用GO n命令定位记录

48、。例如,在当前表缓冲区中原有7、7、9三条记录,使用APPEND或APPEND BLANK命令追加三条记录后,此时缓冲区将包含6条记录,对应的RECNO()的值是7、7、9、-1、-2和-3。,2023/11/5,74,(1)在表缓冲区中追加和删除记录(续),2)删除记录。从表缓冲区中删除追加的记录的操作步骤如下:使用带负值的GO命令将记录指针定位到要删除的记录,例如,GO-1。使用DELETE命令将该记录加上删除标记。使用TABLEREVERT()函数将该记录从缓冲区中移去。使用.T.值的TABLEREVRT()函数,可从表缓冲区中移去所有追加的记录。,2023/11/5,75,(2)将表缓

49、冲区中记录写入表中,TABLEUPDATE()命令将所有当前的记录写入一个表,包括已打上删除标记的记录。下面是一个在启用保守式记录缓冲方式的情况下,更新记录的代码程序段:OPEN DATABASE 成绩管理USE xk.dbf=cursorsetprop(Buffering,2)lModified=.F.FOR nFieldNum=1 TO FUNCTION()IF GETFLDSTATE(nFieldNum)=2lModified=.T.EXITENDIFENDFORIF lModifiednResult=MESSAGEBOX(Record has been modified.Save?,4

50、+32+256,data change)IF nResult=7=TABLEREVERT(.F.)ENDIFENDIFSKIPIF EOF()=MESSAGEBOX(already at bottom)SKIP 1ENDIFTHISFORM.REFRESH,2023/11/5,76,2.使用事务处理更新数据,事务处理更新操作是一种“要么全都做,要么全不做”的更新操作。它实际上不直接对数据库进行更新操作,而是处于缓冲操作的外层,用来缓冲对内存或硬盘的数据更新操作。实际的数据库更新在事务结束之后进行。若由于某种原因系统不能执行对数据库的更新操作,就可回滚整个事务处理,而不执行任何更新操作。事务保护

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号