Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

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

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

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.