1. 主页 > 2018世界杯阿根廷 >

全面掌握Visual FoxPro(VFP)学习资料

本文还有配套的精品资源,点击获取

简介:Visual FoxPro(VFP)是一款功能强大的数据库管理系统,由Microsoft开发。本学习资料为初学者提供从入门到精通的全方位指导,涵盖VFP的安装、界面操作、数据类型与变量、流程控制、数组与集合、函数与过程、表操作、查询与视图、表单与报表设计、数据库应用、程序设计与调试以及面向对象编程的高级特性,最终通过实践项目巩固知识。

1. Visual FoxPro简介

Visual FoxPro,一个高性能的数据库管理系统和面向对象的编程语言,因其强大的数据处理能力和简便的开发过程,在90年代到21世纪初受到了广泛欢迎。Visual FoxPro提供了丰富的内置函数和灵活的语法结构,使开发者能够快速构建功能强大的应用程序。尽管它已经不是主流开发工具,但其在处理小型到中型数据库应用中的高效率依然被一些开发者所珍视。

随着技术的发展,Visual FoxPro已经完成了它的历史使命,不过在理解其历史地位和作用时,我们仍然可以从中汲取编程思想和数据处理的经验。在本章中,我们将探索Visual FoxPro的基本概念,它在数据管理领域内的应用,并简要回顾它对现代软件开发的影响。通过对Visual FoxPro的简介,我们为后续章节中更深入的技术细节和应用技巧打下基础。

2. 环境配置与界面操作

2.1 Visual FoxPro的安装与配置

2.1.1 系统要求和安装步骤

在开始使用Visual FoxPro之前,确保你的计算机满足系统要求。Visual FoxPro 是一个针对Windows操作系统设计的数据库管理系统,通常需要如下配置:

Windows 95/98/NT/2000/XP Pentium 133 MHz 或更快的处理器 最小64 MB RAM,推荐128 MB或更高 约300 MB的硬盘空间

安装步骤如下:

下载Visual FoxPro安装包 :获取最新版本的安装文件,可以从官方渠道或者其他可信的IT资源网站下载。 运行安装程序 :双击下载的安装文件,遵循安装向导的提示进行安装。选择安装路径,通常默认路径即可。 输入产品密钥 :在安装过程中,会要求输入产品密钥,确保输入正确的密钥以激活软件。 选择组件 :根据需要选择安装组件,例如数据库服务器组件、开发工具等。 完成安装 :完成所有安装步骤并重启计算机。

2.1.2 环境变量的设置与测试

在Visual FoxPro安装完成之后,正确设置环境变量对于命令行工具的使用非常关键。环境变量的配置使得FoxPro可以被命令提示符或其他程序调用。

设置FoxPro路径 :通常在系统环境变量中添加Visual FoxPro的安装目录,如 C:\Program Files\Microsoft Visual Studio\VFP98 。 配置命令行工具 :确保FoxPro命令行工具 VFP9R.DLL 被正确引用,这样命令行下的 VFPPATH 命令才能正常工作。

环境变量设置完成后,进行测试:

vfp

在命令行输入上述命令,若安装成功,则会出现Visual FoxPro的命令界面。

2.2 Visual FoxPro的操作界面

2.2.1 主窗口的布局和功能

Visual FoxPro的主窗口提供了一个集成环境,包括代码编辑、调试和运行等功能。主窗口的布局通常包括:

编辑器窗口 :用于编写和修改程序代码。 输出窗口 :显示编译错误、运行结果等信息。 命令窗口 :运行命令和程序。 调试窗口 :用于调试程序,显示变量状态等。

功能说明:

代码编写 :使用编辑器编写FoxPro代码,支持语法高亮、代码补全等功能。 程序运行 :在命令窗口输入命令或程序名,执行程序。 调试程序 :在调试窗口设置断点,逐行执行程序,查看变量状态。

2.2.2 菜单栏、工具栏和状态栏的使用

菜单栏 :提供程序设计的主要功能入口,如文件操作、编辑、视图、调试、项目管理等。 工具栏 :快速访问常用功能的图标按钮,如新建、保存、编译、运行等。 状态栏 :显示当前状态信息,如当前文件、光标位置、代码行数等。

使用示例:

创建新文件 :点击 File 菜单下的 New 选项,或使用工具栏的相应按钮。 保存文件 :点击 File 菜单下的 Save 选项,或使用工具栏的保存按钮。 编译运行程序 :点击工具栏的编译按钮,编译当前程序;点击运行按钮,执行程序。

2.2.3 项目管理器的使用

项目管理器(Project Manager)是Visual FoxPro中用来管理项目文件的集成工具。它提供了一个界面,以便用户可以轻松地查看、添加、删除或修改项目中的文件。

打开项目管理器 :在命令窗口输入 project manager 或使用菜单栏的相应选项。 添加文件到项目 :在项目管理器界面,点击 Add 按钮,选择需要添加到项目的文件。 删除项目文件 :选择项目管理器中的文件,点击 Remove 按钮进行删除。 组织文件结构 :使用项目管理器可以创建文件夹,组织文件结构,以提高项目的可管理性。

以上部分介绍了Visual FoxPro的基础界面操作,掌握这些基本操作是开始数据库开发工作的第一步。接下来,随着对更多高级特性的学习,将逐渐深入了解Visual FoxPro提供的丰富功能。

3. 基本数据类型与变量

3.1 Visual FoxPro的数据类型

3.1.1 常见的数据类型介绍

Visual FoxPro支持多种数据类型,基本类型包括字符型(Character)、数值型(Numeric)、日期型(Date)、日期时间型(DateTime)、逻辑型(Logical)、双精度浮点型(Double)、货币型(Currency)、备注型(Memo)和通用型(General)。这些数据类型用于存储不同类型的数据,以满足不同应用场景的需要。

字符型 用于存储文本信息,最大长度为254个字符。 数值型 用于存储整数或小数,根据需要可以选择不同的长度和小数位数。 日期型 用于存储日期信息,格式通常是“YYYY-MM-DD”。 日期时间型 用于存储日期和时间,格式为“YYYY-MM-DD HH:MM:SS”。 逻辑型 用于存储真(.T.)或假(.F.)的逻辑值。 双精度浮点型 用于存储大范围的浮点数。 货币型 类似于数值型,但在计算时使用四舍五入到分的精确度。 备注型 可以存储较长的文本信息,最多可存储4GB的数据。 通用型 用于存储OLE对象、图片或其他非文本数据。

3.1.2 数据类型的选择和使用

在选择数据类型时,需要考虑数据的性质、存储空间的需求以及操作效率。例如,如果需要存储的数字不需要小数,就应选择整数型而不是数值型。对于大型文本数据,应使用备注型而不是字符型。

在设计数据库和程序时,合理选择数据类型不仅有助于减少存储空间的浪费,还能提升数据处理的速度。例如,货币型数据可以确保在金融相关的计算中不会有四舍五入的误差。

3.2 变量的定义和使用

3.2.1 变量的命名规则和作用域

变量是程序中用于存储数据的容器。在Visual FoxPro中,变量的命名应遵循一定的规则。它们可以包含字母、数字和下划线,且必须以字母或下划线开头。在同一个作用域内,变量名必须唯一。

变量的作用域可以是局部的也可以是全局的。局部变量只能在其定义的程序、过程或代码块中访问,而全局变量在整个程序中都是可见的。使用全局变量时应谨慎,因为它们可能会导致程序不同部分之间的依赖性增加,从而增加调试的复杂度。

3.2.2 变量的赋值和类型转换

变量的赋值使用赋值运算符(=)。例如:

cName = "John Doe"

nAge = 30

在Visual FoxPro中,可以使用 VAL() 函数将字符串转换为数值,使用 STR() 函数将数值转换为字符串。类型转换是常见操作,用于处理不同数据类型之间的转换需求。

cString = "123"

nNumber = VAL(cString) && nNumber 现在是数值型 123

nNumber = 123

cString = STR(nNumber) && cString 现在是字符型 "123"

变量的类型转换在处理数据输入输出和数据库字段类型不匹配时非常重要。例如,数据库字段是数值型,但用户输入的是文本形式的数字,那么在写入数据库前需要进行转换。

在设计程序时,合理的变量管理包括合适的变量命名和适当的类型转换,这可以提升程序的可读性和维护性。

4. 流程控制语句

流程控制语句是编程中控制程序执行流程的语句,它使程序能够做出决策和循环执行。在Visual FoxPro中,流程控制语句是实现复杂逻辑不可或缺的部分。本章将重点介绍条件语句和循环控制语句在Visual FoxPro中的使用方法。

