Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [BCB] C++ Entsprechung zu Operator "is" (https://www.delphipraxis.net/112247-%5Bbcb%5D-c-entsprechung-zu-operator.html)

messie 17. Apr 2008 14:36


[BCB] C++ Entsprechung zu Operator "is"
 
Moin,

wie der Titel schon sagt, möchte ich auf Komponenten eines Forms zugreifen. In Delphi habe ich ja z.B.
Delphi-Quellcode:
if Owner.Components[i] is TControl then...
Etwas Ähnliches würde ich gerne im BCB machen, mir fehlt aber der passende Befehl.

Danke, Messie

nicodex 17. Apr 2008 14:45

Re: [BCB] C++ Entsprechung zu Operator "is"
 
Code:
dynamic_cast<Tx*>(x)
?

messie 17. Apr 2008 15:43

Re: [BCB] C++ Entsprechung zu Operator "is"
 
Zuerst habe ich ja gedacht, Dir wäre die Tastatur runtergefallen :zwinker:
Es funktioniert aber tatsächlich, vielen Dank schonmal.
Leider muss ich die Frage erweitern, denn ich möchte gerne auf die Kompo zugreifen und da brauche ich auch eine Entsprechung von

Delphi-Quellcode:
with dummy as TComponent...
Ich möchte einer Kompo eine freie Fehlermeldung mitgeben, die beim Start initialisiert wird.

Code:
TComponent *comp;
TMyComp *dummy;
for (int i = 0;i < Main->ComponentCount;i++)
{
  if((comp = dynamic_cast< TMyComp *>(Main->Components[i])) != 0)
  {
    dummy = (TMyComp)(comp);
    dummy->ErrMsg = Msg01;
  }
}
Ich bekomme aber die Meldung, dass ich dummy mit new anlegen soll, was ich nicht für richtig halte, denn comp gibt es ja und ich möchte auch nur comp was mitgeben.

Grüße, Messie

Muetze1 17. Apr 2008 16:57

Re: [BCB] C++ Entsprechung zu Operator "is"
 
Zitat:

Zitat von messie
Delphi-Quellcode:
with dummy as TComponent...

Gibt es nicht.

Code:
TMyComp *comp;
for (int i = 0;i < Main->ComponentCount;i++)
{
  if((comp = dynamic_cast< TMyComp *>(Main->Components[i])) != NULL )
  {
    comp->ErrMsg = Msg01;
  }
}
1. Du machst doch schon einen typecast, warum nutzt du dann nicht dessen Ergebnis?
2. Warum vergleichst du eine Instanz auf 0 anstatt auf NULL?
3. Die Fehlermeldung hat vollkommen Recht, da VCL Objekte nicht als lokale Objekte in indirekter Instanziierung benutzt werden können, aber genau das versuchst du: Du castest auf den direkten Typ und nicht auf einen Zeiger auf deinen Typ.

messie 17. Apr 2008 17:13

Re: [BCB] C++ Entsprechung zu Operator "is"
 
Zitat:

Zitat von Muetze1
[Du machst doch schon einen typecast, warum nutzt du dann nicht dessen Ergebnis?

Weil: Kopieren (aus der Hilfe) geht vor Kapieren...

Danke, Messie

Olli 18. Apr 2008 20:11

Re: [BCB] C++ Entsprechung zu Operator "is"
 
Zitat:

Zitat von Muetze1
2. Warum vergleichst du eine Instanz auf 0 anstatt auf NULL?

Was genau spricht dagegen? Defacto ist es portabler. NULL hingegen ist in einigen Implementationen typisiert (oder, schlimmer, mit #define und C-Typecast definiert) und dann wird es bei manchem C++-Compiler (und mitgelieferten Headern) mehr als nur eine Geschmacksfrage, ob man 0 oder NULL benutzt.

Das wird allerdings ohnehin nur ein Problem wenn man C und C++ (bspw. dank Headern) mischt und so dank der Tatsache, dass der Praeprozessor keine Grenzen (wie Namespaces) kennt, in C++ ploetzlich mit sowas wie
Code:
#define NULL (void*)0
konfrontiert wird. In den meisten Faellen wird das dann an der strikten Typisierung von C++ scheitern. Und in C++-Headern wird in den meisten Faellen ohnehin direkt stehen:
Code:
#define NULL 0
so dass es irrelevant wird.

Das schoene an der 0 ist ja gerade, dass sie keinerlei Einheit braucht (bzw. Typ im C++-Jargon) um einen Sinn zu machen. Wenn man mal den Code nach dem Durchlauf des Praeprozessors anschaut, ist da ohnehin kein Unterschied mehr. Aber eben wenn man C und C++ Header mischt oder aehnliche Dinge tut, die bewirken, dass das
Code:
#define NULL 0
eben gerade nicht gilt. Dann ist es ein kleiner bis riesiger Unterschied, je nach Kontext. Bei den Worten "je nach Kontext" werden sich bei jedem erfahrenen Entwickler die Fussnaegel aufrollen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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