"class of" oder ähnliches Konstrukt
-
Wollte mal fragen, ob obiges Konstrukt im C++Builder existiert. Ich hatte da eine Problem mit Lösung in Delphi und will das nun nach C++ portieren.
Ausgangslage:
- es existiert ein MainMenu
- mehrere Forms, die alle von einer erweiterten TForm-Klasse (TExForm) erben
- nach einem Klick auf einen Menübutton, wird über eine statische Methode der Name der Form abgefragt, existiert dieser Name noch nicht, dann wird die Form angelegt.Bsp. Pseudo. Code
TFormClass = class of TExForm; switch (PressedMenuButton) { case AuftragButton: TFormClass := AuftragForm; case AdressButton: TFormClass := AdressForm; case BlaBlaButton: TFormClass := BlaBlaButton; } if not NameExist(TFormClass.StaticNameCheck) then begin TFormClass.Create; end;
Bzw. wie könnte man das in C++ realisieren? Eine umständliche Möglichkeit wäre, obige Abfrage und Create für jede zu erstellende Form einzeln zu machen, das würde aber unheimlich Code duplizieren!
-
öh, vermutlich geht das mit
Application->FindComponent("Name der gesuchten Komponente. Kann auch ein Formular sein.");
-
nusu schrieb:
Wollte mal fragen, ob obiges Konstrukt im C++Builder existiert.
Mehr oder weniger. Klassenreferenzen in C++ sind nicht typisiert, daher ist es nicht möglich, virtuelle Klassenmethoden oder virtuelle Konstruktoren aufzurufen; das müßtest du von Delphi aus machen.
Angenommen, daß du im Wesentlichen von TComponent abgeleitete Klassen benutzt und dementsprechend den virtuellen TComponent-Konstruktor aufrufst, so könnte dein Code - vorausgesetzt, du hast zuvor eine kleine Helferfunktion namens CreateComponent() in Delphi implementiert -, folgendermaßen aussehen:
typedef TClass TFormClass; void __fastcall TMyForm::MyButtonClick (TObject* Sender) { TFormClass FormClass = 0; switch (/* whatever */) { case AuftragButton: FormClass = __classid (TAuftragForm); break; case AdressButton: FormClass = __classid (TAdressForm); break; case BlaBlaButton: FormClass = __classid (TBlaBlaForm); break; } if (!FormExists (FormClass.ClassName ())) AddForm (CreateComponent (FormClass, Application)); GetForm (FormClass.ClassName ())->Show (); }
Die Implementation für CreateComponent() ist trivial und kann hier nachgelesen werden.