Frage von TNT2k, 53

Wieso kennt C++ Builder 10 Application->MessageBox nicht?

Ich habe wegen Windows 10 meinen alten guten C++ Builder 6 leider aufgrund von Fehlfunktionen nicht mehr benutzen können. Also habe ich jetzt von einem Bekannten C++ Builder 10 Seattle. Als universalen Test macht man normalerweise "Hello World!" mit einem Meldefenster. C++ Builder 1 Seattle kennt aber Application->Box offenbar nicht, ich bekomme immer folgende Fehlermeldungen:

[bcc32 Fehler] Unit1.cpp(19): E2316 'MessageBoxW' ist kein Member von 'TApplication' Vollständiger Parser-Kontext Unit1.cpp(18): Analyse: void _fastcall TForm1::Button1Click(TObject *)

Ich habe folgenden Quelltext in der Methode:

void __fastcall TForm1::Button1Click(TObject *Sender){ Application->MessageBox ("","",0);}

//---------------------------------------------------------------------------

Hat jemand eine Idee? Ich habe mich jedenfalls nicht verschrieben, und die Entwicklungsumgebung auch schon mehrmals neu installiert.

Antwort
von PeterKremsner, 28

Warum steht da MessageBoxW und nicht nur MessageBox?

Ich kenne die IDE nicht, ich verwende auf Windows eigentlich Netbeans oder Eclipse, wobei es von der nicht abhängen sollte.

Welchen Compiler verwendest du? mingw?

Kommentar von TNT2k ,

Weiß ich nicht

Kommentar von PeterKremsner ,

Ok das ist eigenartig.

Nach gewöhnlicher Win32 Syntax wäre es übrigens nur MessageBox.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

Btw hat es einen Grund warum du Application->MessageBox schreibst die Syntax für den Zugriff auf Memberfunctionen ist . und nicht ->, sofern es sich bei Application um einen Namespace handelt wäre der Zugriff mit ::

Kommentar von TNT2k ,

Alle von dir genannten Möglichkeiten funktionieren auch nicht.

Kommentar von PeterKremsner ,

Ok dann wird bei deiner IDE irgendein komischer Compiler verwendet, ich verwende dazu hauptsächlich mingw da brauchst du nur die windows.h einbinden und du kannst die Messagebox einfach mit MessageBox(...) aufrufen.

Für gewöhnlich sollte das dein Compiler auch unterstützen....

Vielleicht hilft dir das weiter:

http://www.functionx.com/bcb/topics/msgbox.htm

Kommentar von TNT2k ,

Selbst mit windows.h geht es nicht.

Kommentar von PeterKremsner ,

Gut dann kann ich dir auch nicht weiterhelfen, beim mingw und bei den alten unmanaged C++ Compiler von Microsoft hatts so funktioniert.

Borland C++ hab ich nie verwendet, die IDE hat mir dabei nie wirklich zugsesagt.

Was ist die Fehlermeldung wenn du MessageBox direkt aufrufst, also ohne Application?

zB so wie hier:

http://www.mlrweb.com/program/mbox.htm

Hast du auch schon mal mit einem debugger geprüft ob Application überhaupt definiert ist?

An sich müsste das ein Pointer auf eine Instanz einer Structur oder einer Klasse sein, sonst würde die Syntax mit -> nicht passen.

Kommentar von TNT2k ,

Ich habe das mal aus einem Buch gelernt, mit Pfeil, wenn ich nur einen Punkt nehme will er auf der linke Seite einen Zeiger.

Ohne Application:

[bcc32 Fehler] Unit1.cpp(20): E2034 Konvertierung von 'char const[1]' nach 'HWND__ *' nicht möglich
Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)
[bcc32 Fehler] Unit1.cpp(20): E2342 Keine Übereinstimmung des Parametertyps 'hWnd' ('HWND__ *' erwartet, 'const char *' erhalten)
Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)
[bcc32 Fehler] Unit1.cpp(20): E2193 Zu wenige Parameter im Aufruf von '__stdcall MessageBoxW(HWND__ *,const wchar_t *,const wchar_t *,unsigned int)'
Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

Trotzdem Danke für die Hilfe.

Kommentar von PeterKremsner ,

Ja die Funktion gibt es ja aber du verwendest die falschen Parameter, die Messagebox Funktion braucht als ersten Parameter das Window Handle und nicht den Text.

Sieh dir doch mal die Parameterliste der Funktion in den Links an die ich dir geschickt habe.

Kommentar von TNT2k ,

ShowMessage funktioniert, ich weiß nur nicht, wie man da die Buttons einstellen kann, wie bei MessageBox.

Zum letzten Text:

[bcc32 Fehler] Unit1.cpp(21): E2316 'Handle' ist kein Member von 'TApplication'

Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

[bcc32 Fehler] Unit1.cpp(21): E2034 Konvertierung von 'char const[14]' nach 'const wchar_t *' nicht möglich

Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

[bcc32 Fehler] Unit1.cpp(21): E2342 Keine Übereinstimmung des Parametertyps 'lpText' ('const wchar_t *' erwartet, 'const char *' erhalten)

Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

[bcc32 Fehler] Unit1.cpp(23): E2034 Konvertierung von 'char const[14]' nach 'const wchar_t *' nicht möglich

Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

[bcc32 Fehler] Unit1.cpp(23): E2342 Keine Übereinstimmung des Parametertyps 'lpText' ('const wchar_t *' erwartet, 'const char *' erhalten)

Vollständiger Parser-Kontext
Unit1.cpp(19): Analyse: void _fastcall TForm1::Button1Click(TObject *)

Kommentar von PeterKremsner ,

ShowMessage unterstützt keine Buttons glaub ich.

Ruf die Messagebox funktion mal so auf:

MessageBox(
NULL,
(LPCWSTR)L"Resource not available\nDo you want to try again?",
(LPCWSTR)L"Account Details",
MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
);

Die Messagebox ist aber dadurch nicht an das Hauptfenster gebunden, für Tests sollte das aber egal sein, wenn du herausfindest wie du das Handle von deinem Fenster erhalten kannst wäre das der erste Parameter für die Funktion.

Wenn das nicht geht kannst du auch versuchen die

(LPCWSTR)L

durch

(const wchar_t *)

zu ersetzen.

Wie du den Button auswerten kannst findest du hier:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

Kommentar von TNT2k ,

Das 1. funktioniert, beim Ersetzen bekomme ich im Meldefenster nur noch Chinesische Zeichen.

Kommentar von PeterKremsner ,

Passt, dann lass ersteres.

Kommentar von TNT2k ,

Danke, funktioniert wie MessageBox, wenn man es richtig benutzt.

Kommentar von PeterKremsner ,

Ja im Prinzip wird Application->MessageBox nur ein sogenanntes Currying gewesen sein (hat nichts mit Curry zu tun ;)), die Methode hat sicherlich intern auch die normale MessageBox Funktion aufgerufen und den ersten Parameter durch das entsprechende Window Handle ersetzt.

Für größere Programme solltest du das aber auch machen, also nachsehen wie du in Borland an dein Window Handle kommst und der Messagebox diese übergeben, ansonsten kann man im ursprünglichen Fenster Weiterschreiben oder Buttons Klicken oder auch das Fenster schließen obwohl gerade die MessageBox aktiv ist.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten