Browse Source

Besseres Reference Counting

kolja 5 years ago
parent
commit
f56e3bbefb
38 changed files with 359 additions and 805 deletions
  1. 53 69
      AlphaFeld.cpp
  2. 0 7
      AlphaFeld.h
  3. 4 21
      Animation.cpp
  4. 0 7
      Animation.h
  5. 15 0
      Array.h
  6. 15 31
      AuswahlBox.cpp
  7. 0 7
      AuswahlBox.h
  8. 31 33
      Bildschirm.cpp
  9. 6 12
      Bildschirm.h
  10. 5 30
      Diagramm.cpp
  11. 0 10
      Diagramm.h
  12. 48 40
      Fenster.cpp
  13. 6 12
      Fenster.h
  14. 3 19
      Fortschritt.cpp
  15. 0 7
      Fortschritt.h
  16. 1 0
      Framework.vcxproj
  17. 3 0
      Framework.vcxproj.filters
  18. 0 14
      Kamera2D.cpp
  19. 0 3
      Kamera2D.h
  20. 7 39
      Knopf.cpp
  21. 0 14
      Knopf.h
  22. 9 25
      Liste.cpp
  23. 0 7
      Liste.h
  24. 0 16
      M2DVorschau.cpp
  25. 0 7
      M2DVorschau.h
  26. 1 25
      Rahmen.cpp
  27. 0 13
      Rahmen.h
  28. 0 16
      Scroll.cpp
  29. 1 7
      Scroll.h
  30. 54 50
      Tabelle.cpp
  31. 23 18
      Tabelle.h
  32. 1 17
      TextFeld.cpp
  33. 0 7
      TextFeld.h
  34. 2 13
      ToolTip.cpp
  35. 1 4
      ToolTip.h
  36. 50 0
      UIMLView.h
  37. 11 150
      Zeichnung.cpp
  38. 9 55
      Zeichnung.h

+ 53 - 69
AlphaFeld.cpp

@@ -10,10 +10,9 @@ using namespace Framework;
 // Inhalt der AlphaFeld Klasse aus AlphaFeld.h
 // Konstruktor 
 AlphaFeld::AlphaFeld()
-	: Zeichnung(),
-	strength( 5 ),
-	farbe( 0x9B000000 ),
-	ref( 1 )
+    : Zeichnung(),
+    strength( 5 ),
+    farbe( 0x9B000000 )
 {}
 
 AlphaFeld::~AlphaFeld()
@@ -22,90 +21,75 @@ AlphaFeld::~AlphaFeld()
 // nicht constant 
 void AlphaFeld::setStrength( int st ) // setzt die Stärke
 {
-	strength = st;
-	rend = 1;
+    strength = st;
+    rend = 1;
 }
 
 void AlphaFeld::setFarbe( int f ) // setzt die Farbe
 {
-	farbe = f;
-	rend = 1;
+    farbe = f;
+    rend = 1;
 }
 
 void AlphaFeld::render( Bild &zRObj ) // zeichnet nach zRObj
 {
-	Zeichnung::render( zRObj );
-	int br = gr.x - 1;
-	int hi = gr.y - 1;
-	int xp = pos.x, yp = pos.y;
-	int a = ( farbe >> 24 ) & 0xFF;
-	int index = ( br / 2 ) * ( br <= hi ) + ( hi / 2 ) * ( br > hi );
-	int fc = farbe & 0x00FFFFFF;
-	int fc2 = farbe;
-	if( strength > 0 )
-		index = index > ( a / strength ) ? a / strength : index;
-	if( strength < 0 )
-		index = index > ( ( 255 - a ) / -strength ) ? ( ( 255 - a ) / -strength ) : index;
-	for( int i = 0; i < index; ++i )
-	{
-		a -= strength;
-		fc2 = ( a << 24 ) | fc;
-		int i2 = i << 1;
-		zRObj.drawLinieHAlpha( xp + i + 1, yp + i, br - i2, fc2 );		// oben links --- oben rechts
-		zRObj.drawLinieVAlpha( xp + br - i, yp + i + 1, hi - i2, fc2 );	// oben rechts -- unten rechts
-		zRObj.drawLinieHAlpha( xp + i, yp + hi - i, br - i2, fc2 );		// unten rechts - unten links
-		zRObj.drawLinieVAlpha( xp + i, yp + i, hi - i2, fc2 );			// unten links -- oben links
-	}
-	if( index == br / 2 )
-	{
-		for( int i = index; i <= index + ( br - index ) - index; ++i )
-			zRObj.drawLinieVAlpha( xp + i, yp + index, hi - ( index << 1 ) + 1, fc2 ); // rest Fläche senkrecht
-	}
-	else
-	{
-		for( int i = index; i <= index + ( hi - index ) - index; ++i )
-			zRObj.drawLinieHAlpha( xp + index, yp + i, br - ( index << 1 ) + 1, fc2 ); // rest Fläche waagerecht
-	}
+    Zeichnung::render( zRObj );
+    int br = gr.x - 1;
+    int hi = gr.y - 1;
+    int xp = pos.x, yp = pos.y;
+    int a = ( farbe >> 24 ) & 0xFF;
+    int index = ( br / 2 ) * ( br <= hi ) + ( hi / 2 ) * ( br > hi );
+    int fc = farbe & 0x00FFFFFF;
+    int fc2 = farbe;
+    if( strength > 0 )
+        index = index > ( a / strength ) ? a / strength : index;
+    if( strength < 0 )
+        index = index > ( ( 255 - a ) / -strength ) ? ( ( 255 - a ) / -strength ) : index;
+    for( int i = 0; i < index; ++i )
+    {
+        a -= strength;
+        fc2 = ( a << 24 ) | fc;
+        int i2 = i << 1;
+        zRObj.drawLinieHAlpha( xp + i + 1, yp + i, br - i2, fc2 );		// oben links --- oben rechts
+        zRObj.drawLinieVAlpha( xp + br - i, yp + i + 1, hi - i2, fc2 );	// oben rechts -- unten rechts
+        zRObj.drawLinieHAlpha( xp + i, yp + hi - i, br - i2, fc2 );		// unten rechts - unten links
+        zRObj.drawLinieVAlpha( xp + i, yp + i, hi - i2, fc2 );			// unten links -- oben links
+    }
+    if( index == br / 2 )
+    {
+        for( int i = index; i <= index + ( br - index ) - index; ++i )
+            zRObj.drawLinieVAlpha( xp + i, yp + index, hi - ( index << 1 ) + 1, fc2 ); // rest Fläche senkrecht
+    }
+    else
+    {
+        for( int i = index; i <= index + ( hi - index ) - index; ++i )
+            zRObj.drawLinieHAlpha( xp + index, yp + i, br - ( index << 1 ) + 1, fc2 ); // rest Fläche waagerecht
+    }
 }
 
 // constant 
 int AlphaFeld::getStrength() const // gibt die Stärke zurück
 {
-	return strength;
+    return strength;
 }
 
 int AlphaFeld::getFarbe() const // gibt die Farbe zurück
 {
-	return farbe;
+    return farbe;
 }
 
 Zeichnung *AlphaFeld::dublizieren() const // Kopiert das Zeichnung
 {
-	AlphaFeld *obj = new AlphaFeld();
-	obj->setPosition( pos );
-	obj->setSize( gr );
-	obj->setMausEreignisParameter( makParam );
-	obj->setTastaturEreignisParameter( takParam );
-	obj->setMausEreignis( mak );
-	obj->setTastaturEreignis( tak );
-	if( toolTip )
-		obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
-	obj->setStrength( strength );
-	obj->setFarbe( farbe );
-	return obj;
-}
-
-// Reference Counting 
-AlphaFeld *AlphaFeld::getThis()
-{
-	++ref;
-	return this;
-}
-
-AlphaFeld *AlphaFeld::release()
-{
-	--ref;
-	if( !ref )
-		delete this;
-	return 0;
+    AlphaFeld *obj = new AlphaFeld();
+    obj->setPosition( pos );
+    obj->setSize( gr );
+    obj->setMausEreignisParameter( makParam );
+    obj->setTastaturEreignisParameter( takParam );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
+    if( toolTip )
+        obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
+    obj->setStrength( strength );
+    obj->setFarbe( farbe );
+    return obj;
 }

+ 0 - 7
AlphaFeld.h

@@ -14,7 +14,6 @@ namespace Framework
     private:
         int strength;
         int farbe;
-        int ref;
 
     public:
         // Konstruktor 
@@ -36,12 +35,6 @@ namespace Framework
         __declspec( dllexport ) int getFarbe() const;
         // Kopiert das Alpha Feld, so dass es ohne auswirkungen auf das Original verwendet werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) AlphaFeld *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) AlphaFeld *release();
     };
 }
 

+ 4 - 21
Animation.cpp

@@ -17,8 +17,7 @@ Animation2DData::Animation2DData()
     wiederhohlen( 0 ),
     transparent( 0 ),
     ref( 1 )
-{
-}
+{}
 
 // Destruktor
 Animation2DData::~Animation2DData()
@@ -212,8 +211,7 @@ Animation2D::Animation2D()
     rahmen( 0 ),
     ram( 0 ),
     aps( 255 * 60 ),
-    sichtbar( 0 ),
-    ref( 1 )
+    sichtbar( 0 )
 {}
 
 // Destruktor
@@ -334,7 +332,7 @@ void Animation2D::render( Bild &zRObj )
         unlockZeichnung();
         return;
     }
-	Zeichnung::render( zRObj );
+    Zeichnung::render( zRObj );
     data->lock();
     if( data->zBild( jetzt ) )
     {
@@ -388,7 +386,7 @@ bool Animation2D::hatRahmen() const
 
 Rahmen *Animation2D::getRahmen() const
 {
-    return ram ? ram->getThis() : 0;
+    return ram ? (Rahmen*)ram->getThis() : 0;
 }
 
 Rahmen *Animation2D::zRahmen() const
@@ -429,19 +427,4 @@ Zeichnung *Animation2D::dublizieren() const
         ret->setRahmenFarbe( ram->getFarbe() );
     }
     return ret;
-}
-
-// Reference Counting
-Animation2D *Animation2D::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Animation2D *Animation2D::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 7
Animation.h

@@ -90,7 +90,6 @@ namespace Framework
         Rahmen *ram;
         int aps;
         bool sichtbar;
-        int ref;
 
     public:
         // Konstruktor
@@ -149,12 +148,6 @@ namespace Framework
         __declspec( dllexport ) int getRahmenFarbe() const;
         // Kopiert die Animation, so dass sie ohne auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) Animation2D *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) Animation2D *release();
     };
 }
 

+ 15 - 0
Array.h

@@ -776,6 +776,21 @@ namespace Framework
             return (TYP*)0;
         }
 
+        // Überprüft, ob ein Element in der Liste enthalten ist
+        //  i: Der Index des gesuchten Elementes
+        //  return: (true), wenn der Index vorhanden ist. (false) sonnst
+        bool hat( int i ) const
+        {
+            if( i < 0 )
+                return 0;
+            ArrayEintrag< TYP* > *e = entries;
+            for( int a = 0; a < i && e; ++a )
+                e = e->next;
+            if( e && e->set )
+                return 1;
+            return 0;
+        }
+
         // Erhöht den Reference Counting Zähler.
         //  return: this.
         RCArray< TYP > *getThis()

+ 15 - 31
AuswahlBox.cpp

@@ -47,8 +47,7 @@ AuswahlBox::AuswahlBox()
     mausEintrag( 0 ),
     scrollAnzeigen( 0 ),
     eAkP( 0 ),
