Text 文本属性使用的数据类型是什么?

Text 文本属性使用的数据类型是什么?,text,properties,c++builder,vcl,Text,Properties,C++builder,Vcl,我正在移植一些代码,这些代码来自一个非常古老的Builder>15年的副本。当时,各种控件的文本属性都是AnsiString类型。在最新版本的C++Builder中,情况似乎不再如此。数据类型是什么 我能从帮助中得到的只是TCaption,这是一种类型吗 我的代码可以编译和运行,但在尝试使用简单的编辑框时,文本不是键入的文本,通常是“0”。c_str可以工作,但给出了错误的值。我认为您必须将代码迁移到Unicode。 首先,了解下一个资源: C++ Builder与Unicode 将C++Bui

我正在移植一些代码,这些代码来自一个非常古老的Builder>15年的副本。当时,各种控件的文本属性都是AnsiString类型。在最新版本的C++Builder中,情况似乎不再如此。数据类型是什么

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


我的代码可以编译和运行,但在尝试使用简单的编辑框时,文本不是键入的文本,通常是“0”。c_str可以工作,但给出了错误的值。

我认为您必须将代码迁移到Unicode。 首先,了解下一个资源:

C++ Builder与Unicode 将C++Builder项目迁移到Unicode: 迁移和升级中心:
祝您好运

我认为您必须将代码迁移到Unicode。 首先,了解下一个资源:

C++ Builder与Unicode 将C++Builder项目迁移到Unicode: 迁移和升级中心:
祝你好运

C++Builder的RTL和VCL框架使用的默认字符串类型始终是当时Delphi的原生字符串类型。像tcoption、TFileName等只是字符串的别名,但附加了不同的RTTI,因此IDE的对象检查器可以区分它们

Delphi的字符串类型是Delphi的原生字符类型元素的容器

C++Builder提供System::Char和System::String别名,以匹配Delphi的本机字符和字符串类型:

在C++Builder2007及更早版本中,Delphi的原生字符类型是AnsiChar,因此System::Char是C/C++字符的别名,System::String是C/C++字符的别名。因此,System::String是一个8位的ANSI字符串,String::c_str返回一个以null结尾的char*指针

在C++Builder 2009及更高版本中,Delphi的本机字符类型是WideChar,因此System::Char现在是Windows上的wchar\u t和POSIX上的char16\u t的别名,System::String现在是的别名。因此,System::String是一个16位UTF-16字符串,String::c_str分别返回一个以null结尾的wchar_t*/char16_t*指针

因此,任何在C样式字符串指针上运行的代码,而不是使用在System::string上运行的RTL特性,都必须相应地进行更新,才能从ANSI迁移到UTF-16


请参阅Embarcadero的在线资源。对于Delphi用户来说,过渡是透明的,但是对于C++用户来说,它需要更多的工作。

< P> C++ Cuilder的RTL和VCL框架所使用的默认字符串类型一直是Delphi的本地字符串类型。像tcoption、TFileName等只是字符串的别名,但附加了不同的RTTI,因此IDE的对象检查器可以区分它们

Delphi的字符串类型是Delphi的原生字符类型元素的容器

C++Builder提供System::Char和System::String别名,以匹配Delphi的本机字符和字符串类型:

在C++Builder2007及更早版本中,Delphi的原生字符类型是AnsiChar,因此System::Char是C/C++字符的别名,System::String是C/C++字符的别名。因此,System::String是一个8位的ANSI字符串,String::c_str返回一个以null结尾的char*指针

在C++Builder 2009及更高版本中,Delphi的本机字符类型是WideChar,因此System::Char现在是Windows上的wchar\u t和POSIX上的char16\u t的别名,System::String现在是的别名。因此,System::String是一个16位UTF-16字符串,String::c_str分别返回一个以null结尾的wchar_t*/char16_t*指针

因此,任何在C样式字符串指针上运行的代码,而不是使用在System::string上运行的RTL特性,都必须相应地进行更新,才能从ANSI迁移到UTF-16

请参阅Embarcadero的在线资源。对于Delphi用户来说,过渡是透明的,但是对于C++用户来说,它需要更多的工作。

< P>(免责声明) 所有的代码示例都是我头脑中的想法,而不是实际编译的

字符串类型只是一个宏,根据UNICODE定义选择AnsiString或UnicodeString类

