visual foxpro 程序设计教程

41
Visual FoxPro Visual FoxPro 程程程程程程 程程程程程程

Upload: amir-woods

Post on 01-Jan-2016

113 views

Category:

Documents


6 download

DESCRIPTION

Visual FoxPro 程序设计教程. 第 5 章. 循环结构程序设计. 5.1 循环结构语句. ● 当型循环命令 DO WHILE. 当型循环的语法格式为: DO WHILE〈 条件 〉 [〈 命令列 〉] [EXIT] [LOOP] ENDDO. 【 例 5-1】 求 1 + 2 + 3 + … + 100 的值。如图 5-2 所示。. 设计步骤如下: 表单界面的设计参见前面章节,这里仅给出命令按钮的 Click 事件代码:. s = 0 n = 1 DO WHILE n

TRANSCRIPT

Page 1: Visual FoxPro  程序设计教程

Visual FoxPro Visual FoxPro 程序设计教程序设计教程程

Page 2: Visual FoxPro  程序设计教程

第 第 55 章章

循环结构程序设计

5.1 循环结构语句●● 当型循环命令当型循环命令 DO WHILEDO WHILE

当型循环的语法格式为:

DO WHILE 〈条件〉

[ 〈命令列〉 ]

[EXIT]

[LOOP]

ENDDO

Page 3: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-1 】求 1 + 2 + 3 + … + 100 的值。如图 5-2 所示。

图 5-2 求和

s = 0n = 1DO WHILE n <=100 s = s + n n = n + 1ENDDOTHISFORM.Text1.Value = s

设计步骤如下:表单界面的设计参见前面章节,这里仅给出命令按钮的 Click事件代码:

Page 4: Visual FoxPro  程序设计教程

教学进程教学进程

输入整数 n ,求阶乘 n! (如图 5-4 )。

【例 5-2 】非负整数 n的阶乘定义如下:

0

0

21

1!

n

n

nn

图 5-4 求阶乘 n!

Page 5: Visual FoxPro  程序设计教程

教学进程教学进程

n = THISFORM.Text1.Value

t = 1

i = 1

DO WHILE i <= n

t = t * i

i = i + 1

ENDDO

THISFORM.Text2.Value = t

设计步骤如下:

表单界面的设计参见前面章节,这里给出命令按钮的 Click 事件代码:

Page 6: Visual FoxPro  程序设计教程

教学进程教学进程

另外,为了防止数据溢出,限制输入的整数不超过 20 。为此,编写文本框 Text1 的事件代码如下: Valid 事件代码:a = THIS.Value

IF a < 0 OR a > 20

MESSAGEBOX(" 请输入不超过 20 的非负整数 !")

THIS.GotFocus

RETURN 0

ELSE

RETURN .T.

ENDIF

GotFocus 事件代码:THIS.SelStart=0

THIS.SelLength=LEN(THIS.Text)

Page 7: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-3 】输入两个正整数,求它们的最大公约数。如图 5-6 所示。

图 5-6 求最大公约数

Page 8: Visual FoxPro  程序设计教程

教学进程教学进程

m = THISFORM.Text1.Value

n = THISFORM.Text2.Value

IF n * m = 0

MESSAGEBOX(" 两数都不能为 0!")

RETURN

ENDIF

IF m < n

t = m

m = n

n = t

ENDIF

r = m % n

DO WHILE r != 0

m = n

n = r

r = m % n

ENDDO

THISFORM.Text3.Value = n

设计步骤如下:表单界面的设计参见前面章节,这里给出命令按钮的 Click 事件代码:

Page 9: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-4 】输入一个正整数,利用“当型”循环判断是否素数。

n = THISFORM.Text1.Values = 0i = 2DO WHILE i <= SQRT(n) AND s = 0 IF n % i = 0 s = 1 ELSE i = i + 1 ENDIFENDDOIF s = 0 a = ' 是一个素数 '

设计步骤如下: 表单界面的设计参见前面章节,这里给出命令按钮的 Click事件代码:

Page 10: Visual FoxPro  程序设计教程

教学进程教学进程

ELSE

a = ' 不是素数 '

ENDIF