4.1 条件语句的使用

条件语句允许程序在不同的条件下执行不同的代码分支。Visual FoxPro提供了两种常见的条件语句:IF…ELSE…ENDIF结构和DO CASE…ENDCASE结构。

4.1.1 IF…ELSE…ENDIF结构

IF…ELSE…ENDIF 结构是基于条件表达式的真假来选择性地执行代码块。这个结构的基本语法如下:

IF <条件表达式>

*<条件表达式为真时执行的代码>

ELSE

*<条件表达式为假时执行的代码>

ENDIF

条件表达式 是一个返回布尔值的表达式,决定了IF和ELSE代码块中哪一部分将被执行。 IF部分 如果条件表达式为真,则执行IF与ELSE之间的代码块。 ELSE部分 是可选的,如果条件表达式为假,则执行ELSE与ENDIF之间的代码块。

使用IF…ELSE…ENDIF结构时,注意条件表达式的正确性,并确保适当的代码缩进以提高代码的可读性。

示例代码块展示了一个简单的IF…ELSE…ENDIF结构:

LOCAL nScore

nScore = 75

IF nScore >= 60

? 'Congratulations, you have passed!'

ELSE

? 'Sorry, you have failed!'

ENDIF

4.1.2 DO CASE…ENDCASE结构

DO CASE…ENDCASE结构用于基于表达式的不同值执行不同的代码块。这个结构的语法如下:

DO CASE

CASE <表达式1>

*<当表达式1为真时执行的代码>

CASE <表达式2>

*<当表达式2为真时执行的代码>

CASE <表达式3>

*<当表达式3为真时执行的代码>

OTHERWISE

*<没有任何表达式为真时执行的代码>

ENDCASE

DO CASE 开始条件判断。 CASE 关键字用于定义一个条件表达式及其对应的代码块。 表达式 是返回布尔值的表达式,用于判断是否执行相应的代码块。 OTHERWISE 关键字用于定义一个“否则”的代码块,当前面所有的CASE表达式都不为真时执行。 DO CASE…ENDCASE结构可以处理多种条件分支,并且可以优雅地处理多条件判断的复杂逻辑。

示例代码块演示了一个简单的DO CASE…ENDCASE结构:

LOCAL cDepartment

cDepartment = "Sales"

DO CASE

CASE cDepartment = "Sales"

? "Handle Sales department logic here."

CASE cDepartment = "Marketing"

? "Handle Marketing department logic here."

CASE cDepartment = "Support"

? "Handle Support department logic here."

OTHERWISE

? "Handle other departments logic here."

ENDCASE

4.2 循环控制语句

循环控制语句允许程序重复执行一段代码直到满足特定条件。Visual FoxPro提供了几种循环结构:FOR…ENDFOR循环、WHILE…ENDWHILE循环和DO WHILE…ENDDO循环。

4.2.1 FOR…ENDFOR循环

FOR…ENDFOR循环用于从开始值到结束值重复执行代码块固定次数。FOR循环的语法如下:

FOR <循环变量> = <起始值> TO <结束值>

*<循环体内执行的代码>

ENDFOR

循环变量 表示循环迭代变量,其值在每次循环结束时会自动增加。 起始值 和 结束值 表示循环开始和结束的界限。 循环体内执行的代码 是在每次迭代中执行的代码块。

示例代码块演示了一个简单的FOR…ENDFOR循环,打印数字1到10:

FOR i = 1 TO 10

? i

ENDFOR

4.2.2 WHILE…ENDWHILE循环

WHILE…ENDWHILE循环在给定条件为真时重复执行一段代码。WHILE循环的语法如下:

LOCAL i

i = 1

WHILE i <= 10

? i

i = i + 1

ENDWHILE

WHILE 后面跟一个条件表达式,只要条件为真,循环就会继续执行。 循环体内执行的代码 是在每次迭代中执行的代码块。

WHILE循环特别适用于循环次数不确定的情况。

4.2.3 DO WHILE…ENDDO循环

DO WHILE…ENDDO循环与WHILE…ENDWHILE循环类似,但语法略有不同。DO WHILE循环的语法如下:

LOCAL i = 1

DO WHILE i <= 10

