Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C++ Mengen in C++ (https://www.delphipraxis.net/108171-mengen-c.html)

MrSpock 8. Feb 2008 07:42


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:
MessageDlg("Hallo Welt", mtInformation, [mbOK], 0);
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:

Delphi-Quellcode:
MessageDlg("Hallo Welt", mtInformation, TMsgDlgButtons() << mbOK, 0);
ÄÄhh, hääää? :wiejetzt:

Und tatsächlich, dass funktioniert auch noch. Jetzt die Frage an den Erklärbär:

Zitat:

Was um alles in der Welt ist denn das für eine kranke Notation?

Xong 8. Feb 2008 08:59

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:
MessageDlg("Ich bin eine Hallo-Welt-Anwendung", "Hallo Welt!", mtConfirmation, TMsgDlgButtons() << mbOk << mbCancel << mbIgnore, 0);
LG,
Xong

Muetze1 8. Feb 2008 09:09

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.

MrSpock 8. Feb 2008 10:47

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:
typedef Set<TMsgDlgBtn, mbYes, mbHelp> TMsgDlgButtons;
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:

OldGrumpy 8. Feb 2008 13:42

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 :)

Muetze1 8. Feb 2008 14:50

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.

OldGrumpy 8. Feb 2008 15:25

Re: Mengen in C++
 
Ja aber es ging doch um C++ und nicht Delphi?

Muetze1 8. Feb 2008 16:04

Re: Mengen in C++
 
Zitat:

Zitat von OldGrumpy
Ja aber es ging doch um C++ und nicht Delphi?

... und der C++Builder nutzt die Pascal VCL Quellen. Diese werden in HPP Header übersetzt, wodurch das ganze nunmal zu Stande kam. Und der Grund für die Existenz vom MessageDlg() ist die einfachere Handhabung der MessageBox der WinAPI in Delphi. Nun wird hier diese Delphi Funktion wiederrum in C++ genutzt, was natürlich (da es für/in Delphi entworfen wurde) in einer komplexeren Anwendung endet. Somit: Wenn, dann die MessageBox nutzen und gut ist. Dann ist das einfache, von dir beschriebene, Verhalten benutzbar.

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()).

shmia 8. Feb 2008 16:23

Re: Mengen in C++
 
wir wär's damit:
Code:
MessageDlg("Hallo Welt", mtInformation, (1 << ID_OK)|(1<<ID_CANCEL), 0);
ID_OK (=1) und ID_CANCEL (=2) sind Windows API Konstanten.
<< ist hier der binäre Shift-Operator
(1 << 1)|(1<<2) = 6

OldGrumpy 8. Feb 2008 18:02

Re: Mengen in C++
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von OldGrumpy
Ja aber es ging doch um C++ und nicht Delphi?

... und der C++Builder nutzt die Pascal VCL Quellen. [Beschwerbär entfernt]

Genau *deswegen* fragte ich ja, ob das was compilerspezifisches wäre. Ein einfaches Ja hätte hier ausgereicht :) Ich hab mich nicht beschwert, nur gewundert. Das Konstrukt mit dem Set sah für mich halt unnötig umständlich aus, sorry.

MrSpock 8. Feb 2008 18:48

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:
MessageDlg("Hallo Leute", mtConfirmation, mbYesNo, 0);
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. :?

OldGrumpy 9. Feb 2008 10:22

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 :)

Muetze1 9. Feb 2008 17:05

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