Form mit Buttons usw. zur Laufzeit erstellen
-
hallo akari,
ja habe mir die fag's "komponenten benutzen" angeschaut, bekomme auch buttons uns. auf eine form hin, aber eine schon vorgefertigte.
ich kann auch eine form zur laufzeit erzeugen, mit diesem code..
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;aber auch nur diese form, möchte aber auf dieser form zb. noch ein button erzeugen.
habe das so versucht...
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(this); formf->but->Parent = this; formf->but->Caption = Edit1->Text; formf->but->Width = 32; formf->but->Height = 32; formf->but->Top = 75; formf->but->Show();gibt es den nicht die möglichkeit die form zu erstellen und dann die objecte daruf?
den dabei sagt er mir das "but", kein element von tform ist.gibt es den irgendwo ein code schnippsel dafür?
-
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 codeformf->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 demformf->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 soComboBox1->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 ShowTForm2* 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!!!!
