Teraz jak uzupełniłeś profil widać z czym masz problem, a chodzi to, że w środowiskach C++Builder 2009 i 2010 domyślnie używana jest zmienna typu
UnicodeString, a nie
AnsiString przez co niektóre wartości wymagają konwersji. Dużo zależy jak masz ustawione mapowanie w środowisku na
char czy
wchar_t.
Problem dokładnie opisałem w tym poście:
http://programowanie.cal.pl/forum/viewtopic.php?f=16&t=1098&p=7401&hilit=#p7401Co się zaś tyczy twojego kodu, to zależnie od mapowania. Jeżeli masz ustawione mapowanie na
char to funkcji Application->MessageBox używasz tak:
String a = Memo1->Lines->Strings[ i];
Application->MessageBox( ("czy przeniesc? " + a).c_str(), L"blablbla",MB_YESNO | MB_ICONQUESTION) == IDYES
Dodając do siebie dwie wartości typu String, z których jedna lub wszystkie są w zmiennej tego typu - a typ String w C++Builder 2009 i 2010 zawsze jest typem UnicodeString, a nie jak wcześniej AnsiString - musisz użyć metody c_str(). W przykładzie dodawane wartości to: "czy przeniesc?" i a.
Natomiast podając bezpośrednio wartość String, czyli po prosty teks bez zmiennej, tutaj jest to wartość: "blablbla" przed tekstem wprowadzasz symbol duże L, które służy właśnie do konwersji z UnicodeString na wchar_t.W C++Builder 2009 i 2010 funkcja Application->MessageBox ma taką konstrukcję:
int __fastcall MessageBoxA(const wchar_t * Text, const wchar_t * Caption, int Flags);
Podczas gdy we wcześniejszych wersjach jest tak:
int __fastcall MessageBoxA(const char* Text, const char * Caption, int Flags);
Jak zapewne pamiętasz we wcześniejszych wersjach używając tej funkcji również musiałeś stosować konwersję za pomocą funkcji c_str(), gdy dodawałeś zmienne typu String, ale nie musiałeś stosować symbolu L, gdyż dokonywała się niejawna konwersja z AnsiString na char.
Jeżeli mapowanie masz ustawione na
wchar_t to możesz stosować zarówno
c_str() jak i
t_str() do konwersji
UnicodeString (String) na
wchar_t. Jeżeli jednak chcesz konwertować
AnsiString na
wchar_t to musisz użyć funkcji
WideString i
c_bstr().
AnsiString a = "jakiś tekst";
Application->MessageBox(WideString("Komunikat" + a).c_bstr(), L"test", MB_OK);
//lub
Application->MessageBox(WideString(a).c_bstr(), L"test", MB_OK);
Chcąc natomiast dokonać konwersji z
UnicodeString na
char trzeba najpierw dokonać konwersji na
AnsiString a potem na
char:
void Funckja(char *tekst)
{
ShowMessage( (String)tekst );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String a = "jakiś tekst"; // String = UnicodeString
Funckja( AnsiString(a).c_str() );
}