一直对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. PAT A1134 Vertex Cover (25 分)——图遍历

    A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...

  2. spring batch批量处理框架

    spring batch精选,一文吃透spring batch批量处理框架 前言碎语 批处理是企业级业务系统不可或缺的一部分,spring batch是一个轻量级的综合性批处理框架,可用于开发企业信息 ...

  3. android 之TCP客户端编程

    补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...

  4. Ionic 部分手机升级不成功的问题

    Android端的手机App发布之后的一段时间,用户反馈App无法升级的情况. 原因分析: 对代码进行错误在线,提示是FileNOTFindException错误,确定是下载的时候保存的目的路径 不存 ...

  5. IOC框架之Ninject 简介

    还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 上篇博客介绍了依赖注入的三种方式:构造方法注入,属性注入,接口注入!详情请参考 ...

  6. Jlink使用技巧之烧写SPI Flash存储芯片

    前言 大多数玩单片机的人都知道Jlink可以烧写Hex文件,作为ARM仿真调试器,但是知道能烧写SPI Flash的人应该不多,本篇文章将介绍如何使用JLink来烧写或者读取SPI Flash存储器, ...

  7. 20min 快速着手Markdown

    目录 Markdown介绍和基本使用 初步介绍 markdown的使用场景 为什么是 Markdown markdown的基本语法和使用平台 Q&A: Markdown介绍和基本使用 初步介绍 ...

  8. “北航学堂”M2阶段postmortem

    “北航学堂”M2阶段postmortem 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 这个问题我们在M1阶段的时候就已经探讨的比较明确了,就是 ...

  9. BUAAMOOC项目M2 postmortem

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是基于北航MOOC网站做的Android手机客户端,用于便捷的在学校里通过手机做到随时随地 ...

  10. linux及安全第八周总结

    进程的调度时机与进程的切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调 ...