c++builder - How to put TEdit data into String C++ Builder -


i new in programming. in 2nd year of college , starting internship. want me program in c++ builder know c. studied. , don't have knowledge oop.

so question is.

i have tedit1 , want verify if data introduced in textbox number. know verify if number don't know how put data tedit string.

i wrote code doesn't work.

void __fastcall tform1::button1click(tobject *sender)  {     int size = edit1->gettextlen(); //get length of string in edit1     size++;                         //add room 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 buffer      showmessage(buffer); } 

and these errors:

 e2034 cannot convert 'std::auto_ptr<wchar_t>' 'unicodestring'  e2342 type mismatch in parameter 'msg' (wanted 'const unicodestring', got              std::auto_ptr<wchar_t>') 

can please explain did wrong, or can found embarcadero c++ builder tutorials? searched google , didn't find me.

your code has several mistakes in it:

  1. you declaring 2 buffer variables in same scope. not allowed. need remove 1 of them.

  2. you passing std::auto_ptr showmessage(), expects system::unicodestring instead, compiler error message. can use std::auto_ptr::get() method wchar_t* pointer , pass showmessage(), unicodestring has constructor accepts wchar_t* input:

    showmessage(buffer.get()); 
  3. despite above, cannot use pointer new[] std::auto_ptr begin with. std::auto_ptr uses delete instead of delete[] free memory being pointed at. must use delete new, , delete[] new[]. so, while code compile, not free memory correctly @ runtime. c++11 introduced new std::unique_ptr class replace std::auto_ptr, , std::unique_ptr supports new[] , delete[] (however, c++builder's 32bit compiler not support c++11 yet - in works - 64bit compiler does):

    #include <memory>  void __fastcall tform1::button1click(tobject *sender)  {     int size = edit1->gettextlen(); //get length of string in edit1     size++;                         //add room null character      std::unique_ptr<char[]> buffer(new char[size]); //creates buffer dynamic variable      edit1->gettextbuf(buffer.get(), size); //puts edit1->text buffer      showmessage(buffer.get()); } 

now, said, if going continue using c++builder, should learn how use built-in functionalities, unicodestring, rtl/vcl relies heavily on (use system::string alias code, use unicodestring directly when absolutely necessary).

your example can vastly simplified using tedit::text property:

void __fastcall tform1::button1click(tobject *sender)  {     string s = edit1->text; //get string in edit1     showmessage(s); } 

the simplest solution problem use tcspinedit component instead of tedit, tcspinedit allows numeric input in first place, , has value property returns int:

void __fastcall tform1::button1click(tobject *sender)  {     int number = cspinedit1->value;     showmessage("it number");     // use number needed... } 

but, if have stick tedit, there many ways check unicodestring numeric content.

you can set tedit::numbersonly property true user cannot enter non-numeric value (unless use copy/paste, let's ignore moment), , use rtl's strtoint() function, or system::unicodestring::toint() method, convert as-is:

#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 number, else...         showmessage("it not number");         return;     }      showmessage("it number");     // use number needed... } 

or can use rtl's system::sysutils::trystrtoint() function:

#include <system.sysutils.hpp>  void __fastcall tform1::button1click(tobject *sender)  {     int number;      if (trystrtoint(edit1->text, number))     {         // use number needed...         showmessage("it number");     }     else     {         // not number, else...         showmessage("it not number");     } } 

or can use stl's std::wistringstream class:

#include <sstream>  void __fastcall tform1::button1click(tobject *sender)  {     int number;      std::wistringstream iss(edit1->text.c_str());     if (iss >> number)     {         // use number needed...         showmessage("it number");     }     else     {         // not number, else...         showmessage("it not number");     } } 

or, since have c background, can use c _wtoi() function (which doesn't offer in way of error checking):

#include <cstdlib>  void __fastcall tform1::button1click(tobject *sender)  {     int number = std::_wtoi(edit1->text.c_str());     if (number != 0)     {         // use number needed...         showmessage("it valid number");     }     else     {         // not number, else...         showmessage("it not valid number");     } } 

or can use c wcstol() function:

#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 needed...         showmessage("it number");     }     else     {         // not number, else...         showmessage("it not number");     } } 

or can use c swscanf() function:

#include <cstdio>  void __fastcall tform1::button1click(tobject *sender)  {     int number;      if (std::swscanf(edit1->text.c_str(), l"%d", &number) == 1)     {         // use number needed...         showmessage("it number");     }     else     {         // not number, else...         showmessage("it not number");     } } 

Comments