Zum Inhalt springen

Borland C++ Builder: Beliebig viele Edit-Felder dynamisch generieren?


Magoo

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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[]

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...