Myślę że to jest dobrze, właściwość Edit2->Text jest typu UnicodeString, a c_str() zwróci wchar_t*
Może i dobrze, ale to właśnie nie działa.
Pytanie: jakiego typu argumentów oczekuje funkcja Application->MessageBox w C++ Builder 2009. W C++ Builder 2007 dwa pierwsze argumenty są typu char, dlatego podając np. komunikat:
- Kod: Zaznacz cały
Application->MessageBox("treść komunikatu", "Tytuł", MB_OK | MB_ICONSTOP);
nie trzeba stosować konwersji, gdyż treści przekazane jako argumenty mogą być (zależnie gdzie zostaną użyte) być traktowane zarówno jako char jak i String, tutaj domyślnie są traktowane jako char.
Ale taki kod:
- Kod: Zaznacz cały
Application->MessageBox( ("treść komunikatu" + Edit1->Text).c_str(), "Tytuł", MB_OK | MB_ICONSTOP);
wymaga już konwersji, gdyż właściwość Text obiektu TEdit jest typu AnsiString, więc całość jest traktowana jako AnsiString, a więc konieczna jest konwersja do char.
Jeżeli jednak w C++Builder 2009 zarówno tekst jawny jak i właściwość Text obiektu TEdit są typu UnicodeString i funkcja MessageBox oczekuje typu UnicodeString to dodając je nie trzeba niczego konwertować, czyli wystarczyć powinno:
- Kod: Zaznacz cały
Application->MessageBox("treść komunikatu" + Edit1->Text, "Tytuł", MB_OK | MB_ICONSTOP);
Jeżeli jednak funkcja MessageBox oczekuje typu AnsiString to trzeba dokonać konwersji z UnicodeString do AnsiString, ale nie da się tego załatwić operatorem c_str().
Przeprowadziłem eksperyment w C++Builder 2007:
- Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
wchar_t tekst[255] = L"treść komunikatu";
Application->MessageBox( ( (String)tekst ).c_str(), "Komunikat", MB_OK);
}
//---------------------------------------------------------------------------
To zadziała, ale przecież w C++Builder 2009 i 2010 to nie może być tak skomplikowane
Poza tym z treści komunikatów błędu jasno wynika, że funkcja oczekuje typu wchar_t, więc żadna konwersja nie powinna być potrzebna, gdyż środowisko samo powinno dostosować wprowadzony tekst do potrzeb, czyli wprowadzamy treść komunikatu dodajemy wartość Text obiektu Edit1.
Mam w związku z tym dwa pytania:
Jak środowisko C++Builder 2009 traktuje jawnie wprowadzony tekst, czy jako AnsiString, char, wchar_t, czy może w zależności od tego gdzie jest użyte jako
jedno z tych trzech?
Jakiego typu jest właściwość Text obiektu TEdit w środowisku C++Builder 2009?