Ошибка в формах Visual C ++, Simple MessageBox и назначении текста из текстового поля в строку - PullRequest
0 голосов
/ 28 марта 2012
private: System::Void btn_entrar_Click(System::Object^  sender, System::EventArgs^  e) {

string btn_texto = txt_login->Text->ToString();
MessageBox(NULL, "Hello!", btn_texto.c_str(), MB_OK | MB_ICONEXCLAMATION);

}

Я обычно создаю приложение Windows Form в Visual C ++ Studio 2008 Professional, я добавил функцию щелчка (двойным щелчком по кнопке в режиме разработки), поэтому я написал код внутри сгенерированной им функции.

сгенерировано 2 ошибки:

Ошибка 1:

ошибка C2440: «инициализация»: невозможно преобразовать из «System :: String ^» в 'std :: basic_string <_Elem, _Traits, _Ax>'

Ошибка 2:

ошибка C2872: «MessageBox»: неоднозначный символ 1> может быть 'C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ include \ winuser.h (7374) : int MessageBox (HWND, LPCTSTR, LPCTSTR, UINT) '1> или
«C: \ Windows \ microsoft.net \ Framework \ v2.0.50727 \ System.Windows.Forms.dll : Система :: Windows :: Forms :: MessageBox '

Я создаю в C ++ на Visual Studio 2008 Professional под Windows 7 и проект под .NET Framework 3.5

Кто-то знает, как мне это исправить? Я посмотрел все это, но не смог найти решение. Я надеюсь, что дал достаточно информации. Заранее спасибо.

@ edit Пример, заданный Коди Грей

System::String btn_texto = txt_login->Text->ToString();
System::Windows::Forms::MessageBox(NULL, "Hello!", "HI", MB_OK | MB_ICONEXCLAMATION);

Ошибки получены

ошибка C3149: «System :: String»: здесь нельзя использовать этот тип без ошибка верхнего уровня '^' C2661: 'System :: Windows :: Forms :: MessageBox :: MessageBox': нет перегруженных функция принимает 4 аргумента

Итак, я решил первую ошибку, добавив ^ после System :: String быть таким:

System :: String ^ btn_texto = txt_login-> Text-> ToString ();

но вторая ошибка не была исправлена, и, кстати, как бы я добавил содержимое "btn_texto" в функцию MessageBox? Спасибо!

Ответы [ 2 ]

1 голос
/ 29 марта 2012
System::String^ btn_texto = txt_login->Text->ToString();
MessageBox::Show( "Working", "Info",    MessageBoxButtons::OK, MessageBoxIcon::Exclamation );

Решено. :)

0 голосов
/ 28 марта 2012

Вы смешиваете строковые типы C ++ (std::string) и строковые типы .NET Framework (System::String) повсюду, и это просто не сработает. Или, по крайней мере, это не будет очень просто. Решите, какой из них вы хотите использовать, и придерживайтесь его.

В частности, первая ошибка вызвана ошибкой этой строки:

string btn_texto = txt_login->Text->ToString();
  1. Первая причина, по которой он ошибается, заключается в том, что он создает объект типа std::string (предположительно, у вас есть оператор using namespace std; в верхней части файла кода), который является строковым типом C ++, а не .NET Framework строковый тип. Строковый тип .NET Framework - это тот тип, который вы, вероятно, захотите использовать в приложении .NET WinForms. Вам придется полностью квалифицировать пространство имен как System::String.

  2. Вторая причина, по которой он ошибается, заключается в том, что бессмысленно преобразовывать объект String (возвращаемый свойством Text) в объект String с использованием метода ToString(). Оставьте эту последнюю функцию полностью отключенной.

Вторая ошибка вызвана тем фактом, что заголовки Win32 предоставляют функцию MessageBox, как и .NET Framework. Компилятор должен знать, какой из них вы хотите вызвать.

  1. Чтобы вызвать функцию Win32 MessageBox (как вы пытаетесь это сделать сейчас), вам нужно использовать оператор разрешения глобальной области видимости: ::MessageBox.

    Но тогда вы столкнетесь с проблемой невозможности преобразования из System::String в строку в стиле C. См. в этой статье для получения инструкций по преобразованию между различными типами строк, доступными в C ++ / CLI.

  2. Более простой подход, вероятно, заключается в том, чтобы вызвать версию .NET MessageBox функции , которую вы можете выполнить, выполнив полную квалификацию следующим образом: System::Windows::Forms::MessageBox. Преимущество этой версии в том, что вам не нужно выполнять какие-либо преобразования строк, поскольку она принимает параметр типа System::String. Оболочка .NET MessageBox поддерживает все те же параметры, что и функция Win32 MessageBox, но некоторые из них расположены в другом порядке, поэтому вам необходимо внимательно изучить документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...