首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用包含WideString的记录指针使用New/Dispose

用包含WideString的记录指针使用New/Dispose
EN

Stack Overflow用户
提问于 2016-06-10 08:05:47
回答 1查看 800关注 0票数 5

我有非常古老的代码(来自D3):

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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://grahamwideman.wikispaces.com/Delphi+String+Types

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37743076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档