将 New/Dispose 与包含 WideString 的记录指针一起使用
Using New/Dispose with record pointer containing WideString
我有很旧的代码(来自 D3):
TMyRecord = record
Index : Integer;
Header : String[70];
Strings : Array[1..MAX_VALUES] of String[70];
end;
TMyClass = class(TComponent)
FData : ^TMyRecord;
...
end;
constructor TMyClass.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
New(FData);
...
end;
destructor TMyClass.Destroy;
begin
Dispose(FData);
inherited;
end;
问:将 String[70]
替换为 WideString;
并将 Array[1..MAX_VALUES] of String[70]
替换为 Array[1..MAX_VALUES] of WideString
是否安全? (请说明原因)
我需要这个来支持 Delphi 7.
中的 Unicode
一般来说,你不应该使用 Widestring。
它只是为了与 COM BSTR 兼容。
但是您使用的是 2009 之前的版本,因此如果您需要 Unicode,您别无选择。
WideString 是动态分配的,当你 new
记录 Delphi 将添加代码来初始化你的字符串。
您不必自己初始化它们。
就像 shortstrings WideStrings 没有引用计数,但是当你 dispose
记录时它们会被销毁。
如果将 Widestring 分配给另一个 Widestring Delphi 将进行复制,这比引用计数效率稍低,但除此之外不是问题。
只要 Widestring 超出范围,它就会被销毁。
小心 PWideChar,当 WideString 被销毁时,它们会悬空。
VCL无法显示WideString
请注意,虽然 Delphi 7 确实 支持带宽字符串的 Unicode,但 VCL 无法显示您的宽字符串,它只能显示 AnsiString。
如果要显示 WideStrings,请使用 TNT 组件,请参阅此答案以获取更多信息:Handling a Unicode String in Delphi Versions <= 2007
如果您要将 WideString 分配给 (Ansi)string,您还不如使用纯字符串,因为您将丢失所有 unicode。
你可以使用UTF8,但是D7也不能显示UTF8。
警告:在亚洲地区建立索引
进一步的警告是 MyWidestring[i]
不一定表示第 i 个字符,因为 Unicode 不能完全用每个字符 2 个字节表示。
除非您使用的是亚洲语言,否则这不会影响您。
Q: Is it safe to replace String[70] with WideString;
是的,但是用 String
(又名 AnsiString)替换 String[70]
更容易。因为 D7 VCL 支持 AnsiString 但不支持 WideString。
除此之外,你真的没有问题。
进一步阅读
https://grahamwideman.wikispaces.com/Delphi+String+Types
我有很旧的代码(来自 D3):
TMyRecord = record
Index : Integer;
Header : String[70];
Strings : Array[1..MAX_VALUES] of String[70];
end;
TMyClass = class(TComponent)
FData : ^TMyRecord;
...
end;
constructor TMyClass.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
New(FData);
...
end;
destructor TMyClass.Destroy;
begin
Dispose(FData);
inherited;
end;
问:将 String[70]
替换为 WideString;
并将 Array[1..MAX_VALUES] of String[70]
替换为 Array[1..MAX_VALUES] of WideString
是否安全? (请说明原因)
我需要这个来支持 Delphi 7.
中的 Unicode一般来说,你不应该使用 Widestring。 它只是为了与 COM BSTR 兼容。
但是您使用的是 2009 之前的版本,因此如果您需要 Unicode,您别无选择。
WideString 是动态分配的,当你 new
记录 Delphi 将添加代码来初始化你的字符串。
您不必自己初始化它们。
就像 shortstrings WideStrings 没有引用计数,但是当你 dispose
记录时它们会被销毁。
如果将 Widestring 分配给另一个 Widestring Delphi 将进行复制,这比引用计数效率稍低,但除此之外不是问题。
只要 Widestring 超出范围,它就会被销毁。
小心 PWideChar,当 WideString 被销毁时,它们会悬空。
VCL无法显示WideString
请注意,虽然 Delphi 7 确实 支持带宽字符串的 Unicode,但 VCL 无法显示您的宽字符串,它只能显示 AnsiString。
如果要显示 WideStrings,请使用 TNT 组件,请参阅此答案以获取更多信息:Handling a Unicode String in Delphi Versions <= 2007
如果您要将 WideString 分配给 (Ansi)string,您还不如使用纯字符串,因为您将丢失所有 unicode。
你可以使用UTF8,但是D7也不能显示UTF8。
警告:在亚洲地区建立索引
进一步的警告是 MyWidestring[i]
不一定表示第 i 个字符,因为 Unicode 不能完全用每个字符 2 个字节表示。
除非您使用的是亚洲语言,否则这不会影响您。
Q: Is it safe to replace String[70] with WideString;
是的,但是用 String
(又名 AnsiString)替换 String[70]
更容易。因为 D7 VCL 支持 AnsiString 但不支持 WideString。
除此之外,你真的没有问题。
进一步阅读
https://grahamwideman.wikispaces.com/Delphi+String+Types