= MESSAGEBOX(ALLT(STR(n)) + a, 64 + 0 + 0, " 信息 ")

THISFORM.Text1.SetFocus

● ● 编写 Text1 的 GotFocus 事件代码,使文本框得到焦点后,文本立即被选中:

THIS.SelStart = 0

THIS.SelLength = LEN(STR(THIS.Value))

Page 11: Visual FoxPro  程序设计教程

教学进程教学进程

● ● 步长型循环命令步长型循环命令 FORFOR

语法结构为:

FOR 〈内存变量〉 = 〈初值〉 TO 〈终值〉 [STEP 〈步长值〉 ] [ 〈命令列〉 ] [EXIT] [LOOP]ENDFOR | NEXT

Page 12: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-5 】利用“步长型”循环判断素数的程序。只需修改命令按钮 Command1 的 Click 事件代码:n = THISFORM.Text1.Values = 0i = 2FOR i = 2 TO SQRT(n) IF n % i = 0 s = 1 EXIT ENDIFENDFORIF s = 0 a = ' 是一个素数 'ELSE a = ' 不是素数 'ENDIF= MESSAGEBOX(ALLT(STR(n)) + a, 64 + 0 + 0, " 信息 ")THISFORM.Text1.SetFocus 程序的运行结果同例 5-4 完全相同。

Page 13: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-6 】求 1! + 2! + 3! + … + 20! 的值。

其中命令按钮 Command1 的 Click 事件代码为:s = 0FOR n = 1 TO 20 t = 1 FOR m = 1 TO n t = t * m ENDFOR s = s + tENDFORTHISFORM.Text1.Value = s 运行结果如图 5-11 所示。

图 5-11 求和

Page 14: Visual FoxPro  程序设计教程

教学进程教学进程

5.2 列表框与组合框控件 ●● 使用列表框使用列表框

【例 5-7 】求从 2000 年到 2100 年之间的所有闰年。 设计步骤如下:

(1) 设计表单界面和设置控件属性。 (2) 编写命令按钮 Command1 的 Click 事件代码为:THISFORM.List1.ClearFOR n = 2000 TO 2100 IF n % 4 = 0 IF n % 100 != 0 OR n % 400 = 0 L = 1 ELSE L = 0 ENDIF ELSE L = 0 ENDIF IF L = 1

Page 15: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-8 】利用循环结构和列表框控件,设计一个“选项移动”表单。

设计步骤如下: (1) 建立应用程序用户界面。 (2) 设置对象属性

(3) 编写事件代码。 ●● 编写容器控件 Container1 的 Init 事件代码:THIS.List1.AddItem ("one")THIS.List1.AddItem ("two")THIS.List1.AddItem ("three")THIS.List1.AddItem ("four")THIS.List1.AddItem ("five")THIS.List1.AddItem ("six")THIS.List1.AddItem ("seven")THIS.List1.AddItem ("eight")THIS.List1.AddItem ("nine")THIS.List1.AddItem ("ten")

Page 16: Visual FoxPro  程序设计教程

教学进程教学进程

●● 编写容器控件中命令按钮组 CommandGroup1 的 Click 事件代码:DO CASE CASE THIS.Value = 1 I = 0 DO WHILE I <= THIS.Parent.List1.ListCount IF THIS.Parent.List1.Selected(i) THIS.Parent.List2.Additem (THIS.Parent.list1.List(i)) THIS.Parent.List1.RemoveItem(i) ELSE I = I + 1 ENDIF ENDDO CASE THIS.Value = 2 DO WHILE THIS.Parent.List1.ListCount > 0 THIS.Parent.List2.AddItem(THIS.Parent.List1.List(1)) THIS.Parent.List1.RemoveItem(1) ENDDO CASE THIS.Value = 3

Page 17: Visual FoxPro  程序设计教程

教学进程教学进程

I = 0

DO WHILE I <= THIS.Parent.List2.ListCount

IF THIS.Parent.List2.Selected(i)

THIS.Parent.List1.Additem (THIS.Parent.List2.List(i))

THIS.Parent.List2.RemoveItem(i)

ELSE

I = I + 1

ENDIF

ENDDO

CASE THIS.Value = 4

DO WHILE THIS.Parent.List2.ListCount > 0

THIS.Parent.List1.AddItem(THIS.Parent.List2.List(1))

THIS.Parent.List2.RemoveItem(1)

ENDDO

ENDCASE

Page 18: Visual FoxPro  程序设计教程

教学进程教学进程

IF THIS.Parent.List2.ListCount > 0

THIS.Command3.Enabled =.T.

THIS.Command4.Enabled =.T.

ELSE

THIS.Command3.Enabled =.F.

THIS.Command4.Enabled =.F.

ENDIF

IF THIS.Parent.List1.ListCount = 0

THIS.Command1.Enabled =.F.

THIS.Command2.Enabled =.F.

ELSE

THIS.Command1.Enabled =.T.

THIS.Command2.Enabled =.T.

ENDIF

THISFORM.Refresh

Page 19: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-9 】显示文件目录的列表框程序。在列表框中选定文件后,用鼠标单击“打开选定文件”按钮可打开该文件进行察看或编辑。 设计步骤如下: (1) 选择新建表单,进入表单设计器。增加一个列表框控件 List1 、一个命令按钮 Command1 、两个形状 Shape1~ Shape2 、两个标签 Label1 ~ Label2 和一个文本框 Text1 ,如图 5-16 所示。

图 5-16 文件目录列表

Page 20: Visual FoxPro  程序设计教程

教学进程教学进程

(2) 设置 List1 和 Text1 的属性

(3) 编写事件代码。 ●● 编写表单的 Activate 事件代码:THISFORM.List1.SetFocus

●● 编写文本框 Text1 的 Valid 事件代码:THISFORM.List1.RowSource = ALLTRIM(THIS.Value)

THISFORM.List1.Requery

●● 编写“打开选定文件”按钮 Command1 的 Click 事件代码:a = THISFORM.List1.ListIndex

MODIFY FILE (THISFORM.List1.List(2)+THISFORM.List1.List(a))

Page 21: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-10 】简易数学用表。显示整数 1 ~ 100 的平方、平方根、自然对数和 e 指数,如图 5-18 所示。 设计步骤如下: (1) 设计程序界面与设置对象属性

图 5-18 简易数学用表

(2) 编写 Command1 的 Click 事件代码:FOR n = 1 TO 100 s = ALLT(STR(n)) THISFORM.List1.AddlistItem(s,n,1) s = ALLT(STR(n^2)) THISFORM.List1.AddlistItem(s,n,2) s = ALLT(STR(sqrt(n),10,3)) THISFORM.List1.AddlistItem(s,n,3) s = ALLT(STR(LOG(n),10,4)) THISFORM.List1.AddlistItem(s,n,4) s = ALLT(STR(EXP(n),14,4)) THISFORM.List1.AddlistItem(s,n,5)ENDFOR

Page 22: Visual FoxPro  程序设计教程

教学进程教学进程

●● 使用组合框

1 、下拉列表框【例 5-11 】在文本框输入数据,按回车添加到列表框中,在列表框中选定项目,按回车后可以移去选定项,如图 5-19 所示。

图 5-19 添加或移去文本

Page 23: Visual FoxPro  程序设计教程

教学进程教学进程

设计步骤如下: (1) 选择新建表单,进入表单设计器,首先增加一个形状 Shape1 ,然后,在其中增加一个文本框 Text1 、一个组合框 Combo1 以及两个标签 Label1 ~ Label2 。 (2) 设置 Combo1 的属性

(3) 编写代码。 编写表单的 Activate 事件代码:PUBLIC a

a = 1

THIS.Text1.SetFocus

Page 24: Visual FoxPro  程序设计教程

编写 Text1 的事件代码:

▲▲ KeyPress 事件:LPARAMETERS nKeyCode, nShIFtAltCtrl

IF nKeyCode = 13

IF !EMPTY(THIS.Value)

THISFORM.Combo1.AddItem (THIS.Value)

THISFORM.Combo1.DisplayValue = THIS.Value

ENDIF

THIS.SelStart = 0

THIS.SelLength = LEN(RTRIM(THIS.Text))

a = 0

ENDIF

Page 25: Visual FoxPro  程序设计教程

▲▲ Valid 事件:IF a = 1

