Form mit Buttons usw. zur Laufzeit erstellen



  • Hallo

    but = new TButton(this);
      formf->but->Parent = this;
    

    Kein Wunder wenn du hier this übergibst. Owner und Parent müßen natürlich das neue Fenster sein

    but = new TButton(formf);
    but->Parent = formf;
    

    Desweiteren kannst du dann bei so erstellten Forms/Controls nicht mehr über ansonsten automatisch generierte Member zugreifen.
    Der Pointer buf ist dann eben kein Teil mehr von formf, nur die Instanz auf die buf zeigt ist Teil der Instanz die hinter formf steht.
    Desweiteren brauchst du für den Button kein Show aufrufen, das macht das Form wenn benötigt.
    Auch die Zuweisung des Events OnCreate (mal angesehen davon das OnCreate und OnDestroy nicht benutzt werden sollen) ist nicht so einfach zu machen, du verwendest so eine Methode aus einer ganz anderen Formklasse.

    Korrekt sieht also der Code so aus

    TForm *formf;
    formf = new TForm(this);
    formf->Left = 102;
    formf->Top = 185;
    formf->Width = 696;
    formf->Height = 480;
    formf->Caption = "formf";
    formf->Color = clBtnFace;
    formf->Font->Charset = DEFAULT_CHARSET;
    formf->Font->Color = clWindowText;
    formf->Font->Height = -11;
    formf->Font->Name = "MS Sans Serif";
    formf->OldCreateOrder = False;
    //  formf->OnCreate = FormCreate;
    formf->PixelsPerInch = 96;
    formf->Visible = true;
    
    TButton *but;
    but = new TButton(formf);
    but->Parent = forms;
    but->Caption = Edit1->Text;
    but->Width = 32;
    but->Height = 32;
    but->Top =  75;
    
    formf->ShowModal();
    delete formf;
    

    Das ist sozusagen ein technischer Rohbau. Um allerdings effizient und sinnvoll damit zuarbeiten zu können, solltest du zumindestens das Form selber noch aus einer eigens von TForm abgeleitenen Klasse erstellen. Das muß keine mit der IDE erstellte Klasse sein (TForm1), sondern kann ganz manuell mit den üblichen OOP-Mitteln definiert werden.
    Denn ohne eigene Formmethoden wird sonst die Behandlung der Events sehr kompliziert und verwirrend.
    Die Controls des Forms kannst du dann aber völlig frei erstellen und wenn nötig löschen.

    bis bald
    akari



  • ok ich hab das jetzt mal gemacht, klapt so weit 🙂
    aber ohne die letzten zwei zeilen in deinem code

    formf->ShowModal();
    delete formf;
    

    da sagt er das ein sichtares fenster nicht in Modal... darstellbar ist.

    ich glaube ich weis was du mir sagen willst, ich kann zwar damit meine form mit objecten versehen aber den einzelnen objecten schwierig eine action zuweisen oder?

    ich habe mir mal die erzeugten dateien vom builder angeschaut, wen ich eine Form1 mit dem IDE also GUI oberfläche vom builder erstelle, dann bekomme ich 5 dateien eine header, form, obj, source und eine ddp.

    kann ich den nicht irgendwie tricksen? das ich mir die form so erstelle, mit allen funktionen und objecten und diese dann immer wieder unter einem anderen namen aufrufen, aus meinem programm?
    😉

    wenn da nix geht, gibt es ein tut zum oop verfahren für dummies?



  • Hallo

    da sagt er das ein sichtares fenster nicht in Modal... darstellbar ist.

    Das liegt daran das davor noch

    formf->Visible = true;

    steht. Das muß da noch raus. Dann können die zwei Zeilen mit dem ShowModal wieder rein.

    ich glaube ich weis was du mir sagen willst, ich kann zwar damit meine form mit objecten versehen aber den einzelnen objecten schwierig eine action zuweisen oder?

    Ja genau. Es ist zwar grundsätzlich möglich, aber sehr unbequem und so nicht gedacht.

    kann ich den nicht irgendwie tricksen? das ich mir die form so erstelle, mit allen funktionen und objecten und diese dann immer wieder unter einem anderen namen aufrufen, aus meinem programm?

    Selbstverständlich kannst du von einer bereits vorhandenen Formklasse jederzeit auch weitere Instanzen erzeugen, und diese Instanzen auch weiter mit dynamischen Controls belegen. Das ist dann sozusagen das Optimum aus Komfort und Dynamik.

    bis bald
    akari



  • hab das ausprobiert mit der zeile...

    formf->Visible = true;
    

    wen ich das weg lasse, dann kann ich nur die eine form erstellen.
    aber nicht auf die hauptform, noch mal auf den button klicken, um weitere geichzeitig zu erstellen.

    Selbstverständlich kannst du von einer bereits vorhandenen Formklasse jederzeit auch weitere Instanzen erzeugen, und diese Instanzen auch weiter mit dynamischen Controls belegen. Das ist dann sozusagen das Optimum aus Komfort und Dynamik.

    das ist gut zu wissen, hört sich an als ob das das einfachste von der welt were wie du das schreibst, aber wie stell ich das an

    wie erstellt man eine instans, aus einer formklasse?

    😕



  • Hallo

    wen ich das weg lasse, dann kann ich nur die eine form erstellen.
    aber nicht auf die hauptform, noch mal auf den button klicken, um weitere geichzeitig zu erstellen.

    Ja das liegt an dem ShowModal. Das gesagt das die Anwendung außerhalb des aufgerufenen Forms angehalten wird, bis das Form wieder geschlossen wird.
    Du kannst statt dem

    formf->ShowModal();
    delete formf;
    

    auch

    formf->Show();
    

    oder meinetwegen

    formf->Visible = true;
    

    schreiben.
    Allerdings sollte das erst passieren nachdem alle Controls erstellt wurden.
    Und auf diese Art wird das Form auch nicht so ohne weiteres wieder freigegeben. Du müßtest zum Beispiel mit dem Close-Event das Löschen ausführen.

    wie erstellt man eine instans, aus einer formklasse?

    TForm2* new_form2 = new TForm2(Application);
    

    Jetzt weißt du warum ich sage, das hier Grundkenntnisse in Speiucherverwaltung und OOP notwendig sind.

    bis bald
    akari



  • moin,

    also das

    TForm2* new_form2 = new TForm2(Application);
    

    versteh ich nicht 😞

    hab jetzt angefangen eine erstellte form, aus der form datei zu bearbeiten..

    und hab ein problem 😞

    warum nimmt er das den nicht an?

    .....
    
    TComboBox *ComboBox1;
       ComboBox1 = new TComboBox(quik1);
        ComboBox1->Parent = quik1;
        ComboBox1->Left = 272;
        ComboBox1->Top = 32;
       ComboBox1->Width = 145 ;
        ComboBox1->Height = 21;
        ComboBox1->ItemHeight = 13;
        ComboBox1->ItemIndex = 0 ;
        ComboBox1->TabOrder = 10;
        ComboBox1->Text = "Auswahl";
    
        [b]ComboBox1->Items.Strings = (
          '1'
          '2'
          '3'
          '4'
          '5');[/b]
    

    ich glaube da fehlt mir noch das onchange event, das dachte ich mir verweise ich auf die eigentliche erstellte form.
    also alle events werden in der einen form deklariert sein und die erstelten buttons usw. greifen drauf zu(wie im faq's beispiel).

    ich weis nicht ob es zu umständlich ist, aber das ist der weg den ich noch meistern kann mit meinen kenntnissen und verständnis
    🙄

    danke für jede kleine hilfe



  • Hallo

    versteh ich nicht...

    TForm2* /* Deklariert einen Pointer auf eine Instanz der Klasse TForm2*/
     new_form2 /*Der Pointer bekommt den Namen new_form2. Du kannst hier auch andere Namen nehmen*/
    = new TForm2( /* Es wird eine neue Instanz von der Klasse TForm2 erstellt und den Pointer zugewiesen */
    Application /* Dem Form wird das Application-Objekt zugewiesen, damit sich dieses um da Löschen der Form-Instanz kümmert. Du kannst auch NULL übergeben, bist dann aber selbst für das Löschen verantwortlich*/
    );
    

    warum nimmt er das den nicht an?...

    Weil das noch nie gültiges C++ war, und auch nicht bei per IDE erzeugten Comboboxen gehen würde.
    Entweder so

    ComboBox1->Items->Add("1");
    ComboBox1->Items->Add("2");
    ComboBox1->Items->Add("3");
    ComboBox1->Items->Add("4");
    ComboBox1->Items->Add("5");
    

    oder so

    ComboBox1->Items->Text = "1\r\n2\r\n3\r\n4\r\n5";
    

    bis bald
    akari



  • Hallo

    ich glaube da fehlt mir noch das onchange event, das dachte ich mir verweise ich auf die eigentliche erstellte form.
    also alle events werden in der einen form deklariert sein und die erstelten buttons usw. greifen drauf zu(wie im faq's beispiel).

    Ja genauso würde ich das auch machen, das ist sehr bequem.
    Halte dich da einfach an die FAQ-Beiträge, wie du die Controls in den Eventmethoden auswerten kannst.

    bis bald
    akari



  • moin,

    das klappt wunderbar mit dem ersten beispiel

    ComboBox1->Items->Add("1");
    ComboBox1->Items->Add("2");
    ComboBox1->Items->Add("3");
    ComboBox1->Items->Add("4");
    ......
    

    werde das auch verwenden, find ich übersichtlicher, danke vielmals 🙂

    danke für die erläterung der zeile

    TForm2* new_form3 = new TForm2(Application);
    

    hab sie versucht in einen button1click event zu setzen, habe mir eine zweite form erstellt und dachte das er die form2 durch klicken des buttons erstellt.

    aber das klappt nicht, wie soll ich den die zeile einbinden?



  • Hallo

    Die Zeile erzeugt eine Form-Instanz, aber zeigt sie nicht an.
    In den Button-Event muß also noch etwas mit Show

    TForm2* new_form2 = new TForm2(Application);
    new_form2->ShowModal();
    delete new_form2;
    

    oder

    TForm2* new_form2 = new TForm2(Application);
    new_form2->Show();
    

    Im zweiten Fall (und nur dort) sollte allerdings die Klasse TForm2 noch den OnClose-Event benutzen, um an desen Parameter Action caFree zu übergeben. Sonst sammeln sich da Instanzen.

    bis bald
    akari



  • Macht er auch, aber vermutlich hast Du den Zeiger auch innerhalb der ButtonClick-Methode deklariert. Somit ist er beim Verlassen der Methode nicht mehr verfügbar.

    akarie hat es schon richtig erkannt:

    akari schrieb:

    Jetzt weißt du warum ich sage, das hier Grundkenntnisse in Speiucherverwaltung und OOP notwendig sind.



  • also wen ich das in der haupt form, oder im click event setze, sagt er ...

    Undefiniertes Symbol 'TForm2'
    Undefiniertes Symbol 'new_form2'
    Typname erwartet
    In Anweisung fehlt ;

    habe auch versucht die zeile in die creat stelle der hauptform zu setzen.
    und die show zeilen in den button click event, gibt das gleiche problem 😞

    ja mir fehlen grundkenntnisse, deshalb arbeite ich ja dran 😉



  • Nun ja, die Grundlagen solltest Du beherrschen, bevor Du dich an GUI-Programmen unter Windows versuchst.



  • hawkdz schrieb:

    also wen ich das in der haupt form, oder im click event setze, sagt er ...

    Undefiniertes Symbol 'TForm2'
    Undefiniertes Symbol 'new_form2'
    Typname erwartet
    In Anweisung fehlt ;

    Du must natürlich noch den Header von TForm2 dort includen, wo du es aufrufen willst.

    bis bald
    akari



  • ach sorry mein fehler hab der form2 die unit1 includet, aber vergessen der form1 die unit2 zu includen 😡

    das ist ja genial akari danke dir vielmals!!!! 👍 🙂


Anmelden zum Antworten