linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·delphi轻松设置无边框透明窗体
·delphi第三方控件安装(Ehlib)
·DELPHI组件安装全攻略
·delphi动态创建控件
·开发工具比较Visual C++ VS De
·delphi完整身份证效验程序实例
·delphi中的Format函数详解
·delphi编程获取打印机的打印任
·如何判断文本文件的编码格式
·深入研究Variant数组
·用delphi编写网络游戏的外挂
·Delphi技巧-用户自定义数据类型
·delphi设置控件透明
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
delphi类型强制和转换
[ 作者:  加入时间:2007-11-26 13:30:46  来自:Linux联盟收集整理 ]
Delphi是一种强类型转换的语言。在VC中,赋值符用″=″,例如x=1;到了Delphi赋值符就变成了″:=″,例如x:=1。 从赋值时用符号″:=″而不用″=″,就隐约可见Delphi对类型匹配要求之严,即赋值符右边的类型一定要和左边一致。用惯了VB或VC的程序员,初用Delphi,稍不留神,就会出现类型不匹配的错误。对初学者而言,类型转换也是学习Delphi的重点和难点,为此本文特对Delphi的类型转换做一总结,以供读者参考。WteLinux联盟
一、数的类型转换WteLinux联盟
  把表达式的类型从一种类型转化为另一种类型,结果值是把原始值截断或扩展,符号位保持不变。例如:WteLinux联盟
数的类型转换 举例 WteLinux联盟
字符转换为整数 Integer('A') WteLinux联盟
整数转换为字符 Char(48) WteLinux联盟
整数转换为1个字节的逻辑型 Boolean(0) WteLinux联盟
整数转换为2个字节的逻辑型 WordBool(0) WteLinux联盟
整数转换为4个字节的逻辑型 LongBool(0) WteLinux联盟
整数转换为10进制pascal型字符串 caption:=intToStr(15) WteLinux联盟
整数转换为16进制pascal型4位字符串 caption:=intToHex(15,4) WteLinux联盟
地址转换为长整型数 Longint(@Buffer) WteLinux联盟
二、数的“分开”与“合成”WteLinux联盟
取32位longint型数的 高16位数为 hiword(longint-var) WteLinux联盟
低16位数为 loword(longint-var) WteLinux联盟
取16位数的 高8位数为 hibyte(integer_var) WteLinux联盟
低8位数为 lobyte(integer_var) WteLinux联盟
取32位地址的段选择符和偏移量 段选择符(高16位地址)为 selectorof(p) WteLinux联盟
偏移量(低16位地址)为 offsetof(p) WteLinux联盟
段选择符和偏移量合成为指针   Ptr(SEG, OFS: Word)相当于C语言的宏MK-FP(SEG,OFS)WteLinux联盟
例如在Windows中,Task DataBase结构0FAh偏移处包含'TD'标识,我们可以容易地编写如下代码观察到这个位于Windows内部的未公开的秘密:WteLinux联盟
  {函数ptr(seg,ofs)的用法,相当于C语言的MK-FP(seg,ofs)}WteLinux联盟
  var p:pbyte;ch:char;WteLinux联盟
  p:=ptr(getcurrentTask,$FA);WteLinux联盟
  ch:=char(p^); {结果为ch='T'}WteLinux联盟
  p:=ptr(getcurrentTask,$FA+1);WteLinux联盟
  ch:=char(p^);   {结果为ch='D'} WteLinux联盟
三、字符串string 字符数组与指向字WteLinux联盟
  符串的指针pchar的区别与联系WteLinux联盟
  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。WteLinux联盟
  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。WteLinux联盟
  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误:WteLinux联盟
  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'}WteLinux联盟
  varWteLinux联盟
  s:string;WteLinux联盟
p:pchar;WteLinux联盟
  beginWteLinux联盟
  s:='new'; WteLinux联盟
  label1.caption:=s; {new}WteLinux联盟
 label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}WteLinux联盟
  p:=@s[1];{不是以0结尾,莫用pchar型指针}WteLinux联盟
   label3.caption:=strpas(p); {运行时出现错误}WteLinux联盟
  end;WteLinux联盟
  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。WteLinux联盟
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}WteLinux联盟
  {p-->'new'}WteLinux联盟
  var WteLinux联盟
