![]() |
Mengen in C++
Hallo,
ich brauche mal kurz den Erklärbär :stupid: . Obwohl ich schon in C++ programmiert habe, bin ich gerade kläglich gescheitert, die Buttons im MessageDlg zu definieren:
Delphi-Quellcode:
hatte ich versucht. Das [mbOK] war aber offensichtlich falsch. Also drängte sich die Frage auf, wie werden mengen in C++ dargestellt. Auf dem hirnbasierten Festspeicher konnte ich keine Antwort finden, aber das Internet hat dann folgendes hervorgebracht:
MessageDlg("Hallo Welt", mtInformation, [mbOK], 0);
Delphi-Quellcode:
ÄÄhh, hääää? :wiejetzt:
MessageDlg("Hallo Welt", mtInformation, TMsgDlgButtons() << mbOK, 0);
Und tatsächlich, dass funktioniert auch noch. Jetzt die Frage an den Erklärbär: Zitat:
|
Re: Mengen in C++
Ich bin ja nu auch nicht der Ober-Profi!
TMsgDlgButtons ist eine Funktion, die einen Stream einliest, der über den Stream-Operator (<<) kommt. (Ähnlich dem cout-Konstrukt). Alle Buttons, die in diesen Stream geschrieben werden, werden von der Funktion so umgewandelt, dass MessageDlg damit was anfangen kann. Mehr isses nicht... :roll: Bsp.:
Code:
LG,
MessageDlg("Ich bin eine Hallo-Welt-Anwendung", "Hallo Welt!", mtConfirmation, TMsgDlgButtons() << mbOk << mbCancel << mbIgnore, 0);
Xong |
Re: Mengen in C++
TMsgDlgButtons() ist doch eher der Constructoraufruf, du legst hier eine Instanz lokal auf dem Stack an, aber ohne entsprechende Variable. Und der werden nun über den überladenen Operator << die einzelnen Elemente zugewiesen und der Operator macht dann die entsprechende Oder Verknüpfung intern.
|
Re: Mengen in C++
Hallo,
wie Thomas gesagt hat, handelt es sich bei dem << um einen überladenen Operator. TMsgDlgButtons ist wie folgt definiert:
Delphi-Quellcode:
Also ist TMsgDlgButtons ein "Set" und der Aufruf des Constructors TMsgDlgButtons() erezugt eine leere Menge. Es ist deshalb anzunehmen, dass der operator << einer Menge ein Element hinzufügt. In der online Hilfe zu Set habe ich aber den Operator << nicht gefunden. :stupid:
typedef Set<TMsgDlgBtn, mbYes, mbHelp> TMsgDlgButtons;
|
Re: Mengen in C++
Himmel hilf, warum so kompliziert? Vielleicht bin ich ja von MS VC++ verwöhnt, aber ich schreib an der Stelle einfach immer MB_OK ;) Da die Identifier für die einzelnen Werte einzelne Bits sind, kann man die auch ganz einfach ver-OR-en ohne kompliziertes Typecasting, ist das evtl. compilerspezifisch so gelöst? Ich frag nur weil ichs aus der Praxis gar nicht anders kenn :)
|
Re: Mengen in C++
Die VCL kapselt ja nur diesen WinAPI Aufruf und der Set definiert diese Konstanten entsprechend. Intern macht der set nichts anderes als dieses nachzubilden was du machst. Der MessageDlg() würde in Delphi für Delphi entwickelt und ist dort durch die sprachlichen Möglichkeiten entsprechend einfacher zu verwenden. Es schreibt keiner vor, nicht die MessageBox zu verwenden und entsprechend mit | die Konstanten zu verodern. Mit anderen Worten: mit der entsprechenden Wahl des Aufrufs kann man sich das ganze verkomplizieren. Die MessageBox() kann auch einfach Application->Title.c_str() beim Aufruf mitgegeben werden und man erhält das gleiche Resultat wie ein MessageDlg() Aufruf.
|
Re: Mengen in C++
Ja aber es ging doch um C++ und nicht Delphi?
|
Re: Mengen in C++
Zitat:
Es ist genauso, als wenn sich nun hier irgendein C++Builder Nutzer aufregen würde, warum die Übergabe des dynamischen Arrays so kompliziert ist. Delphi macht die Übergabe und die Arbeit mit dynamischen Arrays durch versteckte Parameter und Compilermagic einfach, im C++Builder aber kommen diese Sachen zum Vorschein und machen es deutlich komplizierter als eine vergleichbare C(++) Lösung. Von daher: Nutzt die C(++) Lösung und gut ist. Du kaufst dir ja auch nicht einen Schrank, wenn du mal ein Stückchen Holz brauchst. Es gibt bessere und einfachere Lösungen (MessageBox()) in der jeweiligen Sprache (C++). Während es in anderen Sprachen (Delphi) für deren Zwecke besser Lösungen gibt (MessageDlg()). |
Re: Mengen in C++
wir wär's damit:
Code:
ID_OK (=1) und ID_CANCEL (=2) sind Windows API Konstanten.
MessageDlg("Hallo Welt", mtInformation, (1 << ID_OK)|(1<<ID_CANCEL), 0);
<< ist hier der binäre Shift-Operator (1 << 1)|(1<<2) = 6 |
Re: Mengen in C++
Zitat:
|
Re: Mengen in C++
Hallo OldGrumpy,
das sieht einfach aus, funktioniert aber nicht. Es gibt zwar auch in C++ im RAD Studio vordefiniert Schaltermengen, z.B. mbYesNo, so dass ein Aufruf:
Delphi-Quellcode:
möglich ist. Wenn man aber die Schalter einzeln festlegen möchte, muss man wohl mit der im ersten Posting gezeigten Methode des Aufrufs leben. :?
MessageDlg("Hallo Leute", mtConfirmation, mbYesNo, 0);
|
Re: Mengen in C++
Wie gesagt, das ganze ist, da VCL, spezifisch für den BCB. Ich bin da MSVC geschädigt, AfxMessageBox() erspart mir das "Gehampel" an der Stelle (hat dafür genügend andere Stolperfallen, darüber brauchen wir nicht diskutieren :mrgreen:)... Ich hab mir den BCB noch gar nicht näher angeschaut weil ich noch keinen Bedarf dafür hatte. Meine Microcontroller programmier ich per gcc, früher hab ich in MSVC++ 6 entwickelt, momentan halt Delphi, und ab und zu sogar mal etwas Pascal unter DOS und OpenWatcom :) Also, Thema durch :)
|
Re: Mengen in C++
Es war kein Beschwerbär sondern ein Erklärbär, warum es so kompliziert ist (da nicht für C++ geschrieben) und warum man darüber nicht nachdenken braucht (da es für C++ entsprechende eigene Funktionen gibt). Und das es hier um C++ geht, sieht man einfach beim ersten Beitrag in diesem Thread. Dein Beitrag kommt halt so rüber: "Was macht ihr nur für einen Scheiß mit eurem BCB, ich brauch doch nur oder'n". Von daher mein Beitrag, aber egal, erklären wird eh total überbewertet...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz