"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.


Anmelden zum Antworten