clientdataset 遍历字段_Delphi TClientDataSet[五]: 读取数据

Delphi TClientDataSet[5]: 读取数据。

本例用到:

TClientDataSet.Fields[];      { 字段集合; 它比 FieldList 有更多功能, 如可获取嵌套字段 }

TClientDataSet.FieldList[];    { 字段列表; 它比 Fields 轻便, 如果只是取值用它快一些 }

TClientDataSet.FieldByName();   { 根据字段名称获取字段对象; 获取一个字段对象时它比上两个快 }

TClientDataSet.FindField();    { 根据字段名称查找字段对象 }

TClientDataSet.FieldValues[];   { 根据字段名称获取字段值; 如果仅是获取字段值, 这个最快 }

TClientDataSet.First;       { 到第一个记录 }

TClientDataSet.Next;        { 到下一个记录 }

TClientDataSet.Last;        { 到最后一个记录 }

TClientDataSet.Prior;       { 到上一个记录 }

TClientDataSet.RecNo;       { 设置或读取当前记录的位置 }

TClientDataSet.Bof;        { 当前位置是否是第一个记录 }

TClientDataSet.Eof;        { 当前位置是否是最后一个记录 }

TClientDataSet.RecordSize;     { 一个记录的大小; 所谓一个记录就是当前行的所有字段 }

TClientDataSet.RecordCount;    { 记录总数; 也就是总行数 }

TClientDataSet.GetFieldList();   { 根据指定的几个字段名获取字段对象的列表 }

TClientDataSet.GetFieldData();   { 把指定字段的值写入一个缓冲区 }

TClientDataSet.GetCurrentRecord(); { 把当前记录(不包括 Bolb 字段)写入到一个缓冲区 }

关键字: TClientDataSet GdiPlus[1] RegularExpreio GdiPlus XMLDocument 类详解

TClientDataSet[5]: 读取数据。

读取字段的结构信息可以使用 TFieldDef 对象(一般来源于 FieldDefs 或 FieldDefList);

现在要读取其中的数据, 应该使用 TField 对象(一般来源于 Fields 或 FieldList).

Fields[0]、Fields[1] ... Fields[n] 获取的是当前行的第几个字段, 可用 Next、RecNo 等指定当前位置(行).

下面的例子使用了 Common Files\CodeGear Shared\Data\holdings.xml, 若更换文件需调整代码.

这是 holdings.xml 的字段信息:

ACCT_R { 类型是 r8, 对应 ftFloat, 相当于 Double }

SYMBOL  { 类型是 string, 对应 ftString, 相当于 AiString; 指定 Size=7, 加上空结束, 大小是 8 }

SHARES  { 类型是 r8, 对应 ftFloat, 相当于 Double }

PUR_PRICE { 类型是 r8, 对应 ftFloat, 相当于 Double }

PUR_DATE { 类型是 date, 对应 ftInteger, 相当于 Integer }

先窗体上放置 ClientDataSet1、DataSource1、DBGrid1、Memo1 和七个 Button, 然后:

{ 准备数据, 也可在设计时完成 }

procedure TForm1.FormCreate(Sender: TObject);

begin

