收藏 分享(赏)

数据查询与显示.ppt

上传人:wspkg9802 文档编号:8696784 上传时间:2019-07-08 格式:PPT 页数:90 大小:839.50KB
下载 相关 举报
数据查询与显示.ppt_第1页
第1页 / 共90页
数据查询与显示.ppt_第2页
第2页 / 共90页
数据查询与显示.ppt_第3页
第3页 / 共90页
数据查询与显示.ppt_第4页
第4页 / 共90页
数据查询与显示.ppt_第5页
第5页 / 共90页
点击查看更多>>
资源描述

1、第7章 数据查询与显示,本章学习要点 l 学习查询组件Table和Query组件 l 掌握ADOTable和ADOQuery组件的用法 l 学习异构和更新查询基本概念 l 掌握数据控制组件显示数据 l 掌握非数据控制组件显示数据,查询是关系数据库中的一个重要概念,它不是数据的集合,而是操作的集合。查询的运行结果是一个动态数据集合,尽管从查询的运行视图上看到的数据集合形式与从数据表视图上看到的数据集合形式完全一样,尽管在数据表视图中所能进行的各种操作也几乎都能在查询的运行视图中完成,但无论它们在形式上是多么的相似,其实质是完全不同的。可以这样理解,数据表是数据源之所在,而查询是针对数据源的操作命

2、令,类似于程序。 在Delphi中,查询的实现可以通过最常用的两类组件来完成,一类是Table组件或者ADOTable组件,用于查询数据库中的固定数据表,另一类是Query组件或者ADOQuery组件,用于查询多个数据表,或只查询数据表中的部分字段。应用Delphi的查询组件是实现关系数据库查询操作的主要方法,它完全可以满足一般信息系统应用的查询要求,也几乎可以应用所有的SQL语句。 在进入数据查询应用之前,首先要了解两类查询组件的用法,本章介绍查询组件及其操作,数据查询、结果显示以及实际中的应用。,7.1 查询组件,在实际信息系统开发过程中,时常会遇到这样的一些要求:除了查询与显示数据库中保

3、存着的信息系统的全部数据外,更多的只是希望看到其中的一部分:数据库中的某些相关数据分别存放于若干个数据表中,而希望看到他们互相连接到一起时的集合状态;希望看到数据表中的某些数据的分类汇总计算的结果;希望看到数据表转置后的分类统计结果等等。满足这样的一些需求,正是Delphi查询组件的功能所在。利用查询可以通过不同的方法来查看、更改以及分析数据。也可以将查询结果作为窗体和报表的记录源。因此可以说,查询组件对任何一个数据库系统的开发都是非常重要的,在应用程序访问数据库时起着极其重要的作用。,7.1.1 Table组件及操作Table组件可以访问数据库表格中的每一行和每一列。它既可以访问本地的数据库

4、如Paradox、dBASE、Access、FoxPro,也可以访问ODBC数据库,还可以访问远程服务器上的SQL数据库如InterBase、Oracle和SQL Server等。 运用Table组件,可以显示和编辑表格中的每一行和每一列,也可以对一个范围内的行进行操作,或者对数据表进行过滤检查,还可以搜索记录,复制、重命名和删除一个表格,并且能够创建表之间的主从关系。 1 设置Table所谓设置Table组件就是将其加入到程序中,并将数据库和数据组件建立好连接。以前的程序里实践过多次了,如有必要,还要为Table组件创建永久字段和设置读写属性。下面对几个重要的地方进一步说明。 (1) 指定访

5、问数据库Table组件的DatabaseName属性用于指定要访问的数据库。对于本地的Paradox和dBASE数据库来说,DatabaseName可以设为BDE别名或数据库存放的路径。而对于SQL数据库来说,DatabaseName属性必须设为BDE别名。用BDE别名指定数据库的好处是,只要修改别名的定义,应用程序就可以访问不同的数据库,而程序本身不必作任何修改。 修改DatabaseName属性时,若Table组件的Active属性原来为True,它会自动变为False。,(2) 指定要访问的数据表设置好要访问的数据库后,就可以用TableName属性用于指定要访问的表。和Database

