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;
问:用WIDeString替换String [70]是否安全;字符串[70]的数组[1..MAX_VALUES]和WIDeString的数组[1..MAX_VALUES]? (请解释原因)
我需要这个在Delphi 7中支持Unicode.
解决方法 通常,您不应该使用WIDestring.它仅用于与COM BSTR兼容.
但是,您使用的是2009年之前的版本,因此如果您需要Unicode,则无法选择.
WIDeString是动态分配的,当你新记录时,Delphi会添加代码来初始化你的字符串.
您不必自己初始化它们.
就像shorttrings WIDeStrings不是引用计数一样,但是当你处理记录时它们会被销毁.
如果你将WIDestring分配给另一个WIDestring Delphi会复制,这比refcounting效率稍差,但不是一个问题.
每当WIDestring超出范围时,它就会被销毁.
注意PWIDeChar,当WIDeString被破坏时,这些将是悬空.
VCL无法显示WIDeString
请注意,尽管Delphi 7确实支持使用WIDestring的Unicode,但VCL无法显示您的WIDestrings,它只能显示AnsiString.
如果要显示WIDeStrings使用TNT组件,请参阅此答案以获取更多信息:Handling a Unicode String in Delphi Versions <= 2007
如果你要将WIDeString分配给(Ansi)字符串,你也可以使用普通字符串,因为你将失去所有的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
以上是内存溢出为你收集整理的delphi – 对包含WideString的记录指针使用New / Dispose全部内容,希望文章能够帮你解决delphi – 对包含WideString的记录指针使用New / Dispose所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)