? i

i = i + 1

ENDDO

DO WHILE 之后指定循环条件。 ENDDO 结束循环。 这个结构将首先检查条件,如果条件为真,则执行循环体内的代码。循环体结束一次后,会再次检查条件,直到条件为假时退出循环。

通过合理运用这些循环结构,程序可以灵活地处理重复性任务,实现强大的数据处理功能。

流程控制语句是编程中的基础,合理利用这些控制结构可以帮助程序员编写出更加清晰、高效、可靠的代码。本章分别讲解了条件语句和循环控制语句的基本用法和示例,相信读者通过学习和实践,能够在实际编程中灵活运用这些结构,处理各种复杂的逻辑判断和重复操作。

5. 数组与集合

在本章中,我们将深入探讨 Visual FoxPro 中的数组和集合的定义、操作以及它们的应用。数组与集合是编程中存储和管理数据的一种基本结构。掌握它们的使用,将有助于我们编写出更加高效、结构化的代码。

5.1 数组的定义和操作

5.1.1 一维数组和多维数组的使用

在 Visual FoxPro 中,数组是一组有序的元素,每个元素都可以通过索引来访问。数组可以是一维的,也可以是多维的。理解不同维度数组的特点和使用方法是处理复杂数据结构的基础。

一维数组

一维数组是最基础的数组类型,其中每个元素都通过一个索引访问。在 Visual FoxPro 中创建一维数组很简单,可以直接使用 DIMENSION 关键字:

DIMENSION myArray(10) && 创建一个包含10个元素的一维数组

创建后,我们可以像访问普通变量一样,通过索引来设置或者获取数组元素的值:

myArray(1) = "First Element"

? myArray(1) && 输出 "First Element"

多维数组

多维数组有多个索引,每个索引对应数组中的一个维度。在某些情况下,多维数组更便于组织和处理数据。例如,创建一个二维数组:

DIMENSION my2DArray(2, 3) && 创建一个2行3列的二维数组

在这个二维数组中,可以通过两个索引来访问特定的元素:

my2DArray(2, 3) = "Sixth Element"

? my2DArray(2, 3) && 输出 "Sixth Element"

多维数组能够模拟表格、矩阵等复杂数据结构,是处理此类数据的重要工具。

5.1.2 数组的遍历和处理

数组的遍历是指对数组中的每个元素执行相同的操作。在 Visual FoxPro 中,可以使用循环结构来遍历数组。例如,遍历上面创建的一维数组并打印每个元素:

FOR i = 1 TO 10

? myArray(i)

ENDFOR

对于多维数组,我们需要嵌套循环来遍历每个维度:

FOR i = 1 TO 2

FOR j = 1 TO 3

? my2DArray(i, j)

ENDFOR

ENDFOR

表格展示

数组类型 描述 访问方式 一维数组 最基础的数组类型,每个元素通过一个索引访问 myArray(索引) 多维数组 包含多个索引的数组,通过多个索引访问元素 my2DArray(行索引, 列索引)

理解数组的遍历是编程中常见的一种操作,它通常用于处理集合数据,如数据排序、搜索等。

5.2 集合的创建和应用

5.2.1 集合的操作方法

集合是 Visual FoxPro 中的另一种数据结构,它可以存储不重复的元素。集合提供了丰富的操作方法,比如合并、交集、差集等。

创建集合

创建集合可以使用 SET 关键字,或者利用对象语法:

SET ORDER TO 1 && 按照某个字段排序

aSet = CREATEOBJECT("Set")

aSet.Add("A", "B", "C") && 向集合中添加元素

集合的操作

集合提供了多种操作方法,例如:

合并集合

aSet1 = CREATEOBJECT("Set")

aSet1.Add("A", "B")

aSet2 = CREATEOBJECT("Set")

aSet2.Add("B", "C")

aSet3 = aSet1 + aSet2 && 合并集合

交集

aSet3.Intersect(aSet1, aSet2) && 获取两个集合的交集

5.2.2 集合与数组的比较

集合和数组在 Visual FoxPro 中都是用来存储数据的,但它们在使用上有一些本质的区别。

区别

特征 集合 数组 元素唯一性 集合中元素唯一 数组中可以有重复元素 数据结构 集合不关注元素的排列顺序 数组关注索引和元素的位置关系 操作方法 集合提供了丰富的方法来操作集合数据,如并集、交集等 数组操作较为基础,主要通过索引访问