6、Name属性类似,修改TableName属性时,若Active属性原来为True,它会自动变为False。除了在设计期指定要访问的表,下面的代码可将程序中Table1访问的数据表在运行期加以改变: with Table1 do beginAcitve:=false; /在改变TableName属性前,最好先关闭Table组件 if TableName=customer.db thenTableName:=orders.dbelse TableName:= customer.dbAcitve:=true; /再重新打开组件 end;,(3) 指定数据表的类型如果要访问的数据库是本地的Parado

7、x、dBASE、FoxPro或用逗号隔开的ASCII文本文件,则BDE将用组件的TableType属性指定数据表格的类型,因此这时必须设置TableType属性。当应用程序访问的是远程SQL数据库时,TableType属性就不会起作用了。 指定表格的类型,应按表7-1所示设置TableType属性。表7-1 TableType属性列表,默认情况下,TableType属性设为ttDefault,BDE将根据数据表文件扩展名来区分表格的类型。没有扩展名或者为.DB时,数据表类型是Paradox,扩展名为.DBF数据表类型是dBASE,扩展名为.TXT数据表类型是ASCII文本。 (4) 打开和关闭

8、数据表要显示和编辑数据组件中的数据,如Dbgrid,首先要打开数据表。要打开一个表格有两种方式,一是把Table组件的Active属性设为True,二是调用组件Open方法。数据表格打开后,它就进入dsBrowse状态。,7.2 SLMIS中销售前台查询的应用,在数据库应用程序中,数据控制组件用于界面部分,它负责数据的显示并为数据提供编辑环境。与数据集组件如Table、Query、StoredProc等不同,数据组件都是可视的。也就是说,如果修改了这些组件的属性,能在窗体上马上反映出来。,7.2.1 数据控制组件的基本特性数据控制组件常常又被称为数据浏览组件,主要是对数据库中的数据进行浏览、编

9、辑、插入、删除等操作。第1章1.2.4节简单介绍了数据控制组件,其中图1-6数据控制组件页上的组件及特点如表1-3所示。大多数的数据浏览组件是从标准组件中演变过来的。它们具有一些相似的特性,如DBGrid和StringGrid组件、DBEdit和Edit组件、DBListBox和ListBox组件等。只是数据浏览组件专门用于显示和编辑数据库中记录的字段信息,它们的使用方法及属性有很大的不同。,DataSource属性:说明数据浏览组件连接的数据源组件DataSource,数据浏览组件是从DataSource组件中获取数据的。需要注意的是,连接数据源后一般还要设置数据组件的DataField属性

10、指定要显示的字段。不过DBGrid、DBCtrlGrid和DBNavigator组件来说,因为它们是基于数据集工作的,不 需要设置DataField属性。 1 编辑和更新数据除了DBNavigator组件外,其他数据控件都可以用来显示数据。而且,只要数据集允许,它们还可以编辑和更新数据。用户是否能通过组件修改数据,并将修改后的数据提交存储到数据库中,取决于下列几个因素。,要使用户能够在数据组件中修改数据,还必须把数据组件的ReadOnly属性设为False(默认值)。如果ReadOnly属性设为True,数据组件中显示的数据就是只读的。接下来,一般情况下DataSource组件的Enabled

11、属性设为True(默认值)。如果这个属性设为False,数据组件就无法显示数据,就更不能修改数据。 数据集组件的ReadOnly属性决定了所做的修改能不能写到数据集。如果ReadOnly属性设为False(默认值),就可以将修改写回到数据集。否则,对于程序数据集就是只读的,用户在数据组件中所做的修改不能写到数据集中。,除了DBGrid组件之外,如果通过一个数据浏览组件修改字段值,那么当鼠标指针(或焦点)离开数据浏览组件时,数据浏览组件中被修改的值就会自动被写回磁盘数据库中。若在焦点没有离开数据浏览组件前按ESC键,Delphi会自动放弃其对字段值的修改。在DBGrid组件中修改表中的记录时,只

