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:
you declaring 2
buffervariables in same scope. not allowed. need remove 1 of them.you passing
std::auto_ptrshowmessage(), expectssystem::unicodestringinstead, compiler error message. can usestd::auto_ptr::get()methodwchar_t*pointer , passshowmessage(),unicodestringhas constructor acceptswchar_t*input:showmessage(buffer.get());despite above, cannot use pointer
new[]std::auto_ptrbegin with.std::auto_ptrusesdeleteinstead ofdelete[]free memory being pointed at. must usedeletenew, ,delete[]new[]. so, while code compile, not free memory correctly @ runtime. c++11 introduced newstd::unique_ptrclass replacestd::auto_ptr, ,std::unique_ptrsupportsnew[],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
Post a Comment