DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4],第1张

Truncate方法

该方法是通过调用BDE API函数实现的 其实现如下

procedure TBlobStream Truncate;

begin

if FOpened then

begin

Check(DbiTruncateBlob(FDataSet Handle FRecord FFieldNo FPosition))

FModified := True;

end;

end;

该方法从BLOB流的当前位置起删除所有数据 并设置修改标志FModified为True 在Delphi VCL中许多部件特别是数据库应用方面的部件都用BDE API函数完成对数据库的访问 如Data Access和Data Control部件 各种数据库部件都是BDE API函数外层的包装简化了对数据库的访问 *** 作 BDE API中还提供了避开BDE配置工具在程序中直接处理Alias(建立 修改 删除等)的函数支持 这也是部件所没有提供的 在Delphi数据库应用安装程序中 这些Alias *** 作函数无疑是相当重要的 有关BDE API函数的详细介绍 可阅读Delphi Client/Server Suite所带的BDE API 帮助文件

读写对象的实现原理和应用

读写对象(Filer)包括TFiler对象 TReader对象和riter对象 TFiler对象是文件读写的基础对象 在应用程序中使用的主要是TReader和riter TReader和riter对象都直接从TFiler对象继承 TFiler对象定义了Filer对象的基本属性和方法

Filer对象主要完成两大功能

● 存取窗体文件和窗体文件中的部件

● 提供数据缓冲 加快数据读写 *** 作

TFiler对象

TFiler对象是TReader和riter的抽象类 定义了用于部件存储的基本属性和方法 它定义了Root属性 Root指明了所读或写的部件的根对象 它的Create方法将Stream对象作为传入参数以建立与Stream对象的联系 Filer对象的具体读写 *** 作都是由Stream对象完成 因此 只要是Stream对象所能访问的媒介都能由Filer对象存取部件 TFiler 对象还提供了两个定义属性的方法 DefineProperty和DefineBinaryProperty 这两个方法使对象能读写不在部件published部分定义的属性

因为Filer对象主要用于存取Delphi的窗体文件和窗体文件中的部件 所以要清楚地理解Filer对象就要清楚Delphi 窗体文件(DFM文件)的结构

DFM文件是用于Delphi存储窗体的 窗体是Delphi可视化程序设计的核心 窗体对应Delphi应用程序中的窗口 窗体中的可视部件对应窗口中的界面元素 非可视部件如TTable和TOpenDialog 对应Delphi应用程序的某项功能 Delphi应用程序的设计实际上是以窗体的设计为中心 因此 DFM文件在Delphi应用设计中也占很重要的位置 窗体中的所有元素包括窗体自身的属性都包含在DFM文件中

在Delphi应用程序窗口 界面元素是按拥有关系相互联系的 因此树状结构是最自然的表达形式 相应地 窗体中的部件也是按树状结构组织 对应在DFM文件中 也要表达这种关系 DFM文件在物理上 是以二进制方式存储的 在逻辑上则是以树状结构安排各部件的关系 Delphi编辑窗口支持以文本方式显示DFM文件 从该文本中可以看清窗体的树状结构 下面是DFM文件的文本显示

Object Form : TForm

Left =

Top =

ActiveControl = DBIMage

Object Panell: TPanel

Left =

Object DBLabel : TDBText

end

Object DBImage : TDBImage

end

end

Object Panel : TPanel

Left =

Object Label : TLable

end

end

Object Panel : TPanel

Left =

Object DBLabel : TDBText

end

end

end

关于DFM文件中存储属性值的规则 请参见自定义部件开发这一章

对照TFiler对象的属性 Root属性就表示部件树的根──窗体 Filer对象的许多方法都是读从根起始的树中所有的部件 Ancestor属性表示根的祖先对象 IgnoreChildren属性则是读部件时忽略根的子结点

下面介绍Filer对象的属性和方法

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25103

内建的Bold对象编辑界面

双击BoldGrid中左侧的箭头 或者记录可以激活对象编辑对话框 对象编辑对话框可以同时启动多个 如下图所示意