12、有当焦点离开当前的记录时,即记录指针移到其他记录上时,用户对当前记录的修改才会被写回磁盘上的数据库表;若在焦点没有离开当前记录时按ESC键,Delphi会自动放弃其对当前记录的修改。 2 禁止和允许数据刷新当程序正在遍历整个数据集或者搜索一个特定的记录时,应当暂时禁止数据组件刷新数据,这样能加快遍历或搜索的速度,并防止屏幕总是在闪烁。,等遍历或搜索结束后,程序应当立即调用数据集组件的EnableControls方法恢复刷新数据。如下所示。 /禁止刷新 Table1.DisableControls; TryTable1.First;While not Table1.EOF do Begin /执

13、行任务CustTable.Next;End; Finally /恢复刷新CustTable.EnableControls; End;,调用数据集的Refresh可以读取数据集中最新的数据并刷新数据控制组件,这个功能在多用户访问数据库环境中尤其有用,因为其他用户有可能已改变了数据集中的数据。有时候,调用Refresh可能会导致意想不到的结果。例如,当一个用户在浏览记录时恰好另一个用户已经删除了这条记录,调用浏览记录的用户调用Refresh方法后,会发现这条记录将从数据组件中消失。数据控制组件的Enabled属性决定了组件是否对键盘、鼠标和计时器事件做出反应,默认值是True;如果要防止这些事件对

14、组件产生影响,可将Enabled属性设置为False,此时组件中显示的数据将变灰。下面根据不同的用途介绍各类数据控制组件。,7.2.2 浏览显示数据集有些数据控制组件显示操作的是数据库的一个或几个字段,如DBText和DBEdit;而有的数据组件显示操作整个数据集,这种类型的组件包括DBGrid、DBNavigator和DBCtrlGrid。DBGrid前面已经用得很多了,用来显示数据; 1 使用DBGrid显示数据DBGrid组件的作用是将一个数据集记录显示在网格中,并且可以对其中的数据进行编辑修改。网格中的各字段值可以使用字段编辑器来设定,也可以在运行时动态地设置。 (1) 编辑列对象DB

15、Grid有一个与设置列对象有关的属性Columns。Columns属性是一个DBGridColumns对象,用于管理一组TColumn对象。而DBGrid表格中的每一列就是TColumn对象,它对应数据集中的一个字段。,在一般默认情况下, Delphi会自动为数据集的每一个字段生成一个动态列对象,用于显示字段。使用动态字段对象时,Columns属性自己的State属性为csDefault,表示列的属性取决于字段的属性。当字段的属性发生变化时,列的属性也跟着变化。接下来介绍永久列对象。所谓永久列对象,与永久字段对象相似,就是人为地设置了栅格中列的个数以及各列的属性和外观,而不再动态地由系统生成。

16、除非改变它们的设置,否则永久列对象不会自动产生变化。永久列对象适用于访问的数据集结构不变,对显示表格有特定要求的情况。,在设计期,可以通过双击DBGrid组件或单击Columns属性的省略号打开一个编辑器来建立永久的列对象,然后在对象观察器中设置列对象的属性,如图7-1所示。图7-1 创建永久列对象,第一次打开这个编辑器,里面是空白的,说明还没有建立永久列对象。可以单击工具条里的Add New按钮或快捷菜单里的Add命令来创建新的永久列对象。如果使用Add All Fields,就会基于所连接数据集的每一个字段分别创建一个永久列对象。要删除一个列对象,可以单击工具栏上的Delete Selec

