对delphi中的数据敏感控件的一点探索
一直对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中的数据敏感控件的一点探索的更多相关文章
- Delphi中解析Xml的控件-SimDesign NativeXml
Delphi中解析Xml的控件-SimDesign NativeXml 正在学习,感觉应用很方便.无源代码的版本还是免费的. SimDesign.NativeXml是一个delphi和bcb的XML控 ...
- 咏南树形下拉列表数据敏感控件--TYNdbTreeList
咏南树形下拉列表数据敏感控件--TYNdbTreeList 软件系统拥有自己通用的下拉列表控件可以大大地加速系统的开发和易用性. 控件支持DELPHI5及以上版本安装并使用. 控件的用法: proce ...
- 咏南下拉列表非数据敏感控件--TYNSearch
咏南下拉列表非数据敏感控件--TYNSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本的安装和使用. 控件的使用方法: procedure Tflog.s ...
- 咏南下拉列表数据敏感控件--TYNDBSearch
咏南下拉列表数据敏感控件--TYNDBSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本安装并使用. 控件的用法: procedure Tfgoods.s ...
- Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...
- delphi中使用MSWINSCK.OCX控件
1.首先是把winsck控件导入到delphi中,就是导入一个ActiveX控件,步骤略过. 2.将导入的winsck控件拖入你的Form中. 3.对winsck进行基本设置(IP,Port). 4. ...
- Delphi 中TWebBrowser的扩展控件TExWebBrowser
主要扩展了3D界面.右键菜单.是否显示图片.是否支持JAVA等功能. 代码如下: unit ExtWebBrowser; interface uses Windows, SysUtils, Class ...
- 制作用于日期时间型字段的DELPHI数据感知控件
用DELPHI开发C/S应用方便而快速,因为它拥有大量易于使用的数据访问和数据感知控件.然而万事总是难以完美,DELPHI的DBEdit控件用于输入日期时间型字段却很不方便,为了改善这一缺点,笔者开发 ...
- 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择
在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...
随机推荐
- 按行读取.txt文件,并按行写入到新文件中
package com.test.io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...
- Linux中进程与线程的概念以及区别
linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题.无论你是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.对于一般的程序员,搞清楚二者的概念并在工作中学会运用是 ...
- ARM汇编语言基础
ARM 与 Thumb 寄存器对应关系 PC寄存器: ARM状态为R15,Thumb状态为PC LR寄存器: ARM状态为R14,Thumb状态为LR SP寄存器: ARM状态为R13,Thumb状态 ...
- spring,springmvc,mybatis整合ssm框架出现ORA-02289:序列不存在问题
今天整合了一个SSM项目,完了后部署到Tomcat服务器,正常启动.但是当我发送请求时,报错,,如下 报错说序列不存在,可是我明明创建了序列呀,然后我测试了一下,测试语句:select tb_user ...
- QT pri 文件的作用
i 是什么东西?包含(include)的首字母.类似于C.C++中的头文件吧,我们可以把 *.pro 文件内的一部分内容单独放到一个 *.pri 文件内,然后包含进来. 接前面的例子,我们将源文件的设 ...
- Luogu P4779 【模板】单源最短路径(标准版)(Dijkstra+堆优化模板)
qwq dij其实和prim挺像的,prim是找权值最小点,dij是找边, 用一个优先队列就可以在加入边的时候直接排序,避免了每次遍历更新min priority_queue <pair< ...
- hibernate4使用原生jdbc进行批处理
在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用.比如有较大的数据量交互的话,缓存反而会降低效率.最近在做一 ...
- ueditor保存出现 从客户端(Note="<p>12345</p>")中检测到有潜在危险的 Request.Form 值
检测到有潜在危险的 Request.Form 值 这种问题是因为你提交的Form中有HTML字符串,例如你在TextBox中输入了html标签,或者在页面中使用了HtmlEditor组件等,解决办 ...
- 循环神经网络RNN的基本介绍
本博客适合那些BP网络很熟悉的读者 一 基本结构和前向传播 符号解释: 1. $c_{t}^{l}$:t时刻第l层的神经元的集合,因为$c_{t}^{l}$表示的是一层隐藏层,所以图中一个圆圈表示多个 ...
- 前后端交互json字符串
//将需要的参数转成json字符串,然后用utf-8编码 var obj = encodeURIComponent(JSON.stringify(this.categories),"utf- ...