DELPHI基础教程:数据访问部件的应用及编程(二)[3]
Delphi提供了两种方式在数据库表中查找记录 Goto方式和Find方式 这两种方式十分相似 它们的主要区别在于为查找指定查找值的方法不一样 使用Goto方式进行数据查找使用的方法有SetKey方法 GotoKey方法和GotoNearest方法 其实际步骤如下 ①确保要查找的字段是关键字段或辅助索引字段 ②调用SetKey方法把与表对应的TTable部件置成查找状态 ③把查找值赋给相应的字段 ④调用GotoKey方法 并测试它的返回值检验查找是否成功 假设Table 对应的表中第一个字段是关键字段 Edit 是应用窗体中的一个编辑框 用户可以通过Edit 输入查找值 下面的代码将通过Goto方式进行查找 Table SetKey; {将Table 置成查找状态} Table Field[ ] AsString := Edit Text; {指定查找值} Table GotoKey; {进行查找} 上面最后一行代码是根据用户指定的查找值 在表中执行查找 查找的结果有两种 也许成功也许失败 这是由调用GotoKey方法之后返回的布尔值来决定 如果返回True 那么查找成功 并且记录指针会指向与查找值匹配的记录 如果返回Fale 那么查找失败 记录指针的位置不发生变化 下面的代码可以测试调用GotoKey方法之后的返回值 告知用户查找是否成功 Table SetKey; Table Field[ ] AsString:= Smith ; If not Table GotoKey then ShowMessage( 记录没找到 ) 在这一段代码中 如果在表中没有找到第一个字段值为Smith的记录 该应用程序会弹出一个对话框告知用户 记录没有找到 如果在表中存在多个关键字段或辅助索引中包含多个字段时 你在进行查找时 只想为第一个字段指定查找值 那么必须要设置TTable部件的KeyFieldCount的属性值为 如果想为多个字段指定查找值 只能为相邻的字段指定查找值 例如辅助索引 *** 有三个字段 那么我们只能为第一个字段 第一和第二个字段 第一和第二以及第三个字段指定查找值 而不能为第一和第三个字段指定查找值 GotoNearest方法的使用与GotoKey方法完全一样 只是它用于不精确查找 它不要求查找结果与查找值精确匹配 当表中有与查找值精确匹配的记录时 它将记录指针移到该记录处 当表中没有与查找值精确匹配的记录时 它会查找出与查找值最接近的记录 并将记录指针移到该记录处 下面是应用GotoNearest方法的一段代码 Table SetKey; Table Fields[ ] AsString:= Sm ; Table GotoNearest; 执行上述代码后 若表中存在第一个字段值等于Sm的记录时 记录指针将移到该记录处 若表中不存在第一个字段值等于Sm的记录 而存在第一个字段值等于Smith的记录 那么记录指针会移到该记录处 如果我们不是以数据库表中的关键字段作为查找字段 我们也可以为TTable部件的IndexFieldName属性中的字段或IndexName属性中的字段指定查找值进行数据查找 例如 假设Customer表中有一个名叫CityIndex的辅助索引 我们为CityIndex中的字段指定查找值进行查找时 首先设置TTable部件的IndexName属性为CityIndex 然后再进行查找 下面是具体的程序代码 Table IndexName := CityIndex ; Table Open; Table SetKey; Table FieldByName{ City ) AsString := Edit Text; Table GotoKey; 使用Find方式 使用Find方式在数据库中进行数据查找的方法有 FindNearest方法和FindKey方法 FindKey方法和FindNearest方法为数据查找提供了一个简单的方法 它们将SetKey 指定查找值 执行查找三个步骤融合在一步里完成 它们在指定查找值时 是把各字段的查找值组成一个数组传给FindKey或FindNearest 下面是使FindKey方法的一个例子 假设Tabel 对应的表中的第一个字段是关键字段 Table FindKey([Edit Text]) 如果用GotoKey方法完成这一功能则需要编写下面代码 Table SetKey; Table Fields[ ] AsStrine := Edit Text; Table GotoKey; FindKey方法和FindNearest方法的区别与GotoKey和GotoNearest方法的区别是一样的 创建主要──明细数据库应用 TTable部件中MasterSource属性和MasterFields属性是用于定义两个数据库表的一对多的关系 MasterSource属性指定主表对应的TDataSource部件 MasterFields属性指定主表和明细表之间建立联系的字段 主表和明细表之间建立一对多关系时 可能不只是基于一个字段 可能有多个字段 如果有多个字段 那么在说明MasterFields属性时 多个字段之间要用分号隔开 如Table MasterFields := OrderNo;CustNo 在设计阶段可以使用字段连接设计器(Field Link Designer)为两上表创建一对多的关系 在Object Inspector 中双击TTable部件的MasterFields便可以打开Field Link Designer 进行一对多关系的创建 Field Link Designer提供了一种可视化的方法来创建主要──明细表之间的一对多关系 图中Available Indexes组合框中存放着明细表中的关键字段和索引字段 可以选择索引字段进行连接 在主表中选择一个用于连接的关键字段 然后将其与明细表中相应的关键字段连接 单击Add按钮 主要──明细表的连接字段将显示在Joined Fields列表框中 如 CustNo >CustNo TDataSource部件及其应用 TDataSource部件是开发数据库应用程序中用到的非常重要的部件 它是连接数据集部件TTable或TQuery和数据浏览部件的桥梁 TDataSource部件本身十分简单 它所拥有的属性 事件和方法都比较少 在使用该部件时无需作太多的工作 它主要是为数据浏览部件服务的 如果在应用程序中没有使用数据浏览部件 我们也没有必要为应用程序设置TDataSource部件 TDataSource部件的属性 TDataSource部件除了其他部件都拥有的Name属性和Tag属性之外 主要有下面几个属性 DataSet属性 该属性说明TDataSource部件从中获取数据的数据集的名字 它可以是TTable部件的名字 也可以是TQuery部件的名字 甚至还可以指定其他窗体内的数据集作为该属性的值 如在下面的程序中我们指定窗体Form 中的table 作为窗体Form 中的DataSource 的DataSet属性值 TForm Formcreate(Sender : Tobject) Begin DataSource DataSet := Form Table ; end; Enable属性 Enable属性可以暂时性地切断TDataSource部件和与之相连的数据集部件的连接 这是一个布尔型变量 当它的值为False时 TDataSource部件和数据集部件的连接被切断 且所有与TDataSource部件相连的数据浏览部件中将变为一片空白 不显示任何数据信息 当Enabled的值变为True时 TDataSource部件和数据集部件的连接恢复 且与TDataSource部件相连的数据浏览部件恢复显示数据 不过要实现上述这些功能 一般不使用TDataSource部件的Enabled属性 而是调用数据集部件的DisableControls方法和EnableControls 方法 因为调用这两个方法可以方便地控制与数据集部件相连的所有TDataSource部件以及与TDataSource部件相连的数据浏览部件 AutoEdit属性 这是一个布尔型变量 它用于说明是否将与TDataSource部件相连的数据集置于编辑状态 当AutoEdit的值为True时 应用程序运行时 与TDataSource相连的数据集部件自动地被设置成编辑状态 当用户在与TDataSource部件相连的数据浏览部件中输入新的值时 数据集部件中的记录也随之改变 如果AutoEdit的值为False 用户想通过数据浏览部件或程序修改数据集中的记录 必须要调用数据集部件的Edit方法 将其置为编辑状态之后才能够进行 lishixinzhi/Article/program/Delphi/201311/25159
DELPHI基础教程:数据浏览部件的应用及编程(二)[1]
在TDBGrid部件中显示数据库表中的记录信息时 如果TDBGrid使用数据集部件在运行过程中动态生成的字段部件时 TDBGrid显示数据库表中的记录是按表中记录的缺省顺序和字段的缺省顺序显示表中的记录信息 而且要显示表中各个记录的全部字段的值 而在大多数情况下 用户可能希望按自己喜欢的字段顺序显示记录的各个字段 有时还希望只显示记录的部分字段值 要达到这一目的 必须在设计阶段使用字段编辑器来创建永久性的字段部件 并且还要设置各个字段部件有关的属性 当使用字段编辑器(Fields Editor)创建永久性的字段部件提供给TDBGrid部件来使用时 我们可以在TDBGrid部件中更灵活地显示数据库表中的记录信息 例如在字段编辑器中的Fields列表框中我们可以设定字段部件的显示顺序 在设定好字段的显示顺序之后 TDBGrid部件便按这个顺序显示记录的各个字段值 当我们设置字段部件的DisplayFormat和EditFormat属性之后 在TDBGrid部件中便相应地以设定的显式和编辑格式显示字段值和编辑字段值 当设置某一个字段部件的Required属性为True时 当插入一条新记录时 必须要为该字段输入相应的字段值 否则会出错 通过设置字段部件的Visible属性 可以确定相应的字段值是否在TDBGrid组件中显示 有关使用字段编辑器来创建字段部件 设置字段部件的属性请参看 节 TDBGrid部件的主要属性及应用 TDBGrid部件是用于显示和编辑数据库表中的记录信息的重要部件 它是我们在程序设计过程当中要经常使用的 灵活地用于显示和编辑数据库表中的记录信息的一个强有力的工具 TDBGrid具有很多重要的属性 我们可以在程序设计阶段和程序运行过程中进行设置 TDBGrid部件的一些重要属性及其设置方法请参看联机帮助文件 TDBGrid部件中一些重要的属性是Option属性 DrawMode属性和DefaultDrawing属性 我们重点对两个属性进行阐述 Options属性 它是TDBGrid部件的一个扩展属性 在程序设计阶段设置Options属性可以控制TDBGrid部件的显示特性和对事件的响应特性 Options属性在TDBGrid部件的属性栏中显示时 它的前面带有一个 + 标志 双击 + 标志 便可以展开一个布尔型属性列表 用户可以逐个地修改其中的各个属性值 修改完毕后可以双击Options属性前的 标志 使TDBGrid部件的属性列表恢复到原来的显示状态 表 列出了Options属性中包含的所有的扩展属性项以及它们对TDBGrid部件的影响 表 TDBGrid部件的Options属性中的扩展属性项 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 属 性 名 取 值 及 影 响 ───────────────────────────────── dbEditing True: 缺省情况下为此值 确保用户能够在网格中编辑插入和删除数据库表中的记录 False:在网格中不能编辑 插入和删除表中的记录 ───────────────────────────────── dbAlwaysShow True: 当用户选中记录中的一个字段时 自动地使该字段 Editor 处于编辑状态 False:缺省情况下为此值 当一个字段被选中 它不能自动地变成编辑状态 ───────────────────────────────── dgTitles True: 缺省情况下为此值 在网格的第一行中显示字段名或字段标题 False:在网格中不显示字段名或字段对应的标题 ───────────────────────────────── dgIndicator True: 缺省情况下为此值 在网格的最左边用一个黑箭头标注当前记录指针所在的位置 在插入状态时 箭头变成星状 在编辑状时 箭头变成 I 头 False:在网格中不标识当前记录指针的位置 ───────────────────────────────── dgColumnResize True: 缺省情况下为此值 通过拖拉网格的垂直分隔线可以改变网格中各列的宽度 在具体操作时要拖拉各列中显示字段标题区域中的垂直分隔线 False:网格中各列的宽度不能改变 ───────────────────────────────── dgCloLines True: 缺省情况下为此值 在网格中显示各列之间的垂直分隔线 False:在网格中不显示垂直分隔线 ───────────────────────────────── dgRowLines True: 缺省情况下为此值 在网格中显示各行之间的水平分隔线 False:在网格中不显示水平分隔线 ───────────────────────────────── dgTabs True: 缺省情况下为此值 可以在记录的各字段之间移动输入焦点(也即选择提示棒) False:不能在记录的名字段之间移动输入焦点 在网格中按Tab键时 直接跳出网格 ───────────────────────────────── dgRowSelect True: 选择提示棒覆盖整条记录中的全部字段False:缺省情况下为此值 选择提示棒一次只覆盖记录中的一个字段 ───────────────────────────────── dgAlwaysShow True: 缺省情况下为此值 在网格始终显示选择提示棒 即 Selection 使其控件获得焦点时 也是如此 False:只在当网格获得焦点时 才显示选择提示棒 ───────────────────────────────── dbConfirmDelete True: 缺省情况下为此值 当在网格中删除记录时 弹出确认信息 False:在网格中删除记录时不弹出确认信息 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 用户想了解这些可选属性项的作用和影响 还可以参看联机帮助信息 DragMode属性 该属性有两个可选的属性值 当它的值被设置为dmManual时 在应用程序运行过程中 用户可以用鼠标拖放网格中的各列 改变各列在网格中的显示顺序和位置 当用鼠标拖放网格中的一列 改变它在网格中的位置时 只是改变了该列在数据集中的位置 并没有改变它对应的数据库表中的位置 当该属性的值被设置成dmAutomatic时 用户不能用鼠标拖放网格中的各列而改变它在网格中的位置 DefalultDrawing属性 该属性是布尔型属性 它用于控制网格中各网格单元的绘制方式 在缺省情况下 该属性的值为True 也就是说Delphi使用网格本身缺省的方法绘制网格中各网格单元 并填充各网格单元中的内容 各网格单元中的数据根据其对应的字段部件的DisplayFormat属性和EidtFormat属性进行显示和绘制 如果DefaulDrawing属性被设置为False时 Delphi不会自动地绘制网格中各网格单元和网格单元中的数据 用户必须自己为TDBGrid部件的OnDrawDataCell事件编写相应的程序用于绘制各网格单元和其中的数据 在了解了TDBGrid部件的各个属性之后 我们便可以使用TDBGrid部件来显示和编辑数据库表中的数据了 图 所示的应用窗体中各部件的属性设置如表 所示 lishixinzhi/Article/program/Delphi/201311/25148