一直对delphi数据敏感控件很好奇,感觉很神奇。只要简单设置一下,就显示和编辑数据,不用写一行代码。

如果不用数据敏感控件,编辑一个表字段数据并保存,我相信应用如下代码。

Table1.edit,

Table1.fieldByName (‘***’) .AsString:= ‘***’;

//Table1.Next;//在内部如果是edit状态,则调用Post.

Table1.Post;

我也相信数据敏感控件从Table端看也应该逃不出以上方法和步骤。

1、  首先,调用edit,使数据集处于编辑状态

2、  第二,给一个字段赋值

3、  第三,调用Post保存到数据库中;

事实上vcl中也是如此处理。

为了说明举一个简单的例子,在一个Edit框中显示并能编辑数据。

在TForm1OnCreate中,Edit1设置字段1的内容。

procedure  TForm1OnCreate(Sender: TObject);

Begin

Table1.Open;

Table1.First;

Edit1.Text := Table1.FieldByName(‘字段1’).AsString;

End;

那么在Edit1框中编辑数据的时候,调用edit过程。

procedure  TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

 if  (Table1. State = dsBrowse) then Table1.Edit;//数据集在浏览状态时,调用Edit进入编辑状态

end;

接下来应给字段赋值,在哪里呢,还好Edit1有一个事件OnExit,在Edit1失去焦点的给字段赋值。

TForm1.Edit1Exit(Sender: TObject);

Begin

Table1.FieldByName(‘字段1’).AsString := Edit1.Text;

End;

接下就要保存了,可以在按钮OnClick中处理了。

procedure TForm1.Button1Click(Sender: TObject);

begin

if  (Table1. State = dsEdit) then Table1.Post;// 数据集在状编辑态时保存

Table1.Close;

end;

这也算数据敏感控件,也太简陋了,不过说回来,这很能说明问题。

数据敏感控件分二部分,第一部分是控件的变化要反应到数据集,第二部分是数据集的变化要反应到控件中去,要相互作用。

现要让我们看看VCL源码中TDBEdit中处理。

第一部分控件到数据集。

procedure TDBEdit.KeyDown(var Key: Word; Shift: TShiftState);

begin

inherited KeyDown(Key, Shift);

 if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then

FDataLink.Edit;//注意这里

end;

procedure TDBEdit.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;

SelectAll;

Key := #0;

 end;

end;

end;

其中TDataLink.EditàTFieldDataLink.EditàTFieldDataLink.EditàTDataLink.EditàTDataSource.EditàTDataSet.Edit

最终调用TDataSet.edit,使数据集处于编辑状态

字段赋值过程先看CMExit消息过程;

procedure TDBEdit.CMExit(var Message: TCMExit);

begin

 try

FDataLink.UpdateRecord; //注意这里

  except

SelectAll;

SetFocus;

raise;

end;

SetFocused(False);

CheckCursor;

DoExit;

end;

在FDataLink.UpdateRecord中究竟做了什么,让我们看看代码。

procedure TDataLink.UpdateRecord;

begin

FUpdating := True;

  try

UpdateData; //注意这里

finally

FUpdating := False;

 end;

end;

让我们再看UpdateData是个虚函数,看它的继承类TFieldDataLink处理。

procedure TFieldDataLink.UpdateData;

begin

if FModified then

begin

if (Field <> nil) and Assigned(FOnUpdateData) then FOnUpdateData(Self);

FModified := False;

end;

end;

再往下看

constructor TDBEdit.Create(AOwner: TComponent);

begin

…..

FDataLink.OnUpdateData := UpdateData; //注意这里

…….

End;

procedure TDBEdit.UpdateData(Sender: TObject);

begin

ValidateEdit;

FDataLink.Field.Text := Text; //注意这里,哈哈终于看到了

end;

从上面我们可以看出TDBEdit给一个字段赋值过程。

TDBEdit.CMExità TDataLink.UpdateRecord à TFieldDataLink.UpdateData àTDataLink.OnUpdateDataà TDBEdit.UpdateData àTDataLink.Field.Text := Text

层层调用终于给字段赋值了。

第二部分从数据集到控件,为了和数据敏感控件交互,数据集TDataSet中定义了一系列数据事件。TDataSet的打开,关闭,编辑,插入,删除,取消,数据集的滚动,最终会通知数据敏感控件,让数据敏感控件有机会改变自己。

因此TDBEdit中有一个成员变量FFieldDataLink来接收数据集TDataSet中的数据事件,而FFieldDataLink是从TDataLink继承下来的, 让我们看看最主要的一个TDataLink.DataEvent过程。

procedure TDataLink.DataEvent(Event: TDataEvent; Info: Longint);

var

Active, First, Last, Count: Integer;

