首页 > 解决方案 > 文本属性使用的数据类型是什么?

问题描述

我正在从非常旧的 Builder 副本(> 15 年)中移植一些代码。在那些日子里,各种控件的 Text 属性都是AnsiString. 似乎在最新版本的 C++Builder 中,情况不再如此。数据类型是什么?

我只能从帮助中得到TCaption,那是一种类型吗?

我的代码可以编译并运行,但在尝试使用简单的编辑框时,文本不是输入的内容,通常是“0”。并且c_str()有效,但给出了错误的值。

标签: textpropertiesc++buildervcl

解决方案


C++Builder 的 RTL 和 VCL 框架使用的默认字符串类型一直是 DelphiString当时的原生类型。诸如TCaption,TFileName等只是别名String(但附加了不同的 RTTI,因此 IDE 的对象检查器可以区分它们)。

Delphi 的String类型是 Delphi 本机Char类型元素的容器。

C++Builder 提供System::CharSystem::String别名来匹配 Delphi 的本机CharString类型:

  • 在 C++Builder 2007 和更早的版本中,Delphi 的本机Char类型是AnsiCharSystem::CharC/C++ 的别名也是如此char,而. 因此,是一个 8 位 ANSI 字符串,并返回一个以空值结尾的指针。System::StringSystem::AnsiStringSystem::StringString::c_str()char*

  • 在 C++Builder 2009 及更高版本中,Delphi 的本机Char类型是WideChar,因此System::Char现在是wchar_tWindows 和char16_tPOSIX 上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++ 用户来说,它往往需要更多的工作。


推荐阅读