RETURN .T.

ELSE

a = 1

RETURN 0

ENDIF

●● 编写 Combo1 的 RightClick 事件代码:IF THIS.ListIndex > 0

THISFORM.Text1.Value = THIS.List(THIS.ListIndex)

THIS.RemoveItem (THIS.ListIndex)

THIS.Value = 1

ENDIF

Page 26: Visual FoxPro  程序设计教程

2 、下列组合框【例 5-12 】在上例中使用下拉组合框来代替文本框和列表框,实现同样的功能:输入数据,按回车后可添加到列表中,在列表中选定项目,单击鼠标右键可移去选定项,如图 5-20 所示。

图 5-20 下拉组合框

Page 27: Visual FoxPro  程序设计教程

教学进程教学进程

设计步骤如下: (1) 表单界面的设计与控件属性的设置参见图 5-20

。 (2) 编写代码。 编写 Combo1 的事件代码: ●● KeyPress 事件:LPARAMETERS nKeyCode, nShiftAltCtrl

IF nKeyCode = 13

IF !EMPTY(THIS. DisplayValue)

THIS.AddItem (THIS.DisplayValue)

THISFORM.Text1.Value = THIS.ListCount

ENDIF

THIS.SelStart = 0

THIS.SelLength = LEN(ALLT(THIS.Text))

THIS.Tag = "N"

ENDIF

Page 28: Visual FoxPro  程序设计教程

教学进程教学进程

●● RightClick 事件:IF THIS.ListCount > 0

THIS.RemoveItem (THIS.ListIndex)

THIS.Value = 1

THISFORM.Text1.Value = THIS.ListCount

ENDIF

●●Valid 事件:IF THIS.Tag = "Y"

RETURN .T.

ELSE

THIS.Tag = "Y"

RETURN 0

ENDIF

Page 29: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-13 】“简易抽奖机”,在组合框中输入号码。按下“开始”按钮后,组合框中将不停变换随机得到的号码。单击“停止”按钮,号码停止变动,并得到中奖的号码。

图 5-21 简易抽奖机

Page 30: Visual FoxPro  程序设计教程

教学进程教学进程

设计步骤如下:

(1) 表单界面的设计与控件属性的设置参见图 5-21 。在窗体中增加一个计时器控件 Timer1 ,并将其 Timer 属性改为: 50

, Enabled 属性改为: False 。

(2) 编写代码。

编写 Combo1 的事件代码:

●● KeyPress 事件:

Page 31: Visual FoxPro  程序设计教程

教学进程教学进程

LPARAMETERS nKeyCode, nShiftAltCtrlDO CASE CASE nKeyCode = 13 IF !EMPTY(THIS.DisplayValue) THIS.AddItem (THIS.DisplayValue) THISFORM.Text1.Value = THIS.ListCount ENDIF THIS.SelStart = 0 THIS.SelLength = LEN(ALLT(THIS.Text)) THIS.Tag = "N" CASE nKeyCode = 27 && 按 Esc 键后可以移去选项 IF THIS.ListCount > 0 THIS.RemoveItem (THIS.ListIndex) THIS.Value = 1 THISFORM.Text1.Value = THIS.ListCount ENDIFENDCASE

Page 32: Visual FoxPro  程序设计教程

教学进程教学进程

●● Valid 事件:IF THIS.Tag = "Y"

RETURN .T.

ELSE

THIS.Tag = "Y"

RETURN 0

ENDIF

●● 编写计时器控件 Timer1 的 Timer 事件代码,使之可以随机地抽取奖号:n = THISFORM.Text1.Value

a = INT(RAND() * n) + 1

THISFORM.Combo1.ListIndex = a

Page 33: Visual FoxPro  程序设计教程

教学进程教学进程

●● 编写命令按钮 Command1 的 Click 事件代码:THISFORM.Timer1.Enabled = .NOT.(THISFORM.Timer1.Enabled)

a = " 按“停止”按钮,可得中奖号码 "

b = " 中奖号码是: " + THISFORM.Combo1.Text

IF THISFORM.Timer1.Enabled

THIS.Caption = " 停止( \<S ) "

THISFORM.Label1.Caption = a