在BoldGrid中 我们可以使用ctrl+鼠标点击来多选对象 也可以点击网格左上角来选中所有的对象 但是默认的BoldGrid对象编辑器不支持人员和账目对象的关联的显示和编辑 但d出的对象编辑器则支持这些关联 上图框起来的箭头 可以用来拖放对象 将哈巴狗拖动到PayPerson的位置 就可以建立支付人同账目对象之间的关联了

还有一点要注意的是d出式对象编辑器并不是同Grid同步绑定的 因此我们可以打开多个编辑器的同时还可以在网格内的记录间导航到不同的位置 两者可以做到互不影响游标 而传统的数据库程序无法做到这点 因为当游标改变时 会同步改变所有同DataSource绑定的数据感知组件中的内容

退出系统后 可以看到Data xml中记录了刚才输入的信息

主从关系的实现

使用上面的Bold程序 再输入一个大尾巴兔兔的用户 你会发现有一个问题 就是大尾巴兔兔同志目前没有任何账目支出 但是点选到大尾巴兔兔对象上时 账目网格组件仍然是显示所有的账目信息 而没有实现主从关联

为了实现主从关系 需要修改一下账目对象的BoldListHandle组件的属性 将blhAcct的RootHandle属性由原来的DmMoney bshMoney改成blhPerson 表示父对象是人员 同时要将Expression属性改成Pay 另外为了能够在账目网格中显示同账目关联的人员信息 双击bgAcct网格 添加一个新的Column 设定它的BoldProperties Expression为PayPerson name 表示字段用来显示支付账目人的名字 见下图示意

再次运行程序 可以看到这回实现了真正的主从关联 当点击哈巴狗时 只显示同哈巴狗关联的账目 同时 如果这时点击账目网格的添加命令的话 新建的对象的PayPerson自动设定为哈巴狗 如下图示意

级联删除的实现

前面虽然我们实现了主从关系 但是将所有人员都删除后 你会发现data xml文件中仍然有账目信息 这表明 删除人员时 没有将同人员绑定的账目信息删除 也就是说并没有实现级联删除

为了更形象的察看这一现象 在界面添加一个BoldGrid BoldNavigator和BoldListHandle来显示系统中所有的对象 设定BoldListHandle的RootHandle属性为DmMoney bshMoney 设定Expression属性为MoneyModelRoot allInstances表示显示系统中所有的对象实例

然后向前面一样将BoldListHandle绑定到BoldGrid和BoldNavigator 并创建默认的Columns 再次运行后的效果如下图所示意

可以看到全部对象列表中有两个字段 type字段表示系统中对象的类型 而AsString字段则显示对象的字符串表达 但是默认Person对象的AsString字段里面显示的是对象组件加类别字符串 而AcctItem对象的AsString显示的是对象的Amount属性 但是为了观察对象被删除的情况 我希望能够显示更有意义的字符串 如显示人员的名称 显示账目的名称及支付人

因此需要修改模型中对象默认字符串的定义 双击数据模块中bmMoney 激活Bold UML Editor 选中Person对象 设定Default string rep为name 表示默认的AsString属性为人员的名称 见下图示意

同样的 设定AcctItem的Default string rep为payPerson name+ +name 表示AsString由支付人的名称及账目名称构成

再次运行程序 显示效果示意如下

这时 将哈巴狗从人员列表中删除后 界面示意图如下

可以看到账目对象大白菜和化妆品仍然还在 只是支付人信息为空了 看来账目对象确实没有被级联删除 为了实现级联删除 再次打开Bold UML Editor 展开PayAssoc关联 选中Pay 然后设定Delete action为Cascade 表示使用级联删除 见下图示意

再次运行程序 输入人员信息及人员账目信息后 再删除人员 会发现这回将绑定的账目信息也一同删除了

总结

lishixinzhi/Article/program/Delphi/201311/24783

下面我们将上面提供的一段代码作如下修改