应用场景

使用集合:

当我们需要操作的是不重复的数据集合,或者需要进行集合间的运算(如并集、交集等)时,集合将是更佳的选择。

aSet1 = CREATEOBJECT("Set")

aSet1.Add("A", "B", "C")

aSet2 = CREATEOBJECT("Set")

aSet2.Add("B", "D", "E")

aSet3 = aSet1.Intersect(aSet2)

? "交集元素为: " + TRANSFORM(aSet3.Value)

使用数组:

当我们需要对数据进行索引排序或频繁的随机访问时,数组是更高效的选择。

DIMENSION myArray(5)

FOR i = 1 TO 5

myArray(i) = i

ENDFOR

mermaid流程图

graph LR

A[开始] --> B[创建数组或集合]

B --> C{数据类型}

C -->|数组| D[定义数组索引]

C -->|集合| E[使用集合操作方法]

D --> F[数组操作]

E --> G[集合操作]

F --> H[数组遍历]

G --> I[集合数据处理]

H --> J[结束]

I --> J

在本章节中,我们探讨了 Visual FoxPro 中数组与集合的定义、操作方法和应用场景。数组作为一种基础的数据结构,在数据存储和快速索引访问方面表现出色。而集合以其独特的元素唯一性和丰富的操作方法,在处理特定的集合数据时提供了极大的便利。理解和掌握这两者之间的差异和适用场景,将有助于我们在实际开发中做出更合理的选择。

6. 函数与过程

在编程中,函数和过程是模块化代码的基本单元,它们使程序更加清晰、易于维护,并且有助于代码的复用。Visual FoxPro(VFP)作为一种数据驱动的编程语言,同样提供了丰富的内置函数和让用户自定义函数与过程的能力。本章将详细介绍函数与过程的使用方法,以及它们在VFP中的应用。

6.1 内置函数的使用

内置函数是VFP提供的预定义函数,它们可以执行各种特定的任务,如字符串处理、数值计算等。使用内置函数可以大大提高编程效率,并且减少代码量。

6.1.1 字符串处理函数

字符串处理是程序开发中常见的需求之一,VFP提供了多种字符串处理函数,比如:

ALLTRIM() :去除字符串两端的空白字符。 LTRIM() 和 RTRIM() :分别去除字符串左边或右边的空白字符。 SUBSTR() :从字符串中提取子串。

下面示例演示 ALLTRIM() 和 SUBSTR() 的使用:

LOCAL cString, cTrimmedString

cString = " Hello, World! "

cTrimmedString = ALLTRIM(cString)

? "原始字符串: " + cString

? "去除空白后的字符串: " + cTrimmedString

? "第一个单词: " + SUBSTR(cTrimmedString, 1, 5)

输出将是:

原始字符串: Hello, World!

去除空白后的字符串: Hello, World!

第一个单词: Hello

6.1.2 数值计算函数

VFP还提供了一些用于数值计算的函数,例如:

ROUND() :对数值进行四舍五入。 INT() :返回数值的整数部分。 RAND() :生成一个0到1之间的随机数。

下面的例子展示了如何使用这些函数:

LOCAL nNumber, nRoundedNumber, nRandomNumber

nNumber = 123.456

nRoundedNumber = ROUND(nNumber)

nRandomNumber = RAND()

? "原始数值: " + TRANSFORM(nNumber)

? "四舍五入后的数值: " + TRANSFORM(nRoundedNumber)

? "随机数: " + TRANSFORM(nRandomNumber)

输出可能会是:

原始数值: 123.456

四舍五入后的数值: 123

随机数: 0.34234

6.2 用户自定义函数和过程

除了内置函数,VFP允许用户根据需求自定义函数和过程。自定义函数和过程可以执行特定的任务,它们的使用增加了代码的模块化。

6.2.1 函数的定义和调用

用户定义的函数类似于内置函数,它们接受参数、执行操作,并返回结果。以下是如何定义和使用自定义函数的示例:

* 定义函数

FUNCTION MultiplyByTwo(nValue)

RETURN nValue * 2

END FUNCTION

* 调用函数

LOCAL nResult

nValue = 10

nResult = MultiplyByTwo(nValue)