-    eAk( 0 ),
-    ref( 1 )
+    eAk( 0 )
 {
     vertikalScrollBar = new VScrollBar();
     style = Style::Normal;
@@ -808,7 +807,7 @@ bool AuswahlBox::tick( double tickVal ) // tick
         ausgeklappt = 0;
     rend |= ausfahren->tick( tickVal );
     this->tickval += tickVal * 300;
-    int val = ( int )this->tickval;
+    int val = (int)this->tickval;
     if( val < 1 )
         return ZeichnungHintergrund::tick( tickVal );
     this->tickval -= val;
@@ -1122,7 +1121,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlBuffer ) )
                     {
                         tmpBuffer = tf->getAlphaFeld();
-                        tf->setAlphaFeldZ( auswAf->getThis() );
+                        tf->setAlphaFeldZ( (AlphaFeld*)auswAf->getThis() );
                         tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                         tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
                     }
@@ -1148,7 +1147,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlRahmen ) )
                     {
                         tmpRahmen = tf->getRahmen();
-                        tf->setRahmenZ( auswRahmen->getThis() );
+                        tf->setRahmenZ( (Rahmen*)auswRahmen->getThis() );
                         tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                         tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
                     }
@@ -1303,7 +1302,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlBuffer ) )
                         {
                             tmpBuffer = tf->getAlphaFeld();
-                            tf->setAlphaFeldZ( auswAf->getThis() );
+                            tf->setAlphaFeldZ( (AlphaFeld*)auswAf->getThis() );
                             tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                             tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
                         }
@@ -1329,7 +1328,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlRahmen ) )
                         {
                             tmpRahmen = tf->getRahmen();
-                            tf->setRahmenZ( auswRahmen->getThis() );
+                            tf->setRahmenZ( (Rahmen*)auswRahmen->getThis() );
                             tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                             tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
                         }
@@ -1381,7 +1380,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::MausBuffer ) )
                         {
                             tmpBuffer = tf->getAlphaFeld();
-                            tf->setAlphaFeldZ( mausAf->getThis() );
+                            tf->setAlphaFeldZ( (AlphaFeld*)mausAf->getThis() );
                             tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                             tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::MausBuffer ) );
                         }
@@ -1407,7 +1406,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::MausRahmen ) )
                         {
                             tmpRahmen = tf->getRahmen();
-                            tf->setRahmenZ( mausRahmen->getThis() );
+                            tf->setRahmenZ( (Rahmen*)mausRahmen->getThis() );
                             tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                             tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::MausRahmen ) );
                         }
@@ -1655,7 +1654,7 @@ Knopf *AuswahlBox::getAusklappKnopf() const // gibt den aus-/einklapp Knopf zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return ausfahren ? ausfahren->getThis() : 0;
+    return ausfahren ? (Knopf*)ausfahren->getThis() : 0;
 }
 
 Knopf *AuswahlBox::zAusklappKnopf() const
@@ -1768,7 +1767,7 @@ Rahmen *AuswahlBox::getAuswRahmen() const // gibt den Auswahl Rahmen zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return auswRahmen ? auswRahmen->getThis() : 0;
+    return auswRahmen ? (Rahmen*)auswRahmen->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zAuswRahmen() const
@@ -1796,7 +1795,7 @@ AlphaFeld *AuswahlBox::getAuswAlphaFeld() const // gibt das Auswahl AlphaFeld zu
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return auswAf ? auswAf->getThis() : 0;
+    return auswAf ? (AlphaFeld*)auswAf->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zAuswAlphaFeld() const
@@ -1847,7 +1846,7 @@ Rahmen *AuswahlBox::getMsAuswRahmen( int i ) const // gibt den Multistyle Auswah
         return 0;
     if( !msAuswRahmen )
         return 0;
-    return msAuswRahmen->z( i ) ? msAuswRahmen->z( i )->getThis() : 0;
+    return msAuswRahmen->z( i ) ? (Rahmen*)msAuswRahmen->z( i )->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zMsAuswRahmen( int i ) const
@@ -1883,7 +1882,7 @@ AlphaFeld *AuswahlBox::getMsAuswAlphaFeld( int i ) const // gibt das Multistyle
         return 0;
     if( !msAuswAf )
         return 0;
-    return msAuswAf->z( i ) ? msAuswAf->z( i )->getThis() : 0;
+    return msAuswAf->z( i ) ? (AlphaFeld*)msAuswAf->z( i )->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zMsAuswAlphaFeld( int i ) const
@@ -1944,7 +1943,7 @@ Rahmen *AuswahlBox::getMausRahmen() const // gibt den Maus Rahmen zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return mausRahmen ? mausRahmen->getThis() : 0;
+    return mausRahmen ? (Rahmen*)mausRahmen->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zMausRahmen() const
@@ -1972,7 +1971,7 @@ AlphaFeld *AuswahlBox::getMausAlphaFeld() const // gibt das Maus AlphaFeld zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return mausAf ? mausAf->getThis() : 0;
+    return mausAf ? (AlphaFeld*)mausAf->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zMausAlphaFeld() const
@@ -2197,19 +2196,4 @@ Zeichnung *AuswahlBox::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     }
     obj->setAlphaFeldFarbe( auswahl );
     return obj;
-}
-
-// Reference Counting
-AuswahlBox *AuswahlBox::getThis()
-{
-    ++ref;
-    return this;
-}
-
-AuswahlBox *AuswahlBox::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 7
AuswahlBox.h

@@ -76,7 +76,6 @@ namespace Framework
         bool scrollAnzeigen;
         void *eAkP;
         std::function< void( void *, AuswahlBox *, int, int ) > eAk;
-        int ref;
 
     public:
         // Konstruktor 
@@ -514,12 +513,6 @@ namespace Framework
         //  abStyle: Der Style
         __declspec( dllexport ) inline bool hatMsStyleNicht( int i, __int64 abStyle ) const;
         __declspec( dllexport ) Zeichnung *dublizieren() const override; // Erzeugt eine Kopie des Zeichnungs
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) AuswahlBox *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) AuswahlBox *release();
     };
 }
 

+ 31 - 33
Bildschirm.cpp

@@ -36,7 +36,7 @@ Bildschirm::Bildschirm( WFenster *f )
     : fenster( f ),
     renderB( new Bild( 1 ) ),
     ref( 1 ),
-    members( new ZeichnungArray() ),
+    members( new RCArray<Zeichnung>() ),
     fillColor( 0xFF000000 ),
     deckFarbe( 0 ),
     onTop( 0 ),
@@ -64,10 +64,12 @@ Bildschirm::~Bildschirm()
     if( fenster )
         fenster->release();
 #endif
-    delete members;
+    members->release();
     tipAnzahl = 0;
     tips->release();
     renderZeit->release();
+    if( onTop )
+        onTop->release();
     unlock();
 }
 
@@ -109,6 +111,8 @@ void Bildschirm::setOnTop( bool onTop ) // legt fest, ob das onTop Zeichnung ger
 void Bildschirm::setOnTopZeichnung( Zeichnung *obj ) // setzt das OnTop Zeichnung
 {
     lock();
+    if( onTop )
+        onTop->release();
     onTop = obj;
     rend = 1;
     unlock();
@@ -123,17 +127,19 @@ void Bildschirm::setdeckFarbe( int f ) // setzt die deckFarbe
 void Bildschirm::addMember( Zeichnung *obj ) // Fügt ein Zeichnung hinzu
 {
     lock();
-    members->addZeichnung( obj );
-    members->updateIndex( 0 );
+    members->add( obj );
     rend = 1;
     unlock();
 }
 
-void Bildschirm::removeMember( Zeichnung *obj ) // Entfernt ein Zeichnung
+void Bildschirm::removeMember( Zeichnung *zObj ) // Entfernt ein Zeichnung
 {
     lock();
-    members->removeZeichnung( obj );
-    members->updateIndex( 0 );
+    for( int i = 0; i < members->getEintragAnzahl(); i++ )
+    {
+        if( members->z( i ) == zObj )
+            members->remove( i );
+    }
     rend = 1;
     unlock();
 }
@@ -159,7 +165,8 @@ void Bildschirm::tick( double tickval )
     {
         for( int i = 0; i < tipAnzahl; ++i )
             rend |= tips->z( i )->tick( tickval );
-        rend |= members->tick( tickval );
+        for( auto i = members->getIterator(); i; i++ )
+            rend |= i->tick( tickval );
     }
     else if( onTop )
     {
@@ -205,7 +212,8 @@ void Bildschirm::doMausEreignis( MausEreignis &me ) // sendet maus Ereignis
     {
         for( int i = 0; i < tipAnzahl; ++i )
             tips->z( i )->doMausEreignis( me );
-        members->sendMausAll( me );
+        for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+            members->z( i )->doMausEreignis( me );
     }
     else if( onTop )
     {
@@ -220,7 +228,10 @@ void Bildschirm::doTastaturEreignis( TastaturEreignis &te ) // sendet tastatur E
 {
     lock();
     if( !renderOnTop )
-        members->sendTastaturAll( te );
+    {
+        for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+            members->z( i )->doTastaturEreignis( te );
+    }
     else if( onTop )
         onTop->doTastaturEreignis( te );
     unlock();
@@ -266,9 +277,9 @@ Bild *Bildschirm::zRenderBild() const
     return renderB;
 }
 
-ZeichnungArray *Bildschirm::getMembers() const // gibt die Zeichnunge zurück
+Iterator<Zeichnung*> Bildschirm::getMembers() const // gibt die Zeichnunge zurück
 {
-    return members;
+    return members->getIterator();
 }
 
 int Bildschirm::getFillFarbe() const // gibt die Füll Farbe zurück
@@ -443,12 +454,14 @@ void Bildschirm2D::render() // Zeichnet das Bild
             if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
             {
                 renderB->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
-                members->render( *renderB ); // zeichnen nach zwischenbuffer
+                for( auto i = members->getIterator(); i; i++ )
+                    i->render( *renderB ); // zeichnen nach zwischenbuffer
                 renderB->releaseAlpha();
             }
             else
             {
-                members->render( *renderB ); // zeichnen nach zwischenbuffer
+                for( auto i = members->getIterator(); i; i++ )
+                    i->render( *renderB ); // zeichnen nach zwischenbuffer
                 if( renderOnTop && deckFarbe )
                     renderB->alphaRegion( 0, 0, renderB->getBreite(), renderB->getHeight(), deckFarbe );
             }
@@ -496,14 +509,6 @@ void Bildschirm2D::render() // Zeichnet das Bild
     rend = 0;
 }
 
-Bildschirm *Bildschirm2D::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Bildschirm3D
 // Konstruktor 
 Bildschirm3D::Bildschirm3D( WFenster *fenster )
@@ -970,12 +975,14 @@ void Bildschirm3D::render() // Zeichnet das Bild
                 if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
                 {
                     renderB->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
-                    members->render( *renderB ); // zeichnen nach zwischenbuffer
+                    for( auto i = members->getIterator(); i; i++ )
+                        i->render( *renderB ); // zeichnen nach zwischenbuffer
                     renderB->releaseAlpha();
                 }
                 else
                 {
-                    members->render( *renderB ); // zeichnen nach zwischenbuffer
+                    for( auto i = members->getIterator(); i; i++ )
+                        i->render( *renderB ); // zeichnen nach zwischenbuffer
                     if( renderOnTop && deckFarbe )
                         renderB->alphaRegion( 0, 0, renderB->getBreite(), renderB->getHeight(), deckFarbe );
                 }
@@ -1026,13 +1033,4 @@ void Bildschirm3D::render() // Zeichnet das Bild
     rendering = 0;
     rend = 0;
 }
-
-// Reference Counting 
-Bildschirm *Bildschirm3D::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
 #endif

+ 6 - 12
Bildschirm.h

@@ -63,7 +63,7 @@ namespace Framework
         WFenster *fenster;
         Bild *renderB;
         int ref;
-        ZeichnungArray *members;
+        RCArray<Zeichnung> *members;
         int fillColor;
         int deckFarbe;
         Zeichnung *onTop;
@@ -116,8 +116,8 @@ namespace Framework
         //  obj: Die Zeichnung
         __declspec( dllexport ) virtual void addMember( Zeichnung *obj );
         // Entfernt eine Zeichnung aus dem Bild. Darf nicht aufgerufen werden, wärend doMausEreignis(), doTastaturEreignis(), tick() oder render() aufgerufen wird.
-        //  obj: Die Zeichnung
-        __declspec( dllexport ) virtual void removeMember( Zeichnung *obj );
+        //  obj: Die Zeichnung (ohne erhöhten reference Counter)
+        __declspec( dllexport ) virtual void removeMember( Zeichnung *zObj );
         // Zeichnet ein Bild und präsentiert es auf dem Bildschirm
         __declspec( dllexport ) virtual void render() = 0;
         // Setzt die Farbe, mit der das Bild for dem Zeichnen gefüllt wird, wenn setFüll( 1 ) gesetzt wurde
@@ -156,7 +156,7 @@ namespace Framework
         // Gibt das Bild ohne erhöhten Reference Counter zurück, in das die 2D GUI Zeichnungen des Frameworks gezeichnet werden
         __declspec( dllexport ) virtual Bild *zRenderBild() const;
         // Gibt ein Array von 2D GUI Zeichnungen zurück, die sich im Bild befinden
-        __declspec( dllexport ) virtual ZeichnungArray *getMembers() const;
+        __declspec( dllexport ) virtual Iterator<Zeichnung*> getMembers() const;
         // Gibt die Farbe im A8R8G8B8 Format zurück, mit der das Bild vor dem Zeichnen befüllt wird
         __declspec( dllexport ) virtual int getFillFarbe() const;
         // Gibt zurück, ob man sich im Vollbildmodus befindet
@@ -191,14 +191,11 @@ namespace Framework
         //  fenster: Das Fenster, dessen Inhalt verwaltet werden soll
         __declspec( dllexport ) Bildschirm2D( WFenster *fenster );
         // Destruktor 
-        __declspec( dllexport ) ~Bildschirm2D();
+        __declspec( dllexport ) virtual ~Bildschirm2D();
         // Aktualisiert die Objekte, mit der die Grafikkarte verwaltet wird
         __declspec( dllexport ) virtual void update();
         // Zeichnet ein Bild und präsentiert es auf dem Bildschirm
         __declspec( dllexport ) virtual void render();
-        // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //  Return: 0
-        __declspec( dllexport ) virtual Bildschirm *release();
     };
 
     // Diese Klasse verwaltet das Bild auf dem Bildschirm mit 3D Elementen
@@ -231,7 +228,7 @@ namespace Framework
         //  fenster: Das Fenster, dessen Inhalt verwaltet werden soll
         __declspec( dllexport ) Bildschirm3D( WFenster *fenster );
         // Destruktor 
-        __declspec( dllexport ) ~Bildschirm3D();
+        __declspec( dllexport ) virtual ~Bildschirm3D();
         // Fügt dem Bildschirm eine Kamera hinzu
         //  obj: Die Kamera
         __declspec( dllexport ) void addKamera( Kam3D *obj );
@@ -253,9 +250,6 @@ namespace Framework
         __declspec( dllexport ) void update();
         // Zeichnet ein Bild und präsentiert es auf dem Bildschirm
         __declspec( dllexport ) void render();
-        // Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //  Return: 0
-        __declspec( dllexport ) Bildschirm *release();
     };
 
     // Findet die Psition und Auflösung eines Monitors heraus

+ 5 - 30
Diagramm.cpp

@@ -138,7 +138,7 @@ void SLDiag::render( Bild &zRObj ) // zeichnet nach zRObj
     {
         lockZeichnung();
         removeStyle( Style::VScroll | Style::HScroll );
-		ZeichnungHintergrund::render( zRObj );
+        ZeichnungHintergrund::render( zRObj );
         if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
         {
             unlockZeichnung();
@@ -423,8 +423,7 @@ DiagDaten *DiagDaten::release()
 BaseDiag::BaseDiag( Critical *lock )
     : daten( new DiagDaten() ),
     changed( 0 ),
-    lock( lock ),
-	ref( 1 )
+    lock( lock )
 {}
 
 // Destruktor
@@ -1288,21 +1287,6 @@ bool BaseDiag::hatWertStyleNicht( int wNum, int style ) const
     return ( daten->werte->z( wNum )->style | style ) != daten->werte->z( wNum )->style;
 }
 
-// Reference Counting
-BaseDiag *BaseDiag::getThis()
-{
-    ++ref;
-    return this;
-}
-
-BaseDiag *BaseDiag::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LDiag Klasse aus Diagramm.h
 // Konstruktor
 LDiag::LDiag()
@@ -1557,7 +1541,7 @@ void LDiag::render( Bild &zRObj )
 {
     if( !hatDatenStyle( DiagDaten::Style::Sichtbar ) )
         return;
-	ZeichnungHintergrund::render( zRObj );
+    ZeichnungHintergrund::render( zRObj );
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
         return;
     lockZeichnung();
@@ -1962,7 +1946,7 @@ Schrift *LDiag::zSchrift() const
 
 Rahmen *LDiag::getDatenRahmen() const // Gibt den inneren Rahmen um das eigentliche Diagramm zurück
 {
-    return dRam ? dRam->getThis() : 0;
+    return dRam ? (Rahmen*)dRam->getThis() : 0;
 }
 
 Rahmen *LDiag::zDatenRahmen() const
@@ -1997,7 +1981,7 @@ Bild *LDiag::zDatenHintergrundBild() const
 
 AlphaFeld *LDiag::getDatenAlphaFeld() const // Gibt das AlphaFeld des eigentlichen Diagramms zurück
 {
-    return dAf ? dAf->getThis() : 0;
+    return dAf ? (AlphaFeld*)dAf->getThis() : 0;
 }
 
 AlphaFeld *LDiag::zDatenAlphaFeld() const
@@ -2013,13 +1997,4 @@ int LDiag::getDatenAlphaFeldFarbe() const
 int LDiag::getDatenAlphaFeldStrength() const
 {
     return dAf ? dAf->getStrength() : 0;
-}
-
-// Reference Counting
-BaseDiag *LDiag::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 10
Diagramm.h

@@ -248,7 +248,6 @@ namespace Framework
         DiagDaten *daten;
         bool changed;
         Critical *lock;
-        int ref;
 
     public:
         // Konstruktor
@@ -493,12 +492,6 @@ namespace Framework
         //  wNum: Der Index des Wertes
         //  style: Die Styles
         __declspec( dllexport ) inline bool hatWertStyleNicht( int wNum, int style ) const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) BaseDiag *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) virtual BaseDiag *release();
     };
 
     // Eine Zeichnung des 2D GUI Frameworks, die die Diagrammdaten als Liniengraphen darstellt
@@ -601,9 +594,6 @@ namespace Framework
         __declspec( dllexport ) int getDatenAlphaFeldFarbe() const;
         // Gibt die Stärke des Farbübergangs des eigentlichen Diagramms zurück (Farbübergang der Daten)
         __declspec( dllexport ) int getDatenAlphaFeldStrength() const;
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) BaseDiag *release() override;
     };
 }
 

+ 48 - 40
Fenster.cpp

@@ -1115,8 +1115,7 @@ Fenster::Fenster()
     closeKlick( 0 ),
     klick( 0 ),
     mx( 0 ),
-    my( 0 ),
-    ref( 1 )
+    my( 0 )
 {
     style = 0;
     this->setMausEreignis( _ret1ME );
@@ -1132,7 +1131,7 @@ Fenster::~Fenster()
     if( titel )
         titel->release();
     if( members )
-        delete members;
+        members->release();
     if( bodyBuffer )
         bodyBuffer->release();
     if( bgBodyPicture )
@@ -1568,28 +1567,38 @@ void Fenster::setVSBScroll( int scroll )
 void Fenster::addMember( Zeichnung *obj ) // fügt einen Member hinzu
 {
     if( !members )
-        members = new ZeichnungArray();
-    members->addZeichnung( obj );
-    members->updateIndex( 0 );
+        members = new RCArray<Zeichnung>();
+    members->add( obj );
     rend = 1;
 }
 
-void Fenster::removeMember( Zeichnung *obj ) // entfernt einen Member
+void Fenster::removeMember( Zeichnung *zObj ) // entfernt einen Member
 {
     if( !members )
         return;
-    members->removeZeichnung( obj );
-    members->updateIndex( 0 );
-    rend = 1;
+    for( int i = 0; i < members->getEintragAnzahl(); i++ )
+    {
+        if( members->z( i ) == zObj )
+        {
+            members->remove( i );
+            rend = 1;
+        }
+    }
 }
 
 // -- Messages -- 
 bool Fenster::tick( double tickval ) // tick
 {
     if( members && hatStyle( Style::Sichtbar ) )
-        rend |= members->tick( tickval );
+    {
+        for( auto i = members->getIterator(); i; i++ )
+            rend |= i->tick( tickval );
+    }
     else if( members )
-        members->tick( tickval );
+    {
+        for( auto i = members->getIterator(); i; i++ )
+            i->tick( tickval );
+    }
     if( vScroll && hatStyle( Style::VScroll ) )
         rend |= vScroll->getRend();
     if( hScroll && hatStyle( Style::HScroll ) )
@@ -1869,7 +1878,10 @@ void Fenster::doMausEreignis( MausEreignis &me )
                     me.my += vScroll->getScroll();
                 if( hatStyle( Style::HScroll ) && hScroll )
                     me.mx += hScroll->getScroll();
-                members->sendMausAll( me );
+                {
+                    for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+                        members->z( i )->doMausEreignis( me );
+                }
                 me.mx += rbr;
                 me.my += rbr + th;
                 if( hatStyle( Style::VScroll ) && vScroll )
@@ -1894,7 +1906,8 @@ void Fenster::doMausEreignis( MausEreignis &me )
         me.id = 0;
         me.mx = -1000000;
         me.my = -1000000;
-        members->sendMausAll( me );
+        for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+            members->z( i )->doMausEreignis( me );
     }
 }
 
@@ -1906,14 +1919,20 @@ void Fenster::doTastaturEreignis( TastaturEreignis &te )
         if( te.verarbeitet )
         {
             if( members )
-                members->sendTastaturAll( te );
+            {
+                for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+                    members->z( i )->doTastaturEreignis( te );
+            }
         }
         else
         {
             if( tak && tak( takParam, this, te ) )
             {
                 if( members )
-                    members->sendTastaturAll( te );
+                {
+                    for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+                        members->z( i )->doTastaturEreignis( te );
+                }
             }
         }
     }
@@ -2041,11 +2060,15 @@ void Fenster::render( Bild &zRObj ) // zeichent nach zRObj
         if( members )
         {
             if( !vSc && !hSc )
-                members->render( zRObj );
+            {
+                for( auto i = members->getIterator(); i; i++ )
+                    i->render( zRObj );
+            }
             else
             {
                 zRObj.addScrollOffset( hSc ? hScroll->getScroll() : 0, vSc ? vScroll->getScroll() : 0 );
-                members->render( zRObj );
+                for( auto i = members->getIterator(); i; i++ )
+                    i->render( zRObj );
             }
         }
         zRObj.releaseDrawOptions();
@@ -2060,7 +2083,7 @@ Rahmen *Fenster::getRahmen() const // gibt den Rahmen zur
 {
     if( !rahmen )
         return 0;
-    return rahmen->getThis();
+    return (Rahmen*)rahmen->getThis();
 }
 
 Rahmen *Fenster::zRahmen() const
@@ -2101,7 +2124,7 @@ TextFeld *Fenster::getTTextFeld() const // gibt das Titel TextFeld zur
 {
     if( !titel )
         return 0;
-    return titel->getThis();
+    return (TextFeld*)titel->getThis();
 }
 
 TextFeld *Fenster::zTTextFeld() const
@@ -2243,7 +2266,7 @@ AlphaFeld *Fenster::getKAlphaFeld() const // gibt das K
 {
     if( !bodyBuffer )
         return 0;
-    return bodyBuffer->getThis();
+    return (AlphaFeld*)bodyBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zKAlphaFeld() const
@@ -2289,7 +2312,7 @@ AlphaFeld *Fenster::getSAlphaFeld() const // gibt das Schlie
 {
     if( !closeBuffer )
         return 0;
-    return closeBuffer->getThis();
+    return (AlphaFeld*)closeBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zSAlphaFeld() const
@@ -2316,7 +2339,7 @@ AlphaFeld *Fenster::getSKAlphaFeld() const // gibt das Schlie
 {
     if( !closeKlickBuffer )
         return 0;
-    return closeKlickBuffer->getThis();
+    return (AlphaFeld*)closeKlickBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zSKAlphaFeld() const
@@ -2385,9 +2408,9 @@ HScrollBar *Fenster::zHScrollBar() const
 }
 
 // -- Members -- 
-ZeichnungArray *Fenster::getMembers() const // gibt die Members zurück
+Iterator<Zeichnung*> Fenster::getMembers() const // gibt die Members zurück
 {
-    return members;
+    return members->getIterator();
 }
 
 // -- Kopie --
@@ -2448,19 +2471,4 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
     ret->setKMin( kMin );
     ret->setKMax( kMax );
     return ret;
-}
-
-// Reference Counting 
-Fenster *Fenster::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Fenster *Fenster::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
 }

+ 6 - 12
Fenster.h

@@ -2,6 +2,7 @@
 #define Fenster_H
 
 #include "Zeichnung.h"
+#include "Array.h"
 
 namespace Framework
 {
@@ -281,7 +282,7 @@ namespace Framework
         void *closingMeParam;
         Rahmen *rahmen;
         TextFeld *titel;
-        ZeichnungArray *members;
+        RCArray<Zeichnung> *members;
         int bgBodyColor;
         Bild *bgBodyPicture;
         AlphaFeld *bodyBuffer;
@@ -295,7 +296,6 @@ namespace Framework
         Punkt kMin, kMax;
         bool closeKlick, klick;
         int mx, my;
-        int ref;
 
     public:
         // Konstruktor 
@@ -459,10 +459,10 @@ namespace Framework
         //  scroll: Die Anzahl der Pixel, die der Inhalt nach oben verschoben werden soll
         __declspec( dllexport ) void setVSBScroll( int scroll );
         // Fügt dem Fenster eine Zeichnung hinzu
-        //  zObj: Die Zeichnung
-        __declspec( dllexport ) void addMember( Zeichnung *zObj );
+        //  obj: Die Zeichnung
+        __declspec( dllexport ) void addMember( Zeichnung *obj );
         // Entfernt eine Zeichnung aus dem Fenster
-        //  zObj: Die Zeichnung
+        //  zObj: Die Zeichnung (ohne erhöhten reference Counter)
         __declspec( dllexport ) void removeMember( Zeichnung *zObj );
         // Aktualisiert das Objekt. Wird vom Framework aufgerufen
         //  tickVal: Die Zeit in sekunden, die seit dem lezten Aufruf dieser Funktion vergangen ist
@@ -576,15 +576,9 @@ namespace Framework
         // Gibt die Scrollbar vom unteren Fensterrand ohne erhöhten Reference Counter zurück
         __declspec( dllexport ) HScrollBar *zHScrollBar() const;
         // Gibt eine Liste mit Zeichnungen zurück, die im Fenster sind
-        __declspec( dllexport ) ZeichnungArray *getMembers() const;
+        __declspec( dllexport ) Iterator<Zeichnung*> getMembers() const;
         // Erzeugt eine Kopie des Fensters, die ohne Auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) Fenster *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) Fenster *release();
     };
 }
 #endif

+ 3 - 19
Fortschritt.cpp

@@ -21,8 +21,7 @@ FBalken::FBalken()
     fBgBild( 0 ),
     textRd( 0 ),
     schriftFarbe( 0 ),
-    schriftSize( 0 ),
-    ref( 1 )
+    schriftSize( 0 )
 {
     style = 0;
 }
@@ -259,7 +258,7 @@ __int64 FBalken::getAktion() const // gibt die fertigen Aktionen zur
 Rahmen *FBalken::getFRahmen() const // gibt den Fertig Rahmen zurück
 {
     if( fRahmen )
-        return fRahmen->getThis();
+        return (Rahmen*)fRahmen->getThis();
     return 0;
 }
 
@@ -271,7 +270,7 @@ Rahmen *FBalken::zFRahmen() const
 AlphaFeld *FBalken::getFAlphaFeld() const // gibt das Fertig Alpha Feld zurück
 {
     if( fBuffer )
-        return fBuffer->getThis();
+        return (AlphaFeld*)fBuffer->getThis();
     return 0;
 }
 
@@ -312,19 +311,4 @@ Schrift *FBalken::zSchrift() const
 int FBalken::getSFarbe() const // gibt die Schrift Farbe zurück
 {
     return schriftFarbe;
-}
-
-// Reference Counting 
-FBalken *FBalken::getThis()
-{
-    ++ref;
-    return this;
-}
-
-FBalken *FBalken::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
 }

+ 0 - 7
Fortschritt.h

@@ -44,7 +44,6 @@ namespace Framework
         TextRenderer *textRd;
         int schriftFarbe;
         unsigned char schriftSize;
-        int ref;
 
     public:
         // Konstruktor 
@@ -126,12 +125,6 @@ namespace Framework
         __declspec( dllexport ) Schrift *zSchrift() const;
         // Gibt die Farbe der Prozentanzeige im A8R8G8B8 Format zurück
         __declspec( dllexport ) int getSFarbe() const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) FBalken *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) FBalken *release();
     };
 }
 

+ 1 - 0
Framework.vcxproj

@@ -248,6 +248,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="TexturList.h" />
     <ClInclude Include="TexturModel.h" />
     <ClInclude Include="Ebene3D.h" />
+    <ClInclude Include="UIMLView.h" />
     <ClInclude Include="Welt2D.h" />
     <ClInclude Include="Welt3D.h" />
     <ClInclude Include="XML.h" />

+ 3 - 0
Framework.vcxproj.filters

@@ -294,6 +294,9 @@
     <ClInclude Include="XML.h">
       <Filter>Headerdateien\Framework</Filter>
     </ClInclude>
+    <ClInclude Include="UIMLView.h">
+      <Filter>Headerdateien\Framework\Objekte2D</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Maus.cpp">

+ 0 - 14
Kamera2D.cpp

@@ -16,7 +16,6 @@ Kamera2D::Kamera2D()
     zoom = 1;
     tickWelt = 0;
     name = new Text( "" );
-    ref = 1;
 }
 
 Kamera2D::~Kamera2D()
@@ -173,19 +172,6 @@ Text *Kamera2D::zName()
     return name;
 }
 
-Kamera2D *Kamera2D::getThis()
-{
-    ref++;
-    return this;
-}
-
-Kamera2D *Kamera2D::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 bool TestKamera2D::tick( double time )
 {
     bool ret = rend;

+ 0 - 3
Kamera2D.h

@@ -19,7 +19,6 @@ namespace Framework
         float zoom;
         Mat3< float > matrix;
         Text *name;
-        int ref;
 
     public:
         __declspec( dllexport ) Kamera2D();
@@ -42,8 +41,6 @@ namespace Framework
         __declspec( dllexport ) const Mat3< float > &getMatrix();
         __declspec( dllexport ) Text *getName();
         __declspec( dllexport ) Text *zName();
-        __declspec( dllexport ) Kamera2D *getThis();
-        __declspec( dllexport ) Kamera2D *release();
     };
 
     class TestKamera2D : public Kamera2D

+ 7 - 39
Knopf.cpp

@@ -21,8 +21,7 @@ Knopf::Knopf()
     klickFarbe( 0xFF000000 ),
     klickBild( 0 ),
     klickBuffer( 0 ),
-    klickIndex( 0 ),
-    ref( 1 )
+    klickIndex( 0 )
 {
     style = Style::Erlaubt | Style::Buffered | Style::KlickBuffer | Style::Rahmen;
     this->setMausEreignis( _ret1ME );
@@ -189,7 +188,7 @@ void Knopf::render( Bild &zRObj ) // zeichenet nach zRObj
         zRObj.setAlpha( 0x20 );
         rA = 1;
     }
-	TextFeld::render( zRObj );
+    TextFeld::render( zRObj );
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
     {
         if( rA )
@@ -245,7 +244,7 @@ AlphaFeld *Knopf::getKB() const // gibt getThis des Klick Buffers zur
 {
     if( !klickBuffer )
         return 0;
-    return klickBuffer->getThis();
+    return (AlphaFeld*)klickBuffer->getThis();
 }
 
 AlphaFeld *Knopf::zKB() const // gibt den Klick Buffer zurück
@@ -314,21 +313,6 @@ Zeichnung *Knopf::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     return obj;
 }
 
-// Reference Counting 
-Knopf *Knopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Knopf *Knopf::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der KontrollKnopf Klasse aus Knopf.h
 // Konstruktor 
 KontrollKnopf::KontrollKnopf()
@@ -345,8 +329,7 @@ KontrollKnopf::KontrollKnopf()
     sKasten( 0 ),
     textRd( 0 ),
     sF( 0xFFFFFFFF ),
