加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 对包含WideString的记录指针使用New / Dispose

发布时间:2020-12-15 09:31:44 所属栏目:大数据 来源:网络整理
导读:我有很老的代码(来自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);begi
我有很老的代码(来自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;

问:用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读