说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi的类型转换

HTML文档下载 WORD文档下载 PDF文档下载
Delphi的类型转换

Delphi是一种强类型转换的语言。在VC中,赋值符用″=″

例如x=1;到了Delphi赋值符就变成了″:=″

例如x:=1。 从赋值时用符号″:=″而不用″=″

就隐约可见Delphi对类型匹配要求之严

即赋值符右边的类型一定要和左边一致。用惯了VB或VC的程序员

初用Delphi

稍不留神

就会出现类型不匹配的错误。对初学者而言

类型转换也是学习Delphi的重点和难点

为此本文特对Delphi的类型转换做一总结

以供读者参考。

一、数的类型转换

把表达式的类型从一种类型转化为另一种类型

结果值是把原始值截断或扩展

符号位保持不变。例如:

数的类型转换 举例

字符转换为整数 Integer('A')

整数转换为字符 Char(48)

整数转换为1个字节的逻辑型 Boolean(0)

整数转换为2个字节的逻辑型 WordBool(0)

整数转换为4个字节的逻辑型 LongBool(0)

整数转换为10进制pascal型字符串 caption:=intToStr(15)

整数转换为16进制pascal型4位字符串 caption:=intToHex(15

4)

地址转换为长整型数 Longint(@Buffer)

二、数的“分开”与“合成”

取32位longint型数的 高16位数为 hiword(longint-var)

低16位数为 loword(longint-var)

取16位数的 高8位数为 hibyte(integer_var)

低8位数为 lobyte(integer_var)

取32位地址的段选择符和偏移量 段选择符(高16位地址)为 selectorof(p)

偏移量(低16位地址)为 offsetof(p)

段选择符和偏移量合成为指针   Ptr(SEG

OFS: Word)相当于C语言的宏MK-FP(SEG

OFS)

例如在Windows中

Task DataBase结构0FAh偏移处包含'TD'标识

我们可以容易地编写如下代码观察到这个位于Windows内部的未公开的秘密:

{函数ptr(seg

ofs)的用法

相当于C语言的MK-FP(seg

ofs)}

var p:pbyte;ch:char;

p:=ptr(getcurrentTask

$FA);

ch:=char(p^); {结果为ch='T'}

p:=ptr(getcurrentTask

$FA+1);

ch:=char(p^);   {结果为ch='D'}

三、字符串string 字符数组与指向字

符串的指针pchar的区别与联系

这3者的基本概念相同

但有一些非常细微的差别

在编程时稍不注意就会出错

需高度重视。

1、使用指向字符串的指针

如果不是以0结尾

运行时就会出现错误。为了避免这种错误

需要在字符串结尾人工加入0 即char(0)

或用strpcopy函数在字符串结尾自动加0。

例1: 指向字符串的指针

如果不是以0结尾

运行时会出现错误:

{s[0]=3 s[1]='n' s[2]='e' s[3]='w'}

var

s:string;

p:pchar;

begin

s:='new';

label1.caption:=s; {new}

label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}

p:=@s[1];{不是以0结尾

莫用pchar型指针}

label3.caption:=strpas(p); {运行时出现错误}

end;

例2:在字符串结尾人工加入0即char(0)

可使用指向字符串的指针。

{s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}

{p-->'new'}

var

s:string;

p:pchar;

begin

p:=@s[1];

s:='new'+char(0); {以0结尾

可用pchar型指针}

label1.caption:=strpas(p); {new}

label2.caption:=s; {new}

label3.caption:=intTostr(integer(s[0])); {4是字符串长度}

end;

例3: 用strpcopy函数赋值会在字符串s结尾自动加0。

{s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}

{p-->'new'}

var

s:string;

p:pchar;

begin

p:=@s[1];

strpcopy(p

'new');{strpcopy函数在字符串结尾自动加0}

label1.caption:=strpas(p);{new}

label2.caption:=s;{new}

label3.caption:=intTostr(integer(s[0]));{4}

end;

2、下标为0的字符串标识符存放的是字符串长度

字符型数组基本相当于字符串

但不能存放字符串长度。字符串可以用s:='a string'的形式赋值

但是字符型数组a[ ]不可直接用a:='array'的形式赋值

用此种形式会出现类型不匹配错误

可选用strpcopy函数赋值。

例4: 字符型数组s[ ]相当于字符串

但没有存放字符串长度的位置。

{s[1]='n' s[2]='e' s[3]='w' s[4]=0;}

{p-->'new'}

var

s:array[1..10] of char;

p:pchar;

begin

{s:='new'+char(0); error}{错误}

p:=@s[1];

{p:=@s; is not correct}

strpcopy(p

'new');

label1.caption:=strpas(p);{new}

label2.caption:=s;{new}

{label3.caption:=intTostr(integer(s[0]));}{不会出现4

下标超出错误}

end;

例5:下标从0开始的字符数组s

s相当于@s[0]。

