VCL Form zur Laufzeit austauschen



  • Hallo,
    ich habe eine VCL Form (Form2) die ich von Form2 mit ->Show() öffne. Meine Anwendung läuft schon einige Zeit produktiv.
    ich habe eine neue Form erstellt und will zur Laufzeit entscheiden welche Form gestartet wird um ausgewählten Anwendern ein alternatives Design zu zeigen und
    andere nicht zu erschrecken.
    Zu einer Lösung wollte ich ChatGPT überreden. Der liefert:

    TForm* targetForm = nullptr;
    bool useForm2 = true; /* Ihre Entscheidungslogik hier */;
    if (useForm2)
    {
    targetForm = Form2;
    }
    else
    {
    targetForm = Form3;
    }
    targetForm->Edit1 = "blabla";

    Alle Controls müssen natürlich in beiden Forms mit gleichen Namen existieren.

    Ich bekomme jedoch den Fehler:
    no member named Edit1 in Vcl::Forms:TForms

    hat jemand eine Idee, wie man sowas hintricksen kann?



  • Da du targetForm (nur) als TForm deklariert hast, ist dort kein Member Edit1 bekannt.
    Du müßtest eine gemeinsame Basisklasse (Basisform) für beide Forms erstellen, welche dann die Member besitzt, die du von außen ansprechen möchtest.

    Unterscheiden sich denn beide Forms so sehr, daß du 2 benötigst, anstelle in der vorhandenen das Design programmiertechnisch zu wechseln?

    Edit:
    Es ginge auch noch per Codewiederholung:

    if (useForm2)
    {
      Form2->Edit1 = "blabla";
      targetForm = Form2;
    }
    else
    {
      Form3->Edit1 = "blabla";
      targetForm = Form3;
    }
    
    targetForm->Show();
    

    Dies ist aber eher ein schlechter Workaround.

    PS: Verwende bitte Code-Tags bei deinen Beiträgen.


Anmelden zum Antworten