转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
多层数据库开发七:字 段 对 象         ★★★★

多层数据库开发七:字 段 对 象

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2258 更新时间:2009/4/23 18:30:19
对象都删掉,下次打开数据集时,就会自动创建动态字段对象。
7.5 设置永久字段对象的属性
  使用永久字段对象的一个优势是可以在设计期设置它的属性、建立事件句柄。例如,可以设置字段的显示宽度、它的值是否能修改。
  要设置永久字段对象的属性和建立事件句柄,首先要打开字段编辑器,在字段编辑器中选择一个字段,然后在对象观察器中进行有关操作。
7.5.1 设置字段的显示和编辑属性
  TField提供了若干个属性由于设置字段的显示和编辑属性,这些属性如下所列:
.Alignment设置字段在数据控件中的对齐方式(左、居中、右);
.ConstraintErrorMessage当用户的输入违反纠错规则时显示由此属性指定的信息;
.CustomConstraint设置一个本地使用的纠错规则;
.Currency设为True表示按货币格式显示;
.DisplayFormat设置字段在数据控件中的显示格式;
.DisplayLabel设置字段在数据库栅格中的列标签;
.DisplayWidth设置字段在数据控件中的显示宽度;
.EditFormat设置字段在编辑时的显示格式;
.EditMask设置用户编辑数据时必须遵守的规则;
.FieldKind指定字段的生成类型;
.FieldName指定字段的名称;
.HasConstraints如果字段已经有纠错规则,这个属性就返回True;
.ImportedConstraint返回服务器端或数据字典中的纠错规则;
.Index指定字段在数据集中的序号;
.LookupDataSet指定另一个数据集,以从中查找字段的值;
.LookupKeyFields指定一个或几个字段,用于与关键字段匹配;
.LookupResultField指定一个字段,该字段的值将复制给Lookup字段;
.MaxValue指定字段的最大值;
.MinValue指定字段的最小值;
.Name指定永久字段对象的内部名称如Table1XXH;
.Origin返回字段在数据集中原先的名称;
.Precision指定字段的有效位;
.ReadOnly设为True表示字段的值是只读的;
.Size指定字段的长度(以字符为单位);
.Tag给每个字段对象一个识别号;
.Transliterate设为True表示将根据驱动程序进行转换;
.Visible设为False表示这个字段不出现在数据控件中。
  要说明的是,有些属性并不适用于某些类型的字段,例如,对于一个TStringField类型的字段来说,它就没有Currency、MaxValue、DisplayFormat等属性,对于一个TFloatField类型的字段来说,它就没有Size属性。
  上述属性也可以在运行期设置,例如,要设置Customers表的CityStateZip字段的ReadOnly属性,程序这么写:
   CustomersCityStateZip.ReadOnly := True;
   注意:不能用字段的名称来访问上述属性,而要用字段对象的名称来访问。
7.5.2 设置用户的输入格式
  EditMask属性仅适用于TStringField、TDateField、TTimeField和TDateTimeField类型的字段,用于设置用户的输入格式。
  要设置EditMask属性,可以在对象观察器中单击EditMask属性边上的省略号按钮打开“Input Mask Editor”对话框,如图7.5所示。
  图7.5 设置EditMask属性对话框
  既可以在“Sample Masks”框内选择一种现成的格式,也可以自定义格式。单击“Masks”按钮可以选择更多的格式。
7.5.3 使用默认的显示格式
  对于TFloatField、TCurrencyField、TIntegerField、TSmallIntField、TWordField、TDateField、TDateTimeField和TTimeField类型的字段来说,Delphi 4提供了若干个例程,能够使这些字段按默认的格式显示。这些例程都是在SysUtils单元中声明的,包括:
.FormatFloat适合于TFloatField和TCurrencyField;
.FormatDateTime适合于TDateField、TTimeField和TDateTimeField;
.FormatCurr适合于TCurrencyField。
  所谓默认的格式,实际上是在“控制面板”中设置的。可以打开“控制面板”,双击“区域设置”的图标,就会看到那儿设置了有关数字、货币、时间和日期的格式。例如,如果区域是United States,对于TFloatField类型的字段来说,它的显示格式就是$1234.56。
  当然,无论是在设计期还是在运行期,都可以重新设置DisplayFormat属性和EditFormat属性指定字段的显示格式。也可以在处理OnGetText事件和OnSetText事件的句柄中自定义字段的显示格式。
7.5.4 处理事件
  就像大多数构件一样,永久字段对象也有事件,可以在设计期建立处理事件的句柄。下面列出了TField的事件:
.OnChange当字段的值改变的时候触发这个事件;
.OnGetText当程序试图检索字段的值时将触发这个事件;
.OnSetText当程序试图设置字段的值时将触发这个事件;
.OnValidate当字段的值将要写到记录缓冲区中时将触发这个事件。
  其中,OnGetText事件和OnSetText事件用于设置字段的显示格式,OnChange事件用于对数据的改变作出反应,例如禁止或允许某个菜单项。OnValidate事件对字段的值进行校验。
7.5.5 调用方法
  下面用于列出了TField的方法:
.AssignValue用于对字段赋值,它会自动进行类型转换;
.Clear把字段的值清为NULL;
.GetData把未格式化的数据写到一个缓冲区中;
.IsValidChar判断某个字符对字段来说是否合法;
.SetData把缓冲区中未格式化的数据赋值给字段;
.FocusControl把输入焦点移到字段所在的数据控件上。如果窗体上有几个数据控件显示一个字段的值,FocusControl会把输入焦点移到第一个显示该字段的数据控件上。
7.6 属 性 集
  如果多个字段的显示属性是相同的或大致相同的,不必重复它们的属性,可以设置一个字段的属性如Alignment、DisplayWidth、DisplayFormat、MaxValue、MinValue,然后建立一个属性集加到数据字典中。这样,其他字段就可以从数据字段中引入属性集。
  要建立一个属性集,首先要打开字段编辑器,选择一个永久字段,然后在对象观察器中设置有关属性。设置好后,在字段编辑器上单击鼠标右键,在弹出的菜单中选择“Save Attributes”命令,弹出“Save Attributes As”对话框,如图7.6所示。
  图7.6 保存属性集
  默认情况下,属性集的名称是表名加字段名,例如CustomCompany,可以改变这个名称。
  也可以在SQL Explorer中创建属性集。在SQL Explorer中创建属性集的好处是,您可以指定字段的类型,而且还可以指定一个数据控件如TDBEdit、TDBCheckBox等,当基于该属性集的字段拖到窗体上时会自动把这个数据控件加到窗体上。
  建立了属性集后,其他字段就可以引入这个属性集。首先也要打开字段编辑器,选择要引入属性集的字段,单击鼠标右键,在弹出的菜单中选择“Associate Attributes”命令,弹出“Associate Attributes”对话框,如图7.7所示。
  图7.7 引入属性集
  选择一个属性集,单击OK按钮,该属性集中的属性将应用到刚才选择的字段中,这就是所谓的引入属性集。
  如果以后又不想使用该属性集中的属性,还得打开字段编辑器,选择一个字段,然后单击鼠标右键,在弹出的菜单中选择“Unassociate Attributes”。
