社区
数据库相关
帖子详情
请问Variant 在Delphi中是个什么数据类型?望详细点....谢过...!
wellshddelphi
2003-10-16 08:48:05
请问Variant 在Delphi中是个什么数据类型?在DELPHI中似乎用的不多呀?
...全文
166
3
打赏
收藏
请问Variant 在Delphi中是个什么数据类型?望详细点....谢过...!
请问Variant 在Delphi中是个什么数据类型?在DELPHI中似乎用的不多呀?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
angle097113
2003-10-16
打赏
举报
回复
变体记录类型 可以转化成为任意的数据类型的
pwzhu666
2003-10-16
打赏
举报
回复
up
阿发伯
2003-10-16
打赏
举报
回复
Variant是一个变体类型,实际上是一个变体记录类型,相当于C的联合,只不过在Delphi中直接同编译器结合起来了,可以表达除指针和对象以外的任何数据。Delphi中很多地方用到了它,如TFile.Value;TParams.Data等等,具体操作请参考有关书籍或查看源码Variants.pas
DELPHI
Variant
变量的使用技巧
delphi
为了完全支持OLE,32位
Delphi
增加了
Variant
数据
类型
,本节将从宏观角度来分析这种
数据
类型
。实际上,
Variant
类型
对Pascal语言有普遍而深入的影响,
Delphi
控件库
中
与OLE 无关的地方也使用到这种
类型
。
Variant
变量没有
类型
一般说来,你可以用
Variant
变量存储任何
数据
类型
,对它执行各种操作和
类型
转换。需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。
variant
变量的
类型
检查和计算在运行期间才进行,编译器不会提示代码
中
的潜在错误,这些错误在进一步测试
中
才能发现。总之,你可以认为包含
variant
变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。 上面对
Variant
类型
的使用提出了警告,现在来看看
Variant
类型
究竟能干什么。基本上说,如果声明了一个
variant
变量: var V:
Variant
; 你就可以把各种不同
类型
的值赋给它: V := 10; V := 'Hello, World'; V := 45.55; 一旦得到一个
variant
值,你可以把它拷贝给任何兼容或不兼容的
数据
类型
。如果你把值赋给不兼容的
数据
类型
,
Delphi
会力尽所能进行转换,无法转换则颁布一个运行时间错误。实际上,
variant
变量
中
不仅包含了
数据
还包含有
类型
信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下: procedure TForm1.Button1Click(Sender: TObject); var V:
Variant
; begin V := 10; Edit1.Text := V; V := 'Hello, World'; Edit2.Text := V; V := 45.55; Edit3.Text := V; end; 很有趣是不是?你可以把一个值为字符串的
variant
变量赋给编辑框Text 属性,还可以把值为整数或浮点数的
variant
变量赋给Text属性。正如你在图10.1
中
所看到的,一切正常。 (图10.1)按Assign按钮后,例VariTest的输出结果 图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果 更糟糕的是:你还可以用
variant
变量计算数值,从第二个按钮的Click事件代码就可看到这一点: procedure TForm1.Button2Click(Sender: TObject); var V:
Variant
; N: Integer; begin V := Edit1.Text; N := Integer(V) * 2; V := N; Edit1.Text := V; end; 至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用
Variant
类型
,还是应坚持使用传统的Pascal
数据
类型
和
类型
检查方法。在
Delphi
和 VCL
中
,
variant
变量主要是用于 OLE 支持和
数据
库域的访问。
Variant
类型
内部结构
Delphi
中
定义了一个
variant
记录
类型
,TVarData,它与
Variant
类型
有相同的内存布局。你可以通过TVarData访问
variant
变量的实际
类型
。TVarData 结构
中
包含了
Variant
类型
信息(由Vtype域表示)、一些保留域及当前值。 VType域的取值包括OLE 自动化
中
的所有
数据
类型
,这些
类型
通常叫OLE
类型
或
variant
类型
。以下是
variant
类型
的完整列表,按字母顺序排列: varArray varBoolean varByRef varCurrency varDate varDispatch varDouble varEmpty varError varInteger varNull varOleStr varSingle varSmallint varString varTypeMask varUnknown var
Variant
你可以在
Delphi
帮助系统的
variant
s 主题下找到这些
类型
的说明。 还有许多操作
variant
变量的函数,你可以用它们进行特定的
类型
转换,或通过它们获取
variant
变量的
类型
信息(例如VarType 函数),当你用
variant
变量写表达式时,
Delphi
会自动调用这些
类型
转换和赋值函数。另外还有操作
variant
数组的例程,你可以通过帮助文件的
Variant
support routines 主题了解相关内容。
Variant
类型
运行很慢!
Variant
类型
代码运行很慢,不仅
数据
类型
转换如此,两个值为整数的
Variant
变量相加也是如此。它们几乎跟Visual Basic这种解释性代码一样慢!为了比较
Variant
变量和整型变量的运行速度,请看例VSpeed 。 程序
中
设置了一个循环,记录运行时间并在进程条
中
显示运行状态。下面是基于
variant
类型
的一段代码,基于整型的代码与此相似: procedure TForm1.Button1Click(Sender: TObject); var time1, time2: TDateTime; n1, n2:
Variant
; begin time1 := Now; n1 := 0; n2 := 0; ProgressBar1.Position := 0; while n1 < 5000000 do begin n2 := n2 + n1; Inc (n1); if (n1 mod 50000) = 0 then begin ProgressBar1.Position := n1 div 50000; Application.ProcessMessages; end; end; // we must use the result Total := n2; time2 := Now; Label1.Caption := FormatDateTime ( 'n:ss', Time2-Time1) + ' seconds'; end; 记时这段代码值得一看,因为你可以把它用到任何
类型
的性能测试
中
。正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。 从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图10.2是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。
Delphi
将ADOQUERY的Parameters存储到流
中
的演示.rar
在
Delphi
环境下,将ADOQUERY的Parameters存储到流
中
可能不太实用,但在基于TCP/IP 套接字模式开发的类三层架构
中
,如虫虫的远程
数据
对象,若能采用此法,必将大幅度提高此类对象的使用范围及查询效率。 本演示程序核心单元WebAdoStream的流读写部分改编自New Midas VCL Library(1.00)的JxStream.pas,为方便与AdoQuery的接口,笔者专门编写了AdoQuerySaveTostream(将ADOQuery的查询语句及Parameters保存到流
中
)、AdoQueryLoadFromstream(从流
中
恢复ADOQuery的查询语句及Parameters)2个过程。
DELPHI
数据
库引擎BDE
BDE能访问的
数据
分两类 一:本地
数据
。 二:客户机-服务器体系的异地
数据
. ADO简介。 与BDE不同ADO是Microsoft推出的新一代
数据
访问规范,在
Delphi
6
中
它的地位等同于一个和BDE并列的
数据
引擎。 ADO实际上和ActiveX技术联系紧密,而ActiveX又和OLE,COM等技术有很密切的关系。 虽然ADO的功能比BDE比起来筲弱一些,但和BDE相比ADO有一些重要的优势,比如: ADO将会内制在从Windows2000开始Microsoft新出的所有操作系统
中
,单就这一点就足以给其他的
数据
访问方式画上问号. 在
Delphi
7
中
提供了对ADO的全力支持,提供了很多ADO组件,还增加了一些新的字段
类型
如:WideString,GUID,
Variant
,interface,IDispatch等. ADO是面向各种
数据
的层次很高的接口,它提供了强大的
数据
访问功能,可以访问的
数据
对象有: 1>关系
数据
库
中
的各种
数据
; 2>非关系型
数据
库,如层次型
数据
库,网状
数据
库等; 3>电子邮件与文件系统; 4>文本与图象,声音; 5>客户事务对象.
学会使用SafeArray 之
Delphi
篇--源码
说明文字在博客
中
。 摘录: 在学习的时候曾经百度了一下,想查找关于
delphi
中
SafeArray的用法,没想到资料竟然如此之少,甚至连一篇相对完整的都没有。也许正如田师傅所说,现在高手们都在实行“技术封锁”了? 在CSDN技术
中
心有一篇关于C++的使用,说的比较详细。鉴于手
中
有田师傅写的代码,特拿来一部分对照自己学习的,翻译为
Delphi
版本。留作笔记,日后翻阅。 =============================================================================== SAFEARRAY的主要目的是用于automation
中
的数组型参数的传递。因为在网络环境
中
,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素
类型
等信息。SafeArray也并不单独使用,而是将其再包装到
VARIANT
类型
的变量
中
,然后才作为参数传送出去。在
VARIANT
的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray
中
元素的
类型
可以是
VARIANT
能封装的任何
类型
,包括
VARIANT
类型
本身。
Delphi
中
com组件或外部调用需要传递一个对象或者数组,这个时候可以考虑使用SafeArray。比如三层架构
中
通常需要将使用的ClientDataSet
数据
集传出,那么就可以将DataSet转换为SafeArray,再由其他模块转换接收。 ===============================================================================
Delphi
技术手册
Inprise/Borland公司的
Delphi
可能是当前最好的Windows快速应用程序开发工具。 随着它在Linux平台上的版本Kylix的发布,它在Unix世界的前景也十分看好。
Delphi
完 全支持COM、ActiveX、可视化组件库(VCL),并提供了可扩展、可定制的快速应用程 序开发环境。本书是这种功能强大的开发工具的全面参考。 本书从简介
Delphi
Pascal并讨论
Delphi
对象模型开始,讨论了运行时
类型
信息 (RTTI)——
Delphi
开发环境的关键部分,这一点在
Delphi
的其他正式帮助文档
中
很 少论及。本书还用一章的篇幅讨论了
Delphi
中
的并发编程,以及多线程应用程序的创建。 本书的主要内容是
Delphi
语言以字母顺序排列的完整参考。每项参考的内容都包括: 语法,使用标准编码惯例 说明参数列表,如果函数或过程包括参数的话提示和技巧—— 在实际程序
中
使用某个组件的实用信息一个简单的例子其他相关关键字的交叉参考本书 秉承“坚果”(In a Nutshell系列技术手册的一贯风格。不管你对
Delphi
的掌握程度如何, 本书都是你日常工作
中
不可或缺的标准参考指南。阅读本书,你将领略到
Delphi
的精华所在, 还可以解决实际编程
中
可能遇到的问题。 第一章
Delphi
Pascal 单元 程序 库 包
数据
类型
变量和常量 异常处理 文件1/O 函数和过程 第二章
Delphi
对象模型 类和对象 接口 引用计算 消息 内存管理 旧式的对象
类型
第三章 运行时
类型
信息 虚方法表 公布的声明 .TypInfo单元 虚方法和动态方法 初始化和结束化 自动的方法 接口 探究RTTI 第四章 并发编程 线程和进程 TThread类 BeginThread和EndThread函数 线程局部存储 进程 未来化 第五章 语言参考 第六章 系统常量
Variant
类型
码 开放数组
类型
虚方法表偏移值 运行时错误代码 第七章 运算符 一元运算符 多元运算符 附加运算符 比较运算符 第八章 编译器指示字 附录一 命令行工具 附录二 SysUtils单元 词汇表 多谢支持【Think you to your download~】
数据库相关
2,498
社区成员
88,445
社区内容
发帖
与我相关
我的任务
数据库相关
Delphi 数据库相关
复制链接
扫一扫
分享
社区描述
Delphi 数据库相关
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章