17、ted按钮或快捷菜单里的相应命令。对于永久列对象来说,它属性的默认值仍然取自于字段。例如默认情况下,列的标题就是字段的DisplayLabel属性。如果修改字段的DisplayLabel属性,列的标题将随之改变。当然如果修改了列对象的Caption属性,列的标题不在基于字段的DisplayLabel属性,它们彼此是独立的。永久列对象的FieldName属性指定了作为列数据源的字段名称。,当FieldName属性为空时,列对象的Field属性将返回NULL,并且栅格中该列是空白列,可以用来显示一些自定义的内容,如图像或图表等。另外,不同列对象的FieldName属性可以指向同一个字段,即几个列显

18、示相同内容。 (2) 编辑永久列对象的数据如果DBGrid组件使用了永久列对象,就不能按照修改动态列的方法直接在单元格内编辑修改,应该是从列表框内选择新数据赋值给它。修改编辑永久列中的数据有三种方法。第一种方法是通过建立Lookup字段以组合框的方式显示另一个数据集的数据。步骤是先在当前数据集中增加一个Lookup字段,连接另外一个数据集;然后为DBGrid组件创建一个永久列对象,并将列对象的FieldName属性指向Lookup字段,ButtonStyle属性设置为cbsAuto。,第二种方法是使用列对象的Picklist属性建立一个静态的列表项。步骤是将永久字段对象的ButtonStyle

19、属性设为cbsAuto,将FieldName属性指向一个字段,注意,FieldName不能为空;最后单击Picklist属性边上的省略号按钮,打开一个字符串列表编辑器,然后依行键入一些用于修改列对象数据的字符串。这些字符串就是静态列表项下拉框里的数据,效果与图7-7类似。第三种方法是使用对话框让用户选择数据,首先必须把列对象的ButtonStyle属性设为cbsEllipsis,这样当程序运行时,该列将出现一个省略号按钮;其次为这个按钮编写OnEditButtonClick事件的处理句柄中,在处理过程中,程序将生成并打开一个对话框,在这个对话框中用户可以选择数据来修改列中各字段的值。对于图像字

20、段列表来说,可以用这种方法显示图像数据。 (3) 显示字段对象 第6章介绍了对象字段,DBGrid组件完全支持对对象字段的显示。,DBGrid组件显示对象字段的格式是基于数据集组件的ObjectView属性的。如果ObjectView设为True,对象字段就可以展开或折叠。当对象字段展开的时候,对象字段的每一个子字段将显示在每一子列中,并且有自己的标题栏,所有的子列都位于对象字段的列标题下,这样可以明显地看出字段之间的包含关系。对象字段折叠时,就只显示一个字符串,该字符串列出了每个子字段的值,彼此之间用逗号隔开。另外与对象字段显示相关的属性有: l 列对象的Expandable属性:如果为Tr

21、ue,表示该列是可展开的。 l 列对象的Expanded属性:检测当前列是否已展开。 l DBGrid的MaxTitleRows属性:设置栅格中最多可出现几行标题。 列对象的ParentColumn属性:用于返回显示父字段的列对象。,2数据集导航 导航器组件DBNavigator在第6章6.1节中已作简单的介绍,它由10个按钮组成,可在数据库中方便地浏览和编辑数据。使用VisibleButtons属性可以选择地显示部分按钮,在设计期和运行期均可以实现。下面举例说明当一个DBNavigator组件为多个数据集导航时,如何动态改变DBNavigator procedure TForm1.DBNav

22、igator1Enter(Sender: TObject); beginif Sender =Table1 thenbeginDBNavigator1.DataSource:= DataSource1;DBNavigator1.VisibleButtons:=nbFirst,nbPrior,nbNext,nbLast; end,elsebeginDBNavigator1.DataSource:= DataSource1;DBNavigator1.VisibleButtons:= DBNavigator1.VisibleButtons+ nbInsert, nbDelete,nbEdit,nbP

