我是编程新手。其实我在大学二年级并开始实习。他们希望我在C ++ builder中做一个程序,但我只知道C.我学过什么。我对OOP没有任何了解。
所以我的问题是。
我有TEdit1,我想验证该文本框中引入的数据是否为数字。我知道要验证它是否是一个数字,但我不知道如何将数据从TEdit放入字符串。
我写了一些代码,但它不起作用。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int Size = Edit1->GetTextLen(); //Get length of string in Edit1
Size++; //Add room for null character
Char *Buffer = new Char[Size]; //Creates Buffer dynamic variable
std::auto_ptr<Char> Buffer(new Char[Size]);
Edit1->GetTextBuf(Buffer.get(),Size); //Puts Edit1->Text into Buffer
ShowMessage(Buffer);
}
我得到了这些错误:
E2034 Cannot convert 'std::auto_ptr<wchar_t>' to 'UnicodeString'
E2342 Type mismatch in parameter 'Msg' (wanted 'const UnicodeString', got std::auto_ptr<wchar_t>')
你能解释一下我做错了什么,或者我在哪里可以找到Embarcadero C ++ Builder教程?我搜索了所有谷歌并没有找到帮助我的东西。
答案 0 :(得分:2)
您的代码中有几个错误:
您在同一范围内声明了两个Buffer
个变量。这是不允许的。你需要删除其中一个。
您正在将std::auto_ptr
本身传递给ShowMessage()
,但它需要System::UnicodeString
,因此编译错误消息。您可以使用std::auto_ptr::get()
方法获取wchar_t*
指针并将其传递给ShowMessage()
,因为UnicodeString
有一个接受wchar_t*
作为输入的构造函数:
ShowMessage(Buffer.get());
尽管如此,您实际上无法使用new[]
与[{1}}开头的指针。 std::auto_ptr
使用std::auto_ptr
代替delete
释放被指向的内存。您必须始终将delete[]
与delete
一起使用,将new
与delete[]
一起使用。因此,虽然代码将编译,但它不会在运行时正确释放内存。 C ++ 11引入了一个新的std::unique_ptr
类来替换new[]
,std::auto_ptr
支持std::unique_ptr
和new[]
(但是,C ++ Builder&#39; s 32位编译器还不支持C ++ 11 - 这是在起作用 - 但它的64位编译器确实如此):
delete[]
现在,如上所述,如果您要继续使用C ++ Builder,您应该学习如何使用其内置功能,如#include <memory>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int Size = Edit1->GetTextLen(); //Get length of string in Edit1
Size++; //Add room for null character
std::unique_ptr<Char[]> Buffer(new Char[Size]); //Creates Buffer dynamic variable
Edit1->GetTextBuf(Buffer.get(), Size); //Puts Edit1->Text into Buffer
ShowMessage(Buffer.get());
}
,RTL / VCL严重依赖(使用大多数代码的UnicodeString
别名,仅在绝对必要时才直接使用System::String
。
使用TEdit::Text
属性可以极大地简化您的示例:
UnicodeString
对您的问题最简单的解决方案是使用void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = Edit1->Text; //Get string in Edit1
ShowMessage(s);
}
组件而不是TCSpinEdit
,因为TEdit
首先只允许数字输入,并且TCSpinEdit
返回Value
:
int
但是,如果您必须坚持使用void __fastcall TForm1::Button1Click(TObject *Sender)
{
int number = CSpinEdit1->Value;
ShowMessage("It is a number");
// use number as needed...
}
,有很多方法可以检查TEdit
的数字内容。
您可以将TEdit::NumbersOnly
属性设置为true,这样用户就无法输入非数字值(除非他们使用复制/粘贴,但暂时忽略它),然后使用RTL的StrToInt()
函数或System::UnicodeString::ToInt()
方法将其按原样转换:
UnicodeString
或者您可以使用RTL的System::Sysutils::TryStrToInt()
功能:
#include <System.SysUtils.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int number;
try
{
number = StrToInt(Edit1->Text);
// or: number = Edit1->Text.ToInt();
}
catch (const EConvertError&)
{
// not a number, do something else...
ShowMessage("It is not a number");
return;
}
ShowMessage("It is a number");
// use number as needed...
}
或者您可以使用STL的std::wistringstream
课程:
#include <System.SysUtils.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int number;
if (TryStrToInt(Edit1->Text, number))
{
// use number as needed...
ShowMessage("It is a number");
}
else
{
// not a number, do something else...
ShowMessage("It is not a number");
}
}
或者,由于你有C背景,你可以使用C _wtoi()
函数(它在错误检查方面没有提供太多帮助):
#include <sstream>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int number;
std::wistringstream iss(Edit1->Text.c_str());
if (iss >> number)
{
// use number as needed...
ShowMessage("It is a number");
}
else
{
// not a number, do something else...
ShowMessage("It is not a number");
}
}
或者您可以使用C wcstol()
功能:
#include <cstdlib>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int number = std::_wtoi(Edit1->Text.c_str());
if (number != 0)
{
// use number as needed...
ShowMessage("It is a valid number");
}
else
{
// not a number, do something else...
ShowMessage("It is not a valid number");
}
}
或者您可以使用C swscanf()
功能:
#include <cstdlib>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = Edit1->Text;
Char *p = s.c_str(), *end;
int number = std::wcstol(p, &end, 10);
if (end != p)
{
// use number as needed...
ShowMessage("It is a number");
}
else
{
// not a number, do something else...
ShowMessage("It is not a number");
}
}