使用数据控件
第章 使用据控件数14
组件面板的属性组包含了控件;其中有一个组助组Data ControlsVCLTFieldDataLink象,。允组据控件被组接到一数个。是组接控件;和用组TFieldDataLinkDataSourceDataSource交互的,和;和据交互的,的组梁。 数dataset
数写并与来据感知控件有附加的特性和事件~组使得组商组组组把商组组组那些控件组系起成组可能。商组组组指的是一组组组~组组组组定组据组被使用。例如~在美一数怎国个;社会Social Security安全,组是九位字且其格式组号数并。组一包含写个号组的组用程序###-##-####Social Security 可能包括定组一格式组组和一组组组以保每一元素要组是十组制字要组是短组。格式组个个确确个数划
组和组组组组束了一据是或者不是一确个数个号数怎组。定组据组被组束的组组是组成一Social Security
般组组商组组组的一部分。
有三地方可以放置商组组组,据组、中组组或者客组组。组束被放置到在客组组中组~客组端个数当
被叫做客组端。客组端组用程序通常是组的。组组被放置到据组组的组候例如使用组器胖胖两当数——触、数——胖两当个离据组束和存组组程和组组组就被叫做服组器。组组组用程序也是组组用程序。定组一分的中组组包含商组组组组~我组组组组用程序组三组组用程序。 并称
数胖胖两数您据控件支持和瘦客组端、和瘦服组器以及组的和三组的组组。据控件允组在特性中格式组束和在事件中的其他商组组组;如将控件中的事件,组合起来。TDBEditOnChange
企组版组了捆;~多组分布式组用DelphiMIDASMultitier Distributed Application Services Suite
程序服组组,组件~组方便了组建中组组并数且大多;,RDBMSRelational Database Management
~组系据组管理系组,服组器都有组剩的组束据的方法。在里放置组束依组于正在数数哪您Systems
使用组组型的组组。本章我组介组据控件和组相组的哪将数与它组象~列组控件和组的特性和它TField
事件~组些特性和方法组据组被管理的商组组组的定组提供了方便;第数怎章介组建立瘦客组端、15
三组组用程序,。
组述组和三组组组两14.1
两个个数个组组用程序组组使用一客组端组用程序和一据组服组器。三组组用程序组组使用一客组端组用程序、一定组商组组组的服组器组用程序和一第三据组服组器组。中组组可以是一或者更多个个数个
的服组器组用程序~客组端组使用组些组用程序和据组组组组。数
通常在组程组程中一好的组组是据组束放置到据组可能近的地方~原因可以个很将数与数尽
通组特性工作的方式组明。外面看~特性像据~组用组透明的是特性有用于组和据的来从数写数
组组方法~组据组束了前字段的一些使用。 数当
在据附近放置组束就是组组据组定在一起。客组端组用程序包含商组组组。组每一次数将与数胖您
88Delphi 6组用组组指南
想在组客组端的其他位置上组组据的组候~必组组制组组组~组组组组束了据被使用的方式。组组数您个数
您写就有了组多代组重组了同组的组组~组句组组~同组需要、组组和组组更多的代组。被定组组其与RDBMS他一些客组端组用程序一起使用~组使得人组可以使用组似于的组用程序修来Microsoft Access改据。如果商组组组组留在的客组端组用程序中~那组组束就不被其他客组端组用程序组用。数您会
胖当胖两服组器的组组在服组器上放置了商组组组。服组器的组组仍然可以在组组用中使用组~商组组组要组近据~而少被其他客组端组用程序组用的可能性。一好组是,定组一服组器数从减另个个胖
意味着只要组每一部分据定组商组组组一次。有趣的是~似乎组有的客组端组用程序比服组数很胖胖
器要多~组组情的存在可能是因组程序组也组建据组。 况数
通组在服组器组组中添加中组组使可以更大程度地控制组组组组据组和控制客组端组用程序胖您怎数
组型增加的量和组组~任何附加的商组组组在据组服组器组中定组组看起不自然~可以被数数来很它
定组到中组组。使用组的中组组组意味着不同组型的多客组端可以同组重新使用同组的中组组。组衡一下独
来胖两来数触个看~客组端、组组用程序看起更便于组组。使用据组组束、组器、存组组程和组组要求有一熟组掌握所组组的的据组组组人组。要组组面向组象的中组组建组要有一面向组象的系组数个体构RDBMS
以组得其携组的中组组。不幸的是~组多组件工程只能由程序组和管理人组完成~组可能组明了很来
胖两胖两呢客组端、组组组的卓越组组。组组是~是不是客组端、组组用程序的组组更廉价,答案可能是不。它很数会很它将很笨组表面上廉价是因组据组和客组端用于程序快出台~但是最组组组得拙。在组组的组始所得到的在组组的后期永组地失去。将
是不是服组器、三组组用程序的组组更廉价,通常组些组用程序要求更高组酬的组组组和据胖呢数
组分析组、在组组的组始组段需要更多的组组和一组组得好的流程。组组的组用程序不同于新型的组用个很
程序,组象模型和据组模型。模型也暗示了需要组组组的数昂;CASEComputer Aided Software
~组算机组助组件工程,工具。客组端服组器的价组售;组EnginneringDelphi$2500; Rational Rose象模型工具,价组每工作站售。所有组些附加的支出不能一定保组成功。 并$4500
工具的大小、组组程度和有效性~受组人组以及管理部组定了组组建特定组用程序的因素。决怎
两与胖与况组三组组用程序和瘦客组端组用程序都有组点和缺陷。只有根据组组情组指组方组才有助于确怎胖两很定组组建特定的组用程序。组用工具、原型和小组用程序都是在客组端、组组用程序组组中好的组组。如果使用工具~以及雇有组组的组组组和据组分析组组建服组器、三组组用程佣数来胖CASE
序~一些大组模的、组组的组用程序有更好的机组组。如果他组想组建三组组用程序~首先他组要会会
做的是组束重新组建已组存在的。在的组伍中注入组组富的程序组和指组人组有助于您丰将确VCL
保成功。
在本章~例子程序示范了组组建客组端组用程序~以组明据控件和怎胖数组象的特性TField但是~客组端、组组用程序不是首组的方法也不是惟一的方法。每一工程的需求由工程胖两既个
的组算、范组、组组性和者的特点定。参与来决;在第将章中介组,更便于组行三组组用程MIDAS15
序的组组。
第14章 使用据控件数89
数概据控件组 14.2
组件面板中的属性组包含了面板上的组多控件。据控件是组准控数Data ControlsStandard
件的子组~据控件添加了一数个组象便于控件组接到据源。附加的特性和将数TFieldDataLink
事件根据控件的需要被添加组。据控件想象成普通的控件~但是据被来将数数写直接到
字段组中。例如控件是组有特性的控件。 underlyingTDBEditFieldDataLinkTEdit
本组组要介组据控件。一些特定的控件在本章的后面部分作组组的组明。 数将
14.2.1 DBGrid
是控件。包含了据的行和列。在组格中每一行代表据它数数集中TDBGridTCustomGrid
的一行。每一列代表据数个数会数个参集中的一字段。组系据组可能返回据组中多表的行;考第章组于组件的部分组组使组组组行组同组组组一组~组使得组组表组组可组,。学怎异与写 13TUpdateQuery
引入了一个集合和组组组列组组器~组方便了在组格中组示据组中的据数数DBGridColumns
;组参考组“控件”中有组的组组介组,。 14.4DBGridDBGrid
14.2.2 DBNavigator
是一组有个数按组组的控件。被组接到一据源~每一它个数个TDBNavigatorTCustomPanel
按组都是其中一据个数个数从集方法组用的可组化比组;组组按组如同组用一据集方法,。左到右;如组所示,的操作是、、、、、、、、和14.1FirstPriorNextLastInsertDeleteEditPostCancel
。Refresh
组控件~用于组用据数集方法 14.1 TDBNaviagtor
组航器不完成组些行组。并有一个特性。组回组第章~每一个DBNavigatorDataSource13
指向一据个数集~的方法定用组组组了一决哪个并按组使用DataSourceDBNavigatorBtnClick
组象引用组用组方法。例如~组组个按组;如组所示,组用将DataSource.DataSetInsert
方法。DataSource.DataSet.Insert
14.2.3 DBText
是一个控件~组于组示自据组的只组据来数数尤其有用。用组不能TDBTextTCustomLabel
直接在控件中组组文本。要把一据控件同一个数个字段组系起~组来TDBTextdataset
特性指定一个组件指定一自并个来组件;一表或者一组个个DataSourceDataSourceDataSet
90Delphi 6组用组组指南
组,的一字段个将从名。有效的字段名自组地;组被指向组件的DataSetDataSetDataSource
特性,中组取。 DataSet
14.2.4 DBEdit
是的子组控件~组控件是一多组用个数途的据组控件~可以被用于组组DBEditTCustomEdit
任何可以以文本组示的据。字数数数母和字字段包含在合适的据组字段中。
14.2.5 DBMemo
是一个控件。在中组示的匹配字段组型是字DBMemoTCustomMemoTDBMemomemo段;组参考组“组组和组字段静”了解更多有组字段的信息,。可以被作组来组14.7TMemoFields示的数真数据组型是正的据组中的组型~据组支持数组型或可组组字符Underlyingmemomemo字段。
14.2.6 DBImage
是而不是的组承控件。组控件可以组示任何可以组组于个DBImageTCustomControlTImage
的组像组型。有效的组象组型包括位组、组组和元文件组形。组型组组文件包TPicturePicture
括、、、、和文件。 .jpg.jpeg.bmp.ico.emf.wmf
14.2.7 DBListBox
组控件组示组组的列表。组置组控件的静特性和特性~在列表中所组框DataFieldDataSource中的组就是被组置字段的组。通组组置特性;一个特性,组组可以在组组组ItemsTStringsDBListBox或者行组被添加。如果需要组组表组组~组使用运您找控件。TDBLookupListbox
14.2.8 DBComboBox
是一个控件。在组型特性中添加组组~组DBComboBoxTCustomComboBoxTStringsItems些组组存组在特性和特性所指定的字段中。可以用下面的方法在行组您运DataFieldDataSource
组控件或者控件添加组组。DBListBoxDBComboBox
DBComboBox.Items.Add( 'True' );
DBComboBox.Items.Add('False');
如果有添加其他的组~那组在组合中组可能的组组是没框两和可以用于'True''False',Boolean或者文本字段。
14.2.9 DBCheckBox
组于控件如果只有和两另组组组的组候~外一组方法是使用DBComboBoxtruefalse
。表示组组~表示不组组。除了和特性~组有可两个DBCheckBoxTruefalseDataFieldDataSource替代的特性,和~组允组组置您控件的组示组组组组状ValueChecked ValueUncheckedDBCheckBox或者不组组~默组组是和~但是可以使用您和~和~和~或truefalseblackwhiteredgreen01者和~只要适合的需要都可以。您yesno
第14章 使用据控件数91
14.2.10 DBLookupListBox
控件有已组熟两个悉的和特性表示所组组的组从DBLookupListBoxDataField DataSource哪里组取~除此之外~组有、和特性。组三特性定据组组个个决数从ListSourceListFieldKeyField
哪里组取。是包含列表据的数。和特性不能指向ListSourceDataSourceListSource DataSource相同的组件。组意味着使用一控件个需要据两个数两个集和TDataSourceDBLookupListBox数据源。
是组示在列表中的组组的列表~框表示组组被到写的ListFieldKeyFieldDataSource
字段中的据。数和不必有相同的名称它数~但是组必组有相同的DataFieldKeyFieldDataField
据组型和大小。和可以是相同的字段~或者可以使用您友好组示的组作组列KeyFieldListField
表字段~使用索引组作组字段。KeyField
14.2.11 DBLookupComboBox
控件是的姐妹组件~其中有个字段,DBLookupComboBoxDBLookupListBox3
、和。下拉式列表由数据源的列中的组定。确ListSourceListFieldKeyFieldListSourceListField当下拉式列表中的组被组中的组候~组中组的行相组的字段组被到由将写组件KeyFieldDataSource引用的据数集的字段中。 DataField
14.2.12 DBRichEdit
控件是既控件也是控件;由TDBRichEditMemoTCustomRichEditTCustomRichEdit
组承而,。来文本允组用组组入格式的命令以便于控制字特性和段体落TCustomMemoRichrich
格式信息。通组指定和特性~可以在据组中存组您数组型的DataFieldDataSourceRichText
;组参考控件”中使用控件的例子,。 memos14.3“DBRichEdit
14.2.13 DBCtrlGrid
控件是定制的控件~允组在组组组在组面板中放置多控件。每一您个DBCtrlGridWinControl
控件面板表示据数当您并数集中的一行。组组组格的组候~控件被组制到后组的面板中~且后组的据组组组示在那些行中。组组示了控件的组组组组组。组置了的14.2TDBCtrlGridDBCtrlGrid
~那组放置在组格上的所有据控件都使用组数。然后组各自据控件组置数DataSourceDataSource
。组置一面板~个控件组其他的面板组置组制的控件~用据将并数集中下DataFieldDBCtrlGrid
一行填参充组制的控件;组考组~组组组示了组所示的控件行组组组运,。 14.314.2DBCtrlGrid
您可以指定和组一次组示据的多行。组数组示表~一ColCount RowCount14.3animals.dbf次组示三行、列或者组两个组组。 6
92Delphi 6组用组组指南
组用据控件组组数的一面板~其他的面板自组放置相同 个将14.2 DBCtrlGrid
的控件~每一面板都组示前一面板的下一组组;如组个个个所示,14.3
组组所示的控件的行组组组 运14.3 14.2DBCtrlGrid
14.2.14 DBChart
是故事的一部分。在几年前组组了组件。已组它很DBChartCinderellaDave BernedaTChart流行了~以至于在中包含了组控件~也在的 组组框InpriseVCLDave BernedaDelphi About中组得了一个的组。誉是一携组高组组件组组器的个控件~在组Delphi StaffDBChartTChart14.6“控件”中有组组件的介组。DBChart
第14章 使用据控件数93
组接到和14.2.15 DataSourceDataSet
如果您跳组第章的组~组部分可以助组组一下。据控件帮您数个至少需要一13TDataSource 和一个组件~用于组接到据组。数组件有一个特性。代表TDataSetTDataSourceDataSetDataSet数数据组中的据~将数据控件组接到组。 DataSourceDataSet
的代组可以被入到并中~但是组组的组每一个会因组添加的TDataSourceTDataSetDataSet
代组而组得组大。组意味着TDataSource
、、、、和的代组会膨组TBDEDataSetTDBDataSetTQueryTStoredProcedureTNestedTableTQuery起。但是有组候需要来您而不是。例如~一包含个的组组组除一行不并DataSetDataSourceSQL返回一据个数没将集~组除行组有必要和组合起。其他的情是~组组被来况DataSourceTQuery
定组返回组果据数并个集~需要一用于组示组果据数集中的字段。 DataSource
通组组置据控件的数特性组组有效的并~每一据控件都被组接到个数DataSourceDataField
一据个数个集中的一特定字段。
数据控件特性 14.2.16
所有的据控件都有组的数从它来祖先组中组承而的特性和事件。从组承而来~TDBEditTEdit它有控件的所有特性。特性的可组性不能被降组~例如~不能从到~因TEditpublishedpublic此所有从组承来的特性组示在将控件的中。TEditpublishedTDBEditObject Inspector
嵌套的特性
允组修改您个嵌套的特性。一控件有一个特性~组特性包含一个DelphiDBEditFont
特性~可以在您中修改组个特性。可以组组特性您左组的“,符StyleObject InspectorStyle[]”号展组嵌套的的特性列表~以组看嵌套的特性组~组可以组组特性左组的“,符号组藏嵌套的特[]”性组。引入了内嵌的特性引用和子组件。 Delphi 6
内嵌的特性引用和子组件
组在组件可以组有子组件。组建一组有外一组件的组件的方法叫做个另个方SetSubComponent法;组参考第章中有组子组件的更多的信息以及一使用个的例子,。10SetSubComponent
组件引用组示在将中。 Owned publishedObject Inspector
提示,如果有没个会引用一子组件那组就不有“[+]”和“[-]”按组~嵌套的引
用特性和事件在Object Inspector中的字组体色是组色的。
被引用的组件也被列在将中;在中新出组的特性,。publishedObject InspectorDelphi 6其组果是可以在您组件中修改控件的和的事件和特性DBEditTDBEditDataSourceDataSet;任何的引用组件都可以使用组组方法修改,。组来组示了在中published14.4Object Inspector被组中的控件。属双性组集中在重嵌套的中。如果要组TDBEditEventsTDatasetObject
中组组的控件修改事件~可以有组方法,您两您InspectorDBEditTDataSource.OnDataChange可以组找引用的来您来修改其特性和事件~或者可以通组嵌套的引用修改组些特DataSource
性和方法。
94Delphi 6组用组组指南
组控件嵌套的特性和重双嵌套的特性 14.4 DBEditDataSourceTDataSet
控件 14.3 DBRichEdit
控件由组承而。来文本可以在文档体中嵌入命令。DBRichEditTCustomRichEditRich
文本控件包括字和段体个档落格式信息~所以整文中的文本组示可以不同。 Rich
格式化文本14.3.1
可以使用特性;一个公有特性,格式化和 SelAttributesTTextAttributesRichEdit
文本。不管文本是否受保组~都可以使用来指定字符集、组色、密度、DBRichEditSelAttributes高度、名称体、组斜度、大小、字。
注意,Delphi中有自组没RichEditDemo.exe程序中用到的组像。组些组像是
Windows 95工具组按组~位组可以在\Program Files\Microsoft Visual
Studio\Common\Graphics\Bitmaps\TlBr_W95中到找;如果已组安了您装
Visual Studio 6.0的组,。
有程序例子可以用于组组组使用两个学怎控件。打组的目组中的RichEditDelphiDemos
工程~此工程包含了一个组组器范例和Demos\RichEdit\RichEditor.dprRichTextDBRichText范例;组参考组,~组工程也可以在本组的中到。 找14.5CD-ROM
组置字组式 体
特性是的一个集合。其组可以是TDBRichEdit.SelAttributes.StyleTFontStyle
、、或者中的任何一。个的特性是一个fsBoldfsItalicfsUnderlinefsStrikeOutSelAttributesStyle集合。使用集合的组组一特定的组式包含到将个从集合中或者集合中组除。在组中的、、14.5BIU和工具按组用于代表组些用组可定组的组式。其支持代组被到一事件组理程序中~所有代写个abc
表组式;前面提组的,的工具按组的事件特性被指定到一事件组理程序中。个OnClick
第14章 使用据控件数95
组程序~一使用个控件的范例14.5 RichEditDemo.exeTDBRichEdit
procedure TFormRichEditDemo.ToolButtonBoldClick(Sender: TObject); const
STYLES : array[1..4] of TFontStyle = (fsBold, fsItalic,
fsUnderline, fsStrikeOut );
begin
// Use ToolButton for Down and Tag
with Sender As TToolButton do
// Use DBRichEdit1.SelAttributes for Style
with DBRichEdit1.SelAttributes do
if( Down ) then
Style := Style + [ STYLES[Tag] ]
else
Style := Style - [ STYLES[Tag] ];
end;
注意,使用多个With组句有些。上面所列的会乱With组句可以使用if条件组句、
case组句或者大量使用组象和特性组组。例如~来if条件组句可以组组用,
if( DBRichEdit1.SelAttributes.Down ) then;不管使用组组哪式~以便于的理您
解组组准。
每一代表一字组式的个个体按组在特性中都有一个数整组。例如~按组在特TagBoldTag
性中的组组。如果组~那组此组式被包含在集合中~如果1TToolButton.DownTrueTFontStyles
组那组此组式不包含在集合中。用于索引数组TToolButton.DownFalseFontStylesTagSTYLES
以返回一特定的字组式。注组部分表示个体和是于从属的特性~DownTagToolButtonStyle
是的特性。 SelAttributes
改组字组体色
是一便个框利的组组组件~用于可组地组组组色。组件在组件面板的TColorDialogTColorDialog
96Delphi 6组用组组指南
属性组中~组组件的特性可以被组予控件的特性。 DialogsColorRichEditselAttributes.Colorprocedure TFormRichEditDemo.Color1Click(Sender: TObject);
begin
if( ColorDialog1.Execute ) then
DBRichEdit1.SelAttributes.Color := ColorDialog1.Color;end;
另外一组方法是使用组件一次组置所有的字组。体TFontDialog
if( FontDialog1.Execute ) then
begin
DBRichEdit1.SelAttributes.Style := FontDialog1.Font.Style;
DBRichEdit1.SelAttributes.Size := FontDialog1.Font.Size;
DBRichEdit1.SelAttributes.Color := FontDialog1.Font.Color;
DBRichEdit1.SelAttributes.Charset := FontDialog1.Font.Charset;
DBRichEdit1.SelAttributes.Name := FontDialog1.Font.Name;
end;
没有特性~因此特性必组组地组置~如上所示。独SelAttributesFontFont
更改段落特性 14.3.2
;和,控件的特性是一个组象。TRichEditTDBRichEditParagraphTParaAttributes
特性可以用于表示、、、、、ParagraphAlignmentFirstIndentLeftIndentNumberingRightIndexTab
和组。特性是一个枚组组~枚组可能的组组,TabCountParagraph.AlignmentTAlignment
、或者。组些组是相互排斥的~因此表示文本组组;组组,taLeftJustifytaCentertaRightJustify14.5
的按组被组合起~来被组置组。可以您按住组组组任何组三个来按组之一改组组AllowAllUpFalseShift
些特性。组三控件的将个特性组置组、特性组置组~表示并将左组组GroupedTrueAllowAllUpFalse
的按组的特性组置组。更改文本组组的代组如下所示,DownTrue
procedure TFormRichEditDemo.ToolButtonLeftJustifyClick(Sender:
TObject);
const
ALIGNMENTS : array[1..3] of TAlignment = (taLeftJustify,
taCenter, taRightJustify);
begin
if( (Sender As TToolButton).Down ) then
DBRichEdit1.Paragraph.Alignment := ALIGNMENTS[Tag];
Table1.Edit;
end;
组了一致性~用于修改字组式的组方法同组用于修改所组组的体数个文本组组。在组三包含交替
第14章 使用据控件数97 组水平组的按组的事件特性被指定到前面的事件组理程序中。其代组同下面的代组;使OnClick
用了一个组句,作用一组。 case
case (Sender AS TToolButton).Tag of
1: DBRichEdit1.Paragraph.Alignment := taLeftJustify;
2: DBRichEdit1.Paragraph.Alignment := taCenter;
3: DBRichEdit1.Paragraph.Alignment := taRightJustify;
end;
数组提供了更好的性能~其组果是所组生的机器代组;,更小。Thorpe, 1996
组找文本 14.3.3
是使用起方便的来很组件~可用于多组组很找操作。控件有一FindDialogDialogRichEdit个方法~组方法有一被组个找参数个参数数文本的、组始和组束位置以及一匹配组型组FindText
;组组定组组组的数找怎文本组行组比组,。返回一个数找整组偏移量~表示所到的匹配文FindText
本组离将找文本组始组的位置。组组文本的组度加上由返回的偏移量正好得到所匹配的文FindText本。
和特性表示被组组的文本。组组组特性和将两个方法组合起可以组来SelStartSelLengthFindText组组和找找再次组功能。下面是摘自程序的一组个家组组用。 RichEditDemo
procedure TFormRichEditDemo.FindText( const FindText : String;
IsNewSearch : Boolean );
const
StartPos : Integer = 0;
var
EndPos, FoundPos : Integer;
begin
if( DBRichEdit1.SelLength = 0 ) or (IsNewSearch) then
StartPos := 0
else
StartPos := DBRichEdit1.SelStart + DBRichEdit1.SelLength;
EndPos := Length(DBRichEdit1.Lines.Text) - StartPos;
FoundPos := DBRichEdit1.FindText( FindText, StartPos, EndPos,
[stMatchCase]);
if( FoundPos <> - 1 ) then
begin
DBRichEdit1.SetFocus;
DBRichEdit1.SelStart := FoundPos;
DBRichEdit1.SelLength := Length( FindText );
98Delphi 6组用组组指南
end;
end;
组程;此组程组像使用组的方法,有,要组的两个参数找文本FindTextDBRichEdit
;,和~的默组组组。如果组是打组组组后的框FindTextIsNewSearchIsNewSearchTrueFindDialog第一次搜索~那组;文本的组始位置,被组置组。是一可以更改的常量~个StartPos0StartPos
的组被组到下一次组用将中。可以被用于组和找找个再次组。在后一组StartPosFindTextFindText
找中~的组被组置组前的当加上~被组置后的位置在前一次组后找匹StartPosSelStartSelLength
配文本的后面。是控件的文本组度去减后的组~表示已组组找EndPosRichEditStartPosStartPos组的文本。
如果组到了找文本~那组组置控件组得组入焦点。组置的位置组TDBRichEdit.SelStart
~组置位置组组到的找找文本组度~使组到的文本组高亮。FoundPosTDBRichEdit.SelLength
流字段 14.3.4 BLOB
是;二组制大组象,的首字母。控件使用一个BLOBBinary Large ObjectDBRichEdit
字段组型。组组型是一个字段;组参考组“组组和组字段静”~在本章的最后ftFmtMemoblob14.7
有组于组象的信息,。下面的组, TField
Table1.FieldsByName('RICH_MEMO').IsBlob
或者
Table1.FieldsByName('RICH_MEMO') Is TBlobField都会个返回一组。的特征是组可以一它从个组中流入或者流出~如TrueTBlobFieldTStream
一组。组意味着可以使用的和;前面已组述叙TFileStreamTBlobFieldSaveToFileLoadFromFile组了,方法~很将容易地字段到写从文件中或者文件中组取字段。 BlobBlob
procedure TFormRichEditDemo.ExportMemo;
begin
SaveDialog1.InitialDir := ExtractFilePath(Application.EXEName);
if( SaveDialog1.Execute ) then
(Table1.FieldByName('RICH_MEMO') As
TBlobField).SaveToFile(SaveDialog1.FileName);
end;
在中~如果组组您上的按组~前组组的当字RichEditDemoSaveDialogSaveRICH_MEMO段组;一个字段组型,被保存到一外部将个文件中。使用方法外从ftFmtMemoLoadFromFile部源加组组个文件。因组是一您从个文件中组取字段到控件中~组控件的RichEditDBRichEdit
必组在模式下。 DataSetEdit
第14章 使用据控件数99
控件 14.4 DBGrid
控件是一个控件~用于在一控件中组示个个个数整表或者整据TDBGridTCustomGrid
集。因组在组果据数个来集中返回的每一字段都组示出~所以只要组置特性就可以TDataSource了~有组的没个特性。从数您确数据集特性中可以组组地定据集的字段DataFieldDataSource.
和字段排序。在组格中的一行代表据数数个集中的一行~在组格中的一列代表据集中的一字段的所有组。
一据个数个当集可以由组表组成~例如所指向的是一个组~DataSourceTDataSetTTable组据数数个数径将离集指向据组中的组表。组系据组使用索引字段根据已组存在的组系用多组途分的表组组地组系起。一例子是人组组组的组系。在美组大多人都有好组组组组~组些组组来个与号国数几个号
号数个个组用于不同的组组或者不同的组合和他组取得组系。组大多成年人有一家庭组组、一组公室组组、可能组有人组组。人和组系组组个个数会两个之组的组系是一组多的组系。在组系据组中~可能定组表~一用于人~外一用于组系组组组。可以有一组组组组字包含人和组组组个个另个号个个号参之组的组系。组考第章中有组的部分~组里有一个摘自组用程序;自组的,13TUpdateSQLMasterAppDelphi的例子~组例子组接了和表。CustomerOrders
组组组接的表可以返回到一个组件、一个中~用于填充。组组TQueryTDataSetDBGrid
中的行可以组示多表中组组的字段。 从个DBGrid
列集合和列组象 14.4.1
组元定组了一个组。一个组象代表控dbgrids.pasTCollectionItemTColumnTColumnDBGrid件中的一列。可以使用您组件组组器;组组,在组组组管理集合。如果在组组组您DBGrid14.6columns定组~那组在行组组组果据运将数个个集中的每一字段自组组建一组象。组组组建的columnscolumn
组象可能是所需要的~也可能不是所需要的。一好组是可以组得一组于在组您您另个您个column
组组据如何组示在组格中的数;所组所得,组组。 即WYSIWYG
组的组组器是一组件组组器~ 个14.6 DBGridcolumns
从的上下文菜组中可以打组此组组器 DBGrid
组组~在组组组通组组置据数集组件;或组件,或者在组组组定组组静RichEditDemoTQueryTTable
的~就可以组建组格的列;组在在中~我组组置将特性组TFieldRichEditDemoQuery.Active
~组参考组“组组和组字段静”中组于组象的组组信息,。组用程序自组True14.7TFieldRichEditDemo组建一个表~组表包含字段、、和。组用程序中的ParadoxIDNAMEDATE_TIMERICH_MEMO组组组返回前面的三字段。在组组使用个组组器组~可以使用任何表~组组组组以并写返回所有Columns
100Delphi 6组用组组指南
的字段。
SELECT * FROM MEMOS.DB
注意,如果组在有您没ODBC组名定组组指向包含表的任何目组~那组可以在组组您
的FROM子句中使用据组的完全数径径双号路~完全路使用引包含。例如
SELECT * FROM "C:\TEMP\MEMOS.DB"。
在组件的特性中添加组组~组置特性组。是通组TQuerySQLActiveTrueDBGridDataSource组接到据数将集中的。特性组置组组件。组组示了TDataSource.DataSetDataSource14.7
程序中的组组的组组组组组。组用于组组框窗体数据组字段中RichEditDemoOpen MemoMEMOS.DB的一行~并返回所组组行的字段组。 ID
组组组组添加列组象之前的组组;以及前台的框上下文菜组,14.7 Open MemoDBGrid
在组组组添加列
在组组组添加列使可以通组您控制每一列的组示。假组有一您个和Object InspectorDataSet
~且已组正地确参配置了;组考本组组始部分,~组组组在上右组~在组出的上DataSourceDBGrid下文菜组;如组所示,中组组组~激活组组器;如组所示,。14.7Columns editorColumns14.6
提示,外一组另激活Columns组组器的方法是组组Object Inspector的
TDBGrid.Columns特性。
如果组组已组激活了~那组右组组出列组组器上下文菜组。如果已组激活了~Columns editordataset那组组出菜组中的组有效。其他的组组包括,将、、、Add All FieldsAddDeleteSelect AllRestore
和~可以被用于在组组器中一次添加一列、组除列、组组所有的列、恢组列的默组组~DefaultsToolbar
组可以切组组组器工具组的可组性。组组菜组组~添加组果据数集中的所有列。组ColumnsAdd All Fields
组示了字段被添加后的和组组器。 14.8Object InspectorColumns
一旦列被添加了~就可以分组地组组每一列~在组组组更改列特性。您并
在组组组更改列特性
第14章 使用据控件数101
在列组组器中组组一或者多列可以更改列特性~且可以改组任何相组的特性。表个个并14.1
列出了所有在组组组可更改的列特性。
组在前台组组了列的以及 14.8 IDObject Inspector
在后台添加了字段之后的组组器 Colujns
表特性~用列组组器组建的组列的特性可以在组组组被修改~或 静14.1 TColumn
者如果在组组组有定组列~那组组组组建的列的特性可以在行被修改没运
列特性 组明
ButtonStyle TColumnButtonStyle的组象~定组了组示在组格组元中的组组按组~其可能的组组是
cbsAuto、cbsEllipsis和cbsNone
Color 字段组元的背景组色
DropDownRows 当ButtonStyle特性组cbsAuto组~DropDownRows组组示的行~组列有一组组字段数个找
或者已组定组了的PickList
Expanded Expanded如果组True~那组ObjectField被组展~组示组象字段的附加列FieldName 字段名~列的据组字段中组数从取组
Font 列中每一组元的组元字 个体
ImeMode 列的组入方法组组器~用于组组组洲字符
ImeName 所使用的组入方法组组器的名称
PickList 静组的组组列表;TStrings组象,~组列表作组列字段的可能组组~例如一个Boolean字段
可以在组组列表中使用True和False组
PopupMenu TPopupMenu组象~可以组示特殊的列
ReadOnly 确数定列中的据是否可组组
Title 一个嵌套的TColumnTitle组象~定组了本列的固定列组元的组示Visible 控制列的可组性
Width 控制列组度
102Delphi 6组用组组指南
下面的几个步组定制列的组示;组组于任何列都是适用的,。 MEMOS.DB
,组组组组器中的列~按组~组除来数自组果据集的列。 1RICH_MEMODeleteRICH_MEMO
,将组组改组~将组组改组。 2NAMENameDATE_TIMEDate & Time
,将的特性组置组。3IDAlignmenttaLeftJustify
,将列的特性组置组。 4NAMEWidth255
,因组组组组用于组组一组特个框个殊的~所以要保每一列的确特性组组。 5memoReadOnlyTrue
,将特性组置组~组看第从步到第步所组生的组果。 6TQuery.ActiveTrue15
从第步到第步的组行涉及到了数据组的表~组组的组组组组组如框15MEMOS.DBOpen Memo组所示。如果在据组数中有数将数据~那组在组格中组示有据。 14.9MEMOS.DBmemo
组组组组的组组;框您除非添 14.9 Open Memo
加了如组所示的~否组组格组将空, memo
组格事件 14.4.2
控件引入了事件~组据感知组格的管理组了方便。表几个数来列出了DBGrid14.2
组中引入的事件特性。 TDBGrid
表控件添加的事件特性 14.2 TDBGrid
事件特性 组明
OnColEnter 当个一新列组得组入焦点的组候组用组事件组理程序
OnColExit 当列失去组入焦点的组候组用组事件组理程序
OnDrawDataCell 老版本的事件组理程序~组组用OnDrawColumnCell事件组理程序 OnDrawColumnCell 当个画一组格组元需要重的组候组用组事件组理程序
OnEditButtonClick 当列的ButtonStyle特性所指定的组组按组被组组的组候组用组事件组理程序 OnColumnMoved 当个用组使用鼠组移组一列的组候组用组事件组理程序
OnCellClick 组格组元被组组的组候组用组事件组理程序~组里要求当TDBGrid.Options不包括
dgRowSelect组
OnTitleClick 当列组组被组组的组候组用组事件组理程序
第14章 使用据控件数103
可以使用事件组理程序组商组组组或者组建组组效果。例如~要组列一组得组入写画个焦点组的矩形~在事件组理程序中添加下面的代组就可以了。 OnTitleClick
type
TFudgeGrid = class(TCustomGrid);
procedure TFormOpenMemoDialog.DrawFocusColumn(
AColumn : Integer = -1 );
const
Column : Integer = -1;
var
ARect : TRect;
begin
if(AColumn <> - 1) then Column := AColumn;
if( Column = -1 ) then exit;
DBGrid1.Refresh;
ARect := TFudgeGrid(DBGrid1).CellRect( Column, 0 );
ARect.Bottom := ARect.Bottom * TFudgeGrid(DBGrid1).RowCount;
DBGrid1.Canvas.DrawFocusRect( ARect );
end;
可以从和 事件组理程序中组用方法。如果OnTitleClickOnCellClickDrawFocusColumn
不组,~那组可修改的常量被更新。如果组组,且不组,AColumn1ColumnAColumn1Column~那组组格被刷新~且在整个列中组制组入焦点的矩形。因组方法是受保组的方法~所1CellRect以代组只能事件组理程序中组用组方法~所以使用组从个精妙的方法,TFudgeGrid(DBGrid1)
;第章中介组的,将组组组组象。 2DBGridTFudgeGrid
注意,组于组格的组短提示,如果想一您画个垂直的组入焦点矩形那组可以在前
面所列的代组基组上作一些修改。但是~保持组入焦点矩形的能力定组了组格的能
力~要组组组秀的面向组象组用~组组重新定组TDBGrid控件~且并将垂直组入焦点
功能加入组组件;TDBGrid在控制了行组~组格,中。
在事件组理程序中组用方法;组有参数,OnTitleClickDrawFocusColumnColumn.Index更新垂直组入焦点矩形。在事件组理程序中组用不组的参数方法OnCellClickDrawFocusColumn刷新最后一次的画参垂直组入焦点矩形;组考下一组中定制组元组格组组的例子,。
定制组元组格组组 14.4.3
有一组人的缺陷。可以组组个很您——会很垂直的和水平的组格组其组果是组于列组组组生DBGrid
好的效果~同组据组元格组数将没将生组格组~或者是有组格组~但是组失去组组组元格效果。3D3D使用事件组理程序~可以组建您的组组组元格~而有组格组;组组没OnDrawColumnCell3D
,。下面的代组定组了此效果。14.10
104Delphi 6组用组组指南
组的列组元格~而有没水平的和垂直的组格组 14.10 3D
type
TFudgeGrid = class(TCustomGrid);
procedure TFormOpenMemoDialog.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
ARect : TRect;
begin
ARect := TFudgeGrid(DBGrid1).CellRect( DataCol, 0 );
if( Rect.Top <= ARect.Bottom + 5 ) thenbegin
DrawEdge(DBGrid1.Canvas.Handle, ARect, EDGE_ETCHED,
BF_TOPLEFT);
DrawEdge(DBGrid1.Canvas.Handle, ARect, EDGE_ETCHED,
BF_BOTTOMRIGHT);
end;
end;
欺组组用于组要组制的组组组元格组得组象。在列组元格被定确之后~使用TFudgeGridTRect
函数组建组组效果。不幸的是事件组理程序不被包含列组的固定行组用~其组果是组APIDrawEdge
组组元格要组其他任何组元格被重的组候被重~要组使用一拙的方法当画画个笨数限制组组的次
;如前面的程序中所做的,。
提示,组似于组格中组制3D列组组的组组组组~由于不能组组所需要的特性或者方法很
组组行所要做的工作~所以需要组承子组。
注意,判定特性和方法于组是重要的任组。提组组一组组属哪个很个个“组组于一组例
第14章 使用据控件数105
或者组于所有的组例能适用组,”。特性和方法必组被包含在组;组组于所有的组例
都是能用的,中。考组组组组界组制代组。在中定组的代组只有在一组格中有用窗体个~
如果此代组被定组到DBGrid子组中~那组所有的组格都可以使用组些代组。那组答案
是组将界组制功能添加到TDBGrid子组中~然后用组组组建一新的组件。个个
回组最后一部分的提示~如果组代组最后被放置到个子组定组中~那组列效果以将TDBGrid
正的次被组制~确数将跟个来跟窗体此代组踪组组件。如原所示~组界组制代组踪~组只能被Open
窗体个中的一控件使用。组建组有组组的定制组件留作组组做。来MemoDBGrid3DTDBGrid
和 控件14.5 DBLookupListBox DBComboBox
您可以通组在和控件的特性中添加字符串来静定组组的组DBListBoxDBComboBoxItems
组列表。被组组的组组被到由写和特性所代表的字段中。DataFieldDataSourceDBLookupListBox 和组件第从个数数二据集和据源中组取组组。除了和DBLookupComboBoxDataField
特性外~组控件组有两个、和特性。组些特性定组了作组DataSourceListSourceListFieldKeyField
可能的组组的据;组数参考组中的窗体,。 14.11MastApp Order
组窗体;自组的演示程序,14.11 MastApp OrderDelphi
以窗体中的组主要向组~各部分的组系定组如下。OrderBill To DBLookup ComboBox
和特性代表被更新的据字段~将数、和表DataFieldDataSourceListSourceListFieldKeyField示可能的组组列表。包含源据的据当数数将集被更新的组候~附加的组组在列表中生效。您Items可以回想一下~和表示用于存组据的据数数集和字段。指向DataFieldDataSourceListSource包含组据的找数组件~组组指向。可以是一TDataSourceTDataSource.DataSetTDataSetTDataSet个个表或者是一组组组件。是包含;组示在下将框拉式列表中,的字段~ListFieldItems
106Delphi 6组用组组指南
的组被将拷组到指向的字段中。 KeyFieldDataField
和可以是相同的字段或者是不相同的字段~和ListFieldKeyFieldKeyFieldDataField不必有相同的名称它~但是组必组是相同的组型。如果和 命名相同更将会KeyFieldDataField方便。窗体上的特性组如下, OrderCompanyCombo
? DataField = CustNo
?是 组象 DataSource = MastData.OrdersSource (MastData TDataModule)
?KeyField = CustNo
?ListField = Company
?ListSource = MastData.CustByCompSrc
当个用组在组组列表中组组一公司的组候~由指向的据数将集中的光组移组到CustByCompSrc组公司所在的行。本行中由表示的组被拷组到目组据数当集前行的KeyFieldCustNo
中的字段中。MastData.OrdersSource.DatasetCustNo
控件 14.6 DBChart
控件已组在几年前出组了。是一据感知控件个数~据它从数集中组取组表。TChartDBChart
是到目前组止最精制的控件~包含了多它属嵌套性组的组件组组器;如组所示,。TDBChart14.12组了组明其中的一些功能~在演示组用程序中使用和表组建了MastAppcustomer.dborders.db一个组组。组组组如组所示~是完全在组组组组建的~不需要附加的代组。 Volume By Customer14.13
第14章 使用据控件数107
组组件组组器 14.12 DBChart
组组于自组的演示程序定制组组~14.13 DelphiMastApp
在一组组中组示用组的组组;在组中有看 个售您没
到的是各个不同组色的三角组和组色的梯度背景,
提示,可以使用你New Items组组中框Business属性组上的TeeChart向组。依次组
组File、New、Other、Business;性组,属打组TeeChart向组。TeeChart向组在New
Items组组中;如果正在使用框您TeeChart向组和DBChart控件~那组组据组个数
表必组已组存在了~且只能组组一表。我组的例子使用表和一组合的组并您个两个个
组,。
要完成组似如组所示的一组表~个数遵循下面所列的组组步组~需要的组替组表和据。 ,打组工程文件。 1\Program Files\Borland\Demos\Db\MastApp\MastApp.dpr
,依次组组、、在工程中添加一新的个窗体~组新的保存将个窗体2FileNewFormMastApp
组。ChartForm.pas
,主窗体是。打组主窗体~依次组组、~组组组元将3Main.pasFileUse UnitChartForm
添加到窗体的组句中。ChartForm.pasMain.pasuses
,从组件面板的属个性组中添加一和一个组件到4Data AccessTDataSourceTQuery
窗体中。 ChartForm
,从组件面板的属个性组中添加一控件。在中5Data ControlsTDBChartObject Inspector
将;组添加的,控件的特性修改组。下一步准组组组取数写据组DBChart1AlignalClient需要的。 SQL
108Delphi 6组用组组指南
,;回想一下~是组似于的组件窗体~通常用作不可组控件~放置在据数6TDataModule
模组上的最常组控件是,、、和组件,。在工TableQueryDataSourceDatabaseMastApp程中~已组有一个组件被添加到了组元中~组组件包含了据组数名TDatabaseDataMod
。模第仿步~将组元添加到组元的组句中。MAST3DataModChartFormuses ,在中~将特性组置组第步添加到7Object InspectorTDataSource.DataSet4ChartForm的组件。将特性组置组~将TQueryTQuery.DatabaseNameMASTTQuery. SessionName特性组置组~组双特性的组组型组组按组~组出特性组组器。 DefaultTQuery.SQLTStrings,组组组示了自表来的所有定组量的组和~组合数表组取公司名;在组例8orders.dbCompany
中使用~组参考组,。组参考第章中组于的指南。组组组组组、14.1319SQLCustNoCompany和字段~合组字段的组~组果放置到字段组将名中。AmountPaidAmountPaidTotal
组句用字段组接表,两个和。在使用如的聚WhereCustNocustomer.db orders.dbSum合功能的任何组候组句都是必需的~子句行大到小的组将从GROUP BYORDER BY
序排列。
SELECT DISTINCT d.CustNo, d.Company, Sum(d1.AmountPaid) As Total FROM "customer.db" d, "orders.db" d1
WHERE (d1.CustNo = d.CustNo)
GROUP BY d.CustNo, d.Company
ORDER BY Total Desc
,接下定组组表。来右组组件组出组件菜组。组组组组~组出9DBChartDBChartEdit ChartDBChart组件组组器~如组所示。14.12
,组组属性组。在属性组上~组组属性组~组组按组组组一组表组型个。10ChartChartSeriesAdd
组组的框属个个性组中有一组组组型。组组组组组组型~然后组组TeeChart GalleryStandardOK按组。组组按组~组组将称名改组。TitleVolume By Customer,在外面的上~组组属您将性组。在组里定组和信息。11PageControlSeriesDataSetDataSource
,在属性组上~组组嵌套的属个性组。组属个性组中有一12SeriesDataSourceDataSource
。将的组更改组~附加的组组字段被组示出。在将来ComboBoxComboBoxDatsSet
中组组将的组指向在第步中在上放置的组组。窗体将ComboBoxDataSet4Labels
更改组~将更改组。ComboBoxCompanyPie ComboBoxTotal
,组组属性组。在属将性组中字段更改组~将13FormatFormatExplode Biggest85Group slices
更改组其组组~组组更改组将。 Stylebelow %,4Less Than 4% Each,组组外组的属性组~然后组组里面的属性组添加梯度背景。在的右下角14ChartPanelPanel找到组。组组可组的组组~组组组始和组束的框框梯度组色。Gradient
提示,如果组您SQL不熟悉~组可以组组使用您Database Desktop QBE;Query By Example~通组例子组组,特性可组地建立SQL组句。或者如果有企组版的您
Delphi~可以使用更高组的您SQL生成器~通组TQuery组件菜组;右组一个TQuery组件,组组此生成器。第8步中的组组使用的是Database Desktop组用程序
第14章 使用据控件数109
中的QBE组组。
组组上是组组~正如所看到的~有组多其他的组组我组有介组~组些组组有多组不同的组合。您没很
一旦您个能组定组一基本的组表~就可以组组使用其他组组所组生的效果。在程序的底组~仍然是
的特性、方法和事件。所有在组组组可以组建的效果都可以在行组用程序组行修改。运 Object Pascal
组了组一组和控件的多组可能用法~组参您装考所安目组下的TChart TDBChartDelphi
文件组中的工程。 Demos\TeeChartteedemo.dpr
组组和组字段 静14.7
组用于特定组件分支的一个数基组~组组件代表据组中字段的面向组象组组。是TFieldTField
的子组~是非可组化组件。大组有组子组代表组大多知数数名的据组组TComponentTFieldTField34
型。例如~在组“流字段”中介组了字段被初始化组一个14.3.4BLOBRichMemoTBlobField组象;一可流入和流出的字段,。 个
任何可以返回一组果据个数数与个数集的据集组件都有组组组据集相组的组件。添加当您TField
组件;或者,到一、一组或者一组元中的组候~个窗体个个组件将TDataSetTTableTQueryField被自组组建。惟一的组是组是在行组被组组组建的组是在组组组被组组建的。区它运静考组控件部分DBGrib的表。表有字段,、、和。MEMOS.DBMEMOS.DBIDNAMEDATE_TIMERICH_MEMOID被定组组自组增加的字段~是一字个符串字段~是一个日期和组组字段~NAMEDATE_TIME
是一格式个化的字段。在行组运程序使用最匹配的据组数RICH_MEMOmemoRichEditDemo型的子组自组组建组象。程序自组组字段组建一个组象。组字段TFieldTFieldIDTAutoIncFieldname组建一个组象。组字段组建一个组象~组TStringFieldDATE_TIMETDateTimeFieldRICH_MEMO字段组建一个组象。 TBlobField
组组得在表中所述的每一据个数个集都包含一集合。在据数集中组于字段的引13.1Fields
用保存在集合中。可以您索引集合或者使用方法;组参考表FieldsFieldsFieldByName
,组组任何特定的字段~方法有一字段个称参数名~如果要组组的字段在集13.2FieldByName
合中存在那组将参返回组字段组象。组考组“流字段”中使用方法的14.3.4BLOBFieldByName例子。下面的例子组明了集合的使用。Fields
procedure TFormRichEditDemo.DisplayFieldDefs1Click(Sender:
TObject);
var
I : Integer;
begin
// insert a new memo
New2Click(Sender);
// walk the table and write the field definitions to the Memo
for I := 0 to Table1.Fields.Count - 1 do
begin
110Delphi 6组用组组指南
DBRichEdit1.Lines.Add( 'object ' + Table1.Fields[I].Name
+ ' ' + Table1.Fields[I].ClassName );
DBRichEdit1.Lines.Add( #9 + 'DisplayText=' +
Table1.Fields[I].DisplayText );
DBRichEdit1.Lines.Add( #9 + 'DataType=' + GetEnumName(
TypeInfo(TFieldType), Ord(Table1.Fields[I].DataType)) );
DBRichEdit1.Lines.Add( #9 + 'DisplayWidth=' +
IntToStr(Table1.Fields[I].DisplayWidth) );
DBRichEdit1.Lines.Add( #9 + 'FieldName=' +
Table1.Fields[I].FieldName );
DBRichEdit1.Lines.Add( #9 + 'FieldNo=' +
IntToStr(Table1.Fields[I].FieldNo) );
DBRichEdit1.Lines.Add( #9 + 'FullName=' +
Table1.Fields[I].FullName );
DBRichEdit1.Lines.Add( 'end' );
end;
end;
上面的代组添加到本章前面的程序中。此代组组控件中的一些RichEditDemoDBRichEdit特性组行了格式化~使组些特性以组似于组如何被流到它文件中的格式组示。 FieldsDFM
object TAutoIncField
DisplayText=
DataType=ftAutoInc
DisplayWidth=10
FieldName=ID
FieldNo=1
FullName=ID
end
如上所示~从循组的组步迭代组出的组果中~组建了组象。注意特性有组没。TFieldName不命名组组组建的组件。 DelphiField
要牢组~是可以在组组组被修改的组件。在组组组可以修改组件的组点组似于在组组组TFieldTField
修改任何组件,方便。
字段组组器 14.7.1
组组组组件是使用字段组组器组建的~字段组组器是一组件组组器~来个右组或者TFieldTQuery组件~然后组出的从菜组中可以打组字段组组器~如组所示~在中组组TTable14.14Object Inspector
了组件。 Table1ID
第14章 使用据控件数111
组使用字段组件组组器;在 14.14 Object Inspector
的右组,在组组组组建组件 TField
要在组组组组建字段组件~表或者组组组件必组组置好所有必需的特性~组组就可以打组表组并取字段定组。组于组件必组指定一全您个径个数限定路名或者一据组名和表名。组于组件~TTableTQuery组需要一组有完全组格表个名的组句~或者一据组个数个名和一组SQL SELECTSQL SELECT句。
当您个组示了字段组组器上下文菜组的组候~需要组可以添加组字段、所有的字段或者组除字段;有组使用字段特性菜组组组的组料组参考组“数个据组字典”,。组例子~要添加14.8
数据组的所有字段~在窗体上的组件必组有一全个限定的MEMOS.DBRichEdit DemoTable1
特性组。在本章前面的例子中可能已组使用了您。下面的步组组明TableNamec:\temp\memos.db怎个组完成组组程。
,确保组件有完全路径和表名信息~右组组件组出此组件的上下文菜组。 1TTableTable1
,组组菜组中的菜组组~打组字段组组器。 2Fields Editor
,右组字段组组器~组出字段组组器的上下文菜组。组组菜组组。其组果组似于组3Add All Fields14.14
所示。
如果看一下定组的前面部分组组组些字段组件已组被添加组了~组些组如下所示。您窗体您将来
Table1ID: TAutoIncField;
Table1NAME: TStringField;
Table1DATE_TIME: TDateTimeField;
Table1RICH_MEMO: TBlobField;
注意,组方便起组~字段组件的名称属数称个以字段所的据集组件名作前组。组定一
112Delphi 6组用组组指南
Table组件;名称组Table1,~那组在默组情下况ID字段的字段组件的名称组
Table1ID。使用表名可以将ID字段同其他表的ID字段组组组。 区来
可以从的组合中分组组组组件~或者在字段组组器中组组组些组框Object InspectorObject Selector
件然后按组打组组组器。组然字段组件在组组组和行组是不可组的~但是可以运您F11Object Inspector
在组组组修改字段组件的一些特性和事件。
字段特性,使用字段组束、默组表式和组组达掩组14.7.2
组件有组多特性。要了解所有的个参帮子组的组组组料~组考完整的助文件。TFieldTField34
在组里我组介组比组感组趣的组。 将几
当您您没在组组组组建字段组件的组候~可以在组组组更改组件的特性。或者~如果在组组组有组建字段组件~那组在行组必组使用代组更改特性。运您来
字段组束
您可以使用、和特性组于组入组字ConstraintErrorMessageCustomConstraintHasConstraints段的据数数将个异您施加组束。组束如同据的有效性组组。如果组束失组~那组引组一常。如果组入一个~那组组示一组组将个将个消息~或者组示一默组的组组消息。 ConstraintErrorMessage
提示,在定组定制的组束之前组组组具的体TField组件的特性。具的组件可以有特体
定的组束组型。例如~TIntegerFields组件有Min和Max特性~用于组束整型字段
的最小和最大的组界组。
假如是您个您从来迷信的人。不希望组注的组组;组组组是不个数您吉利的字,~那组ID13
可以组特性添加组束件条~将特性组组置组CustomConstraintID<>13ConstraintErrorMessage“。自组当达累加器到的组候~将个异异来生成一常~组常包含自13 is unlucky”13
特性的文本。 ConstraintErrorMessage
组束必组组组组组~看看组束是不是符合字段的据组型。组于数组型的字段~TStringField NAME组束是不匹配的~因组字段的据组型是字数您符串。也可以组组例使用组组组定,NAME <> 13name
~如果组束强加到据组方~那组组些组束组示在数将CustomConstraints: ID <> 13 AND ID <> 43
特性中。 ImportedConstraints
默组表式达
是一字个你数符串特性。但是~必组组入文本据~以字符串的形式代表DefaultExpression
组字段的合适数据。字段组型的是‘。默组的表达TDateTimeFieldDefaultExpression12:00 PM’式组加快了据组入。如果一特定字段的特定组在多组合是合数个很将您适的~那组字段组件组组添加组组~用组可以个个覆盖组默组组。
组组掩组
特性施加了外一组组束。组束据组被组入。另它数怎特性适合多组型的字众EditMaskEditMask段组件~包括和组件。组双特性旁组的按组打组TStringFieldTDateTimeFieldEditMaskInput Mask
组组~如组框所示。 Editor14.15
第14章 使用据控件数113
在右组的列表中已组组定组了几个掩组~的助帮Sample MasksTCustomEditMask.EditMask
文档从个包含组组组组器的完整列表。组列表中我组可以看到一组个描述掩组行组的例子。下面的掩组是 Social Security Mask:
000\-00\-0000;1;_
组些所在的位置必组是字组。数如同组言中用于文本据的数~允组一格式它个化的字0\ C\
符~组字符被看作一个号符。子掩组表示是一个号符~组组才有意组~因组通常\--U.S. Social
组的格式是号。表示符号数参字符组组同据一起保存。组考组号~Security###-##-####;1SSN
字段的组度组组是位~包含两个符号号您。最后的分分隔符用于定组无组的组入位置。可SSN11-
以使用任何字符代表空数据。
组组组器同控件使用的特性组组器一组14.15 Input MaskTMaskEdit
组理字段组事件14.7.3
字段组件有四个事件组理程序,、、和。可以组您OnChangeOnGetTextOnSetTextOnValidate组些事件组组外的组组和行组~用于方便或者组束据的组入。 写数
字段的事件 OnChange
当数写冲区据成功地到字段组组~事件组理程序被组用。例如~程序更改了字段OnChange
组或者在字段的据控件中更改了字段组。数当将退出组字段的组候~组用事件组理程序。OnChange下面的代组更新了组~以反映在被修改后的组和之组的组。要保持区StatusBarOldValue
必组将组置组。 OldValueCachedUpdatesTrue
procedure TForm1.Query1CompanyChange(Sender: TField);
const
MASK = '%s: %s';
begin
StatusBar1.Panels[0].Text := Format( MASK, [Sender.FieldName,
Sender.Value] );
StatusBar1.Panels[1].Text := Format( 'Old ' + MASK,
[Sender.FieldName, Sender.OldValue] );
114Delphi 6组用组组指南
end;
使用基组作组组型~所有字段组型都可以被组组到组事件组理程序。如果需要使事件组参数个您
理程序能接收特殊的子组字段~如~那组可以使用您和操作符降组字段组。TBlobFieldIsAs
字段的和事件 OnGetTextOnSetText
当冲区组求字段的文本组组组用和事件组理程序。当必组OnGetTextOnSetTextDisplayText
同组字段组不同的组候或者要组行定制的格式的组候~组写事件组理程序。当冲文本组OnGetText区没需要使用在组示组中有使用的格式组使用事件组理程序。和OnSetTextOnGetText
是相组的事件组理程序~如果使用您事件组理器在用组看到文本之前格OnSetTextOnGetText式化组文本~那组使用事件组理程序将来文本组组到原的格式。默组行组是组示组和文本组OnSetText
都等同于特性组。 AsString
组事件都可以使用的一例子是两个个的字段。组然组您MS-AccessDate/TimeMS-Access的是全部的个您个组~可以只需要一组。要示范定制格式的日期和组组字段~任何日期9Time
和组组都可以。组看下面的代组。
procedure TForm1.Query2OrderNoGetText(Sender: TField; var Text:
String;
DisplayText: Boolean);
begin
Text := Sender.AsString;
if ( Sender Is TDateTimeField = False ) then exit;
try
Text := FormatDateTime( 'dd/mm/yyyy', Sender.AsDateTime );
except
on E : EConvertError do
ShowException( E, Addr(E) );
end;
end;
procedure TForm1.Query2OrderNoSetText(Sender: TField; const Text:
String);
begin
if( Sender is TDateTimeField = False ) then exit;
try
Sender.AsDateTime := StrToDate(Text);
except
on E : EConvertError do
ShowException( E, Addr(E));
end;
第14章 使用据控件数115
end;
事件组理程序无区个组地指定到每一字段。事件组理程序提供了默组的行组,将OnGetText
;组型,组置组参数的参数~如果组字段不是有效的TextVarSenderAsStringTDateTimeField字段组型~那组将退出事件组理程序。如果组字段是~那组被控制的组示将文本TDateTimeField使用数份字的年格式。事件组理程序使用函数将当前的文本组组成4OnSetTextStrToDate
组。DateTime
字段 OnValidate
当冲区即将字段的组被更改的组候~在事件组理程序之前组用方法。OnChangeOnValidate如果没异冲区有引组常~那组组被更新~且组用事件组理程序。正在当您OnValidateOnChange用程序更新一字段的组候个事件组理程序特组适用。组组组似于当您写OnValidateField.Text :=
组组的代组的组候~因组组于组入的据有使用中组控制~所以不使用数没特性。 'value'EditMask
procedure TForm1.Query1ZipValidate(Sender: TField);
resourcestring
ZipCodeError =
'Zip code can not be less than 5 digits in length';
begin
if Length(Sender.AsString) < 5 then
raise Exception.Create( ZipCodeError );
end;
前面的代组组组文本的组度。组事件组理程序是组组政组组字段组的。如果组写政组组的组度少于那组5将个异冲区将会引组一常~组字段组不被更新。
定组字段组的组找14.7.4
组件的特性默组组是。代表组入据。数将TFieldFieldKindfkDatafkData FieldKind FieldKind特性组更改组~就可以使用一组据您个找数找填集~使字段可以自组地以组字段组充字fkLookup
段组。
可以组明组字段的一比组好的例子是组找个将确政组组字段。如果组定城市和州~有可能定组政组组。组然中大组模的城市可能有多组个数数减政组组~自组完成搜索据加快了据的组入~且可以少或者避免数两个数确找据组入组组。除了需要据集之外~要正地组工作组需要组置字段组件的四个找条特性。下面是组字段所必组的前提件,
,在目组和源;组据找数找集,中的组字段和组组字段其组型和大小必组一致。 1
,在目组据数找将集中接收组字段组的字段必组特性组置组。2FieldKindTrue
,目组字段的特性指向组据找数个数集~在组组例中是据源。3LookupDataSet
,当找组行组的组候特性定确两个匹配的字段~必组在表中都组置4LookupKeyFields
特性。 LookupKeyFields
,字段组件的的据组型必组和字段组件的据组型一组。 数数5LookupResultField
116Delphi 6组用组组指南
,字段组件的特性必组匹配字段。用分号个隔组多字段。6KeyFieldsLookupResultsField
下面的代组摘自包含一由据组向组组建的个数窗体窗体主组组的文件。在组例子中添加DFM
了第三据个数集作组字段的组据找数个数集。第三据集包含惟一的组和Query1ZipID
、和字段。组据找数集中的、和字段的组型和大小同目组据数集中的CityStateZipCityStateZip
、和字段匹配;在本组的上演示程序的组目文件CityStateZipCD-ROMFieldEventsDemo.dpr
所使用的目组表指向。是自组的演示据组,。 数customer.dbcustomer.dbDelphi
object Query1Zip: TStringField
FieldKind = fkLookup
FieldName = 'Zip'
LookupDataSet = TableZipCodes
LookupKeyFields = 'City;State'
LookupResultField = 'Zip'
KeyFields = 'City;State'
OnChange = Query1CompanyChange
OnValidate = Query1ZipValidate
Size = 10
Lookup = True
end
从确找找体上面的代组可以定~定组组需要的所有特性都已组在组字段组件中定组了。黑特性组于组正常地工作找至组重要。特性是组了向后兼容~组置了当特性~LookUpFieldKindLookup特性不起作用。将指向组字段组件的中的字段~必组同它KeyFieldsDatasetLookupKeyFields
特性匹配。组在上面的代组中是一组的。组字段的组自它找来。LookupResultFieldLookupDataSet的表中包含了组组组组。 个找TableZipCodes
您找数当也可以在组字段中手工组入据~但是和字段组改组的组候~组自组将CityStateZip地被更新。如果组有找没确返回组或者返回的组不正~那组在字段中组入一新的组。有个您没Zip
必要添加附加的代组组组就可以正常工作了。 找
组于组组字段组件和组字段组件的最后一点组明 静14.7.5
建组使用组的您静~而不要使用组组的。组了组明组建组的有个利之组~下InpriseTFieldTField
面的表组组字段和组组字段的特性作了比组。 静
表静组字段组件和组组字段组件的比组 14.3
特性 组字段组件静 组组字段组件
Yes No~除非有意在行组更改字段定组运推荐
Yes No~如果返回零字段组将个致一组组组背 如果字段定组组化引将异组常
Yes No~在行组使用代组更改特性 运来允组在组组组更改特性
Yes No在组组组组合据字数典特性
第14章 使用据控件数117
;组表, 特性 组字段组件 静组组字段组件
Yes No~每次据数数集被打组的组候组建组组字段~每次组组一次组建和解除
据集的组候都解除组组字段
注意,组组字段的存在同引组Application.CreateForm的原因是一组的,使非面
向组象的程序组和Visual Basic组组者可以更容易地组始使用Delphi。但是~不管
是所有自组组建的组是组组字段~都建组作组组。 窗体您
如表所示~使用组字段的静很数益组明组。使用组组字段的惟一组合是据集被组组组需要组14.3
繁地组化~例如组组组组工具的情。况
数据组字典14.8
数个数您据组字典是一据组~用于存组字段特性的特性。可以在企组版携组的DelphiSQL
的属性组中和在组组版携组的中组建和更改据组数ExplorerDictionaryDelphiDatabase Explorer字典。
注意,组部分的例子使用Delphi企组版携组的SQL Explorer;如果使用您
Delphi组组版~那组使用Database Explorer,。
数个据组字典用于定组集成化的字段特性。在字典中定组特性之后~每次组特性组型的
被组建的组候~就可以使用组些特性。其组果是相似组型的字段组象有一您将致的特性~TField
且只需要在一地方;据组字您个数另个您个典,定组组些特性。外一好组是可以定组一同组字典相组组的控制组。字当您从个典组组器中拖放一到上的组候~窗体组组器组建一在将个TFieldDelphi
组型中已组定组的组型的组件~添加一组组~然后组用字个典中定组的Database Dictionary Attribute
字段特性。
组建据字数典14.8.1
数数从据组字典是包含字段特性的特定组组的据组。中的、菜组或者DelphiDatabaseExplore从桌面上的、菜组中的组组启。字典的操作在StartProgram FilesDelphiSQL ExplorerSQL
;或者,中的菜组中组组~在的ExplorerDatabase ExplorerDictionarySQL ExplorerDatabase属性组中组行字典;组组,。 14.16
在中~已组存在一个和数据组的SQL ExplorerDBDEMOSBCDEMOSSample Data
字典~组组菜组中组~组出一组组~组组一字将个框个当典更改组前的字DictionaryDictionarySelect
典。
在中要更改组有的据组~依次组组数、~或者依次组组SQL ExplorerDictionarySelect
、定组据组字数个您并将典。打组或者组建一字典之后~可以更改字段特性~组些DictionaryNew
特性同组有据组的字段和表相组组。要组数携组的数个据组组建一新的字典~组DelphiDBDEMOS
遵从下面的步组,
118Delphi 6组用组组指南
组数从据组字典的操作或者 14.16 SQL ExplorerDatabase Explorer
;根据所使用的您的版本,中的菜组中组组 DelphiDictionary
,打组;或者是的、菜组中的1SQL ExplorerDelphiDatabaseExplorer Database
,。 Explorer
,组组属性组。 2Dictionary
,依次组组、菜组组。 3DictionaryNew
,在组组中~组入字框称典名;如使用“,~组于4Create a New DictionaryChapter14”
组组~保存字将典组的表命名组“~组入组组的组明;如并DatabaseDBDEMOSChapter14”
,。 Building Delphi 6 Applications Data Dictionary Example
,组组按组。 5OK
提示,要组一新的据组组建字个数个典~先组建一BDE组名指向组据组。在上个数
面的第4步中组组组新的个BDE组名。
第步组建了一个没数将并将空表~有定组特定的据组或者特性。下面的部分定组特性特5
性同据列相组组。 数
定组字段特性
本章的后半部分介组组建字段组和找利用自组的和表使用Delphicustomer.dborders.db
组件。在中携组的工程使用组些演示表组建一组客定组个TFieldDemos\DB\MastAppMastApp.dpr
系组。自组的组例子组明了组根据找怎和字段自组返回组政组组。接下定组据组字来数DelphiCityState
典~更组一步地增强组表的操作~以改组组些表。
本部分组始的第步到第步中~有机组建一新的据字您会个数来典。接下的步组是定组15
字段特性。组组明起组~我组组建将、和的特性。 CustNoStateLastInvoiceDate
组示格式 使用特性可以定组一组组组示组用组。您个怎您假定组想组DisplayFormatcustomer.db中的组客组字段;号,附组描述组组的个您文本~可以用组组方法组字段定组一定个CustNoCustNo制的;组组,。DisplayFormat14.17
,在本组组始组组建的据字数典中~组组的属性组上的列1SQL ExplorerDictionaryAttributes
表组。
,右组打组的上下文菜组~组组组。 2AttributesAttributesNew
第14章 使用据控件数119
组数据字典~组示字典中的特性定组 14.17 Chapter14CustNo
,将字段命名组。 3CustNo
,在右组的属找性组中~到字段~然后组入。4DefinitionDisplayFormatCust# 00000Cust#
是符文号本~代表字段组的五位字的数掩组。00000
,组组保存的定组。5ApplyAttribute
,;参考组“将字典同相组组”~将特性同字典相组组,。 614.8.2DataSetCustNoCustNo
组在~不管在里~只要在组用程序中使用到哪~组特性都已组同个相组组了~CustNoCustNo其组示格式也是一致的。
定组组束 假如;一的个虚构公司,使用组用程序只在一部Marine AdventuresMastApp分州提供组。要组正组用售个组组的组子商组站点中的组组~可以定组特性来DelphiCustomConstraint排除某些州不能完成的偶然定组事件。
要组特性组建~重组前面部分的第步到第步~组组新将个命名组StateCustomConstraint13r
。在属双性组上~组定组打组。组入组个组束, stateDefinitionCustomConstraintExpression Editor
X in ('MI','OH','IN','IL')
组组按组。如果组束有组组或者组法组组~组示一将个组组~框否组无ValidateDatabase Engine Error效的组束组将响生无效的组。注意的使用~可以使用任何不同的您称个称名代表组字段名。添X
加~以保在组确异生组束常的组候组示用组可以理解的文本。 ConstraintErrorMessage
定组特性组组掩组 字典特性的同使用的组型一组。在字典中定组EditMaskTFieldEditMask掩组~只需要组每一您个组型定组一次~例如组组组、号日期和组组。要定组日期组组掩组~组掩Attribute
组能同一起使用~组建新的特性~命名组~在的定组Customer.LastInvoiceDatedateEditMask字段中组入合适的日期组组掩组。合适的日期组组掩组保用组组入有效的将确个日期和组组。组里有一例子,
120Delphi 6组用组组指南
!99/99/0000;1;#
上面的组组掩组~组于月份数份数和日期需要一位或者二位的字~组于年需要四位字。表1示掩组以组组保存。个是每一字的组个数号隔符。 #
使用组示掩组定组~如~用以提供一惟一的组示方式。个EditMaskmm/dd/yyyymm/dd/yyyy掩组用组组当份个数会日期和月只组入一字的组候~自组添加~用组不必要组入。 00
指定和 TFieldClassTControlClass
字典中最先的特性是两个和。定组组的组。组TFieldClassTControlClassTFieldClassTField表示任何的子组的名称都可以组入到特性中~一字段被添加到组当个TFieldTFieldClass
中的组候组个的组型被组建~如果组特性组空~那组组个组型的组建依组于基本DataSetTFieldTfield数据组型。
提示,要从TField组件组建一个数从个窗据感知控件~字段组组器拖放一字段到
体将个数并数上。组操作自组组建一组组和据控件~且如果据字典特性同组字段相组
组那组更新据控件的特性。将数
表示字段被当窗体将拖放到上的组候~被组建的控件的组组。例如~如果TControlClass
是一个~那组字段组组器中当您从个拖放一组件到上窗体TControlClassTDBComboBoxTField的组候~控件被添加到以代表组将窗体个组件。TDBComboBoxTField
将字典同相组组 14.8.2 DataSet
要使用据字数您将典中的定组~必组组特性组型同指定的字段相组组。如果定组一普通的您个
特性~那组组于任何字段~如果想组组字段具有那些原始的特性组置~必组您个您StateTField
将数来组些字段同据字典特性组组起。
要据字将数来您典特性同特定的字段组组起~打组字段组组器然后组组想接收字典特性的字段。右组组字段组示字段组组器上下文菜组~然后组组。在组组Associate attributesAssociate attributes
框称中~组组组字段要组组的特性名~然后组组按组。组组同一上下个文菜组中的OKRetrieve
更新被组组的特性。attributes
字段组组器菜组也可用于更新据字数您并决个典。如果改组了字段特性~且定所有共享组特性的字段都组用特性的组化~组组组。外一组组组是~组组字段组组器另菜组中的Save AttributesSave
~组建新的字典特性。 Attributes as
组建定制的据控件数 14.9
定制的据感知控件的组组同任何其他组件的组组一组。在建立新的定制控件数之前~回答下面的组组,
,组件通常解什决组组的组组,1
,组有的什组控件最匹配需要组建的据控件, 数2
一好的件是在个很条的 中已有和据控件接近的控件~可以其作组数很将DelphiVCL
第14章 使用据控件数121 定制据控件的数基组。
除了组承组有的组件外~据感知控件需要一数个组象。组是组助组~它TDataLinkTDataLink提供了到和的组接。稍后我组将回到。我组首先定组要组建的组件~DataSourceDataSetDataLink步组如下。
组了组明的目的~我组需要一据感知个数日组。在属它性组中~DateTimePickerWin32 VCL可以提供除了据不可组数它很很之外的任何特性。在组示上是有吸引力的~适合组组组组~可能组组组者所熟悉。通常所需要的步组如下。
,定组组组组。 1
,找没到组有的完整的匹配控件;如果可以的组,。如果有吻合匹配的控件存在~那组组2
组匹配程度最高的组件。
,打组。 3Delphi
,组建一新组元。 个4
,组组组的写体从主~包括定组组;我组组组组承子组,的组元和任何组助组元~定组我组要组承的5
最匹配的组。
,将私有成组添加到组组中~定组一个构数构数将造函和析函~6TFieldDataLink
组象组接到组组有的组件中。DataLink
,添加组组需要的其他特性和方法。7
,确数插参定组据感知组件是否可组制~入必要的因素;组考组“使控件可组814.9.2
制”,。
,最后~组组组件。完成组组的组候组组件安到组件包中。 当将装9
第和第步就不多组了。据感知数从日组组件可以组有的组建。第步告组12TDateTimePicker3您怎组做。要完成第步~组组菜组中的菜组中的菜组组~使用组组4FileNewUnitNew Component框框;组组组也完成第步的大部分工作,组组;如果组部分有组组的组~组很参考组“使用组件59.2向组”,。我组第将从步组始组组组组程。 个6
添加组件14.9.1 TFieldDataLink
在后台工作~作组一组助组一控件组接到一字段或者表。在我组它个将个个TFieldDataLink
的例子中~我组根据组定新组件将将命名组。TDBDateTimePicker
组组需要一个成组。因组在部内作组一组助组~被明组个它将声TFieldDataLinkTFieldDataLink私有。控件组接到当您将的和特性组~组控件就可以组TFieldDataLinkFieldNameDataSource接到据组中的字段上。组组件需要一数个构数造函组建和析构数函组放。同其DataLinkDataLink他的据控件一组~我组数将数命名据组组接特性和。最后~控件需要组响基DataFieldDataSource本据字段的组数从化、用组鼠组和组组的组入~用组或者程序组控件的更改需要反映到基本字段和数据集中。其组果如下,
TDBDateTimePicker = class(TDateTimePicker)
private
{ Private declarations }
122Delphi 6组用组组指南
FDataLink : TFieldDataLink;
procedure DataChange( Sender : TObject );procedure EditingChange( Sender : TObject );
function GetDataField : String;
function GetDataSource : TDataSource;
function GetField : TField;
function GetReadOnly : Boolean;
procedure SetDataField( const Value : String ); procedure SetDataSource( Value : TDataSource );
procedure SetEditReadOnly;
procedure SetReadOnly( Value : Boolean );procedure UpdateData( Sender : TObject );
procedure CMExit(var Message : TCMExit); message CM_EXIT;
protected
{ Protected declarations }
procedure Change; override;
procedure Click; override;
procedure CreateWnd; override;
procedure KeyDown( var Key : Word; Shift : TShiftState ); override;
procedure KeyPress( var Key : Char); override;
procedure Loaded; override;
procedure Notification( AComponent : TComponent; Operation : TOperation ); override;
public
{ Public declarations }
constructor Create( AOwner : TComponent ); override; destructor Destroy; override;
function ExecuteAction( Action : TBasicAction ) : Boolean;
override;
function UpdateAction( Action : TBasicAction ) : Boolean; override;
property Field : TField read GetField;
published
{ Published declarations }
property DataField : string read GetDataField write SetDataField;
property DataSource : TDataSource read GetDataSource write SetDataSource;
第14章 使用据控件数123
property ReadOnly : Boolean read GetReadOnly write
SetReadOnly default False;
end;
注意,不要把Object Pascal字段、组的据特性同据数数集中所指的字段相混淆~
文字表示形式一组但其意组却依组于构造组组。
表中组组地描述了每一成组的作用。 个14.4
完整的代组在下一组。只用表列出的特性和方法~组控件除了不能同一14.4DBCtrlGrid起工作之外都可以正地工作。要使组控件同确一起正常工作所需要的其他特性DBCtrlGrid
和完整的代组列在下一组中。
表的特性和方法 14.4 TDBDataTimePickerTDBDateTimePicker的成组 在组中的角色
FDataLink 组承于TFieldDataLink~提供到据数集的组接 DataChange事件组理程序~组响TFieldDataLink的OnDataChange事件 EditingChange 当数确据组组定组化的组候保控件是只组的
GetDataField和SetDataField 组和写DataField特性的组助方法
GetDataSource和SetDataSource 组和写DataSource特性的组助方法
GetField 组公有Field特性的组助方法~返回相组组的TField组象 GetReadOnly和SetReadOnly 组和写ReadOnly特性的组助方法
SetEditReadOnly 强加TDataSet的CanModify特性
UpdateData 组响TFieldDataLink.UpdateData~用控件据的数拷组更新基本字段组 CMExit 组用TFieldDataLink.UpdateRecord~如果更新失组那组将未更新部分
放置在控件上
Change将数据组接组置组组组模式
Click 同Change方法的功能一组
CreateWnd 组用CreateWindowEx;一个Windows API函数窗,组建组基本口 KeyDown将数据组接组置组组组模式
KeyPress 组组基本字段组型的组入~据组接组置组组组模式~或者如果将数按的是
Esc组组组位组字段组
Loaded在从DFM文件组出所有的特性之后更新控件的组示组 Notification 如果被参数数考的据源组件被组除了~那组更新据源的引用 Create 构造FDataLink~将TFieldDataLink的事件特性组接到部的事件内
组理程序中
Destroy 组放FDataLink组象
ExecuteAction 组理控件的Action参数和DataLink的ExecuteAction UpdateAction当Action即将更新事件组组行更新行组
Field 只组特性~组特性组用GetField方法返回相组组的字段引用 DataField包含被参称考字段名的字符串
124Delphi 6组用组组指南
DataSource 被引用的TDataSource组件
ReadOnly 反映DataLink的只组组状
使控件可组制14.9.2
的工作机理是,组制所有的控件到组格的一面板中~更新组格面板个索引所DBCtrlGrid
引用的组组的组示组。在部完成所有组些工作~但是必组保控件知内你确怎道组组制组些DBCtrlGrid
组组的副本。
第一需要做的更改是添加个组象~组组象组持一自个它己的句柄~TPaintControlWindows当响个另响控件需要组制和更新组示组的组候~组组象可以组组消息。外~控件需要组组
消息。组送消息~返回一到个组象的CMGetDataLinkDBCtrlGridGETDATALINKFDataLink引用。使用来个组附加的字段组。一消息方法也被添加组了。来DBCtrlGridFDataLinkWMPaint当出组组制消息的组候~如果包含~那组将组ControlStatecsPaintCopyTDBDateTimePicker
组象组送消息。最后~在解除句柄的组候~函数被跳组。下面PaintControlPaintControlWndProc摘引的代组组示了使用的代组定组和附加的方法。 PaintControl
procedure TDBDateTimePicker.WMPaint( var Message : TWMPaint);
var
D : TDateTime;
T : TSystemTime;
begin
if csPaintCopy in ControlState then
begin
if FDataLink.Field <> nil then D := FDataLink.Field.AsDateTime
else D := Now;
DateTimeToSystemTime(D, T);
SendMessage(FPaintControl.Handle, DTM_SETSYSTEMTIME, 0,
Longint(@T));
{$R-}
SendMessage(FPaintControl.Handle, WM_PAINT, Message.DC, 0);
{$R+}
end else
inherited;
end;
procedure TDBDateTimePicker.WndProc(var Message: TMessage);
begin
if not (csDesigning in ComponentState) then
case Message.Msg of
WM_CREATE,
第14章 使用据控件数125
WM_WINDOWPOSCHANGED,
CM_FONTCHANGED:
FPaintControl.DestroyHandle;
end;
inherited WndProc(Message);
end;
在上面有列出的部分是没构数构数造函和析函。组象必组被构它造和解除。PaintControl有,两个参数所有者和组名;已注的册组的组名~用于组制,。它的WindowsTDateTimePicker
注组是册。构数造函的组用是,SysDateTimePick32
FPaintControl := TPaintControl.Create(Self, 'SysDateTimePick32')~
解除的组用是,
FPaintControl.Free;
构数将造函组组状组添加到特性。 csReplicatableControlState
的消息方法组用组承的消息组理程序~除非包含组。如WMPaintControlStatecsPaintCopy果组控件的副本组用函数将个~那组字段的事件被组组成一Paint
。消息被组送~组组的地址以整数的形式TSystemTimeDTM_SETSYSTEMTIMETSystemTime被组组到窗口~引用组个窗口。在副本日期和组组被更SysDateTimePick32FPaintControl.Handle新之后~消息被组送~组组上下文——称作句柄——被组送到组象。PaintCanvasPaintControl
如果接收到、或者WM_CREATEWM_WINDOWPOSCHANGEDCM_FONTCHANGED消息~消息方法入将并解除句柄的附加行组。最后~组用组承的WndProcPaintControlWndProc方法。控件的完整列表如下所示。 TDBDateTimePicker
unit UDBDateTimePicker;
// UDBDateTimePicker.pas - A DateTimePicker/Data Control Custom
// Component
// Copyright (c) 2000. All Rights Reserved.
// by Software Conceptions, Inc. Okemos, MI USA (800) 471-5890
// Written by Paul Kimmel
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,
ComCtrls, Db, DbCtrls;
type
TDBDateTimePicker = class(TDateTimePicker)
private
{ Private declarations }
126Delphi 6组用组组指南
FDataLink : TFieldDataLink;
FPaintControl : TPaintControl;
procedure DataChange( Sender : TObject );
procedure EditingChange( Sender : TObject );
function GetDataField : String;
function GetDataSource : TDataSource;
function GetField : TField;
function GetReadOnly : Boolean;procedure SetDataField( const Value : String );
procedure SetDataSource( Value : TDataSource );
procedure SetEditReadOnly;
procedure SetReadOnly( Value : Boolean );procedure UpdateData( Sender : TObject );
procedure CMExit(var Message : TCMExit); message CM_EXIT; procedure CMGetDataLink( var Message : TMessage); message CM_GETDATALINK;
procedure WMPaint( var Message : TWMPaint); message WM_PAINT; protected
{ Protected declarations }
procedure WndProc(var Message: TMessage); override; procedure Change; override;
procedure Click; override;
procedure CreateWnd; override;
procedure KeyDown( var Key : Word; Shift : TShiftState ); override;
procedure KeyPress( var Key : Char); override;
procedure Loaded; override;
procedure Notification( AComponent : TComponent; Operation : TOperation ); override;
public
{ Public declarations }
constructor Create( AOwner : TComponent ); override;
destructor Destroy; override;
function ExecuteAction( Action : TBasicAction ) : Boolean; override;
function UpdateAction( Action : TBasicAction ) : Boolean;
override;
property Field : TField read GetField;published
第14章 使用据控件数127
{ Published declarations }
property DataField : string read GetDataField write
SetDataField;
property DataSource : TDataSource read GetDataSource write
SetDataSource;
property ReadOnly : Boolean read GetReadOnly write
SetReadOnly default False;
end;
procedure Register;
implementation
uses
CommCtrl;
procedure Register;
begin
RegisterComponents('PKTools', [TDBDateTimePicker]);
end;
{ TDBDateTimePicker }
constructor TDBDateTimePicker.Create(AOwner: TComponent); begin
FDataLink := TFieldDataLink.Create;
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable]; FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;FDataLink.OnUpdateData := UpdateData;
FDataLink.OnEditingChange := EditingChange;
FPaintControl := TPaintControl.Create(Self,
'SysDateTimePick32');
FPaintControl.Ctl3DButton := True;end;
destructor TDBDateTimePicker.Destroy;
begin
FPaintControl.Free;
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
128Delphi 6组用组组指南
procedure TDBDateTimePicker.CreateWnd;begin
inherited CreateWnd;
SetEditReadOnly;
end;
procedure TDBDateTimePicker.WMPaint( var Message : TWMPaint);
var
D : TDateTime;
T : TSystemTime;
begin
if csPaintCopy in ControlState then
begin
if FDataLink.Field <> nil then D := FDataLink.Field.AsDateTime
else D := Now;
DateTimeToSystemTime(D, T);
SendMessage(FPaintControl.Handle, DTM_SETSYSTEMTIME, 0,
Longint(@T));
{$R-}
SendMessage(FPaintControl.Handle, WM_PAINT, Message.DC, 0);
{$R+}
end else
inherited;
end;
procedure TDBDateTimePicker.WndProc(var Message: TMessage); begin
if not (csDesigning in ComponentState) then
case Message.Msg of
WM_CREATE,
WM_WINDOWPOSCHANGED,
CM_FONTCHANGED:
FPaintControl.DestroyHandle;
end;
inherited WndProc(Message);end;
procedure TDBDateTimePicker.DataChange(Sender: TObject);
第14章 使用据控件数129
begin
if FDataLink.Field <> nil then
DateTime := FDataLink.Field.AsDateTime else
if( csDesigning in ComponentState ) then
Datetime := Now;
end;
procedure TDBDateTimePicker.Change; begin
FDataLink.Edit;
inherited Change;
FDataLink.Modified;
end;
procedure TDBDateTimePicker.Click; begin
FDataLink.Edit;
inherited Click;
FDataLink.Modified;
end;
procedure TDBDateTimePicker.CMExit(var Message: TCMExit);
begin
try
FDataLink.UpdateRecord;
except
SetFocus;
raise;
end;
DoExit;
end;
procedure TDBDateTimePicker.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink); end;
130Delphi 6组用组组指南 procedure TDBDateTimePicker.EditingChange(Sender: TObject); begin
SetEditReadOnly;
end;
function TDBDateTimePicker.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil)
and FDataLink.ExecuteAction(Action);
end;
function TDBDateTimePicker.GetDataField: String; begin
Result := FDataLink.FieldName;
end;
function TDBDateTimePicker.GetDataSource: TDataSource; begin
Result := FDataLink.DataSource;end;
function TDBDateTimePicker.GetField: TField; begin
Result := FDataLink.Field;end;
function TDBDateTimePicker.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;end;
procedure TDBDateTimePicker.KeyDown(var Key: Word; Shift: TShiftState);
第14章 使用据控件数131 begin
inherited KeyDown(Key, Shift);
if Key in [VK_BACK, VK_DELETE, VK_UP, VK_DOWN, 32..255] then
begin
if not FDataLink.Edit and (Key in [VK_UP, VK_DOWN]) then
Key := 0;
end;
end;
procedure TDBDateTimePicker.KeyPress(var Key: Char); begin
inherited KeyPress(Key);
if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
not FDataLink.Field.IsValidChar(Key) then
begin
MessageBeep(0);
Key := #0;
end;
case Key of
^H, ^V, ^X, #32..#255:
FDataLink.Edit;
#27:
begin
FDataLink.Reset;
end;
end;
end;
procedure TDBDateTimePicker.Loaded;
begin
inherited Loaded;
if (csDesigning in ComponentState) then DataChange(Self);
end;
procedure TDBDateTimePicker.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
132Delphi 6组用组组指南
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil; end;
procedure TDBDateTimePicker.SetDataField(const Value: String);
begin
FDataLink.FieldName := Value;
end;
procedure TDBDateTimePicker.SetDataSource(Value: TDataSource); begin
if not (FDataLink.DataSourceFixed and (csLoading in
ComponentState)) then
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Self); end;
procedure TDBDateTimePicker.SetEditReadOnly;begin
SendMessage(Handle, EM_SETREADONLY, Ord(not FDataLink.Editing),
0);
end;
procedure TDBDateTimePicker.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TDBDateTimePicker.UpdateAction(Action: TBasicAction):
Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil)
and FDataLink.UpdateAction(Action);
end;
procedure TDBDateTimePicker.UpdateData(Sender: TObject);
第14章 使用据控件数133
begin
FDataLink.Field.AsDateTime := DateTime;
end;
end.
小 组 14.10
第章介组的内很丰两怎容富。首先组短地组组了组和三组组组~接着介组组使用一些令人感组14
趣的据控件。数数两您据感知控件常被用于建立组的组用程序。但是~如果使用组件~MIDAS那组可以在三组组用程序中使用据感知控件~在下一章看到。 您数您将
到目前组止您学怎已组组了组使用、 和使用控件流入和流出DBGridDBChartDBRichEdit字段据。本章组组了组组和组数静组件之组的组~区静强组了使用组组件~而不要使用组组TFieldTField
组件的原因。本章的最后组组地组组了组建定制的据感知控件。组建据感知控件的组组是数数TField
~要使据感知控件同数一起工作必组使用组象作组组助。TFieldDataLinkDBCtrlGridPaintControl有组更多的定制据控件的组数参料可以考组元。DBCtrls.pas
本文档为【使用数据控件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。