23、ost,nbCancel,nbRefresh; end; end; 可见,一个DBNavigator组件为多个数据集导航时,应该先动态地改变DBNavigator组件的DataSource属性,使其指向要访问的数据源。 3在栅格中使用数据控制组件 DBCtrlGrid组件和DBGrid组件有点相似,都是以网格的形式显示数据,但作用却相差很大。DBGrid组件的特点是每一行显示一条记录,但可以改变列的属性,而DBCtrlGrid组件的特点是每一行都是一个面板(Panel),这样就可以象Panel组件一样,可以以各种方式控制数据库表中各条记录的显示,当用户选择DBCtrlGrid组件的选项,其他数

24、据控制组件将显示相应的记录。,跟其他数据控制组件一样,它有一个DataSource属性用于指定数据源,但它没有DataField属性以指定要访问的字段。DBCtrlGrid组件每个单元格的外观基本是一致的,使用DBCtrlGrid组件可以随意设置每个单元格的属性外观,并且是通过在单元格内放置其他数据控制组件来显示内容。DBCtrlGrid之所以有这样的特点,是因为每一个单元格就是一个Panel对象,所以可以在其上放置组件。例如,可以放置DBEdit组件显示某个字段的值。另外,DBCtrlGrid的一行上可以显示多个记录,单元格的高度和宽度也都是可以调整的。下面介绍DBCtrlGrid组件的重要

25、属性和方法。AllowDelete属性:如果这个属性设为True,当用户按下Ctrl+Delete键时,将在网格上删除当前记录。 AllowInsert属性:如果这个属性设为True,当用户按下Ctrl+Delete键时,将在网格中插入一条新记录。,ColCount属性:用于设置每行的面板数,这样一行上可以显示多个记录,当修改这个属性时,网格将自动调整它的宽度,但每个面板的宽度保持不变。 EditMode属性:如果这个属性设为True,网格处于编辑状态。 Orientation属性:这个属性的默认值为roVertical,表示当数据集的记录个数大于面板数时,将显示一个垂直方向上的滚动条,利用这

26、个滚动条用户可以看到其它记录。 PanelBorder属性:用于设置面板的边框的类型。 PanelCount属性:用于设置各种可见面板的个数。PanelIndex属性:用于设置当前记录的面板的序号。 PanelWidth和PanelHeight属性:分别用于设置面板的宽度和高度。 SelectedColor属性:用于设置当前记录的面板的背景颜色,以区别于其它面板。 ShowFocus属性:当这个属性为True时,显示当前记录的面板将有一个边框。,DBCtrlGrid组件有一重要方法Dokey。这个方法用于仿真用户的操作,key参数可为如下值(见表7-2)。表7-2 Dokey方法的key参数,

27、使用DBCtrlGrid组件的一般步骤是: l 把一个DBCtrlGrid组件放到窗体上,设置它的DataSource属性指定一个数据源组件,这也是以后在其上放置的其他数据控制组件的数据源。默认情况下,DBCtrlGrid组件有三行和一列,当然可以随意设置它的行列数。 l 图7-3 DBCtrlGrid组件的设计和运行效果图,其中“设计单元”能放置数据控制组件,它相当于一个模板,其他单元格会自动复制“设计单元” 上的数据控制组件,并显示不同的记录,当然“设计单元”上也能放置其他的组件。图7-3所示窗体中放置了ADOConnection1组件、ADOTable1、DataSource1和DBCt

28、rlGrid1四个组件,两个Label组件,两个DBEdit组件。按照第6章6.2节的方法设置ADOConnection1组件连接数据库为newworldhouse,其它组件的属性设置见表7-3所示。 表7-3 组件的属性设置,7.2.3 使用非数据控制组件显示数据在前面介绍了如何使用数据控制组件像DBGrid组件、DBEdit组件等来显示数据。其实在开发数据库应用程序的时候,经常需要使用一些非数据控制组件来显示数据,例如StringGrid组件。StringGrid组件与DBGrid组件有一个重要的区别,就是没有DataSource属性。通过前面的介绍可知,DBGrid组件是从DataSou

