text - 文本属性使用的数据类型是什么?
问题描述
我正在从非常旧的 Builder 副本(> 15 年)中移植一些代码。在那些日子里,各种控件的 Text 属性都是AnsiString
. 似乎在最新版本的 C++Builder 中,情况不再如此。数据类型是什么?
我只能从帮助中得到TCaption
,那是一种类型吗?
我的代码可以编译并运行,但在尝试使用简单的编辑框时,文本不是输入的内容,通常是“0”。并且c_str()
有效,但给出了错误的值。
解决方案
C++Builder 的 RTL 和 VCL 框架使用的默认字符串类型一直是 DelphiString
当时的原生类型。诸如TCaption
,TFileName
等只是别名String
(但附加了不同的 RTTI,因此 IDE 的对象检查器可以区分它们)。
Delphi 的String
类型是 Delphi 本机Char
类型元素的容器。
C++Builder 提供System::Char
和System::String
别名来匹配 Delphi 的本机Char
和String
类型:
在 C++Builder 2007 和更早的版本中,Delphi 的本机
Char
类型是AnsiChar
,System::Char
C/C++ 的别名也是如此char
,而. 因此,是一个 8 位 ANSI 字符串,并返回一个以空值结尾的指针。System::String
System::AnsiString
System::String
String::c_str()
char*
在 C++Builder 2009 及更高版本中,Delphi 的本机
Char
类型是WideChar
,因此System::Char
现在是wchar_t
Windows 和char16_t
POSIX 上System::String
的别名,现在是System::UnicodeString
. 因此,System::String
是一个 16 位 UTF-16 字符串,并分别String::c_str()
返回一个以空字符结尾的wchar_t*
/char16_t*
指针。
因此,您拥有的任何在 C 样式字符串指针上运行的代码,而不是使用在 上运行的 RTL 功能System::String
,都必须相应地更新以从 ANSI 移动到 UTF-16。
请参阅 Embarcadero 的Unicode 迁移在线资源。这种转换对于 Delphi 用户来说大部分是透明的,但对于 C++ 用户来说,它往往需要更多的工作。
推荐阅读
- python - 无法在 Series 上就地重置索引以创建 DataFrame
- php - withCount() 用于多个级别?
- c - 我将如何修复此表上的对齐方式?
- python - 由于循环导入,Django 无法导入模块
- c++ - 使用带有大构造函数的类/结构在单独的命名空间中保持常量
- python - 如何将字典之类的数据结构传递给 LSTM 层的 call()?
- c# - Office 365 - MailKit 击中垃圾邮件文件夹 c#
- ios - 无法将“lab2.ViewController”类型的值转换为“lab2.JupiterViewController”
- database - 如何在 phpmyadmin 中导出收藏夹列表并在需要时导入?
- swift - 我如何知道 SwiftUI 中视图/形状的内部或外部点击释放?