ChDir(GetEnvironmentVariable('CommorogramFiles') + '\CodeGear Shared\Data\');

ClientDataSet1.LoadFromFile('holdings.xml');

DBGrid1.DataSource := DataSource1;

DataSource1.DataSet := ClientDataSet1;

end;

{ 读取字段值的几种方法 }

procedure TForm1.Button1Click(Sender: TObject);

var

v1,v2,v3,v4,v5,v6,v7,v8: Variant;

num: Double;

fName: string;

begin

{ 获取首字段的名称 }

fName := ClientDataSet1.Fields[0].FieldName;

{ 获取第一个字段值的几种方法: }

v1 := ClientDataSet1.Fields[0].Value;

v2 := ClientDataSet1.FieldByName(fName).Value;

v3 := ClientDataSet1.FindField(fName).Value;

v4 := ClientDataSet1.FieldValues[fName];

v5 := ClientDataSet1.FieldList[0].Value;

v6 := ClientDataSet1.FieldList.FieldByName(fName).Value;

v7 := ClientDataSet1.FieldList.Find(fName).Value;

v8 := ClientDataSet1.FieldList.Fields[0].Value;

{ 已知这个字段是 Double 类型的, 可同时转换 }

num := ClientDataSet1.Fields[0].AsFloat;

{ 查看结果 }

with Memo1.Lines do begin

Clear;

Add(v1); Add(v2); Add(v3); Add(v4); Add(v5); Add(v6); Add(v7); Add(v8);

Add(FloatToStr(num));

end;

end;

{ 遍历当前行字段的几种方法 }

procedure TForm1.Button2Click(Sender: TObject);

var

Field: TField;

i: Integer;

begin

Memo1.Clear;

for Field in ClientDataSet1.Fields do

begin

Memo1.Lines.Add(Field.Value);

end;

Memo1.Lines.Add('');

for i := 0 to ClientDataSet1.FieldCount - 1 do

begin

Memo1.Lines.Add(ClientDataSet1.Fields[i].Value);

end;

Memo1.Lines.Add('');

for i := 0 to ClientDataSet1.FieldList.Count - 1 do

begin

Memo1.Lines.Add(ClientDataSet1.FieldList[i].Value);

end;

Memo1.Lines.Add('');

end;

{ First、Next、Last、Prior、RecNo }

procedure TForm1.Button3Click(Sender: TObject);

var

s1,s2,s3: string;

begin

{ 读取第二行第二个字段 }

ClientDataSet1.First;

ClientDataSet1.Next;

s1 := ClientDataSet1.Fields[1].Atring;

{ 读取倒数第二行第二个字段 }

ClientDataSet1.Last;

ClientDataSet1.Prior;

s2 := ClientDataSet1.Fields[1].Atring;

{ 读取第四行第二个字段 }

ClientDataSet1.RecNo := 4;

s3 := ClientDataSet1.Fields[1].Atring;

{ 查看结果 }

with Memo1.Lines do begin

Clear;

Add('第二行第二个字段: ' + s1);

Add('倒数第二行第二个字段: ' + s2);

Add('第四行第二个字段: ' + s3);

end;

end;

{ 遍历指定字段的所有记录 }

procedure TForm1.Button4Click(Sender: TObject);

var

i: Integer;

begin

if not ClientDataSet1.Bof then ClientDataSet1.First;

Memo1.Clear;

while not ClientDataSet1.Eof do

begin

Memo1.Lines.Add(ClientDataSet1.FieldList[0].Value);

ClientDataSet1.Next;

end;

Memo1.Lines.Add('-------');

for i := 1 to ClientDataSet1.RecordCount do

begin

ClientDataSet1.RecNo := i;

Memo1.Lines.Add(ClientDataSet1.FieldList[1].Value);

end;

end;

{ 通过 GetFieldList 可以读取几个指定字段的 TField 对象的列表 }

procedure TForm1.Button5Click(Sender: TObject);

var

List: TList;

Field: TField;

i: Integer;

begin

List := TList.Create;

ClientDataSet1.GetFieldList(List, 'ACCT_R; SYMBOL; SHARES');

Memo1.Clear;

for i := 0 to List.Count - 1 do

begin

Field := List[i];

Memo1.Lines.Add(Field.Value);

end;

List.Free;

end;

{ GetFieldData 读取字段值到指针 }

procedure TForm1.Button6Click(Sender: TObject);

var

F1: Double;

F2: array[0..7] of AiChar;

begin

ClientDataSet1.GetFieldData(ClientDataSet1.Fields[0], @F1);

ClientDataSet1.GetFieldData(ClientDataSet1.Fields[1], @F2);

with Memo1.Lines do begin

Clear;

Add(FloatToStr(F1));

Add(F2);

end;

end;

//这是后面的例子用到的函数, 转换 TClientDataSet 时间格式到 TDateTime

function TDateTimeRecToDateTime(DataType: TFieldType; Data: TDateTimeRec): TDateTime;

var

TimeStamp: TTimeStam

begin

case DataType of

ftDate:

begin

TimeStamp.Time := 0;

TimeStamp.Date := Data.Date;

end;

ftTime:

begin

TimeStamp.Time := Data.Time;

TimeStamp.Date := DateDelta;

end;

else

try

TimeStamp := MSecsToTimeStamp(Data.DateTime);

except

TimeStamp.Time := 0;

TimeStamp.Date := 0;

end;

end;

Result := TimeStampToDateTime(TimeStamp);

end;

{ GetCurrentRecord 是把当前行的所有字段(不包括 Blob 字段)读入到缓冲区 }

procedure TForm1.Button7Click(Sender: TObject);

type

THoldingtruct = packed record { 这是根据 holdings.xml 建立的数据结构 }

ACCT_R: Double;

SYMBOL: array[0..7] of AiChar; { 其 Size=7, 但后面还有个 #0 }

SHARES: Double;

PUR_PRICE: Double;

PUR_DATE: Integer;

//  Other: array[0..4] of Byte; { 它后面还空着若干字节, 其字节数等于前面的字段数 }

end;

var

buf: THoldingtruct;

DateTimeRec: TDateTimeRec;

begin

//ShowMeage(IntToStr(ClientDataSet1.RecordSize)); { 可通过这个值对照上面的结构 }

if ClientDataSet1.GetCurrentRecord(@buf) then with Memo1.Lines do

begin

Clear;

Add(FloatToStr(buf.ACCT_R));

Add(buf.SYMBOL);

Add(FloatToStr(buf.SHARES));

Add(FloatToStr(buf.PUR_PRICE));

DateTimeRec.Date := buf.PUR_DATE;

Add(DateToStr(TDateTimeRecToDateTime(ftDate, DateTimeRec)));

end;

end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alios Things的Flash划分规则

摘要: 为了方便大家移植Alios Things,本文给出了关于Alios Things Flash划分规则,及注意事项。 Alios Things简介 AliOS Things发布于2017年杭州云栖大会, 是 AliOS 家族旗下的、面向IoT领域的、高可伸缩的物联网操作系统,于201…

如何解决数组下标越界异常

如何解决数组下标越界异常 今天在写接口的时候运行发现有一个数组的下标越界异常了, 检查了一下发现实在上面的数组中有一些字符串没有大写,造成跟下面的数组字符串不一样,所以导致了数组下标越界异常。

python每天定时9点执行_[求助]关于twisted框架,如何每天定时执行一个scrapy爬虫...

RT,最近在学scrapy,写了一个简单的爬取网页数据的爬虫,利用CrawlProcess单次调用执行的时候没有问题,脚本如下,就是清空数据表然后爬取数据: class updateBoardData: def __init__(self): self.db connect…

centos7 yum安装ifconfig

centos7 yum安装ifconfig yum install net-tools

web前端规范

摘要: HTML 原则1.规范 。保证您的代码规范,保证结构表现行为相互分离。2.简洁。保证代码的最简化,避免多余的空格、空行,保持代码的语义化,尽量使用具有语义的元素,避免使用样式属性和行为属性。任何时候都…

华为表示年内没有推出搭载鸿蒙操作系统手机的计划;OpenStack或被抛弃?iPhone至少还要三年可苹果自研5G调制解调器……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 每周三次,打卡即…

获取控件enable状态_Android自定义组合控件数字加减(适用于购物车)

大家好,我是小黑,一个还没秃头的程序员~~~独学而无友,则孤陋而寡闻--《礼记学记》今天的内容是自定义一个数组加减的控件,可以应用于购物车的数量选择,效果如下:自定义实现了控件的默认值、最大值、最小值、…

python os.path.splitext()的用法_Python常用模块之os.path

os.path.abspath(path) 输入相对路径,返回绝对路径 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>&…

IPv6转换服务正式发布

摘要: IPv6时代已来,阿里云IPv6转换服务帮忙您使现有IPv4业务快速提供IPv6访问能力 什么是IPv6转换服务 IPv6转换服务(IPv6 Translation Service)是阿里云提供的一种有状态的IPv6和IPv4网络地址和协议转换服务。 通过IPv6转换服…

【角度刁钻】如果把线程当作一个人来对待,秒懂

戳蓝字“CSDN云计算”关注我们哦!作者 | 编程新说李新杰责编 | 阿秃多线程的问题都曾经困扰过每个开发人员,今天将从全新视角来解说,希望读者都能明白。强烈建议去运行下文章中的示例代码,自己体会下。问题究竟出在哪里&#xff…

时间序列数据卡尔曼滤波_使用Highcharts和InfluxDB可视化时间序列数据

实时绘制大量带时间戳的数据往往是一项棘手的任务,需要相当多的技巧和过多的耐心。幸运的是,我们已经有了InfluxData平台来为我们提供开箱即用的许多困难。我们可以高效,安全地收集和存储数据,构建可视化,甚至设置警报…

AI又破案!衢州城市大脑这回抓了一个抢劫犯

摘要: 浙江衢州再次上演AI破案的神迹:两周时间内,衢化西路、巨化西路连续发生两起金项链抢劫案。受案发现场条件限制,视频侦查问题重重。在衢州城市大脑的帮助下,警方最终锁定犯罪嫌疑人马某并进行逮捕。经查&#xff…

CentOS7 最小化安装后的必备操作

文章目录1. 安装ifconfig2. firewall 启用 IPtable3. 修改iptables配置文件4. 重启iptables5.关闭SELINUX6. 安装wget7. 安装vim8. 安装unzip9. 更换镜像源 为阿里源10 依赖必备1. 安装ifconfig yum install -y net-tools2. firewall 启用 IPtable #停止 Firewall systemctl …

用javascript进行一个简单的机器学习小实例

摘要: 本篇文章教你如何使用JavaScript在浏览器中完整地定义、训练和部署机器学习算法。 虽然它可能不是机器学习传统选择的开发语言,但是JavaScript正在证明有能力完成这样的工作——即使它目前还不能与主要的机器学习语言Python竞争。在进一步学习之前…

梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好

在公共场合刻字,是不是听上去不太文明?但凡事都有例外!在云南怒江的一个小学,一个支教老师在学校的石砖上刻下了上千个字,他为的不是“到此一游”,而是将汉字知识永远传承下去...△视频来源:看看…

腾讯Blade Team发现云虚拟化平台逃逸漏洞 积极护航云生态安全

随着云技术的快速发展和迭代更新,各行各业都在“云”中快速成长,安全性显得尤为重要。而云时代软硬件的“云交互”,对安全来说也意味着新的挑战。 近日,腾讯Blade Team团队在针对云上虚拟化安全研究中,发现了主流虚拟…

rust盖错了怎么拆除_细说Rust错误处理

细说Rust错误处理1. 前言这篇文章写得比较长,全文读完大约需要15-20min,如果对Rust的错误处理不清楚或还有些许模糊的同学,请静下心来细细阅读。当读完该篇文章后,可以说对Rust的错误处理可以做到掌握自如。笔者花费较长篇幅来描述…

机器学习应用中的UI个性化

摘要: 在这篇文章中,我们看看关于机器学习应用中的UI个性化问题,谈一谈为什么在应用程序开发的过程中交流和沟通是成功的关键。 EdgVerve推出了基于AI的业务应用平台的新一代集成人工智能平台-Infosys Nia使你的企业能够管理特定的业务领域&a…

zookeeper集群部署 精简版本

文章目录1. zookeeper下载2. 解压3. 重命名4. 创建dataDir目录和dataLogDir日志目录5. 更新备份配置文件6. 添加数据目录和日志文件目录7. 添加集群信息7.1. ip配置 方式017.2. 域名配置 方式02(推荐使用)8. 在服务器上分别创建myid,各自写入…

物联网火爆,入门却太难了!

近几年来,物联网发展迅速:据中商产业研究院《2016——2021年中国物联网产业市场研究报告》显示,预计到2020年,中国物联网的整体规模将达2.2万亿元,产业规模比互联网大30倍。我们可以看到,物联网的前景广阔。…