29、rce属性指定的数据源取出数据来显示的,这使得编程变得轻松、简单。StringGrid组件是用来处理字符串的栅格的,以行和列的形式显 示字符串,就像一个电子表格一样。 下面先介绍StringGrid组件的用法。 1显示数据要在StringGrid组件中显示数据,要用到它的cells属性,它的定义如下: property CellsACol,ARow:Integer:string;,从上面可以看出,cells属性有两个参数ACol和ARow,其中ACol代表列号,ARow代表行号。需要注意的是,列号在前,行号在后,这与一般的习惯可能不太一样。另外,StringGrid组件里的行号和列号都是从0开

30、始的。 StringGrid组件有一个很常用的属性集Options,它控制着StringGrid组件显示数据的风格、数据格是否允许用户修改等等。它的定义如下: GridOption=(goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect, GoDrawFocusSelected,goRowSizing,goColSizing,goRowMoving,goColMoving,goEditing, GoTabs,goRowSelect,goAlwaysShowEditor,goThumbTracking);,TGri

31、dOptions=set of TGridOption; property Options: TGridOptions; Options数据集里的每个属性的含义如表7-4所示。 表7-4 Options属性表,在用StringGrid组件来显示数据的时候,还要经常使用FixedCols和FixedRows两个属性。这两个属性一般是用来设置是否要固定列和行的,所谓固定的列或行,是指不能滚动、被固定的。这两个属性是一个整数类型的值,它们的取值范围分别为大于0、小于列数(行数)。如图7-4所示是FixedCols和FixedRows都为1时的StringGrid组件。图7-4 FixedCols和F

32、ixedRows都为1时的StringGrid 如果想知道StringGrid组件有多少列或行,可以使用它的ColCount或RowCount属性。这两个属性是可读写的。例如,下面的代码取到StringGrid的列数和行数。,Var nCol,nRow:integer; BeginnCol:= StringGrid1.ColCount;nRow:= StringGrid1.RowCount; End; 同时,也可以在程序的运行期间通过ColCount和RowCount动态地来设置StringGrid的列和行,代码如下。 Var nCol,nRow:integer; BeginnCol:=18;

33、nRow:=28;StringGrid1.ColCount:= nCol;StringGrid1.RowCount:= nRow; End; 在数据显示的时候,Selection也是一个经常使用的属性,它的定义如下。,Type TGridCoord=record X:Longint; Y:Longint; End; Type TGridRect= recordCase integer of0:(Left,Top,Right,Bottom:Longint);1: (TopLeft, BottomRight:TgridCoord); End; Property Selection: TGridRe

34、ct;从它的定义里可以看出,Selection属性是一个矩形。用它来设置或者获取StringGrid组件上所选择的部分。只有将Options里的goRangeSelect属性设为True,才可以在Selection上选择多于一个格的矩形。例如,如果想选择StringGrid上的第二行到第五行、第三列到第四列的矩形,代码如下:,procedure TForm1.BitBtn1Click(Sender:TObject); var myRect:TGridRect;beginmyRect.Left:=2;myRect.Top:=1;myRect.Right:=3;myRect.Bottom:=4;S

35、tringGrid1.Selection:=myRect;end; 2销售前台房屋面积显示和修改销售前台管理中用一个StringGrid组件来显示newworldhouse数据库中hou_bahouse数据表中的房屋面积数据,然后可以单击StringGrid组件进行使用面积的设置,方便客户查看房屋面积信息。程序的窗体如图7-5所示,窗体中主要对象的属性设置如表7-5所示。,表7-5 房屋面积表窗体主要对象的属性设置,图7-5 设计期间的房屋面积表窗体设计界面中标签“区”和“栋”前面的ComboBox1和ComboBox2上均没有文本显示,程序运行时,首先要创建窗体,调用frm_mianjibi

