230 likes | 447 Views
Visual FoxPro 程序设计教程. 第 8 章. 表单集与多重表单. 8.2 多重表单. 8.1 表单集. ● 表单的类型. ● 创建表单集. ● 主从表单之间的参数传递. ● 表单集的应用. ● 隐藏 Visual FoxPro 主窗口. 8.1 表单集. 表单集有以下优点: (1) 可同时显示或隐藏表单集中的全部表单。 (2) 可以可视的调整多个表单以控制它们的相对位置。
E N D
第8章 表单集与多重表单 8.2 多重表单 8.1 表单集 ●表单的类型 ●创建表单集 ●主从表单之间的参数传递 ●表单集的应用 ●隐藏Visual FoxPro 主窗口
8.1 表单集 表单集有以下优点: (1) 可同时显示或隐藏表单集中的全部表单。 (2) 可以可视的调整多个表单以控制它们的相对位置。 (3) 因为表单集中所有表单都是在单个.scx文件中用单独的数据环境定义的,可自动地同步改变多个表单中的记录指针。如果在一个表单的父表中改变记录指针,另一个表单中子表的记录指针则被更新和显示。 如果需要将多个表单处理为表单组,可以创建表单集。 运行表单集时,将加载表单集所有表单和表单的所有对象。加载带着很多控件的多个表单将会花费几秒钟的时间。 教学进程
表单集的应用 【例8-1】使用表单集设计的电子标题板程序(如图8-2所示)。 设计步骤如下: (1) 设计“控制”表单。 表单中各对象属性的设置参见图8-3。 图8-2 使用表单集设计的电子标题板程序 图8-3 设计“控制”表单 教学进程
(2) 创建表单集。 (3) 新建自定义方法。 ●编写表单集的自定义方法Yidong()的代码: DO CASE CASE THIS.Tag = "1" && 用MOVE方法向上向左移动 20 线 THIS.Form2.Label1.Move( THIS.Form2.Label1.Left – 3, THIS.Form2.Label1.Top – 3) IF THIS.Form2.Label1.Left <= 0 THIS.Tag = "2" && 如果到达表单左边界,向上向右移动 ELSE IF THIS.Form2.Label1.Top <= 0 THIS.Tag = "4" && 如果到达表单顶端,向下向左移动 ENDIF ENDIF CASE THIS.Tag = "2" && 向上向右移动 20 线 教学进程
THIS.Form2.Label1.Move( THIS.Form2.Label1.Left + 3, THIS.Form2.Label1.Top – 3) IF THIS.Form2.Label1.Left >= (THIS.Form2.Width – THIS.Form2.Label1.Width) THIS.Tag = "1" && 如果到达表单右边界,向上向左移动 ELSE IF THIS.Form2.Label1.Top <= 0 THIS.Tag = "3" && 如果到达表单顶端,向下向右移动 ENDIF ENDIF CASE THIS.Tag = "3" && 向下向右移动 20 线 THIS.Form2.Label1.Move( THIS.Form2.Label1.Left + 3, THIS.Form2.Label1.Top + 3) IF THIS.Form2.Label1.Left >= (THIS.Form2.Width - THIS.Form2.Label1.Width) THIS.Tag = "4" && 如果到达表单右边界,向下向左移动 ELSE 教学进程
IF THIS.Form2.Label1.Top <= 0 THIS.Tag = "3" && 如果到达表单顶端,向下向右移动 ENDIF ENDIF CASE THIS.Tag = "3" && 向下向右移动 20 线 THIS.Form2.Label1.Move( THIS.Form2.Label1.Left + 3, THIS.Form2.Label1.Top + 3) IF THIS.Form2.Label1.Left >= (THIS.Form2.Width - THIS.Form2.Label1.Width) THIS.Tag = "4" && 如果到达表单右边界,向下向左移动 ELSE IF THIS.Form2.Label1.Top >= (THIS.Form2.Height – THIS.Form2.Label1.Height) THIS.Tag = "2" && 如果到达表单底端,向上向右移动 ENDIF ENDIF CASE THIS.Tag = "4" && 向下向左移动 20 线 教学进程
THIS.Form2.Label1.Move( THIS.Form2.Label1.Left – 3, THIS.Form2.Label1.Top + 3) IF THIS.Form2.Label1.Left <= 0 THIS.Tag = "3" && 如果到达表单左边界,向下向右移动 ELSE IF THIS.Form2.Label1.Top >= (THIS.Form2.Height – THIS.Form2.Label1.Height) THIS.Tag = "1" && 如果到达表单底端,向上向左移动 ENDIF ENDIF ENDCASE 教学进程
(4) 编写事件代码: ●编写表单集的Activete事件代码: THIS.Tag = "1" ● “控制”表单Form1中编辑框Edit1的Click事件代码: LPARAMETERS nKeyCode, nShiftAltCtrl IF nKeyCode = 13 THISFORMSET.Form2.Label1.Caption = THIS.Value ENDIF ● “控制”表单Form1中“开始”按钮Command1的Click事件代码: THISFORMSET.Form2.Timer1.Enabled = .T. ●“控制”表单Form1中“暂停”按钮Command2的Click事件代码: THISFORMSET.Form2.Timer1.Enabled = .F. ●“控制”表单Form1中“关闭”按钮Command3的Click事件代码: THISFORMSET.Release 教学进程
“标题板”表单Form2中计时器Timer1的Timer事件代码:“标题板”表单Form2中计时器Timer1的Timer事件代码: n = THISFORMSET.Form1.OptionGroup1.Value DO CASE CASE n = 1 IF THISFORM.Label1.Left + THISFORM.Label1.Width > 0 THISFORM.Label1.Left = THISFORM.Label1.Left – 5 ELSE THISFORM.Label1.Left = THISFORM.Width ENDIF CASE n = 2 IF THISFORM.Label1.Top + THISFORM.Label1.Height > 0 THISFORM.Label1.Top = THISFORM.Label1.Top – 5 ELSE THISFORM.Label1.Top = THISFORM.Height ENDIF CASE n = 3 THISFORMSET.yidong() ENDCASE 教学进程
8.2 多重表单 表单的类型 VFP允许创建以下几种类型的表单(如图8-5所示): (1) 子表单: (2) 浮动表单: (3) 顶层表单 图8-5 表单的类型 教学进程
子表单 建立一个子表单的步骤: (1) 用“表单设计器”创建或编辑表单。 (2) 可将表单的ShowWindow属性设置为下列值之一: 0 — 在屏幕中(默认)。子表单的父表单即为Visual FoxPro主窗口。 1 — 在顶层表单中。当子窗口显示时,子表单的父表单是活动的顶层表单。如果希望子窗口出现在顶层表单窗口内,而不是出现在Visual FoxPro主窗口内时,可选用该项设置。 (3) 如果希望子表单最大化时与父表单组合成一体,可设置表单的MDIForm属性为“真”(.T.);如果希望子表单最大化时仍保留为一独立的窗口,可设置表单的MDIForm属性为“假”(.F.)。 教学进程
浮动表单 浮动表单是由子表单变化而来,建立浮动表单的步骤: (1) 用“表单设计器”创建或编辑表单。 (2) 可将表单的ShowWindow属性设置为以下值之一: 0 — 在屏幕中(默认)。浮动表单的父表单将出现在Visual FoxPro主窗口。 1 — 在顶层表单中。当浮动窗口显示时,浮动表单的父表单将是活动的顶层表单。 (3) 将表单的Desktop属性设置为“真”(.T.)。 顶层表单 建立顶层表单的步骤: (1) 用“表单设计器”创建或编辑表单。 (2) 将表单的ShowWindow属性设置为“2 — 作为顶层表单”。 教学进程
当管理一个表单的多个实例时,必须记住以下要点:当管理一个表单的多个实例时,必须记住以下要点: (1) 在启动表单中创建一个数组属性,数组中的每个元素用来存放一个表单的实例变量,如果事先不知道有多少个实例,跟踪实例变量的最简便的方法就是使用数组。 (2) 对于拥有多个实例的表单,将其DataSession属性设置为2 – 私有数据工作期。私有数据工作期为表单的每个实例提供一个独立的工作区,因此选定的表和记录指针的位置都是独立的。 例如,在主表单中定义一个数组属性.aForms,然后在主表单中就可以用以下代码建立子表单Multi.scx的多个实例: n = ALEN(THISFORM.aForms) DO FORM Multi NAME THISFORM.aForms[n] LINKED DIMENSION THISFORM.aForms[nInstance + 1] 此时,以下代码将设置第2个子表单实例的Cption属性为:我是第2个 aForms[2].Caption = "我是第2个" 进一步编写本例的代码时,可以管理表单对象数组,使得关闭表单后,空的数组元素能被作为打开的表单重新使用。否则,数组的大小将不断增加,元素的个数也逐个增加。 教学进程
主从表单之间的参数传递 主表单在调用子表单时,使用DO命令的下列格式,可以实现主从表单之间的参数传递。 (1) 接受从子表单返回的值: DO FORM 〈子表单名〉 TO〈 内存变量〉 说明:从子表单返回的值存放于〈内存变量〉中,在主表单中可以被使用。 (2) 主表单向子表单传递数据: DO FORM 〈表单文件名〉 WITH 〈实参表列〉 说明:在子表单的Init事件代码中应该有如下代码来接受数据: PARAMETERS 〈形参表列〉 〈实参表列〉与〈形参表列〉中的参数应用逗号分隔,〈形参表列〉中的参数数目不能少于〈实参表列〉中的参数数目。多余的参数变量将初始化为:.F. – 假。 (3) 主表单与子表单相互传递数据: DO FORM 〈表单文件名〉 WITH 〈实参表列〉 TO 〈内存变量〉 下面的例子创建自定义的“输入框”表单来模拟VB中的输入框函数,在主表单与子表单之间传递参数。 教学进程
【例8-2】从主表单中将输入框的“标题”、“信息”和“默认值”传给子表单(如图8-6),然后将子表单输入框中的输入值返回主表单(如图8-7)。 图8-6 将“标题”、“信息”和“默认值”传给子表单 教学进程
图8-7 主表单得到返回值 教学进程
设计步骤如下: (1)首先设计子表单(InputBox.scx)。 ① 建立应用程序用户界面。 ② 设置对象属性。 ③编写程序代码。 ● 编写子表单form1的事件代码: Init事件: PARAMETERS cPrompt,ctitle,cDefault SET EXACT ON IF TYPE('cDefault') = 'L' cDefault = "" ENDIF IF TYPE('ctitle') = 'L' ctitle = "输入框" 教学进程
ENDIF IF TYPE(' cPrompt ') = 'L' cPrompt = "请输入:" ENDIF THIS.Caption = ctitle THIS.Label1.Caption = cPrompt THIS.Text1.Value = cDefault SET EXACT OFF UnLoad事件: RETURN THISFORM.creturn ●编写“确定”按钮Command1的Click事件代码: THISFORM.creturn = THISFORM.Text1.Value THISFORM.Release ●编写“取消”按钮Command2的Click事件代码: THISFORM.Release 教学进程
(2)然后设计主表单。 ① 建立应用程序用户界面。 ② 设置对象属性。 ③ 编写程序代码。 ● 编写“输入框”按钮Command1的Click事件代码: cParam1 = THISFORM.Container1.Text1.Value cParam3 = THISFORM.Container2.Text1.Value cParam2 = THISFORM.Container3.Text1.Value DO FORM LOCFILE("inputbox.scx") WITH cParam1,cParam2,cParam3 TO nRetValue THISFORM.Container4.Text1.Value = nRetValue ●编写“关闭”按钮Command2的Click事件代码: THISFORM.Release 教学进程
隐藏Visual FoxPro主窗口 在运行顶层表单时,如果不希望显示Visual FoxPro的主窗口,有两种方法可以隐藏Visual FoxPro的主窗口。 1. 利用Visible属性 可以使用应用程序对象的Visible属性按要求隐藏或显示Visual FoxPro主窗口。 (1) 在表单的Init事件中,包含下列代码行: Application.Visible = .F. (2) 在表单的Destroy事件中,包含下列代码行: Application.Visible = .T. 2. 使用配置文件 在配置文件中包含以下行,可以隐藏Visual FoxPro主窗口: SCREEN = OFF 教学进程
习题8 8.1在表单集的不同表单中进行控制和属性的设置(如图8-10所示)。 图8-10 表单集中的不同表单 教学进程
8.2使用表单集设计口令验证表单与系统表单。如果是合法用户则进入系统表单,否则将关闭表单集。8.2使用表单集设计口令验证表单与系统表单。如果是合法用户则进入系统表单,否则将关闭表单集。 8.3使用主、子表单形式设计口令验证系统。 8.4在例7-6中使用输入框子表单输入数据。 教学进程