AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mengen in C++

Ein Thema von MrSpock · begonnen am 8. Feb 2008 · letzter Beitrag vom 9. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#1

Mengen in C++

  Alt 8. Feb 2008, 07:42
Hallo,

ich brauche mal kurz den Erklärbär .

Obwohl ich schon in C++ programmiert habe, bin ich gerade kläglich gescheitert, die Buttons im MessageDlg zu definieren:

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:

MessageDlg("Hallo Welt", mtInformation, TMsgDlgButtons() << mbOK, 0); ÄÄhh, hääää?

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?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Mengen in C++

  Alt 8. Feb 2008, 08:59
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...

Bsp.:
Code:
MessageDlg("Ich bin eine Hallo-Welt-Anwendung", "Hallo Welt!", mtConfirmation, TMsgDlgButtons() << mbOk << mbCancel << mbIgnore, 0);
LG,
Xong
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Mengen in C++

  Alt 8. Feb 2008, 09:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Mengen in C++

  Alt 8. Feb 2008, 10:47
Hallo,

wie Thomas gesagt hat, handelt es sich bei dem << um einen überladenen Operator.

TMsgDlgButtons ist wie folgt definiert:

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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Mengen in C++

  Alt 8. Feb 2008, 13:42
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
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Mengen in C++

  Alt 8. Feb 2008, 14:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Mengen in C++

  Alt 8. Feb 2008, 15:25
Ja aber es ging doch um C++ und nicht Delphi?
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Mengen in C++

  Alt 8. Feb 2008, 16:04
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()).
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Mengen in C++

  Alt 8. Feb 2008, 16:23
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Mengen in C++

  Alt 8. Feb 2008, 18:02
Zitat von Muetze1:
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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz