文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发DelphiDelphi的类型转换
精品推荐
特别推荐
·利用Delphi编写Socket通信程序
·拦截其它程序的网络数据封包
·Delphi编程根据IP地址得到主机名
·Delphi 程序员代码编写标准指南
·用DELPHI开发自动化服务器
·将日期转化为汉语的形式
·加密ACCESS数据库增加安全性
·使用TCP/IP协议实现聊天程序
·在Delphi中控制扫描仪
热点TOP10
·Delphi中DLL的创建和使用(1)
·用Delphi实现WinSocket高级应用
·利用Delphi编写Socket通信程序
·DBGrid使用全书(三)
·DELPHI多层分布式开发(2)
·实现关键字查找word文档里相匹配的内容
·实现高速文件拷贝
·用Delphi实现动态获取版本信息
·使用TCP/IP协议实现聊天程序
·在Delphi中控制扫描仪
·实现webbrowser中的打印、复制、全选等编辑功能
·拦截其它程序的网络数据封包
·Delphi下的ADO使用方法!
·DELPHI多层分布式开发(1)
·Delphi中利用钩子实现QQ聊天窗口的修改
·Delphi多层开发方案比较
·Delphi下“培养”自己的简单木马
·Delphi数据库控件使用入门
·Delphi的拨号连接类
·在Delphi中实现数据分析模块的动态报表

Delphi的类型转换

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]



  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;


[1] [2] 下一页 




上一篇:Delphi的TWebBrowser编程综述

下一篇:Delphi的嵌入式汇编语言与Windows函数调用

Delphi的类型转换 相关文章:
·MPEG、RM、WMV电影文件格式转换指南
·3GP手机视频转换工具WinAVI
·MKV转换成RMVB
·十二星座的性欲及性爱类型
·如何将DVD影片转换为DVDrip格式?
·APE变成高品质MP3音乐 转换工具介绍
·在Excel中将文本转换为数字的七种方法
·将PDF文件转换为TXT文件
·转换MP4/3GP格式的至尊法宝---MP4/RM转换专家
·利用word将PDF转换DOC文件的方法
Delphi的类型转换 相关软件:
·MP4/RM转换专家V9.7 Build 4660 白金版
·RM转换精灵V6.3
·3GP转换器 V2.5
·WisMencoder(视频压缩、转换软件)V1.99 正式版
·视频转换大师(WinMPG Video Convert)V6.9.0.0 专业版
·Video Convert Master(转换,分割,合并视频)V8.0.5.20 汉化版
·Ultra RM Converter(Real文件转换分割,合并)V3.3.0916 汉化版
·豪杰超级视频转换工具V2.0
·DelphiV7.0
·视频格式转换通V3.1

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot