gpt4 book ai didi

delphi - 使用 New/Dispose 和包含 WideString 的记录指针

转载 作者:行者123 更新时间:2023-12-03 15:08:53 25 4
gpt4 key购买 nike

我有非常旧的代码(来自 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 将添加代码来初始化您的字符串。
您不必自己初始化它们。

就像短字符串一样,WideStrings 不进行引用计数,但当您处置记录时,它们将被销毁。
如果将 Widestring 分配给另一个 Widestring,Delphi 将制作一个副本,这比引用计数效率稍低,但在其他方面不是问题。

每当 Widestring 超出范围时,它就会被销毁。

小心 PWideChar,当 WideString 被销毁时,它们将悬空。

VCL无法显示WideString
请注意,虽然 Delphi 7 确实支持带有 Widestring 的 Unicode,但 VCL 无法显示您的 Widestring,它只能显示 AnsiString。
如果您想使用 TNT 组件显示 WideStrings,请参阅此答案以获取更多信息: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 - 使用 New/Dispose 和包含 WideString 的记录指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37743076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com