Magoo Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Hallo, ich arbeite hier mit dem Borland C++ Builder 5.0 Enterprise. Ich möchte ein Programm schreiben, in dem der Benutzer optionale Eingabefelder selbst verwalten kann. Dazu ist es allerdings notwendig, das Edit-Felder auch dynamisch erstellt und angezeigt werden. Ich habe schon einiges herausgefunden, jedoch noch nicht ganz, wie ich es 100%ig dynamisch hinbekomme. Ich habe dazu erstmal ein kleines Testprogramm geschrieben. Dort gibt es ein fixes Edit-Feld sowie 2 Buttons. In dem Edit-Feld kann ich die Anzahl der zu generierenden Edit-Felder angeben. Ein Klick auf Button1 erstellt diese Edit-Felder dann auch wunderbar. Ein Klick auf Button2 löscht diese wieder. Ich habe in der .h-Datei gesagt, das es ein Array gibt. Dieser sieht wie folgt aus: TEdit *EditFelder[50]; Danach kann ich im Programm hingehen und die Edit-Felder erzeugen. Das kann z.B. so aussehen: for (int i = 0; i < Anzahl; i++) { EditFelder[i] = new TEdit(this); EditFelder[i]->Parent = Panel1; EditFelder[i]->Top = Pos; EditFelder[i]->Left = 100; Pos = Pos + 3 + EditFelder[i]->Height; } Später kann ich die Edit-Felder auch wieder löschen: for (int i = Anzahl - 1; i >= 0; i--) { delete EditFelder[i]; } Jetzt funktioniert das ganze wunderbar, allerdings habe ich ja so eine Beschrängung von maximal 50 Edit-Feldern. Das gefällt mir nicht so gut. Ich könnte jetzt hingehen und die 50 durch 5000 ersetzten. Aber das ist ja auch nicht der Sinn der Sache. Das Problem stellt sich bei Integer nicht. Da sieht das ganze so aus: int *Array; Array = new int[Anzahl]; delete [] Array; Wie muss ich es jetzt für TEdit umstricken? Das Problem ist, das ich Edit-Felder mit dem Befehl "EditFeld = new TEdit(this);" erzeugen muss. Und das (this) macht mir die Probleme. Ich hoffe ihr wisst jetzt, was ich meine. Wenn nicht, fragt doch bitte nochmal nach. Danke schonmal Magoo Zitieren
robotto7831a Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Ganz einfach. Du machst eine TList und speicherst die Objekte in dieser Liste und nicht im dem Array. Dann haste keine Beschränkung. Frank Zitieren
UltimateRuppi Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Das Problem stellt sich bei Integer nicht. Da sieht das ganze so aus: int *Array; Array = new int[Anzahl]; delete [] Array; Wie muss ich es jetzt für TEdit umstricken? Das Problem ist, das ich Edit-Felder mit dem Befehl "EditFeld = new TEdit(this);" erzeugen muss. Und das (this) macht mir die Probleme. Magoo Das ist nicht das gleiche, dein int-Beispiel legt ein "Int-Array" an, ein int*[] ist aber ein int-Pointer-Array also int** Du müsstest Dir demnach dynamisch ein Pointerarray anlegen, etwa sowas TEdit** pEditArray; pEditArray = new TEdit*[nAnzahl]; for (...) { pEditArray[i] = new TEdit(this); ... } Beim freigeben musst du zuerst wieder in der forschleife die einzelnen array-elemente freigeben und dann erst das Array mit delete[] Zitieren
Magoo Geschrieben 18. Oktober 2005 Autor Geschrieben 18. Oktober 2005 @ palvoelgyi Danke für den Tip. Hatte ich garnicht dran gedacht. Funktioniert prima. @ UltimateRuppi Auch dir danke ich für deine Lösung. Habe sie ausprobiert. Funktioniert auch super. Nur leider verstehe ich das ganze nicht so recht. TEdit** pEditArray; pEditArray = new TEdit*[nAnzahl]; Damit wird ein Pointer-Array erzeugt, wenn ich das richtig verstehe. Aber warum 2 Sterne hinter dem TEdit der ersten Zeile? Und wofür noch der Stern hinter TEdit in der 2. Zeile? for (...) { pEditArray[i] = new TEdit(this); ... } Damit wird der Speicher für die einzelnen Array-Elemente reserviert, richtig? Und den muss ich für jedes Element einzeln reservieren, weil ich vorher nur ein Pointer-Array habe, oder? Aber danke schonmal soweit für die Hilfe. Das Problem an sich ist gelöst. Es gibt halt nur noch Verständnisprobleme bei den oben genannten Code. Zitieren
UltimateRuppi Geschrieben 18. Oktober 2005 Geschrieben 18. Oktober 2005 Es ist im prinzip, genau das gleiche wie in deinem oben gennannten code, nur das das Array dynamisch angelegt wird. TEdit *EditFelder[50]; ist auch ein Pointer-Array, aber halt ein statisches mit der grösse 50. Du Speicherst hier diePointer auf die einzelnen EditFelder; mit TEdit** hast du ein Pointer auf das das Zeiger-Array; TEdit** pEditArray; pEditArray = new TEdit*[nAnzahl]; pEditArray[0] zeigt also auf den ersten TEdit* in der liste. Ich hoffe, dass das so verständlicher wurde PS: Die Lösung mit der Liste ist meines erachtens nach praktikabler, da diese auch ohne grossen aufwand dynamisch vergrössert werden kann Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.