j:= ; j:=FDataLink DataSource DataSet FieldCount; I:= ; repeat items Add (FDataLink DataSet Fields[I] DisplayName ); //在items属性中加入DisplayName的值 I:=I+ ; until I>j- ;

另外 还要加入下面一段代码 来判断显示的DisplayName和哪个FieldName相对应

function TListBox GetField:string;var I j:integer;beginj:=FDataLink DataSource DataSet FieldCount ; for I := to j- do begin if FDataLink DataSource DataSet Fields[I] Displayname=text then begin Result:=FDataLink DataSource DataSet Fields[I] FieldName; exit; end; end;end;

这样 当选择了一个中文化的字段显示名称时 就将返回它的真正的字段名 这下用起来就更方便了 图 就是我们将中文字段显示在下拉框中的例子

程序中的字段以中文显示能够给用户带来很大的方便 最后 下面附上这段程序的完整代码 谨供参考

unit DBFieldComboBox;interfaceuses Windows Messages SysUtils Classes Graphics Controls Forms Dialogs StdCtrls db dbctrls;type TDBFieldComboBox = class(TComboBox) private FDataLink:TFieldDataLink; function GetDataSource:TDataSource; function TListBox GetField:string; Procedure SetDataSource( Value:TDataSource); procedure StartDrag(Sender: Tobject; var DragObject: TDragObject); procedure DropDown(Sender : Tobject); { Private declarations } protected { Protected declarations } publicconstructor create(Aowner:Tponent);override; destructor Destroy;override; { Public declarations } published property DataSource :TDataSource read GetDataSource write SetDataSource; property text; { Published declarations } end;

lishixinzhi/Article/program/Delphi/201311/8536

Delphi作为一种目前十分流行的数据库开发语言 在数据库开发领域有着十分重要的地位 它不仅提供了可视化的开发环境 使得开发变得相对容易 而且还是一种面向对象的语言 使得程序员能够充分利用面向对象编程的种种优势——如封装 继承等等 从而大大减轻了开发的难度和工作量 下面 我们就谈一谈利用面向对象的特性来开发数据库控件的方法

Delphi本身提供了一些数据库控件 如DBGrid Table等 它们给开发带来了很多方便 下面我们来以一个能够显示数据表中的所有字段的控件为例来说明如何用Delphi来进行控件的编程

首先要为控件选择一个合适的父类 Windows的一个好处就在于它将许多 *** 作标准化了 通过这些标准的 *** 作 使得学习和使用都有章可循 用户就很容 易融会贯通地掌握整个系统 在Delphi中提供了许多控件 这些控件生成的应用程序足以满足Windows编程的要求 而一些新的控件也可以在此基础上 产生 它一方面继承了一部分控件标准的 *** 作 另一方面也在程序中加入一些代码来实现特定的功能 这样用户使用起来不会觉得突兀 也简化了程序的开发 根据 我们的目标可以看出 利用 下拉框 控件作为新控件的父类比较合适 因为它提供了下拉框中的所有标准 *** 作 这就可以大大减少我们的编程量 然后就是为 特定的功能编写代码 我们应该想到 如果一个下拉框能够显示一个数据库中的所有字段 那么它一定有一个属性能够与数据库相连 我们将这个属性定名为 DataSource 并将这一属性添加到控件中 添加的方法是 首先在Private段中加入如下代码

FDataLink:TFieldDataLink; function GetDataSource:TDataSource; Procedure SetDataSource( Value:TDataSource);

其中TfieldDataLink是一个十分重要的类 我们之所以能够很容易地进行数据库控件的开发全是拜它之赐 它有一些十分有用的属性 如 DataSource 利用这个属性 我们就能很容易地指定新控件的DataSource属性

第三步就是为控件的功能编写代码 可以想到 如果我们想要在拉下下拉框时显示数据库中的所有字段 就要在它的DropDown事件中加入代码来将所有 的字段加入到下拉框的下拉区域中 这应该分两步走 第一就是要取得指定数据库的所有字段 第二就是将这些字段以字符串的格式加入到下拉框中(而拉下时显示 所有字段的功能则由下拉框控件自己完成) 在取得数据库的字段时 用到了我们上面提到的TfieldDataLink类 下面的代码就可以获得指定数据库 的字段数目