s:string; WteLinux联盟
p:pchar;WteLinux联盟
  beginWteLinux联盟
  p:=@s[1];WteLinux联盟
  s:='new'+char(0); {以0结尾,可用pchar型指针}WteLinux联盟
  label1.caption:=strpas(p); {new}WteLinux联盟
  label2.caption:=s; {new}WteLinux联盟
   label3.caption:=intTostr(integer(s[0])); {4是字符串长度}WteLinux联盟
  end;WteLinux联盟
  例3: 用strpcopy函数赋值会在字符串s结尾自动加0。WteLinux联盟
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}WteLinux联盟
  {p-->'new'}WteLinux联盟
  var WteLinux联盟
s:string; WteLinux联盟
p:pchar;WteLinux联盟
  beginWteLinux联盟
  p:=@s[1];WteLinux联盟
 strpcopy(p,'new');{strpcopy函数在字符串结尾自动加0}WteLinux联盟
  label1.caption:=strpas(p);{new}WteLinux联盟
   label2.caption:=s;{new}WteLinux联盟
  label3.caption:=intTostr(integer(s[0]));{4} WteLinux联盟
  end;WteLinux联盟
  2、下标为0的字符串标识符存放的是字符串长度,字符型数组基本相当于字符串,但不能存放字符串长度。字符串可以用s:='a string'的形式赋值,但是字符型数组a[ ]不可直接用a:='array'的形式赋值,用此种形式会出现类型不匹配错误,可选用strpcopy函数赋值。WteLinux联盟
  例4: 字符型数组s[ ]相当于字符串,但没有存放字符串长度的位置。WteLinux联盟
  {s[1]='n' s[2]='e' s[3]='w' s[4]=0;}WteLinux联盟
  {p-->'new'}WteLinux联盟
  var WteLinux联盟
s:array[1..10] of char; WteLinux联盟
p:pchar;WteLinux联盟
  beginWteLinux联盟
  {s:='new'+char(0); error}{错误}WteLinux联盟
  p:=@s[1];WteLinux联盟
  {p:=@s; is not correct}WteLinux联盟
  strpcopy(p,'new');WteLinux联盟
  label1.caption:=strpas(p);{new}WteLinux联盟
  label2.caption:=s;{new}WteLinux联盟
   {label3.caption:=intTostr(integer(s[0]));}{不会出现4, 下标超出错误} WteLinux联盟
  end;WteLinux联盟
  例5:下标从0开始的字符数组s,s相当于@s[0]。WteLinux联盟
  { s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'}WteLinux联盟
  var WteLinux联盟
s:array[1..10] of char; WteLinux联盟
p:pchar;WteLinux联盟
  beginWteLinux联盟
  {s:='new'+char(0); error}{错误}WteLinux联盟
  p:=s;WteLinux联盟
  {p:=@s[0] is also correct}WteLinux联盟
  strpcopy(p,'new');WteLinux联盟
  label1.caption:=strpas(p);{new}WteLinux联盟
  label2.caption:=s;{new}WteLinux联盟
  label3.caption:=s[0];{n}WteLinux联盟
end;WteLinux联盟
  3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同:WteLinux联盟
  例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。WteLinux联盟
  var WteLinux联盟
a:array[1..10]of char; WteLinux联盟
b:array[0..10]of char;WteLinux联盟
  {a:='1..10';}{type mismatch}WteLinux联盟
  {b:='0..10';}{type mismatch}WteLinux联盟
beginWteLinux联盟
  strpcopy( b, 'from 0 to 10'); {正确 因为b即是@b[0] } WteLinux联盟
  strpcopy(@b[0], 'from 0 to 10'); {正确 与上个表达式结果相同}WteLinux联盟
  strpcopy(@a[1], 'from 1 to 10'); {正确 }WteLinux联盟
  strpcopy( a, 'from 1 to 10'); {类型匹配错误 因为a即是@a[0]}WteLinux联盟
end;  WteLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·使用PHP和XSL stylesheets转换XML文档  (2007-11-22 11:19:51)
 ·织梦CMS中文转换拼音函数研究  (2007-11-21 15:28:56)
 ·金额大小写转换的asp完全无错版本  (2007-11-20 16:46:04)
 ·利用客户端js实现汉字简体繁体转换  (2007-11-20 16:41:05)
 ·将asp页面转换成htm页面  (2007-11-20 16:39:46)
 ·用Delphi制作Office的Com AddIn  (2007-11-20 14:23:22)
 ·用Delphi如何注册系统热键  (2007-11-20 14:22:53)
 ·VC与Delphi之间动态链接库互相调用  (2007-11-20 14:20:53)
 ·Delphi面向对象编程的20条规则  (2007-11-20 14:19:10)
 ·使用Delphi发送手机短信息(SMS)  (2007-11-20 13:55:29)