Kniffligen Ausdruck von Delphi nach C++ Builder umwandeln
-
Hallo,
ich weiß, dass man Delphi-Code mit dem Builder einbinden kann. Darum geht es hier aber nicht, sondern vielmehr ums Verständnis. Bekanntlich sind die beiden Sprachen über die VCL gleich. Viele Sachen kann ich mir herleiten.Bei dem folgenden Beispiel habe ich Schwierigkeiten. Insbesondere mit dem Bezug auf "Parent" bin ich unsicher und weiß nicht so recht wie ich den Term aus Delphi umsetzen könnte.
Kann mir jemand sagen, ob ich mit meiner Überlegung (s. u.) richtig liege oder vielleicht sogar einen Vorschlag machen?
Gegeben ist folgende Delphi-Procedure:
/*Delphi: procedure Class1.Func(Sender, Source: TObject; X, Y: Integer); .. if (TWinControl(Source).Parent is Class1) then ..
Dafür wäre meine Umsetzung für den C++ Builder:
void __fastcall Class1::Func(TObject* Sender, TObject* Source, int X, int Y){ Class1* c; Class1* d; c->Parent = (TWinControl*)Source; //ist das das Gleiche wie in Delphi? d = dynamic_cast <Class1*>(c); .. if (d) //cast erfolgreich? wenn ja liegt ein Class1-Typ vor ..
-
Hallo
In C++ sieht das so aus :
void __fastcall Class1::Func(TObject* Sender, TObject* Source, int X, int Y) { TWinControl* control = dynamic_cast<TWinControl*>(Source); if (control && (control->Parent == this)) { .. // cast erfolgreich und parent ist this-Instanz } ..
Allerdings bin ich mir nicht ganz sicher, ob "is class1" auch wirklich dem this-vergleich entspricht.
bis bald
akari
-
So ganz richtig ist das noch nicht.
TWinControl(Source) ist ein "hard cast", entspräche also, wie du vermutest, einem reinterpret_cast oder deinem C-Cast. Allerdings sehe ich in der Delphi-Prozedur keine Zuweisung an eine Parent-Eigenschaft. Auch ist deine Variable c uninitialisiert.Die exakte Umsetzung wäre etwa das hier:
void __fastcall Class1::Func(TObject* Sender, TObject* Source, int X, int Y) { if (dynamic_cast <Class1*> (reinterpret_cast <TWinControl*> (Source)->Parent)) ...; }
Allerdings würde ich das auch in Delphi anders machen:
procedure Class1.Func(Sender, Source: TObject; X, Y: Integer); begin if ((Source as TWinControl).Parent is Class1) then ...; end;
Mit dem as-Operator fliegt für den Fall, daß Source gar kein TWinControl ist, eine Exception, analog zu dynamic_cast<> mit Referenzen.
Dementsprechend in C++:
void __fastcall Class1::Func(TObject* Sender, TObject* Source, int X, int Y) { if (dynamic_cast <Class1*> (dynamic_cast <TWinControl&> (*Source).Parent) != 0) ...; }
akari schrieb:
Allerdings bin ich mir nicht ganz sicher, ob "is class1" auch wirklich dem this-vergleich entspricht.
Tut es nicht. is und as sind die Delphi-Äquivalente zu dynamic_cast<> mit Zeigern und mit Referenzen; mit Objektidentität hat das nichts zu tun.
-
Vielen Dank für Eure kompetente Hilfe, vor allem Dank an Audacia.
Erstklassige Antwort!!