如何将TEdit数据放入String C ++ Builder

时间:2015-07-17 09:44:12

标签: c++builder c++builder-xe7

我是编程新手。其实我在大学二年级并开始实习。他们希望我在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教程?我搜索了所有谷歌并没有找到帮助我的东西。

1 个答案:

答案 0 :(得分:2)

您的代码中有几个错误:

  1. 您在同一范围内声明了两个Buffer个变量。这是不允许的。你需要删除其中一个。

  2. 您正在将std::auto_ptr本身传递给ShowMessage(),但它需要System::UnicodeString,因此编译错误消息。您可以使用std::auto_ptr::get()方法获取wchar_t*指针并将其传递给ShowMessage(),因为UnicodeString有一个接受wchar_t*作为输入的构造函数:

    ShowMessage(Buffer.get());
    
  3. 尽管如此,您实际上无法使用new[]与[{1}}开头的指针。 std::auto_ptr使用std::auto_ptr代替delete释放被指向的内存。您必须始终将delete[]delete一起使用,将newdelete[]一起使用。因此,虽然代码将编译,但它不会在运行时正确释放内存。 C ++ 11引入了一个新的std::unique_ptr类来替换new[]std::auto_ptr支持std::unique_ptrnew[](但是,C ++ Builder&#39; s 32位编译器还不支持C ++ 11 - 这是在起作用 - 但它的64位编译器确实如此):

    delete[]
  4. 现在,如上所述,如果您要继续使用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");
        }
    }