36、aoqt窗体的OnCreate事件,则newworldhouse数据库中hou_bahouse数据表的所有不同区号将显示在ComboBox1列表框中,用鼠标单击ComboBox1上的“ ”下拉按钮即可见所有不同区号,代码如下。,procedure Tfrm_mianjibiaoqt.FormCreate(Sender: TObject); beginBitBtn1.Enabled :=false; /区号没有指定之前,查看按钮不可用,以免误操作ComboBox1.Items.Clear; /将ComboBox1以前保留的信息清空adoquery2.Close;adoquery2.SQL.Cle

37、ar; /将adoquery2数据集以前保留的信息清空adoquery2.SQL.Add(select distinct i_qu from hou_bahouse);/指定adoquery2的数据源adoquery2.Open;if not adoquery2.IsEmpty thenbeginadoquery2.First;ComboBox1.Text:= trim(adoquery2.FieldValuesi_qu);while not adoquery2.Eof dobeginComboBox1.Items.add(trim(adoquery2.FieldValuesi_qu);,ad

38、oquery2.Next; /将所有不同区号加入到ComboBox1中end;end;adoquery2.Close; end;程序运行时,用户只要选择某一区号,则可以在ComboBox2的下拉框中显示该区所有不同的栋号,调用ComboBox1的OnSelect事件可以实现这一功能,代码如下。 procedure Tfrm_mianjibiaoqt.ComboBox1Select(Sender: TObject); varintQu:integer; beginBitBtn1.Enabled :=true; /查看按钮可用ComboBox2.Items.Clear; /将ComboBox2以前

39、保留的信息清空intQu:=strtoint(trim(ComboBox1.Text);adoquery2.Close;,adoquery2.SQL.Clear; /将adoquery2数据集以前保留的信息清空adoquery2.SQL.Add(select distinct c_dong from hou_bahouse where i_qu=:intQu);adoquery2.Parameters.parambyname(intQu).datatype:=ftinteger;adoquery2.Parameters.parambyname(intQu).Value:=intQu;adoqu

40、ery2.Open;if not adoquery2.IsEmpty thenbeginComboBox2.Enabled:=true;adoquery2.First;ComboBox2.Text:= trim(adoquery2.FieldValuesc_dong);while not adoquery2.Eof dobeginComboBox2.Items.Add(trim(adoquery2.FieldValuesc_dong);,adoquery2.Next; /将该区所有不同栋号加入到ComboBox2中end;endelseComboBox2.Enabled:=false;adoq

41、uery2.Close; end; 用户选定区号和栋号后,则可单击“ ”查看该区栋的房屋面积信息,用户一方面可以滚动StringGrid组件的垂直和水平滚动条来滚动记录,也可以使用键盘上的【】和【】来滚动记录。程序运行后的窗体如图7-6所示。图7-6 运行期间的房屋面积表窗体,“ ”按钮的OnClick事件代码如下。 procedure Tfrm_mianjibiaoqt.BitBtn1Click(Sender: TObject); vari,j,m,n1,n2,intqu,intunit:integer;varchardong,area1,area2:string; r,c :integer

42、; beginn1:=1;n2:=1;with strgrid as tstringgrid dobeginif colcount0 thenbegin,for r:=0 to colcount+30 dofor c:=0 to RowCount+30 docellsc,r:=; /将网格清空end;end;intqu:=strtoint(trim(ComboBox1.Text);varchardong:=(trim(ComboBox2.Text);ADOQuery2.Close ; /得到单元数ADOQuery2.SQL.Clear ;ADOQuery2.SQL.Add(select dis

43、tinct i_danyuan from hou_bahouse);ADOQuery2.SQL.Add(where i_qu=:intqu and c_dong=:varchardong);ADOQuery2.SQL.Add(order by i_danyuan);,adoquery2.Parameters.parambyname(intqu).Value:=intqu;adoquery2.Parameters.parambyname(varchardong).Value:=varchardong;adoquery2.Open;if not adoquery2.IsEmpty thenbegi

44、nadoquery2.First ;while not ADOQuery2.Eof dobeginintunit:=ADOQuery2.FieldValuesi_danyuan;if intunit=0 then j:=0elsej:=(intunit-1)*6;if j=0 then strgrid.ColCount:=strgrid.ColCountelse strgrid.ColCount:=strgrid.ColCount+6;for i:=0 to 5 dobegin,strgrid.Cellsi+j,0:=inttostr(intunit)+单元; /显示一个单元的表头end;st

45、rgrid.Cells0+j,1:=楼层;strgrid.Cells1+j,1:=房号;strgrid.Cells2+j,1:=建筑面积;strgrid.Cells3+j,1:=套内实得;strgrid.Cells4+j,1:=分摊;strgrid.Cells5+j,1:=使用面积;ADOQuery1.Close ; /得到一个单元记录ADOQuery1.SQL.Clear ;adoquery1.SQL.Add(select c_louceng,c_fanghao,f_enarea as area1,f_eniarea as area2 from hou_bahouse );ADOQuery1

46、.SQL.Add(where i_qu=:intqu and c_dong=:varchardong and i_danyuan=:intunit);,ADOQuery1.SQL.Add(order by c_louceng,c_fanghao);adoquery1.Parameters.parambyname(intqu).Value:=intqu;adoquery1.Parameters.parambyname(varchardong).Value:=varchardong;adoquery1.Parameters.parambyname(intunit).Value:=intunit;A

47、DOQuery1.Open ;ADOQuery1.First ;fy:=ADOQuery1.RecordCount+4;m:=2;while not ADOQuery1.Eof dobeginstrgrid.Cells0+j,m:=ADOQuery1.FieldValuesc_louceng+ 层;/显示单元一行房屋信息strgrid.Cells1+j,m:=ADOQuery1.FieldValuesc_fanghao;area1:=adoquery1.fieldbyname(area1).AsString;,area2:=adoquery1.fieldbyname(area2).AsStri

48、ng;if area1= then strgrid.Cells2+j,m:=0 /避免房屋面积没有值时,系统报错else strgrid.Cells2+j,m:=area1;if area2= then strgrid.Cells3+j,m:=0else strgrid.Cells3+j,m:=area2;strgrid.Cells4+j,m:=floattostr(strtofloat( strgrid.Cells2+j,m)-strtofloat(strgrid.Cells3+j,m);ADOQuery1.Next; /到单元的下一行房屋记录m:=m+1;end;ADOQuery2.Nex

49、t; /到下一单元end;endelsebegin,showmessage(无+inttostr(intqu)+区+varchardong+栋的房子,请在下拉框中选择!)end; end; 在如图7-19所示的窗体中,可以单击使用面积这一空列,则弹出如图7-7所示的窗体,输入比率后,将比率与该房屋的建筑面积相乘,就可以得到该房屋的使用面积,单击“”可将使用面积的值写回到图7-6运行窗体的使用面积这一列上,实现StringGrid组件上使用面积的修改。图7-7 计算使用面积窗体,利用Strgrid对象的OnClick事件实现StringGrid组件上使用面积的修改,代码如下。 procedure

50、 Tfrm_mianjibiaoqt.strgridClick(Sender: TObject); varx,y:integer; beginx:=strgrid.Selection.Left;y:=strgrid.Selection.Top;if (x+1) mod 6 =0) and (strgrid.Cellsx-3,y) and (strgrid.Cellsx,y=) thenbeginApplication.CreateForm(Tfrm_areajisuanqt, frm_areajisuanqt);/动态创建计算使用面积窗体frm_areajisuanqt.areaqq:=strtofloat(strgrid.Cellsx-3,y); /将该房屋的建筑面积赋给计算使用面积窗体的areaqq变量frm_areajisuanqt.showModal; /显示计算使用面积窗体,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报