j:= ; j:=FDataLink DataSource DataSet FieldCount ;//取得数据库中的所有字段的名字 I:= ;

然后再用下面的代码将这些字段的名字加入到下拉框的items属性中 值得注意的是在每次拉下这个下拉框时都要将items属性清空 否则这个下拉框将每次都会因加入重复的内容而变得越来越长 并且一次选择可以选定许多项 使得控件看起来有点怪

items Clear ; //清空items属性

repeat //循环 *** 作将字段加入下拉框中

items Add (FDataLink DataSet Fields[I] FieldName ); //将字段名加入到下拉框中

I:=I+ ;

until I>j- ; //直到所有的字段加入完为止

第四步 就是将以上代码加入到Delphi的控件编辑窗口中去 点击Delphi的 Component/New Component 菜单 系统出现一个对话框 将对话框如图 所示填写

填写完毕点击 OK 按钮 就可以创建一个文件 将上面提供的代码加入到文件的适当位置 就可以完成这个控件的编写 图 是带有这个控件的程序的例子

可以想见 这个控件有着十分广泛的功能 例如 我们能够利用它设置指定字段的值来运行查询 也可以返回数据库中指定字段的数据类型 长度等信息 给我们的编程提供了极大的方便

但是也应该看到 这个控件也有一些缺点 那就是它只能显示字段的名称 一般的数据库中字段的名称都是英文的 这给中文版的应用软件带来不便 下面我们 就用FdataLink的另一个属性来显示中文化的字段 这个属性就是DisplayName 它所指定的是数据库字段的显示名称 而这个名称我们可以在 设计时将其汉化 这样在应用程序中显示出来的就是有意义的中文了

lishixinzhi/Article/program/Delphi/201311/8535

在delphi中有一批数据库专用的控件,比如ADO类的,可以直接用于数据库开发,你可以先用一个Access数据库自己进行一下测试。

首先在窗体上放一个ADOConnection1控制,用于与Access数据库进行连接,连接字符串为:

ADOConnection1ADOC_DataConnectionString:='provider=MicrosoftJetOLEDB40;'

+'userID=Admin;'

//+'DataSource='+ExtractFilePath(ApplicationExeName)+'MyRecordmdb;'

+'DataSource='+MyDataBaseName+';'

+'Mode=ShareDenyNone;ExtendedProperties=\"\";'

+'JetOLEDB:Systemdatabase=\"\";'

+'JetOLEDB:RegistryPath=\"\";'

+'JetOLEDB:DatabasePassword=\"123456;'//数据库密码

+'JetOLEDB:EngineType=5;'

+'JetOLEDB:DatabaseLockingMode=1;'

+'JetOLEDB:GlobalPartialBulkOps=2;'

+'JetOLEDB:GlobalBulkTransactions=1;'

+'JetOLEDB:NewDatabasePassword=\"\";'

+'JetOLEDB:CreateSystemDatabase=False;'

+'JetOLEDB:EncryptDatabase=False;'

+'JetOLEDB:Don'+''''+'tCopyLocaleonCompact=False;'

+'JetOLEDB:CompactWithoutReplicaRepair=False;'

+'JetOLEDB:SFP=False';

DMADOC_DataLoginPrompt:=False;

再放一个ADOQuery1控制,用于 *** 作数据表,将它的Connection属性设置为ADOConnection1。或用语句实现:ADOQuery1Connection:=ADOConnection1;

然后再分别放置一个DataSource1和一个DBGrid1控件,

将DataSource1的DataSet属性设置为ADOQuery1。

将DBGrid1的DataSource属性设置为DataSource1。

这时就可以通过ADOQuery1来执行SQL语句来查询数据表,并通过DBGrid1显示出来了。

以上就是关于DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]全部的内容,包括:DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]、Delphi深度探索之使用Bold开发数据库应用(3)、Delphi 开发数据库控件的方法[2]等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10084766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存