7.7 显示、转换和访问字段的值
  数据控件能够自动显示字段的值,在允许编辑的情况下,用户可以在数据控件中修改字段的值,并且把修改后的值写回到数据集中,这一切都不需要写代码。
  应用程序可以通过TField的Value属性访问字段的值,例如,下面这行代码把CustomersCompany字段的值显示在编辑框Edit1中:
  Edit1.Text := CustomersCompany.Value;
  从理论上讲,Value属性可以访问任何数据类型的字段的值。不过,很多数据控件只能传递字符串类型的值,因此,需要对Value属性进行转换。
  幸运的是,TField中提供了众多的转换功能,可以按特定的数据类型来访问一个字段的值,例如,AsString可以把数字或布尔型的字段按字符串类型来访问。
  AsVariant适用于所有的数据类型。要说明的是,转换并不总是成功的,例如,AsDateTime可以把一个字符串转换为日期、时间,但该字符串本身必须能识别为日期时间格式,而不能是一个普通的字符串。有些情况下,虽然转换可以进行,但有可能丢失精度。
  用Value属性访问字段的值需要事先知道字段对象的名称,而很多情况下,往往并不知道字段对象的名称,但字段的名称却是知道的。因此,应用程序往往通过字段的序号或名称来访问字段的值。
  数据集构件都有一个Fields属性,这是一个数组,它的每一个元素代表一个字段,这样就可以按序号来访问某个字段的值,序号是从0开始的。例如,下面的代码把Customers表的第7个字段显示到编辑框Edit1中:
  Edit1.Text := CustTable.Fields[6].AsString;
  下面的代码把第7个字段的值设为编辑框Edit1中的内容:  
   Customers.Edit;
   Customers.Fields[6].AsString := Edit1.Text;
   Customers.Post;
   不过,按序号来访问字段的值不是很安全,因为如果记错了序号,就得不到正确的结果。因此,我们推荐按字段名称来访问字段的值,这就要用到FieldByName函数。
  要调用FieldByName函数,得把字段的名称作为参数传递给FieldByName函数。例如,下面的代码把Customers表的CustNo字段显示到编辑框Edit2中:
   Edit2.Text := Customers.FieldByName(''''CustNo'''').AsString;
  下面的代码把CustNo字段的值设为编辑框Edit2中的内容:
   Customers.Edit;
   Customers.FieldByName(''''CustNo'''').AsString := Edit2.Text;
   Customers.Post;
   在多层体系结构的应用程序中,客户程序向应用服务器申请更新数据时有可能出错,这时候可以用CurValue属性检查字段当前的值,因为字段的值是随时有可能修改的,尤其是在多用户的环境下,因此,知道字段当前的值是很有必要的。
7.8 字段级纠错
  所谓字段级纠错,就是事先定义一些规则或条件,字段的值必须符合这些规则或条件,否则就认为出错。字段对象可以借用SQL服务器纠错,也可以建立自定义的纠错。
  大多数SQL服务器都定义了纠错功能,而客户程序则可以借用服务器纠错。TField的ImportedConstraint属性可以返回服务器的纠错规则,实际上是一个字符串,其语法类似于SQL语句,例如:
  Value > 0 and Value < 100
  如果服务器的纠错仍然不能满足要求的话,可以用CustomConstraint属性自己定义纠错规则。这个属性与ImportedConstraint属性不同的是,如果服务器端的纠错规则发生改变,ImportedConstraint属性也将改变,而自定义的纠错规则是不变的。
  自定义的纠错只适用于本应用程序,并且只对用户输入的数据进行校验,对发向应用服务器或从应用服务器接收到的数据无能为力。
  要自定义纠错规则,就要用到CustomConstraint属性指定纠错规则,并且设置ConstraintErrorMessage属性指定一个信息,当字段的值违反纠错规则时就会显示这个信息。自定义的纠错规则类似于SQL语句的Where部分,例如:X > 0 and X < 100其中,X只是一个符号,用来引用字段的值,符号本身是无关紧要的,只要在纠错表达式中保持一致就行了。
7.9 Oracle 8的对象字段
  Delphi 4是发挥Oracle 8对象关联功能的最佳工具,它支持四种最新的字段,包括ADT(抽象数据类型)、数组、数据集(嵌套表)、引用,它们所对应的字段类型如下所列:
.TADTField代表一个ADT字段;
.TArrayField代表一个数组字段;
.TDataSetField代表一个数据集字段;
.TReferenceField代表一个引用字段,指向另一个ADT字段。
  上述四种类型的字段统称为对象字段,它们的一个基本特征是包含或引用了另一个字段。如果一个数据集包含对象字段,只要在设计期创建了对象字段的永久字段对象,就会自动为这些对象字段所包含或引用的子字段创建永久字段对象。同时,数据集构件的ObjectView属性自动设为True。在ObjectView属性设为True的情况下,数据集中的字段按照它们的继承关系以树状存储,而不是按原先的序号线性存储。
  下面列出了对象字段所特有的一些属性和方法,用于操纵它所包含或引用的子字段:
.Fields用这个属性可以访问对象字段包含或引用的子字段;
.ObjectType返回对象的类型;
.FieldCount返回对象字段所包含或引用的子字段个数;
.FieldValues用这个属性可以访问对象字段包含或引用的子字段的值。
7.9.1 ADT字段
  ADT是一种用户自定义的字段类型,有点类似于结构,它可以包含大多数类型的字段,包括数组、引用和嵌套表。
  要访问一个ADT类型的字段有几种方式,最好先要创建永久字段对象。假设一个ADT类型的字段叫Address,它包含了四个子字段,分别是Street、City、State、Zip。如果为Address字段创建了永久字段对象的话,将看到下列永久字段对象:
CustomerAddress: TADTField;
CustomerAddrStreet: TStringField;
CustomerAddrCity: TStringField;
CustomerAddrState: TStringField;
CustomerAddrZip: TStringField;
  这样,就可以把对象字段的子字段当作一个普通的字段使用,例如:
  CityEdit.Text := CustomerAddrCity.AsString;
  不过,上述代码假设已经创建了对象字段的永久字段对象,如果没有创建永久字段,就要用下面的方式来访问对象字段的子字段:
  CityEdit.Text := Customer.FieldByName(''''Address.City'''').AsString;
  可以用TADTField的FieldValues属性访问子字段的值,例如:
  CityEdit.Text := TAdtField(Customer.FieldByName(''''Address''''))[1];
  由于FieldValues属性是TObjectField的默认属性,因此,上述代码可以改为:
  CityEdit.Text := TAdtField(Customer.FieldByName(''''Address'''')).FieldValues[1];
  上述代码也可以改为用Fields属性,例如:CityEdit.Text := TAdtField(Customer.FieldByName(''''Address'''').Fields[1].AsString;
  甚至还可以这样写:CityEdit.Text :=TADTField(Customer.FieldByName(''''Address'''').Fields.FieldByName(''''City'''').AsString; 
  由此可见,通过永久字段对象来访问对象字段的子字段是最简便的。此外,通过数据集构件的FieldValues属性也可以访问ADT字段,例如:
  Customer.Edit;Customer[''''Address.City''''] := CityEdit.Text;Customer.Post;
  下面这行代码把Address字段的City子字段的值显示到编辑框CityEdit中:
  CityEdit.Text := Customer[''''Address.City''''];
7.9.2 数组字段
  所谓数组字段,其概念类似于数组,它所包含的子字段的类型是相同的,而ADT字段所包含的子字段的类型可以是不同的。数组字段的子字段可以是普通的字段,也可以是ADT字段,但不能是另一个数组字段。
  要访问数据集中的数组字段有几种方式,下面是一种典型的访问方式:
var
OrderDates: TArrayField;
I: Integer;
Begin
For I := 0 to OrderDates.Size - 1 Do
Begin
If OrderDates.Fields[I].Is Null then Break;
OrderDateListBox.Items.Add(OrderDates[I]);
End;
End;
  假设有一个数组字段叫TelNos_Array,它有6个字符串类型的子字段。当为TelNos_Array字段创建永久字段对象时,同时将创建6个子字段的永久字段对象:
CustomerTelNos_Array: TArrayField;
CustomerTelNos_Array0: TStringField;
CustomerTelNos_Array1: TStringField;
CustomerTelNos_Array2: TStringField;
CustomerTelNos_Array3: TStringField;
CustomerTelNos_Array4: TStringField;
CustomerTelNos_Array5: TStringField;
  下面这行代码访问其中的第一个子字段:
   TelEdit.Text := CustomerTelNos_Array0.AsString;
  如果没有为数组字段创建永久字段对象,只能通过FieldValues属性来访问子字段的值,但必须把数据集构件的ObjectView属性设为True。例如:
  TelEdit.Text := TArrayField(Table1.FieldByName(''''TelNos_Array'''')).FieldValues[1];
  由于FieldValues属性是TObjectField的默认属性,因此,上述代码可以改为:
  TelEdit.Text := TArrayField(Table1.FieldByName(''''TelNos_Array''''))[1];
  上述代码也可以这样写:TelEdit.Text := TArrayField(Customer.FieldByName(''''TelNos_Array'''').Fields[1].AsString;
7.9.3 数据集字段
  通过数据集字段,可以非常简单地维护表格与表格之间的一对多关系。通过TDataSetField的NestedDataSet属性可以访问数据集字段所嵌套的子数据集。
  为了支持数据集字段,Delphi 4的TDBGrid构件作了改写,凡是显示数据集字段的栏都有一个省略号按钮,用户单击这个省略号将打开一个新的窗口,这个窗口也用一个TDBGrid构件显示嵌套表的数据。当然,要打开这个窗口,也可以调用TDBGrid的ShowPopupEditor函数,例如:
  DBGrid1.ShowPopUpEditor(DbGrid1.Columns[7]);
  要访问嵌套表中的数据,最好要为数据集字段创建永久字段对象,然后用TNestedTable或TClientDataSet的DatasetField属性指定这个字段。
7.9.4 引用字段
  引用字段所表达和存储的是一个指针,指向另一个ADT对象,这个ADT对象通常是另一个数据集中的一条记录。被引用的ADT对象中的数据可以像嵌套表一样来访问,也可以通过TReferenceField的Fields属性来访问。
  与数据集字段一样,在TDBGrid构件中,凡是显示引用字段的栏都有一个省略号按钮,用户单击这个省略号按钮将打开一个新的窗口,这个窗口也用栅格显示被引用的ADT对象中的数据。要打开这个窗口,也可以调用TDBGrid的ShowPopupEditor函数,例如:
  DBGrid1.ShowPopUpEditor(DbGrid1.columns[7]);
  要访问被引用的ADT对象中的数据,首先要为引用字段创建永久字段对象,然后然后用TNestedTable或TClientDataSet的DatasetField属性指定这个字段。
  假设一个引用字段对象叫CustomerRefCity,下面的代码访问它所引用的ADT对象中的某个字段,两行代码的效果是一样的。
  CityEdit.Text := CustomerRefCity.Fields[1].AsString;
  CityEdit.Text :=

上一页  [1] [2] [3]  下一页


[VB.NET程序]使用vb.net 对 Windows Form 按列排序 ListView 项…  [Web开发]对 ASP.NET 应用程序启动调试应如何设置(包括远程…
[演讲致辞]情理之中,意料之内,—— 对 李 慧 娟 现 象 的 思…  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台