我有非常古老的代码(来自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 WideString代替Array[1..MAX_VALUES] of String[70]安全吗?(请解释原因)
我需要这个来支持Delphi 7中的Unicode。
发布于 2016-06-10 08:38:19
一般来说,您不应该使用Widestring。它只是为了与COM BSTR兼容。
但是,您使用的是2009年前的版本,所以如果您的需要 Unicode,您没有选择的余地。
WideString是动态分配的,当您在new中添加代码来初始化您的字符串时。
你不必自己初始化它们。
就像短字符串一样,WideStrings不是引用计数,但是当您dispose记录时,它们将被销毁。
如果您将Widestring分配给另一个Widestring Delphi将创建一个副本,这比重新计算略低一些,但在其他方面没有问题。
每当一个宽字符串超出作用域时,它就会被销毁。
小心PWideChar,当WideString被销毁时,这些东西就会悬挂起来。
VCL无法显示WideString
请注意,尽管Delphi7确实支持带有宽字符串的Unicode,但是VCL不能显示您的宽字符串,它只能显示AnsiString。
如果要显示WideStrings,请使用TNT组件,请参阅此答案以获得更多信息:Handling a Unicode String in Delphi Versions <= 2007
如果要将WideString分配给(Ansi)字符串,则最好使用普通字符串,因为您将丢失所有unicode。
您可以使用UTF8,但D7也不能显示UTF8。
警告:在亚洲地区建立索引
进一步的警告是,MyWidestring[i]不一定意味着ith字符,因为Unicode不能以每字符2字节的形式完全表示。
除非你使用的是亚洲语言,否则这不会影响你。
问:用String70代替WideString安全吗?
是的,但是用String[70] (又名AnsiString)代替String更容易。因为D7 VCL支持AnsiString,而不支持WideString。
除此之外,你并不是真的有问题。
再读
https://stackoverflow.com/questions/37743076
复制相似问题