之前,默认情况下未定义UNICODE,因此使用了char,选择了AnsiString类。今天,UNICODE是默认定义的,因此使用wchar\t,选择UNICODE解构类。这非常方便,因为Windows API现在默认为Unicode

还有其他几种类型,如WideString、UTF8String等。它们都有大致相同的接口,因此可以互换。因此.c_str根据所选字符串类返回不同的类型

要迁移,通常只需在所有常量字符串(如LMy unicode消息)前面加上一个L

应该只有一些罕见的情况下,你特别需要一个8位字符。对于这些情况,您可以使用AnsiString进行转换

Windows API通常有两个版本的每个函数,xxxxA代表Ansi,xxxxW代表宽版本 N如果省略结尾A或W,Windows将根据UNICODE定义使用正确的版本。W版本要求您使用LMy字符串,而A版本不需要。Microsoft通过文本宏:TEXTAuto-converted解决了这个问题。文本宏将根据UNICODE定义将常量字符串转换为ansi或wide。通过选择正确的API函数版本,此行将在UNICODE已定义或未定义的情况下正常工作

MessageBox(TEXT("Auto converted string"),TEXT("TEXT MACRO"),0);
您可以通过在API函数名后面附加A或W来强制Windows使用Ansi或Wide版本

MessageBoxA("This is the ansi version","MessageBoxA",0);
MessageBoxW(L"This is the wide version",L"MessageBoxW",0);
我建议您在可能的情况下将项目迁移为仅使用字符串,并在绝对需要时转换为ansisting,例如调用仅接受8位字符的库函数。默认情况下,项目中的字符应该是wchar\t请参见项目->选项->C++共享选项->\u TCHAR映射到

[免责声明] 所有的代码示例都是我头脑中的想法,而不是实际编译的

字符串类型只是一个宏,根据UNICODE定义选择AnsiString或UnicodeString类

之前,默认情况下未定义UNICODE,因此使用了char,选择了AnsiString类。今天,UNICODE是默认定义的,因此使用wchar\t,选择UNICODE解构类。这非常方便,因为Windows API现在默认为Unicode

还有其他几种类型,如WideString、UTF8String等。它们都有大致相同的接口,因此可以互换。因此.c_str根据所选字符串类返回不同的类型

要迁移,通常只需在所有常量字符串(如LMy unicode消息)前面加上一个L

应该只有一些罕见的情况下,你特别需要一个8位字符。对于这些情况,您可以使用AnsiString进行转换

Windows API通常有两个版本的每个函数,XXA代表Ansi,xxxxW代表宽版本。如果省略结尾A或W,Windows将根据UNICODE定义使用正确的版本。W版本要求您使用LMy字符串,而A版本不需要。Microsoft通过文本宏:TEXTAuto-converted解决了这个问题。文本宏将根据UNICODE定义将常量字符串转换为ansi或wide。通过选择正确的API函数版本,此行将在UNICODE已定义或未定义的情况下正常工作

MessageBox(TEXT("Auto converted string"),TEXT("TEXT MACRO"),0);
您可以通过在API函数名后面附加A或W来强制Windows使用Ansi或Wide版本

MessageBoxA("This is the ansi version","MessageBoxA",0);
MessageBoxW(L"This is the wide version",L"MessageBoxW",0);

我建议您在可能的情况下将项目迁移为仅使用字符串,并在绝对需要时转换为ansisting,例如调用仅接受8位字符的库函数。在您的项目中,默认情况下char应该是wchar\t请参见项目->选项->C++共享选项->\TCHAR映射到

对于这些简单的问题,进一步查看帮助是正确的做法。Vcl.Controls.t选项清楚地通知您:typedef系统::UnicodeString t选项;*TCaption是标题属性的类型。现在,请自己尝试一下,查找System.UnicodeString.c_strf,如果问题的结果出乎意料,您需要提供一个答案,不是吗?对于这些简单的问题,进一步寻求帮助是正确的做法。Vcl.Controls.t选项清楚地通知您:typedef系统::UnicodeString t选项;*TCaption是标题属性的类型。现在,试试你自己,查找System.UnicodeString.c_strf,如果结果出乎意料,你需要提供一个答案,不是吗?所有伟大的答案,谢谢,看起来我有一些研究要做。所有伟大的答案,谢谢,看起来我有一些研究要做。Al Mannarino的有用博客文章:Al Mannarino的有用博客文章: