![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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