Die Klasse DynamicArray

  • Im Beispiel kann durch Klick auf den Button1 eine beliebige Anzahl neuer Fenster in der Mainform erzeugt werden, hierzu wird ein dynamisches Array angelegt, in welchem Zeiger auf die Forms hinterlegt werden.
  • Ein Klick auf Button2 zerstört das jeweils letzte Fenster.
  • *.h
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>

class TForm1 : public TForm
{
    __published: // Von der IDE verwaltete Komponenten
    TButton *Button1;
    TButton *Button2;
    TLabel *Label1;
    TLabel *Label2;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    private: // Anwender-Deklarationen
    public: // Anwender-Deklarationen

        __fastcall TForm1(TComponent* Owner);
        DynamicArray<TForm*->Form2; //dynamisches Array mit TForm-Zeigern
        int FensterNr;             //Nummer des letzten erzeugten Fensters
};
extern PACKAGE TForm1 *Form1;
#endif
  • *.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Randomize();
    FensterNr = 0;
    Form2.Length = 1; //Startlänge des Arrays = 1 setzen
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Neue Form mit Zufallsfarbe (rot, grün, blau) erzeugen
    Form2[FensterNr] = new TForm(Application);
    Form2[FensterNr]->Parent=this;
    Form2[FensterNr]->BorderStyle = bsSizeable;
    Form2[FensterNr]->Left=random(1000);
    Form2[FensterNr]->Top=random(700);
    Form2[FensterNr]->Height=300;
    Form2[FensterNr]->Width=300;

    switch (random(3))
    {
        case 0: Form2[FensterNr]->Color=clRed;
        break;
        case 1: Form2[FensterNr]->Color=clBlue;
        break;
        case 2: Form2[FensterNr]->Color=clGreen;
        break;
    }

    Form2[FensterNr]->Show();

    Form2.Length++; // Arraygröße erhöhen
    FensterNr++;    // Fensterzähler erhöhen
    Label1->Caption = IntToStr(FensterNr);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    if (FensterNr > 0)
    {
        FensterNr--;                //Fensterzähler wieder erniedrigen
        delete Form2[FensterNr];    //Letztes Fenster zerstören
        Form2.Length--;             //Array wieder verkleinern
        Label1->Caption = IntToStr(FensterNr);
    }
}