БлогNot. Из Borland в EmbarCadero... не работает MessageBox?

Из Borland в EmbarCadero... не работает MessageBox?

На самом деле, MessageBox тут не при чём, причина в другом.

Например, если в проекте Borland C++ Builder 6 или иного старого продукта было

void mathErrorMsg (EMathError *E) {
 AnsiString S = "Ошибка вычислений: ";
 if (E->Message == "EZeroDivide") S += "деление на нуль";
 else if (E->Message == "EOverflow") S += "переполнение";
 else if (E->Message == "EInvalidArgument") S += "недопустимое число";
 Application->MessageBox(S.c_str(), "Повторите ввод", MB_OK);
}

то в новом (2014 г.) C++ Builder XE6 от Embarcadero проще всего написать

void mathErrorMsg (EMathError *E) {
 String S = "Ошибка вычислений:\n"+E->Message;
 Application->MessageBox(S.c_str(), L"Повторите ввод", MB_OK);
}

Обратите внимание на "L" перед строковой константой, это означает, что строка в Юникоде. Ну и лень было переводить сообщения E->Message, их значения изменились. Тем не менее, это будет компилироваться без ошибок вроде E2034 Cannot convert 'wchar_t *' to 'char *'...

Или было:

Application->MessageBox("Неверные значения данных!","Повторите ввод",MB_OK);

Для работы кода в новых компиляторах достаточно:

Application->MessageBox(L"Неверные значения данных!",L"Повторите ввод",MB_OK);

Заморочки со строками связаны со всё той же причиной - некогда (в до-Юникодную эпоху) имевшей место однобайтовостью строк по умолчанию.

01.09.2014, 17:44 [12728 просмотров]


теги: программирование c++ ретро builder

показать комментарии (1)