{ s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'}

var

s:array[1..10] of char;

p:pchar;

begin

{s:='new'+char(0); error}{错误}

p:=s;

{p:=@s[0] is also correct}

strpcopy(p

'new');

label1.caption:=strpas(p);{new}

label2.caption:=s;{new}

label3.caption:=s[0];{n}

end;

3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同:

例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。

var

a:array[1..10]of char;

b:array[0..10]of char;

{a:='1..10';}{type mismatch}

{b:='0..10';}{type mismatch}

begin

strpcopy( b

'from 0 to 10'); {正确 因为b即是@b[0] }

strpcopy(@b[0]

'from 0 to 10'); {正确 与上个表达式结果相同}

strpcopy(@a[1]

'from 1 to 10'); {正确 }

strpcopy( a

'from 1 to 10'); {类型匹配错误 因为a即是@a[0]}

end;

RemoteViews - Android Widget开发入门 ASP.NET如何用正则表达式得到网站页面中的所有链接 PHP实现图形验证码案例(1) Android Widget开发实例-电量监控 Android自带Widget - Clock指针钟表源代码分析 C#实现文件批量改名工具 PHP利用Google Chart API生成饼图 PHP操作SQLite数据库 PHP利用DomDocument创建XML文件 ASP.NET如何加密/解密URL网址 如何使用C#读取csv文件 三步骤实现ASP.NET(C#)项目中添加谷歌(Google Map)地图 使用C# ASP.NET以FTP客户端方式下载文件 ASP.NET如何用C#代码检测手机浏览器 使用C#读取上传的Excel文件 新版本SQL Helper类 C#使用iTextsharp生成PDF 在.NET里用iTextSharp库生成PDF文档 用itextsharp将ASP.NET页面导出到PDF中 什么是JQuery-JQuery API jQuery入门指南-JQuery API jQuery的核心部分-JQuery API $(elements)-JQuery API $(expr, context)-JQuery API $(fn) -JQuery API $(html) -JQuery API $.extend(prop) -JQuery API $.noConflict() -JQuery API each(fn)-JQuery API eq(pos)-JQuery API get(num)-JQuery API 拜托大家帮帮忙!在线等待 怎么编写自己的函数库? 请教一个strut问题 sos 求急。如何取掉多显示器?? 后生可畏啊!佩服:绝对实力派。 请问如何把从oracle取出来的数据AdoRecordset保存为.dbf文件和.xls文件 如何还原一个窗口 质问斑竹:是谁删了《立法会第一立法案:水源小斑竹选举法》 谁在强结我帖子?站出来! 请问消息都是串行处理吗? 飞利浦15寸液晶显示器;先到先得。 有谁做过3D骨骼编程的,留一个联系方式 急救!!!WIN98启动就死.(在线等) 幫我看看這是什麼病毒:win32.HLLM.Reteras 急急????在繞等待!!!!!! pb含原代码的例子何处寻觅 如何读取word表格中的数据? 怎样让一个tc程序在一台没有安装tc的电脑上运行? 请问在Vb.NET中引用型变量本身在内存中的值怎么查看呢? 关于在网络版程序中单据号连续的问题? 有关上网的缓存文件(捧分跪等) 我这样实现查询可不可以,为什么没有结果请帮我看好吗 怎么VFP2.5 for windows里的界面(对话框的标题栏里)都没有关闭按钮啊 如何在用户长时间等待的过程中显示一个临时页 ERROR:ORA-12560: TNS: 协议适配器错误 如何在SQL语句里精确小数点以后的位数不清 想得到一段程序的运行时间,C#中提供的time精确度太低,有没有精度比较高的算法? 在客户端已知某个文件的存放路径而不通过HTML的FILE控件再进行浏览选择,怎样把这个文件上传到服务器上 在VBA中变量的值改变后如何保存住值啊? 请问ListView怎么实现(点击标题栏字段名时)排序?谢谢 为什么生命还是这么短 关于电子论坛的设计!!!(回答有意义的高分美人相送,灌水的大炮伺候) jdk1.4大量认证资料奉送 请教对话框的创建 几个小问题,请大家多多帮忙!在线等待 请大家仔细看看,不知道我有没有写清楚,不知道算不算难还算容易....... win2000 sever怎样安装borland c++builder?(高分100) 请大家帮个忙,举手之劳而已 使用MSComm,在关闭窗口的时候,出现“端口已打开”的错误。怎么解决? 请问这几段C#语句怎么办? applet问题,期待高手出现 如何使用OpenDialog啊? 高分组网,斑竹不要删~~~~~~~~~~~~~~~ win2000 sever怎样安装borland c++builder?(高分100) 如何按分组条件,给一个字段乘以不同的值 求电子书!!! win2000问题,很急.在线等 求教,用delphi编的drm程序,急!~~~~~~~~ 请教对话框的创建 倒粪1 win2k中tts问题 XML+XSL+HTML运行出错(书上的例子) 高谈阔论类似的词语 植物内起源是什么意思? 雪闹梅枝尖,玉影舞翩跹;风娆花飘醉,香满绣罗衫. 国会和议会的区别 对于平衡体系:mA(g)+nB(g)pC(g)+qD(g)(正反应放热),有下列判断,其中正确的是 A.若温度不变,将容器的体积增大1倍,此时A的浓度变为原来的0.58倍,则m+n 国会和议会有何区别? 我想知道你们对唐朝的评价 全面评论唐朝,只要正面的可以从政治,经济,文化,还有对外的影响力,特别是对外的影响力和对现在的影响做出评论 请问a选项为什么正确b选项为什么错了? 化解此式子.求过程. 在南半球,南回归线以北,一年中太阳高度最大值? 中国留学生勇救日本小学生 安倍将为其安倍访问土耳其 助日企获福岛核事故后南非20名白人右翼分子因叛国罪获刑 张德江会见印尼人民协商会议主席西达尔德专家:欧元区最大问题在于违反不援助日本海上自卫队一军官因非法使用兴奋剂委内瑞拉总统称查韦斯音容出现在委地铁美国最新隐身驱逐舰下水 明年秋季开始消息人士称叙化武生产设备销毁工作如期纽约提高香烟禁售最低年龄 未满21不研究证明蝙蝠系非典传播源 病毒可由动生日收福彩“大红包”成河南大学生必修课信息速递商报报道的“黑网吧”200人“采访团” 开馆以来头回见跨行转账 单笔最高收费50元大肚子瘪了 远离9种病湖北年轻干部陪领导喝酒猝死 妻子怀孕“讲故事”讲出即开彩销售状元9名儿童被炸死激情驾控 挑战速度
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