begin

if Event = deUpdateState then UpdateState else

if FActive then

case Event of

deFieldChange, deRecordChange:

if not FUpdating then RecordChanged(TField(Info));

deDataSetChange, deDataSetScroll, deLayoutChange:

begin

……

case Event of

deDataSetChange: DataSetChanged;

deDataSetScroll: DataSetScrolled(Count);

deLayoutChange: LayoutChanged;

end;

end;

deUpdateRecord:

UpdateRecord;

deCheckBrowseMode:

CheckBrowseMode;

deFocusControl:

FocusControl(TFieldRef(Info));

end;

end;

下面是主要数据事件的说明。

deFieldChange      一个字段数值已改变。

deRecordChange     当前记录的内容已改变。

deDataSetChange    例如调用. Insert,delet,edit等时发生

deDataSetScroll 

对delphi中的数据敏感控件的一点探索的更多相关文章

  1. Delphi中解析Xml的控件-SimDesign NativeXml

    Delphi中解析Xml的控件-SimDesign NativeXml 正在学习,感觉应用很方便.无源代码的版本还是免费的. SimDesign.NativeXml是一个delphi和bcb的XML控 ...

  2. 咏南树形下拉列表数据敏感控件--TYNdbTreeList

    咏南树形下拉列表数据敏感控件--TYNdbTreeList 软件系统拥有自己通用的下拉列表控件可以大大地加速系统的开发和易用性. 控件支持DELPHI5及以上版本安装并使用. 控件的用法: proce ...

  3. 咏南下拉列表非数据敏感控件--TYNSearch

    咏南下拉列表非数据敏感控件--TYNSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本的安装和使用. 控件的使用方法: procedure Tflog.s ...

  4. 咏南下拉列表数据敏感控件--TYNDBSearch

    咏南下拉列表数据敏感控件--TYNDBSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本安装并使用. 控件的用法: procedure Tfgoods.s ...

  5. Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)

    一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...

  6. delphi中使用MSWINSCK.OCX控件

    1.首先是把winsck控件导入到delphi中,就是导入一个ActiveX控件,步骤略过. 2.将导入的winsck控件拖入你的Form中. 3.对winsck进行基本设置(IP,Port). 4. ...

  7. Delphi 中TWebBrowser的扩展控件TExWebBrowser

    主要扩展了3D界面.右键菜单.是否显示图片.是否支持JAVA等功能. 代码如下: unit ExtWebBrowser; interface uses Windows, SysUtils, Class ...

  8. 制作用于日期时间型字段的DELPHI数据感知控件

    用DELPHI开发C/S应用方便而快速,因为它拥有大量易于使用的数据访问和数据感知控件.然而万事总是难以完美,DELPHI的DBEdit控件用于输入日期时间型字段却很不方便,为了改善这一缺点,笔者开发 ...

  9. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

随机推荐

  1. [转]Qt状态栏(statusbar)的使用

    状态栏显示的信息分3种 1. 一般信息,用QLabel 代表 2. 永久信息,文本会一直显示在状态栏的最右边. 3. 临时信息,指定信息现实的时间.时间到即信息消失 QLabel *locationL ...

  2. SD-WAN助力解决多云问题

    导读 SD-WAN供应商和云服务供应商之间的合作,有助于跨多个云供应商轻松管理云连接,并创建安全.低延迟的多云环境. 随着SD-WAN成为远程用户访问基于云的应用程序的主要途径,促使越来越多的部署多云 ...

  3. httpclient原理

    http.tcp/ip和socket的区别,用一个序列图概括最合适 网络上的跨域请求,都是以URL的方式发送请求,后端接收.标准的http请求格式包括header和body,传输到服务端 应用的协议都 ...

  4. LVS + Keepalived 理论

    LVS 纯理论: VRRP协议与工作原理 在现实的网络环境中,主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障通信就会失效,因此这种通信模式当中,路由器就成了 ...

  5. QT qss 初级介绍

    这篇文章来自于QT的帮助文档,你要是看了最新版的,会发现讲解得更棒.如果你的英文不是那么好,或者说看着头疼,那还是来看此篇吧. 在此之前说一个帮助文档的特别用法,绝不仅仅是搜单词,QT的文档非常强大的 ...

  6. java static 在java 中的使用。

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  7. Android学习之基础知识十一 —运用手机多媒体

    一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...

  8. java 入门常识

    1.java应用程序的运行机制 Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java:再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class: 最后 ...

  9. Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)

    1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...

  10. ElasticSearch实践系列(三):探索数据

    前言 经过前两篇文章得实践,我们已经了解了ElasticSearch的基础知识,本篇文章让我来操作一些更真实的数据集.我们可以利用www.json-generator.com/生成如下的文档结构: { ...