? "乘以2的结果是:" + TRANSFORM(nResult)

输出将是:

乘以2的结果是:20

6.2.2 过程的定义和调用

过程与函数类似,但它们不返回值。它们通常用于执行一系列操作,比如在用户界面中,当某些事件触发时执行操作。

* 定义过程

PROCEDURE SayHello

MESSAGEBOX("Hello, World!", 0, "Greeting")

END PROCEDURE

* 调用过程

SayHello()

当执行过程调用时,会弹出一个消息框显示”Hello, World!”。

函数与过程的使用不仅可以使代码结构更加清晰,也方便了代码的维护和扩展。在后续的章节中,我们将结合VFP的其他特性,如表单设计、报表生成等,进一步探讨函数和过程的具体应用。通过这些示例和练习,学习者将能够更加熟练地运用函数和过程来实现复杂的业务逻辑。

7. 表的创建与操作

7.1 数据表的创建和管理

使用表设计器创建表

在Visual FoxPro中,表设计器是一个强大的工具,它允许用户通过图形界面快速创建和修改数据表结构。数据表是数据库中的基础,用于存储数据记录。

以下是使用表设计器创建数据表的步骤:

打开Visual FoxPro,选择“文件”菜单,点击“新建”选项,然后选择“表”以打开表设计器。 在表设计器中,你可以添加新字段,为每个字段定义字段名、数据类型以及字段大小等属性。 完成字段定义后,保存表。建议在保存时为表指定一个逻辑名,便于后续的引用和管理。

修改表结构和索引

随着需求的变化,我们可能需要对已经存在的表结构进行修改。在Visual FoxPro中,你可以通过表设计器来修改表结构,包括添加、删除字段以及修改字段属性。

通过执行以下命令,可以为表添加索引,从而提升查询性能:

USE mytable

INDEX ON 姓名 TAG 姓名索引

上述代码展示了如何为名为 mytable 的表创建一个名为 姓名索引 的索引,基于 姓名 字段。索引可以帮助加快数据检索的速度。

7.2 表的查询和更新

使用SELECT语句进行数据查询

Visual FoxPro 使用 SQL 语言进行数据查询。SELECT 语句是 SQL 中用于数据查询的核心语句。以下是使用 SELECT 语句进行数据查询的一个基本示例:

SELECT * FROM mytable WHERE 姓名 = '张三'

此命令将返回 mytable 表中所有字段中姓名为“张三”的记录。你还可以使用更多的子句来构建复杂的查询,比如 ORDER BY 、 GROUP BY 和 HAVING 等。

插入、更新和删除数据记录

在Visual FoxPro中,可以使用 SQL 的 INSERT 、 UPDATE 和 DELETE 语句来管理数据。

插入数据记录

INSERT INTO mytable (姓名, 年龄) VALUES ('李四', 25)

上述命令在 mytable 表中插入一条新记录,字段值为姓名李四和年龄25。

更新数据记录

UPDATE mytable SET 年龄 = 26 WHERE 姓名 = '李四'

使用此命令可以更新 mytable 表中姓名为“李四”的记录,将其年龄修改为26岁。

删除数据记录

DELETE FROM mytable WHERE 姓名 = '李四'

此命令将从 mytable 表中删除姓名为“李四”的记录。

在使用这些操作时,务必要小心谨慎,因为它们会直接更改数据库中的数据。在执行更新或删除操作之前,确保已经做好了数据备份,以防止不可逆的数据丢失。

在本章节中,我们详细介绍了如何在Visual FoxPro中创建和管理数据表,如何使用 SQL 语句进行数据查询以及如何插入、更新和删除数据记录。理解并掌握这些知识点,对于有效地使用 Visual FoxPro 进行数据库操作至关重要。接下来的章节,我们将探讨如何进行更高级的查询以及使用视图来简化复杂的数据操作。

本文还有配套的精品资源,点击获取

简介:Visual FoxPro(VFP)是一款功能强大的数据库管理系统,由Microsoft开发。本学习资料为初学者提供从入门到精通的全方位指导,涵盖VFP的安装、界面操作、数据类型与变量、流程控制、数组与集合、函数与过程、表操作、查询与视图、表单与报表设计、数据库应用、程序设计与调试以及面向对象编程的高级特性,最终通过实践项目巩固知识。

本文还有配套的精品资源,点击获取