-    sGr( 12 ),
-    ref( 1 )
+    sGr( 12 )
 {
     style = Style::Erlaubt | Style::KlickBuffer;
     setKAFFarbe( 0x00007500 );
@@ -654,7 +637,7 @@ void KontrollKnopf::render( Bild &zRObj ) // zeichnet nach zRObj
     if( !hatStyle( Style::Sichtbar ) )
         return;
     removeStyle( Style::VScroll | Style::HScroll );
-	ZeichnungHintergrund::render( zRObj );
+    ZeichnungHintergrund::render( zRObj );
     lockZeichnung();
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
     {
@@ -840,7 +823,7 @@ Bild *KontrollKnopf::zKBgBild() const
 
 AlphaFeld *KontrollKnopf::getSAlphaFeld() const // gibt das Select AlphaFeld zurück
 {
-    return sAf ? sAf->getThis() : 0;
+    return sAf ? (AlphaFeld*)sAf->getThis() : 0;
 }
 
 AlphaFeld *KontrollKnopf::zSAlphaFeld() const
@@ -852,25 +835,10 @@ AlphaFeld *KontrollKnopf::getKAlphaFeld() const // gibt das Klick AlphaFeld zur
 {
     if( !kAf )
         return 0;
-    return kAf->release();
+    return (AlphaFeld*)kAf->getThis();
 }
 
 AlphaFeld *KontrollKnopf::zKAlphaFeld() const
 {
     return kAf;
-}
-
-// Reference Counting 
-KontrollKnopf *KontrollKnopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-KontrollKnopf *KontrollKnopf::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 14
Knopf.h

@@ -36,7 +36,6 @@ namespace Framework
         Bild *klickBild;
         AlphaFeld *klickBuffer;
         int klickIndex;
-        int ref;
 
     public:
         // Konstruktor 
@@ -83,12 +82,6 @@ namespace Framework
         __declspec( dllexport ) int getKBStrength() const;
         // Kopiert den Knopf, so das er ohne auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) Knopf *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) Knopf *release();
     };
 
     // Eine Zeichnung des 2D GUI Frameworks, die einen Auswählbares Kästchen mit beschriftung zeichnet
@@ -131,7 +124,6 @@ namespace Framework
         TextRenderer *textRd;
         int sF;
         int sGr;
-        int ref;
 
     public:
         // Konstruktor 
@@ -254,12 +246,6 @@ namespace Framework
         __declspec( dllexport ) AlphaFeld *getKAlphaFeld() const;
         // Gibt den Farbübergang ohne erhöhten Reference COunter zurück, der verwendet wird, während auf das Kästchen geklickt wird
         __declspec( dllexport ) AlphaFeld *zKAlphaFeld() const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) KontrollKnopf *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) KontrollKnopf *release();
     };
 }
 

+ 9 - 25
Liste.cpp

@@ -29,8 +29,7 @@ AuswahlListe::AuswahlListe()
     ahBildListe( 0 ),
     aBufferListe( 0 ),
     aRahmenListe( 0 ),
-    schrift( 0 ),
-    ref( 1 )
+    schrift( 0 )
 {
     style = 0;
     this->setMausEreignis( _ret1ME );
@@ -642,7 +641,7 @@ void AuswahlListe::render( Bild &zRObj ) // zeichnet nach zRObj
     if( !hatStyle( Style::Sichtbar ) )
         return;
     removeStyle( Style::HScroll );
-	ZeichnungHintergrund::render( zRObj );
+    ZeichnungHintergrund::render( zRObj );
     lockZeichnung();
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
     {
@@ -689,7 +688,7 @@ void AuswahlListe::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlBuffer ) && aBuffer )
                     {
                         tmpBuffer = tf->getAlphaFeld();
-                        tf->setAlphaFeldZ( aBuffer->getThis() );
+                        tf->setAlphaFeldZ( (AlphaFeld*)aBuffer->getThis() );
                         tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                         tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
                     }
@@ -715,7 +714,7 @@ void AuswahlListe::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlRahmen ) && aRahmen )
                     {
                         tmpRahmen = tf->getRahmen();
-                        tf->setRahmenZ( aRahmen->getThis() );
+                        tf->setRahmenZ( (Rahmen*)aRahmen->getThis() );
                         tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                         tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
                     }
@@ -896,7 +895,7 @@ TextFeld *AuswahlListe::getEintrag( int pos ) const // gibt den pos- ten Eintrag
         return 0;
     TextFeld *ret = (TextFeld*)tfListe->get( pos );
     if( ret )
-        return ret->getThis();
+        return (TextFeld*)ret->getThis();
     return 0;
 }
 
@@ -910,7 +909,7 @@ TextFeld *AuswahlListe::zEintrag( int pos ) const
 Rahmen *AuswahlListe::getARahmen() const // gibt den Auswahl Rahmen zurück (ohne MultiStyled)
 {
     if( aRahmen )
-        return aRahmen->getThis();
+        return (Rahmen*)aRahmen->getThis();
     return 0;
 }
 
@@ -939,7 +938,7 @@ Bild *AuswahlListe::zAHBild() const
 AlphaFeld *AuswahlListe::getABuffer() const // gibt den Auswahl Buffer zurück (ohne MultiStyled)
 {
     if( aBuffer )
-        return aBuffer->getThis();
+        return (AlphaFeld*)aBuffer->getThis();
     return 0;
 }
 
@@ -954,7 +953,7 @@ Rahmen *AuswahlListe::getARahmen( int pos ) const // gibt den Auswahl Rahmen zur
     if( aRahmenListe )
         ret = (Rahmen*)aRahmenListe->get( pos );
     if( ret )
-        return ret->getThis();
+        return (Rahmen*)ret->getThis();
     return 0;
 }
 
@@ -997,7 +996,7 @@ AlphaFeld *AuswahlListe::getABuffer( int pos ) const // gibt den Auswahl Buffer
     if( aBufferListe )
         ret = (AlphaFeld*)aBufferListe->get( pos );
     if( ret )
-        return ret->getThis();
+        return (AlphaFeld*)ret->getThis();
     return 0;
 }
 
@@ -1022,19 +1021,4 @@ bool AuswahlListe::hatMsStyleNicht( int pos, __int64 style ) const // pr
     if( styles )
         st = styles->get( pos );
     return ( st | style ) != st;
-}
-
-// Reference Counting 
-AuswahlListe *AuswahlListe::getThis()
-{
-    ++ref;
-    return this;
-}
-
-AuswahlListe *AuswahlListe::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
 }

+ 0 - 7
Liste.h

@@ -53,7 +53,6 @@ namespace Framework
         RCArray< AlphaFeld > *aBufferListe;
         RCArray< Rahmen > *aRahmenListe;
         Schrift *schrift;
-        int ref;
 
     public:
         // Konstruktor 
@@ -256,12 +255,6 @@ namespace Framework
         //  pos: Der Index des Eintrags
         //  style: Die zu prüfenden Styles
         __declspec( dllexport ) inline bool hatMsStyleNicht( int pos, __int64 style ) const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) AuswahlListe *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) AuswahlListe *release();
     };
 }
 

+ 0 - 16
M2DVorschau.cpp

@@ -21,7 +21,6 @@ M2DVorschau::M2DVorschau()
     my = -1;
     af = 0;
     ram = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -183,19 +182,4 @@ Zeichnung *M2DVorschau::dublizieren() const
         ret->setAlphaFeldZ( (AlphaFeld*)hintergrundFeld->dublizieren() );
     ret->setHintergrundFarbe( bgF );
     return ret;
-}
-
-// Reference counting
-M2DVorschau *M2DVorschau::getThis()
-{
-    ref++;
-    return this;
-}
-
-M2DVorschau *M2DVorschau::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 0 - 7
M2DVorschau.h

@@ -29,7 +29,6 @@ namespace Framework
         int bgF;
         int mx;
         int my;
-        int ref;
 
     public:
         // Konstruktor
@@ -58,11 +57,5 @@ namespace Framework
         __declspec( dllexport ) Model2D *getModel() const;
         // Erzeugt eine Komplette Kopie der Zeichnung, die ohne auswirkungen auf die Originale verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) M2DVorschau *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) M2DVorschau *release();
     };
 }

+ 1 - 25
Rahmen.cpp

@@ -13,8 +13,7 @@ Rahmen::Rahmen()
     : Zeichnung(),
     br( 1 ),
     farbe( 0xFF000000 ),
-    alpha( 0 ),
-    ref( 1 )
+    alpha( 0 )
 {}
 
 // Destruktor
@@ -55,13 +54,6 @@ int Rahmen::getRBreite() const // Gibt die Breite des Rahmens zur
     return br;
 }
 
-// Reference Counting 
-Rahmen *Rahmen::getThis()
-{
-    ++ref;
-    return this;
-}
-
 
 // Inhalt der LRahmen Klasse aus Rahmen.h
 // Konstruktor 
@@ -119,14 +111,6 @@ Zeichnung *LRahmen::dublizieren() const // Kopiert das Zeichnung
     return obj;
 }
 
-Rahmen *LRahmen::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der Rahmen3D Klasse aus Rahmen.h
 // Konstruktor 
@@ -187,12 +171,4 @@ Zeichnung *Rahmen3D::dublizieren() const // Kopiert das Zeichnung
     obj->setFarbe( farbe );
     obj->setRamenBreite( br );
     return obj;
-}
-
-Rahmen *Rahmen3D::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
 }

+ 0 - 13
Rahmen.h

@@ -15,7 +15,6 @@ namespace Framework
         int br;
         int farbe;
         bool alpha;
-        int ref;
 
     public:
         // Konstruktor 
@@ -37,12 +36,6 @@ namespace Framework
         __declspec( dllexport ) int getFarbe() const;
         // Gibt zurück, ob der Rahmen mit Alpha Blending gezeichnet wird
         __declspec( dllexport ) bool hatAlpha() const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) Rahmen *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) virtual Rahmen *release() = 0;
     };
 
     // Eine Zeichnung des 2D GUI Frameworks, die einen Linienrahmen um ein Rechteck zeichnet
@@ -60,9 +53,6 @@ namespace Framework
         __declspec( dllexport ) void render( Bild &zRObj ) override;
         // Kopiert den Rahmen, so dass er ohne auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) Rahmen *release() override;
     };
 
     class Rahmen3D : public Rahmen
@@ -77,9 +67,6 @@ namespace Framework
         __declspec( dllexport ) void render( Bild &zRObj ) override;
         // Kopiert den Rahmen, so dass er ohne auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) Rahmen *release() override;
     };
 }
 

+ 0 - 16
Scroll.cpp

@@ -242,14 +242,6 @@ void VScrollBar::render( int x, int y, int br, int hi, Bild &zRObj ) const
     zRObj.fillRegion( x + 1, y + br + st, br - 1, end, farbe );
 }
 
-ScrollBar *VScrollBar::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der HScrollBar Klasse aus Scroll.h
 // Konstruktor 
 HScrollBar::HScrollBar()
@@ -347,12 +339,4 @@ void HScrollBar::render( int x, int y, int br, int hi, Bild &zRObj ) const
         end = br - hi * 2;
     }
     zRObj.fillRegion( x + hi + st, y + 1, end, hi - 1, farbe );
-}
-
-ScrollBar *HScrollBar::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
 }

+ 1 - 7
Scroll.h

@@ -83,7 +83,7 @@ namespace Framework
         __declspec( dllexport ) ScrollBar *getThis();
         // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
         //  return: 0.
-        __declspec( dllexport ) virtual ScrollBar *release();
+        __declspec( dllexport ) ScrollBar *release();
     };
 
     // Eine vertikale Scrollbar, wie sie in manchen 2D GUI Zeichnungen des Frameworks verwendet wird
@@ -108,9 +108,6 @@ namespace Framework
         //  hi: Die Höhe der Scroll Bar
         //  zRObj: Das Bild, in das gezeichnet werden soll
         __declspec( dllexport ) void render( int x, int y, int br, int hi, Bild &zRObj ) const override;
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) ScrollBar *release() override;
     };
 
     // Eine horizontale Scrollbar, wie sie in manchen 2D GUI Zeichnungen des Frameworks verwendet wird
@@ -135,9 +132,6 @@ namespace Framework
         //  hi: Die Höhe der Scroll Bar
         //  zRObj: Das Bild, in das gezeichnet werden soll
         __declspec( dllexport ) void render( int x, int y, int br, int hi, Bild &zRObj ) const override;
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) ScrollBar *release() override;
     };
 }
 

+ 54 - 50
Tabelle.cpp

