符 Size 的代码结构:
在 Tiburon 中,下列
列表中列出的这些函数和特性依赖字符 Size,并且已经包含了一个“轻便”的版本,迁移代码的时候只需要将列出的代码迁移到后面提供的轻便版本即可。
SizeOf() 替换为 Length()
范例:
var
Count: Integer;
Buffer: array[0..MAX_PATH - 1] of Char;
begin
// 现有代码 - 当 string = UnicodeString 的时候
这段代码是错的
Count := SizeOf(Buffer);
GetWindowText(Handle, Buffer, Count);
// 正确的应该是下面这样
Count := Length(Buffer); // <<-- Count 应该是 Chars 而不是 Bytes
GetWindowText(Handle, Buffer, Count);
end;
SizeOf 返回的是数组的字节数,而 GetWindowText 的 Counts 参数需要的是字符数,所以这里需要把 SizeOf 换成 Length。
Move(... CharCount) 替换为 Move( ,,, CharCount * SizeOf(Char))
var
Count: Integer;
Buf1, Buf2: array[0..255] of Char;
begin
// 现有代码 - 当 string = UnicodeString (char = 2 bytes) 时,下面的代码是错误的
Count := Length(Buf1);
Move(Buf1, Buf2, Count);
// 正确的写法应该是
Count := SizeOf(Buf1); // <<-- Specify buffer size in bytes
Count := Length(Buf1) * SizeOf(Char); // <<-- Specify buffer size in bytes
Move(Buf1, Buf2, Count);
end;
由于 Length 返回的是字符数,而 Move 的 Count 参数需要的是字节数,所以应该用 SizeOf 或者 Length(Buf1) * SizeOf(Char) 替换 Length(Buf1)。
Stream 的 Read/Write 替换为 AnsiString, SizeOf(Char),或者使用 TEncoding 类
调用 Read/ReadBuffer 方法的范例:
var
S: string;
L: Integer;
Stream: TStream;
Temp: AnsiString;
begin
// 现有代码- 当 string = UnicodeString 时它是不正确的
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L);
// 正确的 Unicode 写法如下
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L * SizeOf(Char)); // <<-- Specify buffer size in bytes
//正确的 Ansi 写法如下
Stream.Read(L, SizeOf(Integer));
SetLength(Temp, L); // <<-- 使用临时的变量 AnsiString
Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar)); // <<-- Specify buffer size in bytes
S := Temp; // <<-- 放宽 string 到 Unicode
end;
上面的解决方案依赖于您存储在 Stream 中的字符串的编码格式,更好的读取和转换他们建议使用 TEncoding 类。
调用 Write/WriteBuffer 的范例:
var
S: string;
Stream: TStream;
Temp: AnsiString;
begin
// 现有代码 - 当 string = UnicodeString 时它是错的
Stream.Write(Pointer(S)^, Length(S));
// 正确的读取 Unicode 的代码
Stream.Write(Pointer(S)^, Length(S) * SizeOf(Char)); // <<-- Specify buffer size in bytes
// 正确的读取 Ansi 的代码
Temp := S; // <<-- Use temporary AnsiString
Stream.Write(Pointer(Temp)^, Length(Temp) * SizeOf(AnsiChar));// <<-- Specify buffer size in bytes
end;
上面的解决
方案依赖于您要存储进 Stream 中的字符串的编码格式,建议使用 TEncoding 类来更好的对格式进行处理。
FillChar(, , ) 如果采用 #0 填充, 替换为 * SizeOf(Char);如果填充其它字符,替换为 StringOfChar 函数
范例:
var
Count: In
teger;