Delphi 的字符及字符串[1] - string、AnsiString、WideString、String[n]、ShortString
//最常用的 string
var
str: string; {定義}
begin
str := '萬一'; {賦值}
ShowMessage(IntToStr(Length(str))); {長度是: 4}
end;
//長字符串 AnsiString; 在當前版本(2007)中的默認狀態下, String 就是 AnsiString
var
str: AnsiString;
begin
str := '萬一';
ShowMessage(IntToStr (Length(str))); {長度是: 4}
end;
//寬字符串 WideString (效率不及 AnsiString)
var
str: WideString;
begin
str := '萬一';
ShowMessage(IntToStr (Length(str))); {長度是: 2}
end;
//定長字符串
var str1: String[6]; {指定大小不能超過 255}
str2: String[100];
begin
{少給了也會占那些內存}
str1 := '萬一';
ShowMessage(str1); {萬 一}
ShowMessage(IntToStr(Length(str1))); {4; 這是字符串的長度}
ShowMessage (IntToStr(SizeOf(str1))); {7; 這是占內存大小}
{多給了會被截斷}
str1 := '萬一的 Delphi 博客';
ShowMessage(str1); {萬一的}
ShowMessage(IntToStr (Length(str1))); {6; 這是實際保存的字符串長度}
ShowMessage(IntToStr(SizeOf(str1))); {7; 這是占內存大小}
{問題: 不是聲明大小為 6 嗎? 怎麼 SizeOf 是 7 ? }
{因為定長字符串會 多出一個首字節來記憶字符串的實際長度}
{舉例說明, 如果給 str2 按如下賦值, 那它的首字節 (sstr2[0])肯定儲存著字符 'A'}
str2 := 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii'; {65個}
ShowMessage(str2[0]); {A}
ShowMessage(IntToStr(Ord(str2[0]))); {65s; 這是 'A' 在 ASCII 序列中的序號, 用的就是它}
{那以後可以用 Ord(str2[0]) 來代替 Length 判 斷字符串的長度嗎? }
{對定長字符串是可以的; 不但能讀取, 還可以像 SetLength 一樣設置}
end;
//ShortString; 它相當於 String[255]
var
str: ShortString;
begin
str := '萬一的 Delphi 博客';
ShowMessage(str); {萬一的 Delphi 博客}
ShowMessage(IntToStr(SizeOf (str))); {256; 這是大小}
ShowMessage(IntToStr(Length(str))); {18 ; 這是實際長度}
ShowMessage(IntToStr(Ord(str[0]))); {18 ; 這是從首字節中取出的長度}
end;