Announcement

Collapse
No announcement yet.

Aus FormClassName ein Object von TForm erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aus FormClassName ein Object von TForm erzeugen

    Ich speichere in einer Stringlist den Namen von TFormClass also für TForm1.ClassName = 'TForm1' ... Nun möchte ich zum Späteren Zeitpunkt anhand des ClassNames ein neues Form erzeugen geht das?

    procedure TForm1.Button2Click(Sender: TObject);
    var
    xClass : TFormClass;
    begin
    xClass.ClassName := 'TForm1';
    with xClass.Create(Application) do
    begin
    try
    ShowModal;
    finally
    free;
    end;
    end;
    end;

    Nur Leider ist ClassName ein ReadOnlyProperty!

    Ich hab auch schon ('TForm1' as TFormClass).Create ...
    probiert geht leider auch nicht!

    Danke für die Hilfe

  • #2
    Hallo Klaus,<BR><BR>
    Wenn du nur den Klassename speicherst, musst du die Klassenreferenz erst mit FindClass(AClassName) holen.<BR>
    In etwa...<PRE>
    var
    ViewClass : TFormClass;
    begin
    ViewClass := TFormClass(FindClass('TForm1'));
    if Assigned(ViewClass) then
    begin
    with ViewClass.Create(Self) do
    begin
    Show;
    // ...
    end
    end
    end;
    </PRE>
    Fran

    Comment


    • #3
      Hallo und danke für die schnelle Antwort. Nur leider geht es mit FindClass nicht, Ich habe es sogar mit dem Hauptformular probiert
      und der sagt immer TForm1 existiert nicht! Obwohl es vorhanden ist! muss ich noch eine andere Unit einbinden oder klappt FindClass bei Formularen nicht

      Comment


      • #4
        Hi Klaus,<BR>
        hatte ich noch vergessen...<BR>
        in jeder Formular - Unit<BR>
        <PRE><CODE>
        initialization
        RegisterClass(TForm1);
        </PRE></CODE>
        natürlich statt TForm1 die richtige Klasse...<BR>
        Fran

        Comment


        • #5
          Danke so geht es, nur leider ist dieses vorgehen in der Kcomponentenentwicklung nicht so günstig. Ich wollte eigentlich
          nur eine Komponente auf das Formular legen. Kann man die Zuweisung RegisterClass auch in einer Componente vornehmen

          Comment


          • #6
            Ja, dafür hat jede Unit einen Initialization-Abschnitt.

            Mari
            Schöne Grüße, Mario

            Comment


            • #7
              du kannst RegisterClass auch im Initialization deiner Komponente unterbringen. Dazu müssen aber alle Formular Units in der Uses deine Kompo stehen. Ich weiss nicht, ob du das willst.<BR>
              Was soll denn die Komponente machen. Willst du jedes Form in eine Komponente verpacken?<BR>
              Fran

              Comment


              • #8
                Hallo Frank, ich möchte ich einer sogenannten "Trägerkomponente" die auf dem Hauptformular liegt, eine Liste aller Formulare die im Projekt vorhanden sind speichern, um Später bestimmte Properties des Formulare auszulesen zu bearbeiten etc. Da ich nicht direkt auf TForms in Komponenten zurückgreifen kann, habe ich eine "Formkomponente" geschrieben, die nichts anderes macht als den Formularnamen bzw. FormClassNamen der Owner an die "Trägerkomponente" übergibt. Wenn ich nun bestimme Eigenschaften eines Formulares benötige, suche ich das entsprechende Fromular aus der Trägerkomponente, erstelle es undso auf die entsprechenden Informationen zugreifen

                Comment


                • #9
                  Hi Klaus,<BR><BR>
                  ich würde für diesen Fall nicht zu Komponenten greifen.<BR>
                  Du müsstest ja zur Entwurfszeit die Klassenname oder die Klassenreferenz speichern. Aus meiner Sicht kommst du um das RegisterClass nicht herum.<BR>
                  Aber da es sowiese sinnvoll ist, seine Formulare mit einer Struktur vorzuhalten, würde ich eine Art FormularController schreiben. Für die Formularbeschreibung eine eigene Klasse, eine Liste mit den Formularbeschreibungen und eine Methode RegisterFormular, welche ein Form mit seiner Beschreibung im Formularcontroller einträgt. Dann hast du zwar immer noch einen Eintrag pro FormularUnit, aber das ist auch bei mir in meinen Projekten Standard. Alle Datenmodule und alle Formulare werden in einem eigenen AppControl registriert und verwaltet.<BR>
                  <BR>Gruß, Fran

                  Comment


                  • #10
                    Danke für die Infos, muss der Aufruf des RegisterClass(TForm1);
                    immer im initialization Bereich erfolgen, des jeweiligen Formulars erfolgen oder kann ich zentral alle Formulare Registrieren? Wie sehe so ein AppControl aus, bzw. hast Du ein Beispiel für deinen Vorschlag?

                    Comment


                    • #11
                      RegisterClass kannst du auch für alle Forms in einer Unit im Abschnitt Initialization durchführen.<BR>
                      Als kleines Beispiel hilft dir vielleicht folgendes:

                      <a href="http://www.entwickler-forum.de/WebX?13@@.4a871111/2">Beitrag Formularvererbung</a>
                      <BR>
                      Fran

                      Comment

                      Working...
                      X