@@ -14,7 +14,7 @@ using namespace Framework;
 // Konstruktor 
 ObjTabelle::ObjTabelle()
     : ZeichnungHintergrund(),
-    zZeichnungs( new RCArray< Array< Zeichnung* > >() ),
+    members( new RCArray< RCArray< Zeichnung > >() ),
     spaltenNamen( new RCArray< Text >() ),
     zeilenNamen( new RCArray< Text >() ),
     spaltenBreite( new Array< int >() ),
@@ -37,8 +37,7 @@ ObjTabelle::ObjTabelle()
     aAf( 0 ),
     msaRam( new RCArray< RCArray< Rahmen > >() ),
     msaAf( new RCArray< RCArray< AlphaFeld > >() ),
-    styles( new RCArray< Array< __int64 > >() ),
-    ref( 1 )
+    styles( new RCArray< Array< __int64 > >() )
 {
     style = 0;
 }
@@ -46,8 +45,8 @@ ObjTabelle::ObjTabelle()
 // Destruktor 
 ObjTabelle::~ObjTabelle()
 {
-    if( zZeichnungs )
-        zZeichnungs->release();
+    if( members )
+        members->release();
     if( spaltenNamen )
         spaltenNamen->release();
     if( zeilenNamen )
@@ -80,7 +79,7 @@ ObjTabelle::~ObjTabelle()
 void ObjTabelle::addSpalte( const char *name ) // Spalte hinzufügen
 {
     lockZeichnung();
-    zZeichnungs->add( new Array< Zeichnung* >(), spaltenAnzahl );
+    members->add( new RCArray< Zeichnung >(), spaltenAnzahl );
     spaltenNamen->add( new Text( name ), spaltenAnzahl );
     spaltenBreite->add( 100 );
     msaRam->add( new RCArray< Rahmen >(), spaltenAnzahl );
@@ -93,7 +92,7 @@ void ObjTabelle::addSpalte( const char *name ) // Spalte hinzuf
 void ObjTabelle::addSpalte( Text *name )
 {
     lockZeichnung();
-    zZeichnungs->add( new Array< Zeichnung* >(), spaltenAnzahl );
+    members->add( new RCArray< Zeichnung >(), spaltenAnzahl );
     spaltenNamen->add( name, spaltenAnzahl );
     spaltenBreite->add( 100 );
     msaRam->add( new RCArray< Rahmen >(), spaltenAnzahl );
@@ -108,7 +107,7 @@ void ObjTabelle::addSpalte( int sNum, const char *name ) // Spalte bei sNum einf
     if( sNum > spaltenAnzahl )
         return;
     lockZeichnung();
-    zZeichnungs->add( new Array< Zeichnung* >(), sNum );
+    members->add( new RCArray< Zeichnung >(), sNum );
     spaltenNamen->add( new Text( name ), sNum );
     spaltenBreite->add( 100, sNum );
     minSpaltenBreite->add( 0, sNum );
@@ -126,7 +125,7 @@ void ObjTabelle::addSpalte( int sNum, Text *name )
     if( sNum > spaltenAnzahl )
         return;
     lockZeichnung();
-    zZeichnungs->add( new Array< Zeichnung* >(), sNum );
+    members->add( new RCArray< Zeichnung >(), sNum );
     spaltenNamen->add( name, sNum );
     spaltenBreite->add( 100, sNum );
     minSpaltenBreite->add( 0, sNum );
@@ -170,8 +169,8 @@ void ObjTabelle::addZeile( int zNum, const char *name ) // Zeile bei zNum einf
     maxZeilenHeight->add( 100, zNum );
     for( int i = 0; i < spaltenAnzahl; ++i )
     {
-        if( zZeichnungs->z( i ) )
-            zZeichnungs->z( i )->add( 0, zNum );
+        if( members->z( i ) )
+            members->z( i )->add( 0, zNum );
         if( msaRam->z( i ) )
             msaRam->z( i )->add( 0, zNum );
         if( msaAf->z( i ) )
@@ -195,8 +194,8 @@ void ObjTabelle::addZeile( int zNum, Text *name )
     maxZeilenHeight->add( 100, zNum );
     for( int i = 0; i < spaltenAnzahl; ++i )
     {
-        if( zZeichnungs->z( i ) )
-            zZeichnungs->z( i )->add( 0, zNum );
+        if( members->z( i ) )
+            members->z( i )->add( 0, zNum );
         if( msaRam->z( i ) )
             msaRam->z( i )->add( 0, zNum );
         if( msaAf->z( i ) )
@@ -214,7 +213,7 @@ void ObjTabelle::removeSpalte( int sNum ) // Spalte l
     if( sNum >= spaltenAnzahl )
         return;
     lockZeichnung();
-    zZeichnungs->remove( sNum );
+    members->remove( sNum );
     spaltenNamen->remove( sNum );
     spaltenBreite->remove( sNum );
     minSpaltenBreite->remove( sNum );
@@ -252,8 +251,8 @@ void ObjTabelle::removeZeile( int zNum ) // Zeile l
     maxZeilenHeight->remove( zNum );
     for( int i = 0; i < spaltenAnzahl; ++i )
     {
-        if( zZeichnungs->z( i ) )
-            zZeichnungs->z( i )->remove( zNum );
+        if( members->z( i ) )
+            members->z( i )->remove( zNum );
         if( msaRam->z( i ) )
             msaRam->z( i )->remove( zNum );
         if( msaAf->z( i ) )
@@ -297,8 +296,8 @@ void ObjTabelle::setSpaltePosition( int sNum, int pos )
     else
         ++insertPos;
     lockZeichnung();
-    zZeichnungs->add( zZeichnungs->get( sNum ), insertPos );
-    zZeichnungs->remove( delPos );
+    members->add( members->get( sNum ), insertPos );
+    members->remove( delPos );
     spaltenNamen->add( spaltenNamen->get( sNum ), insertPos );
     spaltenNamen->remove( delPos );
     spaltenBreite->add( spaltenBreite->hat( sNum ) ? spaltenBreite->get( sNum ) : 0, insertPos );
@@ -346,10 +345,10 @@ void ObjTabelle::setZeilePosition( int zNum, int pos )
     maxZeilenHeight->remove( delPos );
     for( int i = 0; i < spaltenAnzahl; ++i )
     {
-        if( zZeichnungs->z( i ) )
+        if( members->z( i ) )
         {
-            zZeichnungs->z( i )->add( zZeichnungs->z( i )->hat( zNum ) ? zZeichnungs->z( i )->get( zNum ) : 0, insertPos );
-            zZeichnungs->z( i )->remove( delPos );
+            members->z( i )->add( members->z( i )->hat( zNum ) ? members->z( i )->get( zNum ) : 0, insertPos );
+            members->z( i )->remove( delPos );
         }
         if( msaRam->z( i ) )
         {
@@ -371,14 +370,14 @@ void ObjTabelle::setZeilePosition( int zNum, int pos )
     unlockZeichnung();
 }
 
-void ObjTabelle::setZeichnungZ( int sNum, int zNum, Zeichnung *zObj ) // setzt ein Zeichnung
+void ObjTabelle::setZeichnungZ( int sNum, int zNum, Zeichnung *obj ) // setzt ein Zeichnung
 {
     if( sNum >= spaltenAnzahl || zNum >= zeilenAnzahl )
         return;
     lockZeichnung();
-    if( !zZeichnungs->z( sNum ) )
-        zZeichnungs->set( new Array< Zeichnung* >(), sNum );
-    zZeichnungs->z( sNum )->set( zObj, zNum );
+    if( !members->z( sNum ) )
+        members->set( new RCArray< Zeichnung >(), sNum );
+    members->z( sNum )->set( obj, zNum );
     rend = 1;
     unlockZeichnung();
 }
@@ -1045,7 +1044,7 @@ void ObjTabelle::render( Bild &zRObj ) // zeichnet nach zRObj
 {
     if( hatStyleNicht( Style::Sichtbar ) )
         return;
-	ZeichnungHintergrund::render( zRObj );
+    ZeichnungHintergrund::render( zRObj );
     lockZeichnung();
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
     {
@@ -1061,13 +1060,13 @@ void ObjTabelle::render( Bild &zRObj ) // zeichnet nach zRObj
         int yPos = 0;
         if( vertikalScrollBar && hatStyle( Style::VScroll ) )
             yPos -= vertikalScrollBar->getScroll();
-        Array< Zeichnung* > *tmp_zZeichnungs = zZeichnungs->z( s );
+        RCArray< Zeichnung > *tmp_zZeichnungs = members->z( s );
         if( !tmp_zZeichnungs )
             continue;
         for( int z = 0; z < zeilenAnzahl && tmp_zZeichnungs; ++z )
         {
             int zHi = zeilenHeight->hat( z ) ? zeilenHeight->get( z ) : 0;
-            Zeichnung *obj = tmp_zZeichnungs->hat( z ) ? tmp_zZeichnungs->get( z ) : 0;
+            Zeichnung *obj = tmp_zZeichnungs->hat( z ) ? tmp_zZeichnungs->z( z ) : 0;
             if( obj )
             {
                 obj->setPosition( xPos, yPos );
@@ -1204,12 +1203,12 @@ Punkt ObjTabelle::getZeichnungPosition( Zeichnung *zObj ) const // gibt die Posi
 
 Zeichnung *ObjTabelle::zZeichnung( int sNum, int zNum ) const // gibt das Zeichnung auf der Position zurück
 {
-    if( !zZeichnungs->z( sNum ) )
+    if( !members->z( sNum ) )
         return 0;
-    Array< Zeichnung* > *tmp = zZeichnungs->z( sNum );
+    RCArray< Zeichnung > *tmp = members->z( sNum );
     if( !tmp->hat( zNum ) )
         return 0;
-    return tmp ? tmp->get( zNum ) : 0;
+    return tmp ? tmp->z( zNum ) : 0;
 }
 
 Zeichnung *ObjTabelle::zZeichnung( const char *spaltenName, const char *zeilenName ) const
@@ -1222,6 +1221,26 @@ Zeichnung *ObjTabelle::zZeichnung( Text *spaltenName, Text *zeilenName ) const
     return zZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
+Zeichnung *ObjTabelle::getZeichnung( int sNum, int zNum ) const // gibt das Zeichnung auf der Position zurück
+{
+    if( !members->z( sNum ) )
+        return 0;
+    RCArray< Zeichnung > *tmp = members->z( sNum );
+    if( !tmp->hat( zNum ) )
+        return 0;
+    return tmp ? tmp->get( zNum ) : 0;
+}
+
+Zeichnung *ObjTabelle::getZeichnung( const char *spaltenName, const char *zeilenName ) const
+{
+    return getZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
+}
+
+Zeichnung *ObjTabelle::getZeichnung( Text *spaltenName, Text *zeilenName ) const
+{
+    return getZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
+}
+
 int ObjTabelle::getSpaltenBreite( int num ) const // gibt die Breite der Spalte zurück
 {
     return spaltenBreite->get( num );
@@ -1403,7 +1422,7 @@ int ObjTabelle::getRasterBreite() const // gibt die Breite des Rasters zur
 
 Rahmen *ObjTabelle::getARahmen() const // gibt den auswahl Rahmen zurück
 {
-    return aRam ? aRam->getThis() : 0;
+    return aRam ? (Rahmen*)aRam->getThis() : 0;
 }
 
 Rahmen *ObjTabelle::zARahmen() const
@@ -1413,7 +1432,7 @@ Rahmen *ObjTabelle::zARahmen() const
 
 AlphaFeld *ObjTabelle::getAAlphaFeld() const // gibt das auswahl AlphaFeld zurück
 {
-    return aAf ? aAf->getThis() : 0;
+    return aAf ? (AlphaFeld*)aAf->getThis() : 0;
 }
 
 AlphaFeld *ObjTabelle::zAAlphaFeld() const
@@ -1562,8 +1581,8 @@ Zeichnung *ObjTabelle::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
                 if( maxZeilenHeight->hat( z ) )
                     obj->setMaxZeilenHeight( z, maxZeilenHeight->get( z ) );
             }
-            if( zZeichnungs->z( s ) && zZeichnungs->z( s )->hat( z ) )
-                obj->setZeichnungZ( s, z, zZeichnungs->z( s )->get( z ) );
+            if( members->z( s ) && members->z( s )->hat( z ) )
+                obj->setZeichnungZ( s, z, members->z( s )->get( z ) );
             if( styles->z( s ) && styles->z( s )->hat( z ) )
                 obj->setMsStyle( s, z, styles->z( s )->get( z ) );
             if( msaRam->z( s ) && msaRam->z( s )->z( z ) )
@@ -1574,19 +1593,4 @@ Zeichnung *ObjTabelle::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     }
     obj->setAuswahl( selected.x, selected.y );
     return obj;
-}
-
-// Reference Counting
-ObjTabelle *ObjTabelle::getThis()
-{
-    ++ref;
-    return this;
-}
-
-ObjTabelle *ObjTabelle::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 23 - 18
Tabelle.h

@@ -38,7 +38,7 @@ namespace Framework
             const static __int64 normal = Rahmen | Erlaubt | Sichtbar | AuswahlBuffer | AuswahlRahmen | Raster; // Vereint die Flags: Rahmen, Erlaubt, Sichtbar, SpaltenBeweglich, AuswahlBuffer, AuswahlRahmen, Raster
         };
     private:
-        RCArray< Array< Zeichnung* > > *zZeichnungs;
+        RCArray< RCArray< Zeichnung > > *members;
         RCArray< Text > *spaltenNamen;
         RCArray< Text > *zeilenNamen;
         Array< int > *spaltenBreite;
@@ -59,7 +59,6 @@ namespace Framework
         RCArray< RCArray< Rahmen > > *msaRam;
         RCArray< RCArray< AlphaFeld > > *msaAf;
         RCArray< Array< __int64 > > *styles;
-        int ref;
 
     public:
         // Konstruktor 
@@ -140,20 +139,20 @@ namespace Framework
         // Wenn bereits ein Zeichnung in dem Feld ist, wird es überschrieben.
         //  sNum: Der Index der Spalte, in der das Zeichnung stehen soll
         //  zNum: Der Index der Zeile, in der das Zeichnung stehen soll
-        //  zObj: Das Zeichnung welches in dem Feld sein soll
-        __declspec( dllexport ) void setZeichnungZ( int sNum, int zNum, Zeichnung *zObj );
+        //  obj: Das Zeichnung welches in dem Feld sein soll
+        __declspec( dllexport ) void setZeichnungZ( int sNum, int zNum, Zeichnung *obj );
         // Setzt ein Zeichnung, welches in einem Bestimmten Feld sein soll
         // Wenn bereits ein Zeichnung in dem Feld ist, wird es überschrieben.
         //  spaltenName: Der Name der Spalte, in der das Zeichnung stehen soll
         //  zeilenName: Der Name der Zeile, in der das Zeichnung stehen soll
-        //  zZeichnung: Das Zeichnung welches in dem Feld sein soll
-        __declspec( dllexport ) void setZeichnungZ( const char *spaltenName, const char *zeilenName, Zeichnung *zZeichnung );
+        //  obj: Das Zeichnung welches in dem Feld sein soll
+        __declspec( dllexport ) void setZeichnungZ( const char *spaltenName, const char *zeilenName, Zeichnung *obj );
         // Setzt ein Zeichnung, welches in einem Bestimmten Feld sein soll
         // Wenn bereits ein Zeichnung in dem Feld ist, wird es überschrieben.
         //  spaltenName: Der Name der Spalte, in der das Zeichnung stehen soll
         //  zeilenName: Der Name der Zeile, in der das Zeichnung stehen soll
-        //  zZeichnung: Das Zeichnung welches in dem Feld sein soll
-        __declspec( dllexport ) void setZeichnungZ( Text *spaltenName, Text *zeilenName, Zeichnung *zZeichnung );
+        //  obj: Das Zeichnung welches in dem Feld sein soll
+        __declspec( dllexport ) void setZeichnungZ( Text *spaltenName, Text *zeilenName, Zeichnung *obj );
         // Setzt die Spalten Breite
         //  sNum: Der Index der Spalte
         //  br: Die Breite in Pixeln
@@ -457,20 +456,32 @@ namespace Framework
         //  num: Der Index der Zeile
         __declspec( dllexport ) Text *zZeilenName( int num ) const;
         // Sucht eine Zeichnung in der Tabelle und gibt den Index der Spalte als x und den der Zeile als y zurück. (-1, -1) falls das Objekt nicht gefunden wurde
-        //  zObj: Die Zeichnung
+        //  zObj: Die Zeichnung (ohne erhöhten reference Counter)
         __declspec( dllexport ) Punkt getZeichnungPosition( Zeichnung *zObj ) const;
-        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist (ohne erhöhten reference Counter)
         //  sNum: Der Index der Spalte
         //  zNum: Der Index der Zeile
         __declspec( dllexport ) Zeichnung *zZeichnung( int sNum, int zNum ) const;
-        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist (ohne erhöhten reference Counter)
         //  spaltenName: Der Name der Spalte des Kästchens
         //  zeilenName: Der Name der Zeile des Kästchens
         __declspec( dllexport ) Zeichnung *zZeichnung( const char *spaltenName, const char *zeilenName ) const;
-        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist (ohne erhöhten reference Counter)
         //  spaltenName: Der Name der Spalte des Kästchens
         //  zeilenName: Der Name der Zeile des Kästchens
         __declspec( dllexport ) Zeichnung *zZeichnung( Text *spaltenName, Text *zeilenName ) const;
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        //  sNum: Der Index der Spalte
+        //  zNum: Der Index der Zeile
+        __declspec( dllexport ) Zeichnung *getZeichnung( int sNum, int zNum ) const;
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        //  spaltenName: Der Name der Spalte des Kästchens
+        //  zeilenName: Der Name der Zeile des Kästchens
+        __declspec( dllexport ) Zeichnung *getZeichnung( const char *spaltenName, const char *zeilenName ) const;
+        // Gibt die Zeichnung zurück, die in einem bestimmten Kästchen der Tabelle ist
+        //  spaltenName: Der Name der Spalte des Kästchens
+        //  zeilenName: Der Name der Zeile des Kästchens
+        __declspec( dllexport ) Zeichnung *getZeichnung( Text *spaltenName, Text *zeilenName ) const;
         // Gibt die Breite einer Spalte in Pixeln zurück
         //  num: Der Index der Spalte
         __declspec( dllexport ) int getSpaltenBreite( int num ) const;
@@ -637,12 +648,6 @@ namespace Framework
         __declspec( dllexport ) inline bool hatMsStyleNicht( Text *spaltenName, Text *zeilenName, __int64 style ) const;
         // Erzeugt eine Kopie der Tabelle, die ohne auswirkungen auf das Original verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) ObjTabelle *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) ObjTabelle *release();
     };
 }
 #endif

+ 1 - 17
TextFeld.cpp

@@ -27,8 +27,7 @@ TextFeld::TextFeld()
 	begf( 0 ),
 	cpos( 0 ),
 	tickVal( 0 ),
-	mausKlick( 0 ),
-	ref( 1 )
+	mausKlick( 0 )
 {
 	horizontalScrollBar = new HScrollBar();
 	vertikalScrollBar = new VScrollBar();
@@ -833,19 +832,4 @@ Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
 	obj->setSchowChar( showChar );
 	obj->setAuswahl( begf, cpos );
 	return obj;
-}
-
-// Reference Counting 
-TextFeld *TextFeld::getThis()
-{
-	++ref;
-	return this;
-}
-
-TextFeld *TextFeld::release()
-{
-	--ref;
-	if( ref == 0 )
-		delete this;
-	return 0;
 }

+ 0 - 7
TextFeld.h

@@ -42,7 +42,6 @@ namespace Framework
         double tickVal;
         bool mausKlick;
     protected:
-        int ref;
 
     public:
         // Konstruktor 
@@ -134,12 +133,6 @@ namespace Framework
         __declspec( dllexport ) int getSelectionPos() const;
         // Erzeugt eine Komplette Kopie des Textfeldes, welches ohne auswirkungen verändert werden kann
         __declspec( dllexport ) Zeichnung *dublizieren() const override;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) virtual TextFeld *getThis();
-        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //  return: 0.
-        __declspec( dllexport ) virtual TextFeld *release();
     };
 }
 #endif

+ 2 - 13
ToolTip.cpp

@@ -163,20 +163,9 @@ Bildschirm *ToolTip::zBildschirm() const
 }
 
 // Reference Counting
-TextFeld *ToolTip::getThis()
+Zeichnung *ToolTip::release()
 {
-    ++ref;
-    return this;
-}
-
-TextFeld *ToolTip::release()
-{
-    --ref;
-    if( !ref )
-    {
-        delete this;
-        return 0;
-    }
+    Zeichnung::release();
     if( ref == 1 )
     {
         if( !bildschirm->removeToolTip( this ) )

+ 1 - 4
ToolTip.h

@@ -70,12 +70,9 @@ namespace Framework
         __declspec( dllexport ) void render( Bild &zRObj ) override;
         // Gibt einen Zeiger auf den Bildschirm ohne erhöhten Reference Counter zurück, so dem der Tooltip gehört.
         __declspec( dllexport ) Bildschirm *zBildschirm() const;
-        // Erhöht den Reference Counting Zähler.
-        //  return: this.
-        __declspec( dllexport ) TextFeld *getThis() override;
         // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
         //  return: 0.
-        __declspec( dllexport ) TextFeld *release() override;
+        __declspec( dllexport ) Zeichnung *release() override;
     };
 }
 

+ 50 - 0
UIMLView.h

@@ -0,0 +1,50 @@
+#pragma once
+
+#include "Zeichnung.h"
+#include "Array.h"
+
+namespace Framework
+{
+    class Text;
+    namespace XML
+    {
+        class Element;
+    }
+
+    class UIMLView : public ZeichnungHintergrund
+    {
+    private:
+        XML::Element *dom;
+        RCArray< Zeichnung > *elements;
+
+    public:
+        // Erstellt eine UIML View zu einem UIML Text
+        //  uiml: Ein xml element gemät des ksg uiml standarts
+        __declspec( dllexport ) UIMLView( XML::Element *uiml );
+        // Erstellt eine UIML View zu einem UIML Text
+        //  uiml: Ein xml text gemät des ksg uiml standarts
+        __declspec( dllexport ) UIMLView( Text uiml );
+        __declspec( dllexport ) ~UIMLView();
+        // setzt den inhalt der view
+        //  uiml: Ein xml element gemät des ksg uiml standarts
+        __declspec( dllexport ) void setUIML( XML::Element *uiml );
+        // setzt den inhalt der view
+        //  uiml: Ein xml text gemät des ksg uiml standarts
+        __declspec( dllexport ) void setUIML( Text uiml );
+        // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
+        //  id: die id der Zeichnung
+        __declspec( dllexport ) Zeichnung *zZeichnung( Text id );
+        // Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
+        //  me: Das Ereignis
+        __declspec( dllexport ) virtual void doMausEreignis( MausEreignis &me );
+        // Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
+        //  te: Das Ereignis
+        __declspec( dllexport ) virtual void doTastaturEreignis( TastaturEreignis &te );
+        // Updated den Zeichenhintergrund
+        //  tickVal: Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser Funktion verstrichen ist
+        //  return: 1, wenn das Bild neu gezeichnet werden muss. 0 sonnst
+        __declspec( dllexport ) bool tick( double tickVal ) override;
+        // Zeichnet den Hintergrund eines Zeichnunges nach rObj
+        __declspec( dllexport ) void render( Bild &rObj ) override;
+    };
+}

+ 11 - 150
Zeichnung.cpp

@@ -30,7 +30,8 @@ Zeichnung::Zeichnung()
     mausIn( 0 ),
     toolTip( 0 ),
     style( 0 ),
-    rend( 0 )
+    rend( 0 ),
+    ref( 1 )
 {}
 
 // Destruktor 
@@ -318,7 +319,7 @@ int Zeichnung::getY() const // gibt Y zur
 
 ToolTip *Zeichnung::getToolTip() const // gibt den ToolTip Text
 {
-    return (ToolTip*)toolTip->getThis();
+    return ( ToolTip*)toolTip->getThis();
 }
 
 ToolTip *Zeichnung::zToolTip() const
@@ -350,159 +351,19 @@ Zeichnung *Zeichnung::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     return obj;
 }
 
-// Inhalt der ZeichnungArray Klasse aus Zeichnung.h
-// Konstruktor 
-ZeichnungArray::ZeichnungArray()
-    : This( 0 ),
-    next( 0 )
-{}
-
-// Destruktor 
-ZeichnungArray::~ZeichnungArray()
-{
-    delete next;
-}
-
-// nicht const 
-bool ZeichnungArray::addZeichnung( Zeichnung *obj ) // Fügt ein Zeichnung hinzu
-{
-    if( obj == This )
-        return 0;
-    if( !This )
-    {
-        This = obj;
-        return 1;
-    }
-    if( !next )
-        next = new ZeichnungArray();
-    return next->addZeichnung( obj );
-}
-
-bool ZeichnungArray::removeZeichnung( Zeichnung *obj ) // Entfernt ein Zeichnung
+Zeichnung *Zeichnung::getThis()
 {
-    if( obj == This )
-    {
-        if( index == 0 )
-        {
-            if( next )
-            {
-                This = next->getZeichnung();
-                ZeichnungArray *tmp = next->getNext();
-                next->setNext0();
-                delete next;
-                next = tmp;
-            }
-            else
-                This = 0;
-            return 0;
-        }
-        return 1;
-    }
-    if( !next )
-        return 0;
-    if( next->removeZeichnung( obj ) )
-    {
-        ZeichnungArray *tmp = next->getNext();
-        next->setNext0();
-        delete next;
-        next = tmp;
-    }
-    return 0;
+    ref++;
+    return this;
 }
 
-bool ZeichnungArray::removeZeichnung( int i ) // Entfernt das von diesem aus i-te Zeichnung
+Zeichnung *Zeichnung::release()
 {
-    if( i == index )
-    {
-        if( index == 0 )
-        {
-            This = next->getZeichnung();
-            ZeichnungArray *tmp = next->getNext();
-            next->setNext0();
-            delete next;
-            next = tmp;
-            return 0;
-        }
-        return 1;
-    }
-    if( !next )
-        return 0;
-    if( next->removeZeichnung( i ) )
-    {
-        ZeichnungArray *tmp = next->getNext();
-        next->setNext0();
-        delete next;
-        next = tmp;
-    }
+    if( !--ref )
+        delete this;
     return 0;
 }
 
-void ZeichnungArray::setNext0() // Setzt das nächste Zeichnung zu 0
-{
-    next = 0;
-}
-
-void ZeichnungArray::updateIndex( int i ) // aktualisiert die Index variable
-{
-    index = i;
-    if( next )
-        next->updateIndex( i + 1 );
-}
-
-// constant 
-ZeichnungArray *ZeichnungArray::getNext() const // gibt das nächste Zeichnung zurück
-{
-    return next;
-}
-
-Zeichnung *ZeichnungArray::getZeichnung( int i ) const // gibt das von diesem aus i-te Zeichnung zurück
-{
-    if( i == index )
-        return This;
-    if( !next )
-        return 0;
-    return next->getZeichnung( i );
-}
-
-Zeichnung *ZeichnungArray::getZeichnung() const // gibt das von diesem aus i-te Zeichnung zurück
-{
-    return This;
-}
-
-int ZeichnungArray::getIndex() const // Gibt den Index zurück
-{
-    return index;
-}
-
-void ZeichnungArray::sendMausAll( MausEreignis &me ) const // sendet me an alle volgenden Zeichnunge
-{
-    if( next )
-        next->sendMausAll( me );
-    if( This )
-        This->doMausEreignis( me );
-}
-
-void ZeichnungArray::sendTastaturAll( TastaturEreignis &te ) const // sendet te an alle volgenden Zeichnunge
-{
-    if( next )
-        next->sendTastaturAll( te );
-    if( This )
-        This->doTastaturEreignis( te );
-}
-
-void ZeichnungArray::render( Bild &zRObj )
-{
-    if( This )
-        This->render( zRObj );
-    if( next )
-        next->render( zRObj );
-}
-
-bool ZeichnungArray::tick( double tickval )
-{
-    return ( This && This->tick( tickval ) ) | ( next && next->tick( tickval ) );
-}
-
 
 // Inhalt der ZeichnungHintergrund Klasse aus Zeichnung.h
 // Konstruktor 
@@ -864,7 +725,7 @@ AlphaFeld *ZeichnungHintergrund::getAlphaFeld() const // gibt getThir vom Hinter
 {
     if( !hintergrundFeld )
         return 0;
-    return hintergrundFeld->getThis();
+    return (AlphaFeld*)hintergrundFeld->getThis();
 }
 
 AlphaFeld *ZeichnungHintergrund::zAlphaFeld() const // gibt den Hintergrund Buffer zurück
@@ -888,7 +749,7 @@ Rahmen *ZeichnungHintergrund::getRahmen() const // gibt getThis des Rahmens zur
 {
     if( !rahmen )
         return 0;
-    return rahmen->getThis();
+    return (Rahmen*)rahmen->getThis();
 }
 
 Rahmen *ZeichnungHintergrund::zRahmen() const // gibt den Rahmen zurück

+ 9 - 55
Zeichnung.h

@@ -52,12 +52,13 @@ namespace Framework
         __int64 style;
         bool rend;
         std::queue< std::function< void() > > actions;
+        int ref;
 
     public:
         // Konstruktor 
         __declspec( dllexport ) Zeichnung();
         // Destruktor 
-        __declspec( dllexport ) ~Zeichnung();
+        __declspec( dllexport ) virtual ~Zeichnung();
         // Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
         __declspec( dllexport ) void postAction( std::function< void() > action );
         // Legt fest, ob sich die Zeichnung seit des letzten Bildes verändert hat und neu gezeichnet werden muss
@@ -181,59 +182,12 @@ namespace Framework
         __declspec( dllexport ) bool hatStyleNicht( __int64 style ) const;
         // Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das Original verändert werden kann
         __declspec( dllexport ) virtual Zeichnung *dublizieren() const;
-    };
-
-    // Ein Array von Zeichnungen, der von den Bildschirm Klassen verwendet wird, um die Objekte der GUI zu speichern
-    class ZeichnungArray// Array von Zeichnungen
-    {
-    private:
-        Zeichnung *This;
-        ZeichnungArray *next;
-        int index;
-
-    public:
-        // Konstruktor 
-        __declspec( dllexport ) ZeichnungArray();
-        // Destruktor 
-        __declspec( dllexport ) ~ZeichnungArray();
-        // Fügt dem Array eine Zeichnung hinzu. Es kann jede Zeichnung nur einmal hinzugefügt werden
-        //  obj: Die neue Zeichnung
-        //  return: 1, falls die Zeichnung erfolgreich hinzugefügt wurde.
-        __declspec( dllexport ) bool addZeichnung( Zeichnung *obj );
-        // Entfernt eine Zeichnung
-        //  obj: Die Zeichnung, die entfernt werden soll
-        //  return 1, falls die Zeichnung erfolgreich entfernt wurde
-        __declspec( dllexport ) bool removeZeichnung( Zeichnung *obj );
-        // Entfernt eine Zeichnung
-        //  i: Der Index der Zeichnung, die entfernt werden soll
-        //  return 1, falls die Zeichnung erfolgreich entfernt wurde
-        __declspec( dllexport ) bool removeZeichnung( int i );
-        // Setzt den Zeiger auf das Nächste Array Element auf 0
-        __declspec( dllexport ) void setNext0();
-        // Aktualisiert die Array indizes.
-        //  i: Der Index des ersten Elements
-        __declspec( dllexport ) void updateIndex( int i );
-        // Gibt den Zeiger auf das nchste Array Element zurück
-        __declspec( dllexport ) ZeichnungArray *getNext() const;
-        // Gibt eine Zeichnung zurück
-        //  i: Der Index der Zeichnung
-        __declspec( dllexport ) Zeichnung *getZeichnung( int i ) const;
-        // Gibt die Zeichnung dieses Array Elements zurück
-        __declspec( dllexport ) Zeichnung *getZeichnung() const;
-        // Gibt den Index dieses Array Elements zurück
-        __declspec( dllexport ) int getIndex() const;
-        // Sendet an alle Zeichnungen ein Maus Ereignis. Die zuletzt hinzugefügte Zeichnung bekommt das Ereignis als Erste
-        //  me: Das Ereignis
-        __declspec( dllexport ) void sendMausAll( MausEreignis &me ) const;
-        // Sendet an alle Zeichnungen ein Tastatur Ereignis. Die zuletzt hinzugefügte Zeichnung bekommt das Ereignis als Erste
-        //  te: Das Ereignis
-        __declspec( dllexport ) void sendTastaturAll( TastaturEreignis &te ) const;
-        // Zeichnet alle Zeichnungen. Die zuletzt hinzugefügte Zeichnung ist oben
-        //  zRObj: Das Bild, in das alle Zeichnungen gezeichnet werden sollen
-        __declspec( dllexport ) void render( Bild &zRObj );
-        // Verarbeitet bei allen Zeichnungen die Vergangene Zeit seit dem letzten Aufruf der Funktion
-        //  tickVal: Die vergangene Zeit in Sekunden
-        __declspec( dllexport ) bool tick( double tickval );
+        // Erhöht den Reference Counting Zähler.
+        //  return: this.
+        __declspec( dllexport ) Zeichnung *getThis();
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) virtual Zeichnung *release();
     };
 
     // Eine Zeichnung für das 2D GUI Framework mit Hintergrund, Rahmen und Scroll Balken
@@ -266,7 +220,7 @@ namespace Framework
         // Konstruktor 
         __declspec( dllexport ) ZeichnungHintergrund();
         // Destruktor 
-        __declspec( dllexport ) ~ZeichnungHintergrund();
+        __declspec( dllexport ) virtual ~ZeichnungHintergrund();
         // Setzt das Hintergrund Bild (benötigt Flag zum Zeichnen: Hintergrund, HBild)
         //  bild: Das Bild wird kopiert und als Hintergrundbild verwendet
         __declspec( dllexport ) void setHintergrundBild( Bild *bild );