ELSE

THIS.Caption = " 开始( \<S ) "

THISFORM.Label1.Caption = b

ENDIF

Page 34: Visual FoxPro  程序设计教程

教学进程教学进程

●● 5.35.3 页框页框●● 5.315.31 带选项卡的表单带选项卡的表单

【例 5-14 】在表单中设计一个带选项卡的页框架,其中有三个页面,分别放上一些不同的控件。

设计步骤如下: (1) 选择新建表单,进入表单设计器,设计成具有三个页页的页框,编辑页框 1 。如下图所示

Page 35: Visual FoxPro  程序设计教程

教学进程教学进程

(2) 编辑 Page2 ,如下图所示

(3) 编辑 Page3 ,如下图所示

(4) 编写事件代码。 编写第二页中 Timer1 的 Timer 事件代码:

Page 36: Visual FoxPro  程序设计教程

教学进程教学进程

IF HOUR(DATETIME()) >= 12

THIS.Parent.Label1.Caption = ' 下午 '

ELSE

THIS.Parent.Label1.Caption = ' 上午 '

ENDIF

IF HOUR(DATETIME()) > 12

hh = HOUR(DATETIME()) – 12

ELSE

hh = HOUR(DATETIME())

ENDIF

THIS.Parent.Text1.Value = STR(hh) + SUBSTR(TIME(),3)

Page 37: Visual FoxPro  程序设计教程

教学进程教学进程

【例 5-15 】将例 5-14 中的页框架改为不带选项卡的形式,使用选项按钮组控制页面的选择。如图 5-25 所示。

●● 5.315.31 不带选项卡的表单不带选项卡的表单

Page 38: Visual FoxPro  程序设计教程

教学进程教学进程

Page 39: Visual FoxPro  程序设计教程

教学进程教学进程

设计步骤如下:(在例 5-15 的基础上进行修改)

(1) 选择“打开”表单文件,进入表单设计器,删去选项按钮组控件 OptionGroup1 ,增加一个“命令按钮组”控件 CommandGroup1 ,并修改其属性。其中命令按钮组中的按钮 Command1 和 Com

mand2 的 Enabled 属性改为: .F. – 假,参见图 5-2

6 所示。

(2) 编写命令按钮组 CommandGroup1 的 Click

事件代码:

Page 40: Visual FoxPro  程序设计教程

教学进程教学进程

n = THIS.Valuek = THISFORM.PageFrame1.ActivePageDO CASE CASE n=1 THISFORM.PageFrame1.Pages(1).Zorder CASE n=2 THISFORM.PageFrame1.Pages(k-1).Zorder CASE n=3 THISFORM.PageFrame1.Pages(k+1).Zorder CASE n=4 THISFORM.PageFrame1.Pages(3).ZorderENDCASEk = THISFORM.PageFrame1.ActivePageTHIS.Command1.Enabled = IIF(k = 1, .F., .T.)THIS.Command2.Enabled = IIF(k = 1, .F., .T.)THIS.Command3.Enabled = IIF(k = 3, .F., .T.)THIS.Command4.Enabled = IIF(k = 3, .F., .T.)

Page 41: Visual FoxPro  程序设计教程

ENDEND

(1) (1) 阐述矢量图形与位图图像的区别。阐述矢量图形与位图图像的区别。

(2) (2) 图像分辨率的单位是什么?阐述其意义。图像分辨率的单位是什么?阐述其意义。

(3) (3) 哪种格式的图像文件体积最小?哪种格式的图像文件体积最小?

(4) (4) 练习使用图像浏览器练习使用图像浏览器 ACDSee32ACDSee32 。。

(5) (5) 练习获取练习获取 WindowsWindows 界面的方法。界面的方法。

▲▲ 把把 Windows Media PlayerWindows Media Player 界面粘贴到界面粘贴到 WordWord 文档中。文档中。

▲▲ 把任意一个下拉式菜单粘贴到把任意一个下拉式菜单粘贴到 WordWord 文档中。文档中。

(6) (6) 使用使用 PhotoShopPhotoShop 改变图像的几何尺寸,并保存。改变图像的几何尺寸,并保存。

课外作业课外作业

教学进程教学进程