首页 > 代码库 > Delphi 常见数据类型转换
Delphi 常见数据类型转换
不同的类有不同的成员,一般子类的成员是在父类的成员的后面增加了新的成员,如果子类转为父类,那这些新增加的成员虽然还存在,但
是就不可以访问得到了。如果父类转为子类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员。
类型的转换也有很多类的,有隐性的和显性的,一些专用的类型转换函数,会重新建立一个新类型目标对象,然后把就类型的数值移动过去
,然后销毁旧对象。一些隐性的转换,对象本身没改变,就把指针类型换一了一下。
@用于取地址!最方便的用法:
在调用Api的时候,举个例子:
我们调用Api的时候,经常要用到pchar类型,而Pchar类型的内存管理是一个很头
疼的事情。在使用时要先Getmem,最后还要freemem,如果用了@就方便了。声明一
个string类型的变量abc,然后在调用的时候使用@abc就可以了。
DateTimeToFileDate 函数 将DELPHI的日期格式转换为DOS的日期格式
DateTimeToStr 函数 将日期时间格式转换为字符串
DateTimeToString 函数 将日期时间格式转换为字符串
DateToStr 函数 将日期格式转换为字符串
FileDateToDateTime 函数 将DOS的日期格式转换为DELPHI的日期格式
FloatToDecimal 函数 将浮点数转换为十进制数
FloatToStrF 函数 将浮点数转换为字符串
FloatToStr 函数 将浮点数转换为字符串
FloatToText 函数 将给定的浮点数转换为十进制数
FloatToTextFmt 函数 将给定的浮点数转换为十进制数
IntToHex 将整型数转换为十六进制数
IntToStr 将整型数转换为字符串
StringToWideChar 函数 将ANSI字符串转换为UNICODE字符串
StrToDate 函数 将字符串转换为日期格式
StrToDateTime 函数 将字符串转换为日期/时间格式
StrToFloat 函数 将给定的字符串转换为浮点数
StrToInt 函数 将字符串转换为整型
StrToIntDef 函数 将字符串转换为整型或默认值
StrToTime 函数 将字符串转换为时间格式
TextToFloat 函数 将字符串(以NULL结束的格式)转换为浮点数
TimeToStr 函数 将时间格式转换为字符串
VarToDateTime 函数 将给定的变体转换为日期时间
WideCharLenToString 函数 将ANSI字符串转换为UNICODE字符串
WideCharToString 函数 将UNICODE字符串转换为ANSI字符串
WideCharToStrVar 函数 将UNICODE字符串转换为ANSI字符串变量
procedure GetMem(var P: Pointer; Size: Integer);
//分配动态内存
function StrPas(const Str: PChar): string;
//将PChar转换为String
delphi数据类型转换函数
计算机知识 2009-11-26 11:02 阅读100 评论0
字号: 大大 中中 小小
在我们编写程序当中,根据不同情况,会使用到多种数据类型。当要对不同的类型进行操作时,必须要将不同的类型转换成同样的类型。因此熟练地掌握数据类型的转换是非常重要的。
1.FloatToStr
功能说明:该函数用于将“浮点型”转换成“字符型”。
参考实例:
Edit1.Text := FloatToStr(1.981);
2.IntToStr
功能说明:该函数用于将“整数型”转换成“字符型”。
参考实例:
S := IntToStr(10);(注:S为String类型变量。)
3.IntToHex
功能说明:该函数用于将“十进制”转换成“十进制”。该函数有二个参数。第一个参数为要转换的十进制数据,第二个参数是指定使用多少位来显示十六进制数据。
参考实例:
Edit1.Text := IntToHex(‘‘100‘‘, 2);
执行结果,Edit1.Text等于64。
注意:Delphi没有提供专门的“十六进制”转换为“十进制”的函数。使用StrToInt函数可以实现这个功能。具体代码是:I := StrToInt(‘‘S\‘‘ + ‘‘64‘‘); 这时I等于100。加上一个‘‘S\‘‘即可将“十六进制”转换为“十
进制”。
4.StrToInt
功能说明:该函数用于将“字符型”转换成“整数型”。
参考实例:
I := StrToInt(‘‘100‘‘);
注意:不能转换如 StrToInt(‘‘ab‘‘)或StrToInt(‘‘好‘‘)这样的类型,因为他们并不存在数字型。
4.2 StrToIntdef(‘字符‘,数字)
功能说明:返回字符串S转换成整数
说明 字符串非整数表达时则返回默认值Default
参考实例:
SpinEdit1.Value := StrToIntDef(Edit1.Text, 0);
注意:当Edit1.Text转换成非整数表达时,则返回默认值0。
5.StrToFloat
功能说明:该函数用于将“字符型”转换成“浮点型”。
参考实例:
N := StrToFloat(Edit1.Text);
注意:Edit1.Text中的内容为1.981(凡在Edit控件中显示的文本均为字符串)。N为Double类型,用于保存转换后的浮点型数据。
DateTimeToFileDate 函数 将DELPHI的日期格式转换为DOS的日期格式
DateTimeToStr 函数 将日期时间格式转换为字符串
DateTimeToString 函数 将日期时间格式转换为字符串
DateToStr 函数 将日期格式转换为字符串
FileDateToDateTime 函数 将DOS的日期格式转换为DELPHI的日期格式
FloatToDecimal 函数 将浮点数转换为十进制数
FloatToStrF 函数 将浮点数转换为字符串
FloatToStr 函数 将浮点数转换为字符串
FloatToText 函数 将给定的浮点数转换为十进制数
FloatToTextFmt 函数 将给定的浮点数转换为十进制数
IntToHex 将整型数转换为十六进制数
IntToStr 将整型数转换为字符串
StringToWideChar 函数 将ANSI字符串转换为UNICODE字符串
StrToDate 函数 将字符串转换为日期格式
StrToDateTime 函数 将字符串转换为日期/时间格式
StrToFloat 函数 将给定的字符串转换为浮点数
StrToInt 函数 将字符串转换为整型
StrToIntDef 函数 将字符串转换为整型或默认值
StrToTime 函数 将字符串转换为时间格式
TextToFloat 函数 将字符串(以NULL结束的格式)转换为浮点数
TimeToStr 函数 将时间格式转换为字符串
VarToDateTime 函数 将给定的变体转换为日期时间
WideCharLenToString 函数 将ANSI字符串转换为UNICODE字符串
WideCharToString 函数 将UNICODE字符串转换为ANSI字符串
WideCharToStrVar 函数 将UNICODE字符串转换为ANSI字符串
一、数的类型转换
把表达式的类型从一种类型转化为另一种类型,结果值是把原始值截断或扩展,符号位保持不变。例如:
数的类型转换 举例
字符转换为整数 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;
0
0
0
】Delphi中关键字,优先法则,类型转换等相关
Trunc 转换一个实型值为小数截断后的整型值
Int 返回浮点数的整数部分
IntToStr 将数值转换为字符串
IntToHex 将数值转换为十六进制数字符串
StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常
StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值
Val 将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)
Str 将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)
StrPas 将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的
StrPCopy 拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的
StrPLCopy 拷贝Pascal类型字符串的一部分到一个零终止字符串
FloatToDecimal 将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型
FloatToStr 将浮点值转换为缺省格式的字符串
FloatToStrF 将浮点值转换为特定格式的字符串
FloatToText 使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
FloatToTextFmt 同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
StrToFloat 将一个Pascal字符串转换为浮点数
TextToFloat 将一个零终止字符串转换为浮点数
Dec 将例程中的参数值递减1或一个特定的值,其中特定值可在第二个可选参数中定义
Inc 将例程中的参数值增加1或一个特定的值
Odd 如果参数为奇数返回真
Pred 根据参数在其数据类型定义中的序列,返回参数值的前驱值
Succ 返回参数值的后继值
Ord 返回参数值在其数据类型值集合中的序号
Low 返回参数对应的有序数据类型的最小取值
High 返回参数对应的有序数据类型的最大取值
实数:
Single
Double
Extended
Real {$REALCOMPATIBILITY ON}据说不标准,要兼容旧的格式使用这个宏
Comp
Currency
TDateTime = type Double
为了后续使用或直接用于变量,需要给自定义类型命名。如果自定义一个命名的类型,你必须将代码放在特定的type区,如下所示:
最多的如定义类等。
type
Uppercase = ‘A‘..‘Z‘;
Temperatures = array [1..24] of Integer;
Date = record
Month: Byte;
Day: Byte;
Year: Integer;
end;
Colors = (Red, Yellow, Green, Cyan, Blue, Violet);
Letters = set of Char;
end;
子界类型
a...b
a~b为有序类型
枚举类型
type
Colors = (Red, Yellow, Green);//园括弧括起来的,在属性列表中最多出现。
end;
只能有一个值
CPP = enum
集合类型
type Letters = set of Char;
var Letters1,Letters2etters;
begin
Letters1 := [‘A‘.‘B‘.‘C‘];
Letters2 := [‘K‘];
end;
是什么什么的集合,可以有多个属性。
CPP = 多字段与或
Font.style := [fsBold, fsItalic]; // two styles
Font.style :=Oldstyle + [fsBold, fsItalic];
数组类型
type
MonthTemps = array [1..24, 1..31] of Integer;
YearTemps = array [Jan..Dec] of Integer;
记录类型
type
Date = record
Year: Integer;
Month: Byte;
Day: Byte;
end;
类似 structure
指针
type
PointerToInt = ^Integer;
var
P:^Integerl
X:Integer;
begin
P := @X; p = &x;
X :=10; x = 10;
P^ :=20; *p = 20;
end;
除了表示已分配内存的地址外,指针还能通过New 例程在堆中动态分配内存,不过当你不需要这个指针时,你也必须调用Dispose 例程释放你动态分配的内存。
P:=nil;
Pointer 类型,如void *;
实际上,Delphi 中必须使用指针的情况很少,这是Delphi开发环境一个诱人的优点。
文件类型
type
IntFile = file of Integer;
能打开一个与这个结构相应的物理文件、向文件中写入整数、或者从文件中读取当前的值