Delphi的类型转换 good

  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:[email protected][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:[email protected][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:[email protected][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:[email protected][1]; 
  {p:[email protected]; 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:[email protected][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;

4、获取整数的高16位和低16位

使用HiWord方法和LoWord方法.

var IntValue: Integer;

Hiw: Word;

Low: Word;

begin

Hiw:= HiWord(IntValue);

Low:= LoWord(IntValue);

//IntValue:= (Hiw shl 16)+ Low;

end;

http://blog.csdn.net/henreash/article/details/3956493

时间: 2024-11-03 20:55:34

Delphi的类型转换 good的相关文章

Delphi数据类型转换(有几个字符串函数没见过,比如StringToWideChar和WideCharToString)

DateTimeToFileDate                  函数                     将DELPHI的日期格式转换为DOS的日期格式         DateTimeToStr                          函数                     将日期时间格式转换为字符串         DateTimeToString                      函数                     将日期时间格式转换为字符串 

Delphi数据类型转换

DateTimeToFileDate        将DELPHI的日期格式转换为DOS的日期格式 DateTimeToStr              将日期时间格式转换为字符串         DateTimeToString          将日期时间格式转换为字符串         DateToStr                     将日期格式转换为字符串         FileDateToDateTime        将DOS的日期格式转换为DELPHI的日期格式    

Delphi 常见数据类型转换

不同的类有不同的成员,一般子类的成员是在父类的成员的后面增加了新的成员,如果子类转为父类,那这些新增加的成员虽然还存在,但是就不可以访问得到了.如果父类转为子类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员.类型的转换也有很多类的,有隐性的和显性的,一些专用的类型转换函数,会重新建立一个新类型目标对象,然后把就类型的数值移动过去,然后销毁旧对象.一些隐性的转换,对象本身没改变,就把指针类型换一了一下.@用于取地址!最方便的用法:在调用Api的时候,举个例子:我们调

delphi控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的

[转]Delphi 控件属性和事件

常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大小 BiDiMode:(所有组件) 为从右向左写的语言提供支持 BoundsRect:定义组件边框矩形(只适用于运行时) Borderwidth:(窗口化组件)边框的宽度 BorberStyle:设置组件边框形状(样式) Brush:可确定组件的风格和颜色 Caption:使用该属性可指定标注组件的

More Effective C++

条款一:指针与引用的区别 指针与引用看上去完全不同(指针用操作符'*'和'->',引用使用操作符'.'),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一个对象,例如你的设计不允许变量为

Delphi XE6 TStringHelper中的string类型转换

类型转换: function ToBoolean: Boolean; function ToInteger: Integer; function ToSingle: Single; function ToDouble: Double; function ToExtended: Extended; class function ToBoolean(const S: string): Boolean; class function ToInteger(const S: string): Intege

Delphi 类型转换函数(有几个函数没见过,FloatToStrF,FloatToText等等)

Chr 将一个有序数据转换为一个ANSI字符 Ord 将一个有序类型值转换为它的序号 Round 转换一个实型值为四舍五入后的整型值 Trunc 转换一个实型值为小数截断后的整型值 Int 返回浮点数的整数部分 IntToStr 将数值转换为字符串 IntToHex 将数值转换为十六进制数字符串 StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常 StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值 Val 将字符串转换为一个数字(传统Tur

谈谈Delphi的类和对象:三、类可以理解成一种特殊的数据结构、类型转换

三.类可以理解成一种特殊的数据结构 我们知道数据类型可以进行强制类型转换,类既然可以理解成一种数据类型,那么它也应该可以进行类型转换.比如下面代码为一个按钮(Button1)的单击事件 procedure TForm1.Button1Click(Sender: TObject); var ACaption: String; begin ACaption:= TButton(Sender).Caption; //Sender从TObject转化为TButton ShowMessage(Format