Form mit Buttons usw. zur Laufzeit erstellen



  • 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