Browse Source

use more flexible implementation of reference counting

Kolja Strohm 3 years ago
parent
commit
8c1e86952d
124 changed files with 1608 additions and 3053 deletions
  1. 14 29
      Animation.cpp
  2. 1 8
      Animation.h
  3. 2 19
      Animation3D.cpp
  4. 2 8
      Animation3D.h
  5. 84 119
      Array.h
  6. 37 37
      AuswahlBox.cpp
  7. 84 99
      Bild.cpp
  8. 78 85
      Bild.h
  9. 28 42
      Bildschirm.cpp
  10. 1 8
      Bildschirm.h
  11. 5 17
      CharMap.h
  12. 6 6
      Cube.cpp
  13. 1 16
      DLLRegister.cpp
  14. 2 5
      DLLRegister.h
  15. 23 23
      DX11GraphicsApi.cpp
  16. 36 36
      DX12GraphicsApi.cpp
  17. 19 19
      DX12PixelShader.h
  18. 21 21
      DX12VertexShader.h
  19. 1 19
      DXBuffer.cpp
  20. 2 8
      DXBuffer.h
  21. 3 16
      DXCommandQueue.cpp
  22. 2 4
      DXCommandQueue.h
  23. 15 30
      Datei.cpp
  24. 1 8
      Datei.h
  25. 6 30
      DateiDialog.cpp
  26. 1 10
      DateiDialog.h
  27. 135 300
      DateiSystem.cpp
  28. 11 88
      DateiSystem.h
  29. 18 64
      Diagramm.cpp
  30. 2 29
      Diagramm.h
  31. 10 24
      Dialog.cpp
  32. 2 5
      Dialog.h
  33. 5 24
      DreieckListe.h
  34. 19 0
      Feld.h
  35. 49 64
      Fenster.cpp
  36. 1 8
      Fenster.h
  37. 3 3
      Fortschritt.cpp
  38. 2 1
      Framework.vcxproj
  39. 6 3
      Framework.vcxproj.filters
  40. 18 0
      Funktion.h
  41. 1 14
      GraphicsApi.cpp
  42. 1 6
      GraphicsApi.h
  43. 11 26
      InitDatei.cpp
  44. 1 8
      InitDatei.h
  45. 10 23
      JSON.cpp
  46. 2 4
      JSON.h
  47. 9 24
      KSGTDatei.cpp
  48. 1 8
      KSGTDatei.h
  49. 2 21
      Kam3D.cpp
  50. 1 9
      Kam3D.h
  51. 5 5
      Kamera2D.cpp
  52. 16 46
      Key.cpp
  53. 3 16
      Key.h
  54. 34 0
      Klasse.h
  55. 30 30
      Knopf.cpp
  56. 30 33
      Liste.cpp
  57. 16 30
      M2Datei.cpp
  58. 1 8
      M2Datei.h
  59. 56 72
      M3Datei.cpp
  60. 2 7
      M3Datei.h
  61. 2 17
      Maus.cpp
  62. 2 8
      Maus.h
  63. 28 44
      Model2D.cpp
  64. 2 9
      Model2D.h
  65. 22 75
      Model3D.cpp
  66. 3 24
      Model3D.h
  67. 2 21
      Model3DList.cpp
  68. 1 8
      Model3DList.h
  69. 5 17
      Pair.h
  70. 2 15
      Prozess.cpp
  71. 2 8
      Prozess.h
  72. 5 23
      Random.cpp
  73. 2 8
      Random.h
  74. 24 0
      ReferenceCounter.cpp
  75. 18 0
      ReferenceCounter.h
  76. 0 31
      ReferenceCounting.h
  77. 9 0
      Reflection.h
  78. 21 0
      ReflectionExample.h
  79. 1 0
      ReflectionStuff.cpp
  80. 5 13
      RenderThread.cpp
  81. 0 2
      RenderThread.h
  82. 36 94
      Schrift.cpp
  83. 5 32
      Schrift.h
  84. 3 18
      Scroll.cpp
  85. 6 12
      Scroll.h
  86. 1 19
      Shader.cpp
  87. 1 8
      Shader.h
  88. 11 0
      Sichtbarkeit.h
  89. 54 54
      Tabelle.cpp
  90. 33 85
      Text.cpp
  91. 3 16
      Text.h
  92. 29 50
      TextFeld.cpp
  93. 1 8
      TextFeld.h
  94. 5 23
      Textur.cpp
  95. 2 8
      Textur.h
  96. 3 19
      Textur2D.cpp
  97. 2 8
      Textur2D.h
  98. 3 22
      TexturList.cpp
  99. 1 8
      TexturList.h
  100. 2 19
      Thread.cpp
  101. 2 8
      Thread.h
  102. 2 21
      ToolTip.cpp
  103. 0 3
      ToolTip.h
  104. 4 17
      Tree.h
  105. 3 16
      Trie.h
  106. 13 0
      Typ.h
  107. 6 6
      UIDialog.cpp
  108. 8 8
      UIInitialization.cpp
  109. 15 15
      UIMLView.cpp
  110. 17 17
      UIPixelShader.h
  111. 19 19
      UIVertexShader.h
  112. 17 43
      Welt2D.cpp
  113. 2 11
      Welt2D.h
  114. 2 20
      Welt3D.cpp
  115. 1 8
      Welt3D.h
  116. 25 39
      XML.cpp
  117. 3 7
      XML.h
  118. 21 29
      Zeichnung.cpp
  119. 3 9
      Zeichnung.h
  120. 1 14
      Zeichnung3D.cpp
  121. 2 8
      Zeichnung3D.h
  122. 87 147
      Zeit.cpp
  123. 5 32
      Zeit.h
  124. 5 5
      main.h

+ 14 - 29
Animation.cpp

@@ -11,12 +11,12 @@ using namespace Framework;
 // Inhalt der Animation2DData Klasse aus Animation.h
 // Konstruktor
 Animation2DData::Animation2DData()
-    : bilder( 0 ),
+    : ReferenceCounter(),
+    bilder( 0 ),
     bildAnzahl( 0 ),
     fps( 0 ),
     wiederhohlen( 0 ),
-    transparent( 0 ),
-    ref( 1 )
+    transparent( 0 )
 {}
 
 // Destruktor
@@ -58,7 +58,7 @@ void Animation2DData::ladeAnimation( InitDatei *datei )
         --anz;
         transparent = datei->zWert( "transparent" )->istGleich( "true" );
     }
-    Bild **bilder = new Bild*[ anz ];
+    Bild **bilder = new Bild * [ anz ];
     int j = 0;
     for( int i = 0; i < anz; ++i )
     {
@@ -73,14 +73,14 @@ void Animation2DData::ladeAnimation( InitDatei *datei )
             Text *name = pfad.getTeilText( pfad.positionVon( ".ltdb/", pfad.anzahlVon( ".ltdb/" ) - 1 ) + 6 );
             pfad.setText( pfad.getTeilText( 0, pfad.getLength() - name->getLength() - 1 ) );
             LTDBDatei *dat = new LTDBDatei();
-            dat->setDatei( pfad.getThis() );
+            dat->setDatei( (Text *)pfad.getThis() );
             dat->leseDaten( 0 );
             bilder[ j ] = dat->laden( 0, name );
             dat->release();
         }
         ++j;
     }
-    this->bilder = new Bild*[ bildAnzahl ];
+    this->bilder = new Bild * [ bildAnzahl ];
     j = 0;
     for( int i = 0; i < anz; ++i )
     {
@@ -103,14 +103,14 @@ void Animation2DData::ladeAnimation( LTDBDatei *datei )
     int anz = datei->getBildAnzahl();
     RCArray< Text > *list = datei->zBildListe();
     lock();
-    Bild **bilder = new Bild*[ anz ];
+    Bild **bilder = new Bild * [ anz ];
     for( int i = 0; i < anz; ++i )
     {
         bilder[ i ] = datei->laden( 0, list->get( i ) );
         if( bilder[ i ] )
             ++bildAnzahl;
     }
-    this->bilder = new Bild*[ bildAnzahl ];
+    this->bilder = new Bild * [ bildAnzahl ];
     int j = 0;
     for( int i = 0; i < anz; ++i )
     {
@@ -143,7 +143,7 @@ void Animation2DData::reset()
 {
     lock();
     for( int i = 0; i < bildAnzahl; ++i )
-        bilder[ i ] = bilder[ i ]->release();
+        bilder[ i ] = (Bild *)bilder[ i ]->release();
     delete[] bilder;
     bilder = 0;
     bildAnzahl = 0;
@@ -156,7 +156,7 @@ void Animation2DData::reset()
 // constant
 Bild *Animation2DData::getBild( int i ) const
 {
-    return ( i >= 0 && i < bildAnzahl ) ? bilder[ i ]->getThis() : 0;
+    return ( i >= 0 && i < bildAnzahl ) ? (Bild *)bilder[ i ]->getThis() : 0;
 }
 
 Bild *Animation2DData::zBild( int i ) const
@@ -184,21 +184,6 @@ bool Animation2DData::istTransparent() const
     return transparent;
 }
 
-// Reference Counting
-Animation2DData *Animation2DData::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Animation2DData *Animation2DData::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der Animation2D Klasse aus Animation.h
 // Konstruktor
 Animation2D::Animation2D()
@@ -356,7 +341,7 @@ void Animation2D::render( Bild &zRObj )
 // constant
 Animation2DData *Animation2D::getAnimationData() const
 {
-    return data ? data->getThis() : 0;
+    return data ? (Animation2DData *)data->getThis() : 0;
 }
 
 Animation2DData *Animation2D::zAnimationData() const
@@ -386,7 +371,7 @@ bool Animation2D::hatRahmen() const
 
 Rahmen *Animation2D::getRahmen() const
 {
-    return ram ? (Rahmen*)ram->getThis() : 0;
+    return ram ? (Rahmen *)ram->getThis() : 0;
 }
 
 Rahmen *Animation2D::zRahmen() const
@@ -414,9 +399,9 @@ Zeichnung *Animation2D::dublizieren() const
     ret->setMausEreignis( mak );
     ret->setTastaturEreignis( tak );
     if( toolTip )
-        ret->setToolTipZ( (ToolTip*)toolTip->dublizieren() );
+        ret->setToolTipZ( (ToolTip *)toolTip->dublizieren() );
     if( data )
-        ret->setAnimationDataZ( data->getThis() );
+        ret->setAnimationDataZ( (Animation2DData *)data->getThis() );
     ret->setAPS( aps );
     ret->setSichtbar( sichtbar );
     ret->setAlphaMaske( maxAlpha );

+ 1 - 8
Animation.h

@@ -12,7 +12,7 @@ namespace Framework
     class Rahmen; //! Rahmen.h
 
     //! Enthält alle Bilder einer Video Animation
-    class Animation2DData
+    class Animation2DData : public virtual ReferenceCounter
     {
     private:
         Bild **bilder;
@@ -21,7 +21,6 @@ namespace Framework
         bool wiederhohlen;
         bool transparent;
         Critical cs;
-        int ref;
 
     public:
         //! Konstruktor
@@ -69,12 +68,6 @@ namespace Framework
         DLLEXPORT bool istWiederhohlend() const;
         //! Gibt zurück, ob beim Zeichnen der Bilder Alphablending benutzt wird
         DLLEXPORT bool istTransparent() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Animation2DData *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Animation2DData *release();
     };
 
     //! Eine Zeichnung, die eine Video Animation zeichnet

+ 2 - 19
Animation3D.cpp

@@ -14,11 +14,11 @@ void Animation3D::deleteKnochenData( KnochenData *d )
 // Inhalt der Animation3D Klasse aus Animation3D.h
 // Konstruktor
 Animation3D::Animation3D()
+    : ReferenceCounter()
 {
     for( int i = 0; i < MAX_KNOCHEN_ANZ; i++ )
         kd[ i ] = 0;
     maxTime = 0;
-    ref = 1;
 }
 
 // Destructor
@@ -51,7 +51,7 @@ void Animation3D::addKeyFrame( int kId, double time, Vec3<float> pos, Vec3<float
     d->next->next = 0;
     d->next->time = time;
     d->next->pos = pos;
-    d->next->rot = rot;    
+    d->next->rot = rot;
 }
 
 // Wendet die Animation auf ein bestimmtes Skelett an
@@ -109,21 +109,4 @@ void Animation3D::apply( Knochen *zK, double timeOffset, double sec ) const
                 d = kd[ zK->id ];
         }
     }
-}
-
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Animation3D *Animation3D::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Animation3D *Animation3D::release()
-{
-    if( --ref == 0 )
-        delete this;
-    return 0;
 }

+ 2 - 8
Animation3D.h

@@ -1,13 +1,14 @@
 #pragma once
 
 #include "Vec3.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
     class Skelett;
     class Knochen;
 
-    class Animation3D
+    class Animation3D : public virtual ReferenceCounter
     {
     private:
         struct KnochenData
@@ -20,7 +21,6 @@ namespace Framework
 
         KnochenData *kd[ MAX_KNOCHEN_ANZ ];
         double maxTime;
-        int ref;
 
         //! löscht eine KnochenData Struktur
         void deleteKnochenData( KnochenData *d );
@@ -46,11 +46,5 @@ namespace Framework
         //! timeOffset: zeit in sekunden, die diese Animation bereits auf dem Knochen angewendet wurde.
         //! sec: zeit in Sekunden, die vergangen ist seit dem diese Methode zuletzt für dem Knochen aufgerufen wurde
         DLLEXPORT void apply( Knochen *zK, double timeOffset, double sec ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Animation3D *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Animation3D *release();
     };
 }

+ 84 - 119
Array.h

@@ -4,6 +4,7 @@
 #include "Betriebssystem.h"
 #include <stdexcept>
 #include "Text.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -13,10 +14,10 @@ namespace Framework
     {
         TYP var;
         bool set = false;
-        ArrayEintrag< TYP >* next = 0;
+        ArrayEintrag< TYP > *next = 0;
 
         //! Setzt den Eintrag auf die Werte des anderen Eintrages
-        ArrayEintrag& operator=( ArrayEintrag& r )
+        ArrayEintrag &operator=( ArrayEintrag &r )
         {
             var = r.var;
             set = r.set;
@@ -32,12 +33,12 @@ namespace Framework
                 err += __FILE__;
                 err += " Line: ";
                 err += __LINE__;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
             return var;
         }
         //! inkrementiert durch die Linked List durch
-        ArrayEintrag< TYP >& operator++() //! prefix
+        ArrayEintrag< TYP > &operator++() //! prefix
         {
             if( !next )
             {
@@ -51,7 +52,7 @@ namespace Framework
             return *next;
         }
         //! inkrementiert durch die Linked List durch
-        ArrayEintrag< TYP >& operator++( int ) //! postfix
+        ArrayEintrag< TYP > &operator++( int ) //! postfix
         {
             if( !next )
             {
@@ -71,10 +72,10 @@ namespace Framework
     class Iterator
     {
     private:
-        ArrayEintrag< TYP >* current;
+        ArrayEintrag< TYP > *current;
 
     public:
-        Iterator( ArrayEintrag< TYP >* start )
+        Iterator( ArrayEintrag< TYP > *start )
         {
             current = start;
             while( current && !current->set )
@@ -83,12 +84,12 @@ namespace Framework
             }
         }
 
-        Iterator( const Iterator& it )
+        Iterator( const Iterator &it )
         {
             current = it.current;
         }
 
-        Iterator< TYP >& operator=( Iterator< TYP >& r )
+        Iterator< TYP > &operator=( Iterator< TYP > &r )
         {
             current = r.current;
             return *this;
@@ -96,7 +97,7 @@ namespace Framework
 
         bool hasNext()
         {
-            ArrayEintrag< TYP >* next = current->next;
+            ArrayEintrag< TYP > *next = current->next;
             while( next && !next->set )
             {
                 next = next->next;
@@ -112,7 +113,7 @@ namespace Framework
                 err += __FILE__;
                 err += " Line: ";
                 err += __LINE__;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
             return Iterator( current->next );
         }
@@ -130,12 +131,12 @@ namespace Framework
                 err += __FILE__;
                 err += " Line: ";
                 err += __LINE__;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
             return current->var;
         }
 
-        Iterator< TYP >& operator++() //! prefix
+        Iterator< TYP > &operator++() //! prefix
         {
             do
             {
@@ -164,7 +165,7 @@ namespace Framework
                 err += __FILE__;
                 err += " Line: ";
                 err += __LINE__;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
             return current->var;
         }
@@ -177,7 +178,7 @@ namespace Framework
                 err += __FILE__;
                 err += " Line: ";
                 err += __LINE__;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
             return current->var;
         }
@@ -186,24 +187,25 @@ namespace Framework
 
     template< class TYP >
     //! Eine Linked List von Klassen, die kein Reference Counting berteiben
-    class Array
+    class Array : public virtual ReferenceCounter
     {
     private:
-        ArrayEintrag< TYP >* entries;
-        int ref;
+        ArrayEintrag< TYP > *entries;
 
     public:
         //! Erstellt eine neue Linked List
         Array() noexcept
+            : ReferenceCounter()
         {
             entries = new ArrayEintrag< TYP >();
             entries->set = 0;
             entries->next = 0;
-            ref = 1;
         }
 
         //! Kopiert eine Linked list
-        Array( const Array& arr )
+        //! 
+        Array( const Array &arr )
+            : ReferenceCounter()
         {
             entries = new ArrayEintrag< TYP >();
             entries->set = 0;
@@ -211,7 +213,6 @@ namespace Framework
             int anz = arr.getEintragAnzahl();
             for( int i = 0; i < anz; i++ )
                 add( arr.get( i ) );
-            ref = 1;
         }
 
         //! Leert und löscht die Linked List 
@@ -225,7 +226,7 @@ namespace Framework
         //! \param t Das neue Element
         void add( TYP t )
         {
-            for( ArrayEintrag< TYP >* e = entries; 1; e = e->next )
+            for( ArrayEintrag< TYP > *e = entries; 1; e = e->next )
             {
                 if( !e->set && !e->next )
                 {
@@ -249,19 +250,19 @@ namespace Framework
         {
             if( i < 0 )
                 return;
-            ArrayEintrag< TYP >* e = entries;
+            ArrayEintrag< TYP > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
                 {
-                    ArrayEintrag< TYP >* ne = new ArrayEintrag< TYP >();
+                    ArrayEintrag< TYP > *ne = new ArrayEintrag< TYP >();
                     ne->set = 0;
                     ne->next = 0;
                     e->next = ne;
                 }
                 e = e->next;
             }
-            ArrayEintrag< TYP >* ne = new ArrayEintrag< TYP >();
+            ArrayEintrag< TYP > *ne = new ArrayEintrag< TYP >();
             ne->var = e->var;
             ne->set = e->set;
             ne->next = e->next;
@@ -277,12 +278,12 @@ namespace Framework
         {
             if( i < 0 )
                 return;
-            ArrayEintrag< TYP >* e = entries;
+            ArrayEintrag< TYP > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
                 {
-                    ArrayEintrag< TYP >* ne = new ArrayEintrag< TYP >();
+                    ArrayEintrag< TYP > *ne = new ArrayEintrag< TYP >();
                     ne->set = 0;
                     ne->next = 0;
                     e->next = ne;
@@ -300,8 +301,8 @@ namespace Framework
         {
             if( i < 0 || p < 0 || i == p )
                 return;
-            ArrayEintrag< TYP >* e = entries;
-            ArrayEintrag< TYP >* ve = 0;
+            ArrayEintrag< TYP > *e = entries;
+            ArrayEintrag< TYP > *ve = 0;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
@@ -309,8 +310,8 @@ namespace Framework
                 ve = e;
                 e = e->next;
             }
-            ArrayEintrag< TYP >* e2 = entries == e ? e->next : entries;
-            ArrayEintrag< TYP >* ve2 = 0;
+            ArrayEintrag< TYP > *e2 = entries == e ? e->next : entries;
+            ArrayEintrag< TYP > *ve2 = 0;
             for( int a = 0; a < p; ++a )
             {
                 if( !e2 )
@@ -340,7 +341,7 @@ namespace Framework
         {
             if( i < 0 )
                 return;
-            ArrayEintrag< TYP >* e = entries;
+            ArrayEintrag< TYP > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
@@ -356,7 +357,7 @@ namespace Framework
             }
             else
                 e->set = 0;
-            ArrayEintrag< TYP >* del = e->next;
+            ArrayEintrag< TYP > *del = e->next;
             if( e->next )
                 e->next = e->next->next;
             else
@@ -384,8 +385,8 @@ namespace Framework
         //! Löscht alle Elemente der Liste
         void leeren()
         {
-            ArrayEintrag< TYP >* e2 = 0;
-            for( ArrayEintrag< TYP >* e = entries; e; e = e->next )
+            ArrayEintrag< TYP > *e2 = 0;
+            for( ArrayEintrag< TYP > *e = entries; e; e = e->next )
             {
                 delete e2;
                 e2 = e;
@@ -426,9 +427,9 @@ namespace Framework
                 err += __LINE__;
                 err += " Index: ";
                 err += i;
-                throw std::out_of_range( (char*)err );
+                throw std::out_of_range( (char *)err );
             }
-            ArrayEintrag< TYP >* e = entries;
+            ArrayEintrag< TYP > *e = entries;
             for( int a = 0; a < i && e; ++a )
                 e = e->next;
             if( e && e->set )
@@ -439,7 +440,7 @@ namespace Framework
             err += __LINE__;
             err += " Index: ";
             err += i;
-            throw std::out_of_range( (char*)err );
+            throw std::out_of_range( (char *)err );
         }
 
         //! Überprüft, ob ein Element in der Liste enthalten ist
@@ -449,7 +450,7 @@ namespace Framework
         {
             if( i < 0 )
                 return 0;
-            ArrayEintrag< TYP >* e = entries;
+            ArrayEintrag< TYP > *e = entries;
             for( int a = 0; a < i && e; ++a )
                 e = e->next;
             if( e && e->set )
@@ -462,7 +463,7 @@ namespace Framework
         int getWertIndex( TYP t ) const
         {
             int ret = 0;
-            for( ArrayEintrag< TYP >* e = entries; e; e = e->next )
+            for( ArrayEintrag< TYP > *e = entries; e; e = e->next )
             {
                 if( e->set && e->var == t )
                     return ret;
@@ -471,25 +472,7 @@ namespace Framework
             return -1;
         }
 
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        Array< TYP >* getThis()
-        {
-            ++ref;
-            return this;
-        }
-
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        Array< TYP >* release()
-        {
-            --ref;
-            if( !ref )
-                delete this;
-            return 0;
-        }
-
-        Array& operator=( const Array& arr )
+        Array &operator=( const Array &arr )
         {
             leeren();
             int anz = arr.getEintragAnzahl();
@@ -501,26 +484,26 @@ namespace Framework
 
     template< class TYP >
     //! Eine Linked List von Zeigern auf Zeichnunge, die Reference Counting berteiben
-    class RCArray
+    class RCArray : public virtual ReferenceCounter
     {
     private:
-        ArrayEintrag< TYP* >* entries;
-        int ref;
+        ArrayEintrag< TYP * > *entries;
 
     public:
         //! Erstellt eine neue Linked List
         RCArray() noexcept
+            : ReferenceCounter()
         {
-            entries = new ArrayEintrag< TYP* >();
+            entries = new ArrayEintrag< TYP * >();
             entries->set = 0;
             entries->next = 0;
-            ref = 1;
         }
 
         //! Kopiert eine Linked list
-        RCArray( const RCArray& arr )
+        RCArray( const RCArray &arr )
+            : ReferenceCounter()
         {
-            entries = new ArrayEintrag< TYP* >();
+            entries = new ArrayEintrag< TYP * >();
             entries->set = 0;
             entries->next = 0;
             int anz = arr.getEintragAnzahl();
@@ -538,9 +521,9 @@ namespace Framework
 
         //! Hängt ein Element ans Ende der Liste an
         //! \param t Das neue Element
-        void add( TYP* t )
+        void add( TYP *t )
         {
-            for( ArrayEintrag< TYP* >* e = entries; 1; e = e->next )
+            for( ArrayEintrag< TYP * > *e = entries; 1; e = e->next )
             {
                 if( !e->set && !e->next )
                 {
@@ -550,7 +533,7 @@ namespace Framework
                 }
                 if( !e->next )
                 {
-                    e->next = new ArrayEintrag< TYP* >();
+                    e->next = new ArrayEintrag< TYP * >();
                     if( e->next->set && e->next->var )
                         e->next->var->release();
                     e->next->set = 0;
@@ -562,7 +545,7 @@ namespace Framework
         //! Fügt ein Element bei einer bestimmten Position in die Liste ein
         //! \param t das neue Element
         //! \param i Die Position, wo das Element eingefügt wird (danach der Index des neuen Elementes)
-        void add( TYP* t, int i )
+        void add( TYP *t, int i )
         {
             if( i < 0 )
             {
@@ -570,19 +553,19 @@ namespace Framework
                     t->release();
                 return;
             }
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
                 {
-                    ArrayEintrag< TYP* >* ne = new ArrayEintrag< TYP* >();
+                    ArrayEintrag< TYP * > *ne = new ArrayEintrag< TYP * >();
                     ne->set = 0;
                     ne->next = 0;
                     e->next = ne;
                 }
                 e = e->next;
             }
-            ArrayEintrag< TYP* >* ne = new ArrayEintrag< TYP* >();
+            ArrayEintrag< TYP * > *ne = new ArrayEintrag< TYP * >();
             ne->var = e->var;
             ne->set = e->set;
             ne->next = e->next;
@@ -594,7 +577,7 @@ namespace Framework
         //! Setzt den Wert des i-ten Eintrags
         //! \param t der Neue Wert
         //! \param i Der Index des Eintrages der gesetzt werden soll
-        void set( TYP* t, int i )
+        void set( TYP *t, int i )
         {
             if( i < 0 )
             {
@@ -602,12 +585,12 @@ namespace Framework
                     t->release();
                 return;
             }
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
                 {
-                    ArrayEintrag< TYP* >* ne = new ArrayEintrag< TYP* >();
+                    ArrayEintrag< TYP * > *ne = new ArrayEintrag< TYP * >();
                     ne->set = 0;
                     ne->next = 0;
                     e->next = ne;
@@ -627,8 +610,8 @@ namespace Framework
         {
             if( i < 0 || p < 0 || i == p )
                 return;
-            ArrayEintrag< TYP* >* ve = 0;
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *ve = 0;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
@@ -636,8 +619,8 @@ namespace Framework
                 ve = e;
                 e = e->next;
             }
-            ArrayEintrag< TYP* >* e2 = entries == e ? e->next : entries;
-            ArrayEintrag< TYP* >* ve2 = 0;
+            ArrayEintrag< TYP * > *e2 = entries == e ? e->next : entries;
+            ArrayEintrag< TYP * > *ve2 = 0;
             for( int a = 0; a < p; ++a )
             {
                 if( !e2 )
@@ -667,7 +650,7 @@ namespace Framework
         {
             if( i < 0 )
                 return;
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i; ++a )
             {
                 if( !e->next )
@@ -689,7 +672,7 @@ namespace Framework
                     e->var->release();
                 e->set = 0;
             }
-            ArrayEintrag< TYP* >* del = e->next;
+            ArrayEintrag< TYP * > *del = e->next;
             if( e->next )
                 e->next = e->next->next;
             else
@@ -709,7 +692,7 @@ namespace Framework
         {
             if( vi < 0 || ni < 0 )
                 return;
-            TYP* tmp = get( ni );
+            TYP *tmp = get( ni );
             set( get( vi ), ni );
             set( tmp, vi );
         }
@@ -717,8 +700,8 @@ namespace Framework
         //! Löscht alle Elemente der Liste
         void leeren()
         {
-            ArrayEintrag< TYP* >* e2 = 0;
-            for( ArrayEintrag< TYP* >* e = entries; e; e = e->next )
+            ArrayEintrag< TYP * > *e2 = 0;
+            for( ArrayEintrag< TYP * > *e = entries; e; e = e->next )
             {
                 if( e2 && e2->var && e2->set )
                     e2->var->release();
@@ -728,16 +711,16 @@ namespace Framework
             if( e2 && e2->var && e2->set )
                 e2->var->release();
             delete e2;
-            entries = new ArrayEintrag< TYP* >();
+            entries = new ArrayEintrag< TYP * >();
             entries->set = 0;
             entries->next = 0;
         }
 
         //! Gibt einen Iterator zurück.
         //! Mit ++ kann durch die Liste iteriert werden
-        Iterator< TYP* > getIterator() const
+        Iterator< TYP * > getIterator() const
         {
-            return Iterator< TYP* >( entries );
+            return Iterator< TYP * >( entries );
         }
 
         //! Gibt zurück, wie viele Elemente in der Liste sind
@@ -752,7 +735,7 @@ namespace Framework
         int getLastIndex() const
         {
             int index = 0;
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *e = entries;
             for( ; e; ++index )
                 e = e->next;
             return index - 1;
@@ -760,30 +743,30 @@ namespace Framework
 
         //! Gibt den Wert des i-ten Elementes zurück mit erhöhtem Reference Counter
         //! \param i Der index des gesuchten Elementes, (0) wenn der Index nicht existiert
-        TYP* get( int i ) const
+        TYP *get( int i ) const
         {
             if( i < 0 )
-                return (TYP*)0;
-            ArrayEintrag< TYP* >* e = entries;
+                return (TYP *)0;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i && e; ++a )
                 e = e->next;
             if( e && e->set && e->var )
-                return (TYP*)e->var->getThis();
-            return (TYP*)0;
+                return (TYP *)e->var->getThis();
+            return (TYP *)0;
         }
 
         //! Gibt den Wert des i-ten Elementes zurück ohne erhöhten Reference Counter
         //! \param i Der index des gesuchten Elementes, (0) wenn der Index nicht existiert
-        TYP* z( int i ) const //! gibt den index - ten T zurück
+        TYP *z( int i ) const //! gibt den index - ten T zurück
         {
             if( i < 0 )
-                return (TYP*)0;
-            ArrayEintrag< TYP* >* e = entries;
+                return (TYP *)0;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i && e; ++a )
                 e = e->next;
             if( e && e->set && e->var )
-                return (TYP*)e->var;
-            return (TYP*)0;
+                return (TYP *)e->var;
+            return (TYP *)0;
         }
 
         //! Überprüft, ob ein Element in der Liste enthalten ist
@@ -793,7 +776,7 @@ namespace Framework
         {
             if( i < 0 )
                 return 0;
-            ArrayEintrag< TYP* >* e = entries;
+            ArrayEintrag< TYP * > *e = entries;
             for( int a = 0; a < i && e; ++a )
                 e = e->next;
             if( e && e->set )
@@ -801,25 +784,7 @@ namespace Framework
             return 0;
         }
 
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        RCArray< TYP >* getThis()
-        {
-            ++ref;
-            return this;
-        }
-
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        RCArray< TYP >* release()
-        {
-            --ref;
-            if( !ref )
-                delete this;
-            return 0;
-        }
-
-        RCArray& operator=( const RCArray& arr )
+        RCArray &operator=( const RCArray &arr )
         {
             leeren();
             int anz = arr.getEintragAnzahl();

+ 37 - 37
AuswahlBox.cpp

@@ -125,7 +125,7 @@ void AuswahlBox::doMausEreignis( MausEreignis &me, bool userRet ) // Maus
         return;
     mausEintrag = -1;
     bool insideParent = me.insideParent;
-    me.insideParent = me.mx >= 0 && me.mx < gr.x && me.my >= 0 && me.my < gr.y + ausklappHeight;
+    me.insideParent = me.mx >= 0 && me.mx < gr.x &&me.my >= 0 && me.my < gr.y + ausklappHeight;
     bool vera = me.verarbeitet;
     if( ausfahren )
     {
@@ -222,7 +222,7 @@ void AuswahlBox::setSchriftZ( Schrift *schrift ) // setzt die schrift
         textRd = new TextRenderer( schrift );
     else
         textRd->setSchriftZ( schrift );
-    ausfahren->setSchriftZ( schrift->getThis() );
+    ausfahren->setSchriftZ( (Schrift *)schrift->getThis() );
     rend = 1;
 }
 
@@ -1065,7 +1065,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlBuffer ) )
                     {
                         tmpBuffer = tf->getAlphaFeld();
-                        tf->setAlphaFeldZ( (AlphaFeld*)auswAf->getThis() );
+                        tf->setAlphaFeldZ( (AlphaFeld *)auswAf->getThis() );
                         tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                         tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
                     }
@@ -1078,7 +1078,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlHBild ) )
                         {
                             tmpHBild = tf->getHintergrundBild();
-                            tf->setHintergrundBildZ( auswBgB->getThis() );
+                            tf->setHintergrundBildZ( (Bild *)auswBgB->getThis() );
                             tmpHB = tf->hatStyle( TextFeld::Style::HBild );
                             tf->setStyle( TextFeld::Style::HBild, hatStyle( Style::HBild ) );
                         }
@@ -1091,7 +1091,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                     if( hatStyle( Style::AuswahlRahmen ) )
                     {
                         tmpRahmen = tf->getRahmen();
-                        tf->setRahmenZ( (Rahmen*)auswRahmen->getThis() );
+                        tf->setRahmenZ( (Rahmen *)auswRahmen->getThis() );
                         tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                         tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
                     }
@@ -1246,7 +1246,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlBuffer ) )
                         {
                             tmpBuffer = tf->getAlphaFeld();
-                            tf->setAlphaFeldZ( (AlphaFeld*)auswAf->getThis() );
+                            tf->setAlphaFeldZ( (AlphaFeld *)auswAf->getThis() );
                             tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                             tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::AuswahlBuffer ) );
                         }
@@ -1259,7 +1259,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                             if( hatStyle( Style::AuswahlHBild ) )
                             {
                                 tmpHBild = tf->getHintergrundBild();
-                                tf->setHintergrundBildZ( auswBgB->getThis() );
+                                tf->setHintergrundBildZ( (Bild *)auswBgB->getThis() );
                                 tmpHB = tf->hatStyle( TextFeld::Style::HBild );
                                 tf->setStyle( TextFeld::Style::HBild, hatStyle( Style::HBild ) );
                             }
@@ -1272,7 +1272,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlRahmen ) )
                         {
                             tmpRahmen = tf->getRahmen();
-                            tf->setRahmenZ( (Rahmen*)auswRahmen->getThis() );
+                            tf->setRahmenZ( (Rahmen *)auswRahmen->getThis() );
                             tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                             tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::AuswahlRahmen ) );
                         }
@@ -1324,7 +1324,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::MausBuffer ) )
                         {
                             tmpBuffer = tf->getAlphaFeld();
-                            tf->setAlphaFeldZ( (AlphaFeld*)mausAf->getThis() );
+                            tf->setAlphaFeldZ( (AlphaFeld *)mausAf->getThis() );
                             tmpB = tf->hatStyle( TextFeld::Style::Buffered );
                             tf->setStyle( TextFeld::Style::Buffered, hatStyle( Style::MausBuffer ) );
                         }
@@ -1337,7 +1337,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                             if( hatStyle( Style::MausHBild ) )
                             {
                                 tmpHBild = tf->getHintergrundBild();
-                                tf->setHintergrundBildZ( mausBgB->getThis() );
+                                tf->setHintergrundBildZ( (Bild *)mausBgB->getThis() );
                                 tmpHB = tf->hatStyle( TextFeld::Style::HBild );
                                 tf->setStyle( TextFeld::Style::HBild, hatStyle( Style::HBild ) );
                             }
@@ -1350,7 +1350,7 @@ void AuswahlBox::render( Bild &zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::MausRahmen ) )
                         {
                             tmpRahmen = tf->getRahmen();
-                            tf->setRahmenZ( (Rahmen*)mausRahmen->getThis() );
+                            tf->setRahmenZ( (Rahmen *)mausRahmen->getThis() );
                             tmpR = tf->hatStyle( TextFeld::Style::Rahmen );
                             tf->setStyle( TextFeld::Style::Rahmen, hatStyle( Style::MausRahmen ) );
                         }
@@ -1598,7 +1598,7 @@ Knopf *AuswahlBox::getAusklappKnopf() const // gibt den aus-/einklapp Knopf zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return ausfahren ? (Knopf*)ausfahren->getThis() : 0;
+    return ausfahren ? (Knopf *)ausfahren->getThis() : 0;
 }
 
 Knopf *AuswahlBox::zAusklappKnopf() const
@@ -1711,7 +1711,7 @@ Rahmen *AuswahlBox::getAuswRahmen() const // gibt den Auswahl Rahmen zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return auswRahmen ? (Rahmen*)auswRahmen->getThis() : 0;
+    return auswRahmen ? (Rahmen *)auswRahmen->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zAuswRahmen() const
@@ -1739,7 +1739,7 @@ AlphaFeld *AuswahlBox::getAuswAlphaFeld() const // gibt das Auswahl AlphaFeld zu
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return auswAf ? (AlphaFeld*)auswAf->getThis() : 0;
+    return auswAf ? (AlphaFeld *)auswAf->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zAuswAlphaFeld() const
@@ -1774,7 +1774,7 @@ Bild *AuswahlBox::getAuswHintergrundBild() const // gibt das Auswahl Hintergrund
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return auswBgB ? auswBgB->getThis() : 0;
+    return auswBgB ? (Bild *)auswBgB->getThis() : 0;
 }
 
 Bild *AuswahlBox::zAuswHintergrundBild() const
@@ -1790,7 +1790,7 @@ Rahmen *AuswahlBox::getMsAuswRahmen( int i ) const // gibt den Multistyle Auswah
         return 0;
     if( !msAuswRahmen )
         return 0;
-    return msAuswRahmen->z( i ) ? (Rahmen*)msAuswRahmen->z( i )->getThis() : 0;
+    return msAuswRahmen->z( i ) ? (Rahmen *)msAuswRahmen->z( i )->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zMsAuswRahmen( int i ) const
@@ -1826,7 +1826,7 @@ AlphaFeld *AuswahlBox::getMsAuswAlphaFeld( int i ) const // gibt das Multistyle
         return 0;
     if( !msAuswAf )
         return 0;
-    return msAuswAf->z( i ) ? (AlphaFeld*)msAuswAf->z( i )->getThis() : 0;
+    return msAuswAf->z( i ) ? (AlphaFeld *)msAuswAf->z( i )->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zMsAuswAlphaFeld( int i ) const
@@ -1887,7 +1887,7 @@ Rahmen *AuswahlBox::getMausRahmen() const // gibt den Maus Rahmen zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return mausRahmen ? (Rahmen*)mausRahmen->getThis() : 0;
+    return mausRahmen ? (Rahmen *)mausRahmen->getThis() : 0;
 }
 
 Rahmen *AuswahlBox::zMausRahmen() const
@@ -1915,7 +1915,7 @@ AlphaFeld *AuswahlBox::getMausAlphaFeld() const // gibt das Maus AlphaFeld zur
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return mausAf ? (AlphaFeld*)mausAf->getThis() : 0;
+    return mausAf ? (AlphaFeld *)mausAf->getThis() : 0;
 }
 
 AlphaFeld *AuswahlBox::zMausAlphaFeld() const
@@ -1950,7 +1950,7 @@ Bild *AuswahlBox::getMausHintergrundBild() const // gibt das Maus Hintergrund Bi
 {
     if( hatStyle( Style::MultiStyled ) )
         return 0;
-    return mausBgB ? mausBgB->getThis() : 0;
+    return mausBgB ? (Bild *)mausBgB->getThis() : 0;
 }
 
 Bild *AuswahlBox::zMausHintergrundBild() const
@@ -2092,33 +2092,33 @@ Zeichnung *AuswahlBox::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     obj->setMausEreignis( mak );
     obj->setTastaturEreignis( tak );
     if( toolTip )
-        obj->setToolTipZ( (ToolTip*)toolTip->dublizieren() );
+        obj->setToolTipZ( (ToolTip *)toolTip->dublizieren() );
     obj->setStyle( style );
     if( textRd )
-        obj->setTextRendererZ( textRd->getThis() );
+        obj->setTextRendererZ( (TextRenderer *)textRd->getThis() );
     if( rahmen )
-        obj->setRahmenZ( (Rahmen*)rahmen->dublizieren() );
+        obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     if( ausfahren )
-        obj->setAusklappKnopfZ( (Knopf*)ausfahren->dublizieren() );
+        obj->setAusklappKnopfZ( (Knopf *)ausfahren->dublizieren() );
     obj->setHintergrundFarbe( hintergrundFarbe );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( hintergrundFeld )
-        obj->setAlphaFeldZ( (AlphaFeld*)hintergrundFeld->dublizieren() );
+        obj->setAlphaFeldZ( (AlphaFeld *)hintergrundFeld->dublizieren() );
     if( auswRahmen )
-        obj->setAuswRahmenZ( (Rahmen*)auswRahmen->dublizieren() );
+        obj->setAuswRahmenZ( (Rahmen *)auswRahmen->dublizieren() );
     obj->setAuswHintergrundFarbe( auswBgF );
     if( auswBgB )
-        obj->setAuswHintergrundBild( auswBgB->getThis() );
+        obj->setAuswHintergrundBild( (Bild *)auswBgB->getThis() );
     if( auswAf )
-        obj->setAuswAlphaFeldZ( (AlphaFeld*)auswAf->dublizieren() );
+        obj->setAuswAlphaFeldZ( (AlphaFeld *)auswAf->dublizieren() );
     if( mausRahmen )
-        obj->setMausRahmenZ( (Rahmen*)mausRahmen->dublizieren() );
+        obj->setMausRahmenZ( (Rahmen *)mausRahmen->dublizieren() );
     obj->setMausHintergrundFarbe( mausBgF );
     if( mausBgB )
-        obj->setMausHintergrundBild( mausBgB->getThis() );
+        obj->setMausHintergrundBild( (Bild *)mausBgB->getThis() );
     if( mausAf )
-        obj->setMausAlphaFeldZ( (AlphaFeld*)mausAf->dublizieren() );
+        obj->setMausAlphaFeldZ( (AlphaFeld *)mausAf->dublizieren() );
     obj->setMaxAuskappHeight( ausklapMaxHeight );
     obj->setEintragHeight( eintragHeight );
     for( int i = 0; i < anzahl; ++i )
@@ -2126,25 +2126,25 @@ Zeichnung *AuswahlBox::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
         if( members->z( i ) )
         {
             obj->addEintrag( "a" );
-            obj->setEintragZ( i, (TextFeld*)members->z( i )->dublizieren() );
+            obj->setEintragZ( i, (TextFeld *)members->z( i )->dublizieren() );
             if( msStyle && msStyle->hat( i ) )
                 obj->setMsStyle( i, msStyle->get( i ) );
             if( msAuswRahmen && msAuswRahmen->z( i ) )
-                obj->setMsAuswRahmenZ( i, (Rahmen*)msAuswRahmen->z( i )->dublizieren() );
+                obj->setMsAuswRahmenZ( i, (Rahmen *)msAuswRahmen->z( i )->dublizieren() );
             if( msAuswBgF && msAuswBgF->hat( i ) )
                 obj->setMsAuswHintergrundFarbe( i, msAuswBgF->get( i ) );
             if( msAuswBgB && msAuswBgB->z( i ) )
                 obj->setMsAuswHintergrundBild( i, msAuswBgB->get( i ) );
             if( msAuswAf && msAuswAf->z( i ) )
-                obj->setMsAuswAlphaFeldZ( i, (AlphaFeld*)msAuswAf->z( i )->dublizieren() );
+                obj->setMsAuswAlphaFeldZ( i, (AlphaFeld *)msAuswAf->z( i )->dublizieren() );
             if( msMausRahmen && msMausRahmen->z( i ) )
-                obj->setMsMausRahmenZ( i, (Rahmen*)msMausRahmen->z( i )->dublizieren() );
+                obj->setMsMausRahmenZ( i, (Rahmen *)msMausRahmen->z( i )->dublizieren() );
             if( msMausBgF && msMausBgF->hat( i ) )
                 obj->setMsMausHintergrundFarbe( i, msMausBgF->get( i ) );
             if( msMausBgB && msMausBgB->z( i ) )
                 obj->setMsMausHintergrundBild( i, msMausBgB->get( i ) );
             if( msMausAf && msMausAf->z( i ) )
-                obj->setMsMausAlphaFeldZ( i, (AlphaFeld*)msMausAf->z( i )->dublizieren() );
+                obj->setMsMausAlphaFeldZ( i, (AlphaFeld *)msMausAf->z( i )->dublizieren() );
         }
     }
     obj->setAlphaFeldFarbe( auswahl );

+ 84 - 99
Bild.cpp

@@ -32,10 +32,10 @@ using namespace Framework;
 // Inhalt der Bild Klasse aus Bild.h
 // Konstruktor 
 Bild::Bild( bool options )
-    : fc( 0 ),
+    : ReferenceCounter(),
+    fc( 0 ),
     delFc( 1 ),
     size( 0, 0 ),
-    ref( 1 ),
     drawOff( options ? new Punkt[ 2000 ] : new Punkt[ 1 ] ),
     dPosA( options ? new Punkt[ 2000 ] : new Punkt[ 1 ] ),
     dSizeA( options ? new Punkt[ 2000 ] : new Punkt[ 1 ] ),
@@ -75,8 +75,8 @@ inline void Bild::alphaPixelP3D( int x, int y, int f )
 
 inline void Bild::alphaPixelAssozP( int &fc, int f )
 {
-    unsigned char *fc1 = (unsigned char *)& fc;
-    unsigned char *fc2 = (unsigned char *)& f;
+    unsigned char *fc1 = (unsigned char *)&fc;
+    unsigned char *fc2 = (unsigned char *)&f;
     unsigned char na = (unsigned char)~fc2[ 3 ];
     unsigned char a = (unsigned char)( fc2[ 3 ] + ( ( na * fc1[ 3 ] ) >> 8 ) );
     if( a == 0 )
@@ -94,7 +94,7 @@ inline void Bild::alphaPixelP3D( int &fc, int colorb )
     int alpha = ( ( colorb >> 24 ) & 0xFF );
     int na = ( 0x100 - alpha );
     fc = ( ( ( ( ( na * ( fc & 0xFF00FF ) ) >> 8 ) + ( ( alpha * ( colorb & 0xFF00FF ) ) >> 8 ) ) & 0xFF00FF ) |
-        ( ( ( ( na * ( fc & 0x00FF00 ) ) >> 8 ) + ( ( alpha * ( colorb & 0x00FF00 ) ) >> 8 ) ) & 0x00FF00 ) |
+           ( ( ( ( na * ( fc & 0x00FF00 ) ) >> 8 ) + ( ( alpha * ( colorb & 0x00FF00 ) ) >> 8 ) ) & 0x00FF00 ) |
            ( ( fc & 0xFF000000 ) ) ) * ( fc != 0 ) | ( fc == 0 ) * colorb;
     //unsigned char *fc1 = (unsigned char*)&fc;
     //unsigned char *fc2 = (unsigned char*)&colorb;
@@ -112,7 +112,7 @@ inline void Bild::alphaPixelP( int &fc, int colorb )
     int alpha = ( ( colorb >> 24 ) & 0xFF );
     int na = ( 0x100 - alpha );
     fc = ( ( ( ( ( na * ( fc & 0xFF00FF ) ) >> 8 ) + ( ( alpha * ( colorb & 0xFF00FF ) ) >> 8 ) ) & 0xFF00FF ) |
-        ( ( ( ( na * ( fc & 0x00FF00 ) ) >> 8 ) + ( ( alpha * ( colorb & 0x00FF00 ) ) >> 8 ) ) & 0x00FF00 ) |
+           ( ( ( ( na * ( fc & 0x00FF00 ) ) >> 8 ) + ( ( alpha * ( colorb & 0x00FF00 ) ) >> 8 ) ) & 0x00FF00 ) |
            ( ( fc & 0xFF000000 ) ) );
     //unsigned char *fc1 = (unsigned char*)&fc;
     //unsigned char *fc2 = (unsigned char*)&colorb;
@@ -151,7 +151,7 @@ void Bild::drawFlatDreieck( int y1, int y2, float m1, float b1, float m2, float
 }
 
 void Bild::drawFlatDreieckTextur( int y1, int y2, double m1, double b1, double m2, double b2, double tx1, double ty1, double tx2, double ty2,
-                                  double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild & textur )
+                                  double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild &textur )
 {
     const double yStart = max( y1, dPosA[ doa ].y );
     const double yEnd = min( y2, dSizeA[ doa ].y );
@@ -191,7 +191,7 @@ void Bild::drawFlatDreieckAlpha( int y1, int y2, float m1, float b1, float m2, f
 }
 
 void Bild::drawFlatDreieckTexturAlpha( int y1, int y2, double m1, double b1, double m2, double b2, double tx1, double ty1, double tx2, double ty2,
-                                       double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild & textur )
+                                       double tx_1o, double ty_1o, double tx_2o, double ty_2o, double txf, double tyf, Bild &textur )
 {
     const double yStart = max( y1, dPosA[ doa ].y );
     const double yEnd = min( y2, dSizeA[ doa ].y );
@@ -204,7 +204,7 @@ void Bild::drawFlatDreieckTexturAlpha( int y1, int y2, double m1, double b1, dou
     }
 }
 
-void Bild::drawLinieHTextur( Vec2< double > p, double len, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild & textur ) // zeichnet eine horizontale Linie
+void Bild::drawLinieHTextur( Vec2< double > p, double len, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild &textur ) // zeichnet eine horizontale Linie
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -253,7 +253,7 @@ void Bild::drawLinieHTextur( Vec2< double > p, double len, Vec2< double > ta, Ve
     rend = 1;
 }
 
-void Bild::drawLinieHTexturAlpha( Vec2< double > p, double len, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild & textur ) // zeichnet eine horizontale Linie
+void Bild::drawLinieHTexturAlpha( Vec2< double > p, double len, Vec2< double > ta, Vec2< double > tb, double txo, double tyo, Bild &textur ) // zeichnet eine horizontale Linie
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -297,7 +297,7 @@ void Bild::drawLinieHTexturAlpha( Vec2< double > p, double len, Vec2< double > t
             f = buffer[ (int)( (int)( x + 0.5 ) + (int)( y + 0.5 ) * txtBr ) ];
             if( alpha[ alphaAnzahl ] )
             {
-                unsigned char *cf = (unsigned char *)& f;
+                unsigned char *cf = (unsigned char *)&f;
                 cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
             }
             alphaPixelP3D( *fc, f );
@@ -311,7 +311,7 @@ void Bild::drawLinieHTexturAlpha( Vec2< double > p, double len, Vec2< double > t
             f = buffer[ (int)( (int)( x + 0.5 ) + (int)( y + 0.5 ) * txtBr ) ];
             if( alpha[ alphaAnzahl ] )
             {
-                unsigned char *cf = (unsigned char *)& f;
+                unsigned char *cf = (unsigned char *)&f;
                 cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
             }
             alphaPixelP( *fc, f );
@@ -403,7 +403,7 @@ void Bild::setFarbe( int f )
     else
     {
         for( int *i = fc, *end = i + size.x * size.y; i < end; i++ )
-            * i = f;
+            *i = f;
     }
     rend = 1;
 }
@@ -442,7 +442,7 @@ void Bild::fillRegion( int x, int y, int b, int h, int ff )
     for( int i = 0; i < h; pixel += size.x - b, ++i, rowEnd += size.x )
     {
         for( ; pixel < rowEnd; ++pixel )
-            * pixel = ff;
+            *pixel = ff;
     }
     rend = 1;
 }
@@ -473,7 +473,7 @@ void Bild::alphaRegion( int x, int y, int b, int h, int ff )
     h = ( y + h ) >= dgy ? ( dgy - y ) : h;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& ff;
+        unsigned char *cf = (unsigned char *)&ff;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     int *pixel = fc + y * size.x + x;
@@ -489,7 +489,7 @@ void Bild::alphaRegion( int x, int y, int b, int h, int ff )
             for( ; pixel < rowEnd; ++pixel )
             {
                 *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                    ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                           ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                            ( ( *pixel & 0xFF000000 ) ) ) * ( *pixel != 0 ) | ( *pixel == 0 ) * ff;
             }
         }
@@ -501,7 +501,7 @@ void Bild::alphaRegion( int x, int y, int b, int h, int ff )
             for( ; pixel < rowEnd; ++pixel )
             {
                 *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                    ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                           ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                            ( ( *pixel & 0xFF000000 ) ) );
             }
         }
@@ -513,9 +513,9 @@ void Bild::alphaPixel2D( int i, int f )
 {
     if( !alpha[ alphaAnzahl ] )
         alphaPixelP( fc[ i ], f );
-	else
+    else
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         alphaPixelP( fc[ i ], f );
         rend = 1;
@@ -526,9 +526,9 @@ void Bild::alphaPixel3D( int i, int f )
 {
     if( !alpha[ alphaAnzahl ] )
         alphaPixelP3D( fc[ i ], f );
-	else
+    else
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         alphaPixelP3D( fc[ i ], f );
         rend = 1;
@@ -541,7 +541,7 @@ void Bild::alphaPixel2D( int x, int y, int f )
         alphaPixelP( fc[ x + y * size.x ], f );
     if( alpha[ alphaAnzahl ] < 0xFF )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         alphaPixelP( fc[ x + y * size.x ], f );
         rend = 1;
@@ -554,7 +554,7 @@ void Bild::alphaPixel3D( int x, int y, int f )
         alphaPixelP3D( fc[ x + y * size.x ], f );
     if( alpha[ alphaAnzahl ] < 0xFF )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         alphaPixelP3D( fc[ x + y * size.x ], f );
         rend = 1;
@@ -573,7 +573,7 @@ void Bild::alphaPixelDP2D( int x, int y, int f )
         return;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     alphaPixelP( fc[ x + y * size.x ], f );
@@ -592,7 +592,7 @@ void Bild::alphaPixelDP3D( int x, int y, int f )
         return;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     alphaPixelP3D( fc[ x + y * size.x ], f );
@@ -680,7 +680,7 @@ void Bild::drawLinieH( int x, int y, int len, int f ) // zeichnet eine horizonta
     int pval = len < 0 ? -1 : 1;
     len = len > 0 ? len : -len;
     for( int i = 0; i < len; ++i, fc += pval )
-        * fc = f;
+        *fc = f;
     rend = 1;
 }
 
@@ -719,7 +719,7 @@ void Bild::drawLinieV( int x, int y, int len, int f ) // zeichnet eine vertikale
     int pval = len < 0 ? -br : br;
     len = len > 0 ? len : -len;
     for( int i = 0; i < len; ++i, fc += pval )
-        * fc = f;
+        *fc = f;
     rend = 1;
 }
 
@@ -754,7 +754,7 @@ void Bild::drawLinieHAlpha( int x, int y, int len, int f ) // zeichnet eine hori
     int end = 0;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     int alpha = ( ( f >> 24 ) & 0xFF );
@@ -764,7 +764,7 @@ void Bild::drawLinieHAlpha( int x, int y, int len, int f ) // zeichnet eine hori
     for( int i = x + y * br; end < len; ++end, i += pval )
     {
         fc[ i ] = ( ( ( ( ( na * ( fc[ i ] & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-            ( ( ( ( na * ( fc[ i ] & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                    ( ( ( ( na * ( fc[ i ] & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                     ( ( fc[ i ] & 0xFF000000 ) ) ) * ( fc[ i ] != 0 || !alpha3D ) | ( fc[ i ] == 0 && alpha3D ) * f;
     }
     rend = 1;
@@ -801,7 +801,7 @@ void Bild::drawLinieVAlpha( int x, int y, int len, int f ) // zeichnet eine vert
     int end = 0;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& f;
+        unsigned char *cf = (unsigned char *)&f;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     int alpha = ( ( f >> 24 ) & 0xFF );
@@ -811,7 +811,7 @@ void Bild::drawLinieVAlpha( int x, int y, int len, int f ) // zeichnet eine vert
     for( int i = x + y * br; end < len; ++end, i += pval )
     {
         fc[ i ] = ( ( ( ( ( na * ( fc[ i ] & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-            ( ( ( ( na * ( fc[ i ] & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                    ( ( ( ( na * ( fc[ i ] & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                     ( fc[ i ] & 0xFF000000 ) ) * ( fc[ i ] != 0 || !alpha3D ) | ( fc[ i ] == 0 && alpha3D ) * f;
     }
     rend = 1;
@@ -987,7 +987,7 @@ void Bild::drawLinieBorderedAlpha( Punkt a, Punkt b, int bc, int fc )
         double x = (double)a.x, y = (double)a.y;
         if( alpha[ alphaAnzahl ] )
         {
-            unsigned char *cf = (unsigned char *)& fc;
+            unsigned char *cf = (unsigned char *)&fc;
             cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         }
         int maxP = (int)( sqrt( (float)( xlen * xlen + ylen * ylen ) ) + 0.5 );
@@ -1008,28 +1008,28 @@ void Bild::drawLinieBorderedAlpha( Punkt a, Punkt b, int bc, int fc )
             {
                 int &pixel = this->fc[ (int)( x - 0.5 ) + (int)( y + 0.5 ) * size.x ];
                 pixel = ( ( ( ( ( na2 * ( pixel & 0xFF00FF ) ) >> 8 ) + j1 ) & 0xFF00FF ) |
-                    ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
+                          ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
                           ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * bc;
             }
             if( (int)( (int)( x + 1.5 ) + (int)( y + 0.5 ) * size.x ) < maxPixel )
             {
                 int &pixel = this->fc[ (int)( x + 1.5 ) + (int)( y + 0.5 ) * size.x ];
                 pixel = ( ( ( ( ( na2 * ( pixel & 0xFF00FF ) ) >> 8 ) + j1 ) & 0xFF00FF ) |
-                    ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
+                          ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
                           ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * bc;
             }
             if( (int)( (int)( x + 0.5 ) + (int)( y - 0.5 ) * size.x ) < maxPixel )
             {
                 int &pixel = this->fc[ (int)( x + 0.5 ) + (int)( y - 0.5 ) * size.x ];
                 pixel = ( ( ( ( ( na2 * ( pixel & 0xFF00FF ) ) >> 8 ) + j1 ) & 0xFF00FF ) |
-                    ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
+                          ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
                           ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * bc;
             }
             if( (int)( (int)( x + 0.5 ) + (int)( y + 1.5 ) * size.x ) < maxPixel )
             {
                 int &pixel = this->fc[ (int)( x + 0.5 ) + (int)( y + 1.5 ) * size.x ];
                 pixel = ( ( ( ( ( na2 * ( pixel & 0xFF00FF ) ) >> 8 ) + j1 ) & 0xFF00FF ) |
-                    ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
+                          ( ( ( ( na2 * ( pixel & 0x00FF00 ) ) >> 8 ) + j2 ) & 0x00FF00 ) |
                           ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * bc;
             }
             x += xf, y += yf;
@@ -1040,7 +1040,7 @@ void Bild::drawLinieBorderedAlpha( Punkt a, Punkt b, int bc, int fc )
             ++count;
             int &pixel = this->fc[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * size.x ];
             pixel = ( ( ( ( ( na * ( pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                      ( ( ( ( na * ( pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                       ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * fc;
             x += xf, y += yf;
         }
@@ -1205,7 +1205,7 @@ void Bild::drawLinieAlpha( Punkt a, Punkt b, int fc )
         double x = (double)a.x, y = (double)a.y;
         if( alpha[ alphaAnzahl ] )
         {
-            unsigned char *cf = (unsigned char *)& fc;
+            unsigned char *cf = (unsigned char *)&fc;
             cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
         }
         int maxP = (int)( sqrt( (float)( xlen * xlen + ylen * ylen ) ) + 0.5 );
@@ -1219,7 +1219,7 @@ void Bild::drawLinieAlpha( Punkt a, Punkt b, int fc )
             ++count;
             int &pixel = this->fc[ (int)( x + 0.5 ) + (int)( y + 0.5 ) * size.x ];
             pixel = ( ( ( ( ( na * ( pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                      ( ( ( ( na * ( pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                       ( pixel & 0xFF000000 ) ) * ( pixel != 0 || !alpha3D ) | ( pixel == 0 && alpha3D ) * fc;
             x += xf, y += yf;
         }
@@ -1289,7 +1289,7 @@ void Bild::drawKreisAlpha( int xOff, int yOff, int r, int fc )
         return;
     if( alpha[ alphaAnzahl ] < 0xFF )
     {
-        unsigned char *cf = (unsigned char *)& fc;
+        unsigned char *cf = (unsigned char *)&fc;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     int alpha = ( ( fc >> 24 ) & 0xFF );
@@ -1304,63 +1304,63 @@ void Bild::drawKreisAlpha( int xOff, int yOff, int r, int fc )
         {
             pixel = &this->fc[ xOff + a + ( yOff + b ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff - a < dgx && xOff - a > dpx && yOff + b < dgy && yOff + b > dpy )
         {
             pixel = &this->fc[ xOff - a + ( yOff + b ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff + a < dgx && xOff + a > dpx && yOff - b < dgy && yOff - b > dpy )
         {
             pixel = &this->fc[ xOff + a + ( yOff - b ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff - a < dgx && xOff - a > dpx && yOff - b < dgy && yOff - b > dpy )
         {
             pixel = &this->fc[ xOff - a + ( yOff - b ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff + b < dgx && xOff + b > dpx && yOff + a < dgy && yOff + a > dpy )
         {
             pixel = &this->fc[ xOff + b + ( yOff + a ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff - b < dgx && xOff - b > dpx && yOff + a < dgy && yOff + a > dpy )
         {
             pixel = &this->fc[ xOff - b + ( yOff + a ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff + b < dgx && xOff + b > dpx && yOff - a < dgy && yOff - a > dpy )
         {
             pixel = &this->fc[ xOff + b + ( yOff - a ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
         if( xOff - b < dgx && xOff - b > dpx && yOff - a < dgy && yOff - a > dpy )
         {
             pixel = &this->fc[ xOff - b + ( yOff - a ) * size.x ];
             *pixel = ( ( ( ( ( na * ( *pixel & 0xFF00FF ) ) >> 8 ) + i1 ) & 0xFF00FF ) |
-                ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
+                       ( ( ( ( na * ( *pixel & 0x00FF00 ) ) >> 8 ) + i2 ) & 0x00FF00 ) |
                        ( *pixel & 0xFF000000 ) ) * ( *pixel != 0 || !alpha3D ) | ( *pixel == 0 && alpha3D ) * fc;
         }
     }
     rend = 1;
 }
 
-void Bild::drawBild( int x, int y, int br, int hi, Bild & zBild ) // zeichet zBild
+void Bild::drawBild( int x, int y, int br, int hi, Bild &zBild ) // zeichet zBild
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1398,7 +1398,7 @@ void Bild::drawBild( int x, int y, int br, int hi, Bild & zBild ) // zeichet zBi
     rend = 1;
 }
 
-void Bild::alphaBildAssoz( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBildAssoz( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1441,7 +1441,7 @@ void Bild::alphaBildAssoz( int x, int y, int br, int hi, Bild & zBild )
             for( xx = xst2; xx < dgx; ++xx )
             {
                 int fc = ff[ ( xx - xst2 + xst ) + ygr2 ];
-                unsigned char *cf = (unsigned char *)& fc;
+                unsigned char *cf = (unsigned char *)&fc;
                 cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                 alphaPixelAssozP( this->fc[ xx + ygr ], fc );
             }
@@ -1450,7 +1450,7 @@ void Bild::alphaBildAssoz( int x, int y, int br, int hi, Bild & zBild )
     rend = 1;
 }
 
-void Bild::alphaBild( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBild( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1512,7 +1512,7 @@ void Bild::alphaBild( int x, int y, int br, int hi, Bild & zBild )
                 for( xx = xst2; xx < dgx; ++xx )
                 {
                     int fc = ff[ ( xx - xst2 + xst ) + ygr2 ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP( this->fc[ xx + ygr ], fc );
                 }
@@ -1527,7 +1527,7 @@ void Bild::alphaBild( int x, int y, int br, int hi, Bild & zBild )
                 for( xx = xst2; xx < dgx; ++xx )
                 {
                     int fc = ff[ ( xx - xst2 + xst ) + ygr2 ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP3D( this->fc[ xx + ygr ], fc );
                 }
@@ -1537,7 +1537,7 @@ void Bild::alphaBild( int x, int y, int br, int hi, Bild & zBild )
     rend = 1;
 }
 
-void Bild::drawBild90( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet ein um 90 Grad nach rchts gedrehtes Bild
+void Bild::drawBild90( int x, int y, int br, int hi, Bild &zBild ) // Zeichnet ein um 90 Grad nach rchts gedrehtes Bild
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1574,7 +1574,7 @@ void Bild::drawBild90( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet
     rend = 1;
 }
 
-void Bild::alphaBild90( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBild90( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1629,7 +1629,7 @@ void Bild::alphaBild90( int x, int y, int br, int hi, Bild & zBild )
                 for( yy = yst2; yy < dgy; ++yy )
                 {
                     int fc = ff[ ( yy - yst2 + yst ) + xbb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP3D( xx, yy, fc );
                 }
@@ -1643,7 +1643,7 @@ void Bild::alphaBild90( int x, int y, int br, int hi, Bild & zBild )
                 for( yy = yst2; yy < dgy; ++yy )
                 {
                     int fc = ff[ ( yy - yst2 + yst ) + xbb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP( xx, yy, fc );
                 }
@@ -1653,7 +1653,7 @@ void Bild::alphaBild90( int x, int y, int br, int hi, Bild & zBild )
     rend = 1;
 }
 
-void Bild::drawBild180( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet ein um 180 Grad nach rchts gedrehtes Bild
+void Bild::drawBild180( int x, int y, int br, int hi, Bild &zBild ) // Zeichnet ein um 180 Grad nach rchts gedrehtes Bild
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1691,7 +1691,7 @@ void Bild::drawBild180( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet
     rend = 1;
 }
 
-void Bild::alphaBild180( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBild180( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1749,7 +1749,7 @@ void Bild::alphaBild180( int x, int y, int br, int hi, Bild & zBild )
                 for( xx = xst2; xx < dgx; ++xx )
                 {
                     int fc = ff[ ( bb - ( xx - xst2 + xst + 1 ) ) + ybb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP3D( this->fc[ xx + ygr ], fc );
                 }
@@ -1764,7 +1764,7 @@ void Bild::alphaBild180( int x, int y, int br, int hi, Bild & zBild )
                 for( xx = xst2; xx < dgx; ++xx )
                 {
                     int fc = ff[ ( bb - ( xx - xst2 + xst + 1 ) ) + ybb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP( this->fc[ xx + ygr ], fc );
                 }
@@ -1774,7 +1774,7 @@ void Bild::alphaBild180( int x, int y, int br, int hi, Bild & zBild )
     rend = 1;
 }
 
-void Bild::drawBild270( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet ein um 270 Grad nach rchts gedrehtes Bild
+void Bild::drawBild270( int x, int y, int br, int hi, Bild &zBild ) // Zeichnet ein um 270 Grad nach rchts gedrehtes Bild
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1811,7 +1811,7 @@ void Bild::drawBild270( int x, int y, int br, int hi, Bild & zBild ) // Zeichnet
     rend = 1;
 }
 
-void Bild::alphaBild270( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBild270( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1866,7 +1866,7 @@ void Bild::alphaBild270( int x, int y, int br, int hi, Bild & zBild )
                 for( yy = yst2; yy < dgy; ++yy )
                 {
                     int fc = ff[ ( bb - ( yy - yst2 + yst + 1 ) ) + xbb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP3D( xx, yy, fc );
                 }
@@ -1880,7 +1880,7 @@ void Bild::alphaBild270( int x, int y, int br, int hi, Bild & zBild )
                 for( yy = yst2; yy < dgy; ++yy )
                 {
                     int fc = ff[ ( bb - ( yy - yst2 + yst + 1 ) ) + xbb ];
-                    unsigned char *cf = (unsigned char *)& fc;
+                    unsigned char *cf = (unsigned char *)&fc;
                     cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                     alphaPixelP( xx, yy, fc );
                 }
@@ -1890,7 +1890,7 @@ void Bild::alphaBild270( int x, int y, int br, int hi, Bild & zBild )
     rend = 1;
 }
 
-void Bild::drawBildSkall( int x, int y, int br, int hi, Bild & zBild ) // zeichet zBild Skalliert
+void Bild::drawBildSkall( int x, int y, int br, int hi, Bild &zBild ) // zeichet zBild Skalliert
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1929,7 +1929,7 @@ void Bild::drawBildSkall( int x, int y, int br, int hi, Bild & zBild ) // zeiche
     rend = 1;
 }
 
-void Bild::alphaBildSkall( int x, int y, int br, int hi, Bild & zBild )
+void Bild::alphaBildSkall( int x, int y, int br, int hi, Bild &zBild )
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -1962,7 +1962,7 @@ void Bild::alphaBildSkall( int x, int y, int br, int hi, Bild & zBild )
             for( xx = xst2, xb = xst * xo; xx < dgx; ++xx, xb += xo )
             {
                 int f = ff[ (int)xb + ygr2 ];
-                unsigned char *cf = (unsigned char *)& f;
+                unsigned char *cf = (unsigned char *)&f;
                 cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                 alphaPixelP3D( fc[ xx + ygr ], f );
             }
@@ -1977,7 +1977,7 @@ void Bild::alphaBildSkall( int x, int y, int br, int hi, Bild & zBild )
             for( xx = xst2, xb = xst * xo; xx < dgx; ++xx, xb += xo )
             {
                 int f = ff[ (int)xb + ygr2 ];
-                unsigned char *cf = (unsigned char *)& f;
+                unsigned char *cf = (unsigned char *)&f;
                 cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
                 alphaPixelP( fc[ xx + ygr ], f );
             }
@@ -2054,7 +2054,7 @@ void Bild::drawDreieck( Punkt a, Punkt b, Punkt c, int farbe ) // f
     rend = 1;
 }
 
-void Bild::drawDreieckTextur( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild & textur ) // füllt eine Dreieck aus
+void Bild::drawDreieckTextur( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur ) // füllt eine Dreieck aus
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -2210,7 +2210,7 @@ void Bild::drawDreieckAlpha( Punkt a, Punkt b, Punkt c, int farbe ) // f
         return;
     if( alpha[ alphaAnzahl ] )
     {
-        unsigned char *cf = (unsigned char *)& farbe;
+        unsigned char *cf = (unsigned char *)&farbe;
         cf[ 3 ] = (unsigned char)( ( cf[ 3 ] > alpha[ alphaAnzahl ] ) * ( cf[ 3 ] - alpha[ alphaAnzahl ] ) );
     }
     if( b.y < a.y )
@@ -2262,7 +2262,7 @@ void Bild::drawDreieckAlpha( Punkt a, Punkt b, Punkt c, int farbe ) // f
     rend = 1;
 }
 
-void Bild::drawDreieckTexturAlpha( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild & textur ) // füllt eine Dreieck aus
+void Bild::drawDreieckTexturAlpha( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur ) // füllt eine Dreieck aus
 {
     if( alpha[ alphaAnzahl ] == 0xFF )
         return;
@@ -2410,7 +2410,7 @@ void Bild::replaceColorWithAlpha( int color )
         int ygr = y * size.x;
         for( int x = dx + xx; x < bb; x++ )
         {
-            unsigned char *cf = ( unsigned char * ) & ( fc[ x + ygr ] );
+            unsigned char *cf = (unsigned char *)&( fc[ x + ygr ] );
             int abstand = (int)sqrt( (float)( ( r - cf[ 2 ] ) * ( r - cf[ 2 ] ) + ( g - cf[ 1 ] ) * ( g - cf[ 1 ] ) + ( b - cf[ 0 ] ) * ( b - cf[ 0 ] ) ) );
             if( abstand > 255 )
                 abstand = 255;
@@ -2419,7 +2419,7 @@ void Bild::replaceColorWithAlpha( int color )
     }
 }
 
-bool Bild::setDrawOptions( const Punkt & pos, const Punkt & gr ) // setzt die Drawoptionen
+bool Bild::setDrawOptions( const Punkt &pos, const Punkt &gr ) // setzt die Drawoptionen
 {
     int dx = drawOff[ doa ].x, dy = drawOff[ doa ].y;
     int xx = dPosA[ doa ].x, yy = dPosA[ doa ].y;
@@ -2459,7 +2459,7 @@ bool Bild::setDrawOptions( int x, int y, int br, int hi )
     return 1;
 }
 
-bool Bild::setDrawOptionsErzwingen( const Punkt & pos, const Punkt & gr ) // setzt die Drawoptionen
+bool Bild::setDrawOptionsErzwingen( const Punkt &pos, const Punkt &gr ) // setzt die Drawoptionen
 {
     int dx = drawOff[ doa ].x, dy = drawOff[ doa ].y;
     if( dx + pos.x + gr.x < 0 || dy + pos.y + gr.y < 0 || dx + pos.x >= size.x || dy + pos.y >= size.y )
@@ -2573,21 +2573,6 @@ bool Bild::hasAlpha3D()
     return alpha3D;
 }
 
-// Reference Counting 
-Bild *Bild::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Bild *Bild::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der BildZ Klasse aus Bild.h
 // Konstruktor 
@@ -2628,7 +2613,7 @@ void BildZ::doMausEreignis( MausEreignis &me, bool userRet ) // ruft Mak auf
 }
 
 // nicht constant 
-void BildZ::setBildZ( Bild * b ) // setzt das Bild
+void BildZ::setBildZ( Bild *b ) // setzt das Bild
 {
     if( bild )
         bild->release();
@@ -2645,7 +2630,7 @@ void BildZ::setBildZ( Bild * b ) // setzt das Bild
     rend = 1;
 }
 
-void BildZ::setBild( Bild * b )
+void BildZ::setBild( Bild *b )
 {
     if( !bild )
         bild = new Bild();
@@ -2666,7 +2651,7 @@ bool BildZ::tick( double tickVal ) // tick
     return ZeichnungHintergrund::tick( tickVal );
 }
 
-void BildZ::render( Bild & zRObj ) // zeichnet nach zRObj
+void BildZ::render( Bild &zRObj ) // zeichnet nach zRObj
 {
     if( hatStyle( Style::Sichtbar ) )
     {
@@ -2724,7 +2709,7 @@ void BildZ::render( Bild & zRObj ) // zeichnet nach zRObj
 Bild *BildZ::getBild() const // gibt das Bild zurück
 {
     if( bild )
-        return bild->getThis();
+        return (Bild *)bild->getThis();
     return 0;
 }
 
@@ -2751,15 +2736,15 @@ Zeichnung *BildZ::dublizieren() const // erstellt eine Kopie des Zeichnungs
     if( rahmen )
         obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( bild )
-        obj->setBild( bild->getThis() );
+        obj->setBild( (Bild *)bild->getThis() );
     obj->setStyle( style );
     return obj;
 }
 
 #ifdef WIN32
-Bild *Framework::ladeBild( char *pfad, Text * zError )
+Bild *Framework::ladeBild( char *pfad, Text *zError )
 {
     Text p = pfad;
     Text *txt = p.getTeilText( p.positionVon( '.', p.anzahlVon( '.' ) - 1 ) );
@@ -2779,7 +2764,7 @@ Bild *Framework::ladeBild( char *pfad, Text * zError )
     Gdiplus::Color pix;
     delete[]name;
 
-    Bild * ret = new Bild();
+    Bild *ret = new Bild();
     ret->neuBild( bitmap.GetWidth(), bitmap.GetHeight(), 0 );
     int *buff = ret->getBuffer();
     for( unsigned int i = 0; i < bitmap.GetWidth() * bitmap.GetHeight(); i++ )

+ 78 - 85
Bild.h

@@ -17,13 +17,12 @@ namespace Framework
 #endif
 
     //! Verwaltet ein Bild als Array von Pixel Farben im A8R8G8B8 Format, in den gezeichnet werden kann
-    class Bild
+    class Bild : public virtual ReferenceCounter
     {
     private:
         int *fc;
         bool delFc;
         Punkt size;
-        int ref;
         Punkt *drawOff;
         Punkt *dPosA;
         Punkt *dSizeA;
@@ -53,226 +52,226 @@ namespace Framework
         //! Konstruktor
         //! \param options 1, wenn das Bild Buffer zum Zeichnen anlegen soll, wie zum Beispiel für temporäre Zeichnenflächen Begrenzungen und Transparenz Filter
         //!  Verbraucht etwa 50 kb mehr Arbeitsspeicher pro Bild
-       DLLEXPORT Bild( bool options = 0 );
+        DLLEXPORT Bild( bool options = 0 );
         //! Destruktor 
-       DLLEXPORT ~Bild();
+        DLLEXPORT ~Bild();
         //! Prüft ob ein Rechteck vollständig oder teilweise in der Zeichen Fläche liegt.
         //!  return 0, falls das Rechteck nicht in der Zeichenfläche liegt, 1 sonst
-       DLLEXPORT bool isAreaDrawable( int x, int y, int width, int height );
+        DLLEXPORT bool isAreaDrawable( int x, int y, int width, int height );
         //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
         //! Das ist sinnvoll für die Verwendung im 3DBildschirm, wo das Gezeichnette Bild später mittels Alpha Blending angezeigt wird.
         //! Der Flag wird im 3DBildschirm automatisch gesetzt
-       DLLEXPORT void setAlpha3D( bool erlaubt );
+        DLLEXPORT void setAlpha3D( bool erlaubt );
         //! Setzt die mindest Transparenz von allem was als nächstes gezeichnet wird, bis der zugehörige releaseAlpha() aufruf erfolgt.
-       DLLEXPORT void setAlpha( unsigned char alpha );
+        DLLEXPORT void setAlpha( unsigned char alpha );
         //! Entfernt die als letztes mit setAlpha() gesetzte Alpha grenze
-       DLLEXPORT void releaseAlpha();
+        DLLEXPORT void releaseAlpha();
         //! Setzt einen Zeiger auf die Pixel, in die gezeichnet werden soll
         //! \param buffer Ein Array mit den A8R8G8B8 Farbwerten
         //! \param deleteBuffer 1, fals der Array vom Bild gelöscht werden soll
         //! \param breite Die Breite in Pixeln
         //! \param height Die Höhe in Pixeln
-       DLLEXPORT void setPixelBuffer( int *buffer, bool deleteBuffer, int breite, int height );
+        DLLEXPORT void setPixelBuffer( int *buffer, bool deleteBuffer, int breite, int height );
         //! Erstellt ein neues Bild
         //! \param breite Die Breite des Bildes in Pixeln
         //! \param höhe Die Höhe des Bildes in Pixeln
         //! \param fillColor Die startfarbe, auf die alle Pixel gesetzt werden
-       DLLEXPORT void neuBild( int breite, int height, int fillColor );
+        DLLEXPORT void neuBild( int breite, int height, int fillColor );
         //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
         //! Beachtet nicht die begrenzung der Zeichnenfläche und das Skroll Offset
         //! \param x Die X Koordinate des Pixels
         //! \param y Die Y Koordinate des Pixels
         //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
-       DLLEXPORT void alphaPixel2D( int x, int y, int f );
-       DLLEXPORT void alphaPixel3D( int x, int y, int f );
+        DLLEXPORT void alphaPixel2D( int x, int y, int f );
+        DLLEXPORT void alphaPixel3D( int x, int y, int f );
         //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
         //! Beachtet nicht die begrenzung der Zeichnenfläche und das Skroll Offset
         //! \param i Der Index des Pixels im Pixel Array
         //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
-       DLLEXPORT void alphaPixel2D( int i, int f );
-       DLLEXPORT void alphaPixel3D( int i, int f );
+        DLLEXPORT void alphaPixel2D( int i, int f );
+        DLLEXPORT void alphaPixel3D( int i, int f );
         //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
         //! \param x Die X Koordinate des Pixels
         //! \param y Die Y Koordinate des Pixels
         //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
-       DLLEXPORT void alphaPixelDP2D( int x, int y, int f );
-       DLLEXPORT void alphaPixelDP3D( int x, int y, int f );
+        DLLEXPORT void alphaPixelDP2D( int x, int y, int f );
+        DLLEXPORT void alphaPixelDP3D( int x, int y, int f );
         //! Blendet mittels Alphablending eine Farbe auf einen bestimmten Pixel
         //! \param i Der Index des Pixels im Pixel Array
         //! \param f Die Farbe in A8R8G8B8 Format, die geblendet werden soll
-       DLLEXPORT void alphaPixelDP2D( int i, int f );
-       DLLEXPORT void alphaPixelDP3D( int i, int f );
+        DLLEXPORT void alphaPixelDP2D( int i, int f );
+        DLLEXPORT void alphaPixelDP3D( int i, int f );
         //! Setzt die Farbe eines besimmten Pixels
         //! \param x Die X Koordinate des Pixels
         //! \param y Die Y Koordinate des Pixels
         //! \param f Die neue Farbe in A8R8G8B8 Format
-       DLLEXPORT void setPixelDP( int x, int y, int f );
+        DLLEXPORT void setPixelDP( int x, int y, int f );
         //! Setzt die Farbe eines besimmten Pixels
         //! \param i Der Index des Pixels im Pixel Array
         //! \param f Die neue Farbe in A8R8G8B8 Format
-       DLLEXPORT void setPixelDP( int i, int f );
+        DLLEXPORT void setPixelDP( int i, int f );
         //! Setzt die Farbe aller Pixel des Bildes
         //! \param f Die neue Farbe
-       DLLEXPORT void setFarbe( int f );
+        DLLEXPORT void setFarbe( int f );
         //! Setzt die Farben aller Pixel in einem Rechteck
         //! \param x Die X Koordinate
         //! \param y Die Y Koordinate
         //! \param b Die Breite des Rechtecks
         //! \param h Die Höhe des Rechtecks
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void fillRegion( int x, int y, int b, int h, int fc );
+        DLLEXPORT void fillRegion( int x, int y, int b, int h, int fc );
         //! Blendet eine Farbe mit Alphablending in einem Rechteck
         //! \param x Die X Koordinate
         //! \param y Die Y Koordinate
         //! \param b Die Breite des Rechtecks
         //! \param h Die Höhe des Rechtecks
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void alphaRegion( int x, int y, int b, int h, int fc );
+        DLLEXPORT void alphaRegion( int x, int y, int b, int h, int fc );
         //! Zeichnet eine horizontale Linie
         //! \param x Die X Koordinate des Startpunktes der Linie
         //! \param y Die Y Koordinate des Startpunktes der Linie
         //! \param length Die Länge der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieH( int x, int y, int length, int fc );
+        DLLEXPORT void drawLinieH( int x, int y, int length, int fc );
         //! Zeichnet eine vertikale Linie
         //! \param x Die X Koordinate des Startpunktes der Linie
         //! \param y Die Y Koordinate des Startpunktes der Linie
         //! \param length Die Länge der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieV( int x, int y, int length, int fc );
+        DLLEXPORT void drawLinieV( int x, int y, int length, int fc );
         //! Zeichnet eine horizontale Linie mit Alpha blending
         //! \param x Die X Koordinate des Startpunktes der Linie
         //! \param y Die Y Koordinate des Startpunktes der Linie
         //! \param length Die Länge der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieHAlpha( int x, int y, int length, int fc );
+        DLLEXPORT void drawLinieHAlpha( int x, int y, int length, int fc );
         //! Zeichnet eine vertikale Linie mit Alpha Blending
         //! \param x Die X Koordinate des Startpunktes der Linie
         //! \param y Die Y Koordinate des Startpunktes der Linie
         //! \param length Die Länge der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieVAlpha( int x, int y, int length, int fc );
+        DLLEXPORT void drawLinieVAlpha( int x, int y, int length, int fc );
         //! Zeichnet eine Linie
         //! \param a Der Startpunkt der Linie
         //! \param b der Endpunkt der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieBordered( Punkt a, Punkt b, int bc, int fc );
+        DLLEXPORT void drawLinieBordered( Punkt a, Punkt b, int bc, int fc );
         //! Zeichnet eine Linie
         //! \param a Der Startpunkt der Linie
         //! \param b der Endpunkt der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieBorderedAlpha( Punkt a, Punkt b, int bc, int fc );
+        DLLEXPORT void drawLinieBorderedAlpha( Punkt a, Punkt b, int bc, int fc );
         //! Zeichnet eine Linie
         //! \param a Der Startpunkt der Linie
         //! \param b der Endpunkt der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinie( Punkt a, Punkt b, int fc );
+        DLLEXPORT void drawLinie( Punkt a, Punkt b, int fc );
         //! Zeichnet eine Linie mit Alpha Blending
         //! \param a Der Startpunkt der Linie
         //! \param b der Endpunkt der Linie
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawLinieAlpha( Punkt a, Punkt b, int fc );
+        DLLEXPORT void drawLinieAlpha( Punkt a, Punkt b, int fc );
         //! Füllt einen Kreis mit einer Farbe. (Unfertig)
         //! \param xOff Die X Koordinate des Kreismittelpunktes
         //! \param yOff Die Y Koordinate des Kreismittelpunktes
         //! \param r Der Radius des Kreises in Pixeln
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void fillCircle( int xOff, int yOff, int r, int fc );
+        DLLEXPORT void fillCircle( int xOff, int yOff, int r, int fc );
         //! Zeichnet den Umriss eines Kreises
         //! \param xOff Die X Koordinate des Kreismittelpunktes
         //! \param yOff Die Y Koordinate des Kreismittelpunktes
         //! \param r Der Radius des Kreises in Pixeln
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawKreis( int xOff, int yOff, int r, int fc );
+        DLLEXPORT void drawKreis( int xOff, int yOff, int r, int fc );
         //! Zeichnet den Umriss eines Kreises mit Alpha Blending
         //! \param xOff Die X Koordinate des Kreismittelpunktes
         //! \param yOff Die Y Koordinate des Kreismittelpunktes
         //! \param r Der Radius des Kreises in Pixeln
         //! \param fc Die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawKreisAlpha( int xOff, int yOff, int r, int fc );
+        DLLEXPORT void drawKreisAlpha( int xOff, int yOff, int r, int fc );
         //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void drawBild( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void drawBild( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBild( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBild( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild in ein bestimmtes Feld ohne Skallierung mit alpha blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBildAssoz( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBildAssoz( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void drawBild90( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void drawBild90( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 90 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBild90( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBild90( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void drawBild180( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void drawBild180( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 180 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBild180( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBild180( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void drawBild270( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void drawBild270( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild um 270 grad nach rechts gedreht in ein bestimmtes Feld ohne Skallierung mit alpha Blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBild270( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBild270( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void drawBildSkall( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void drawBildSkall( int x, int y, int br, int hi, Bild &zBild );
         //! Zeichnet ein Bild in ein bestimmtes Feld mit Skallierung mit Alpha Blending
         //! \param x Die X Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param y Die Y Koordinate der linken oberen Ecke des Rechtecks in dem das Bild gezeichnet werden soll
         //! \param br Die Breite des Rechecks in dem das Bild gezeichnet werden soll
         //! \param hi Die Höhe des Rechecks in dem das Bild gezeichnet werden soll
         //! \param zBild Das Bild, was gezeichnet werden soll
-       DLLEXPORT void alphaBildSkall( int x, int y, int br, int hi, Bild &zBild );
+        DLLEXPORT void alphaBildSkall( int x, int y, int br, int hi, Bild &zBild );
         //! Füllt ein Dreieck mit einer bestimmten Farbe
         //! \param a Eine Ecke des Dreiecks
         //! \param b Eine Ecke des Dreiecks
         //! \param c Eine Ecke des Dreiecks
         //! \param farbe die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawDreieck( Punkt a, Punkt b, Punkt c, int farbe );
+        DLLEXPORT void drawDreieck( Punkt a, Punkt b, Punkt c, int farbe );
         //! Füllt ein Dreieck mit einer bestimmten Textur
         //! \param a Eine Ecke des Dreiecks
         //! \param b Eine Ecke des Dreiecks
@@ -281,13 +280,13 @@ namespace Framework
         //! \param tb Die Koordinaten von b in der Textur
         //! \param tc Die Koordinaten von c in der Textur
         //! \param textur Das Bild, was als Textur verwendet werden soll
-       DLLEXPORT void drawDreieckTextur( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur );
+        DLLEXPORT void drawDreieckTextur( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur );
         //! Füllt ein Dreieck mit einer bestimmten Farbe mit alpha blending
         //! \param a Eine Ecke des Dreiecks
         //! \param b Eine Ecke des Dreiecks
         //! \param c Eine Ecke des Dreiecks
         //! \param farbe die Farbe im A8R8G8B8 Format
-       DLLEXPORT void drawDreieckAlpha( Punkt a, Punkt b, Punkt c, int farbe );
+        DLLEXPORT void drawDreieckAlpha( Punkt a, Punkt b, Punkt c, int farbe );
         //! Füllt ein Dreieck mit einer bestimmten Textur mit alpha blending
         //! \param a Eine Ecke des Dreiecks
         //! \param b Eine Ecke des Dreiecks
@@ -296,15 +295,15 @@ namespace Framework
         //! \param tb Die Koordinaten von b in der Textur
         //! \param tc Die Koordinaten von c in der Textur
         //! \param textur Das Bild, was als Textur verwendet werden soll
-       DLLEXPORT void drawDreieckTexturAlpha( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur );
+        DLLEXPORT void drawDreieckTexturAlpha( Punkt a, Punkt b, Punkt c, Punkt ta, Punkt tb, Punkt tc, Bild &textur );
         //! Ersetzt eine bestimmte Farbe durch Transparenz
-       DLLEXPORT void replaceColorWithAlpha( int color );
+        DLLEXPORT void replaceColorWithAlpha( int color );
         //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
         //! Wenn die Zeichenfläche über den Rand einer bestehenden Zeichenfläche hinausragt, wird sie automatisch auf die bestehende Zeichnenfläche beschnitten.
         //! \param pos Die Koordinaten der linken oberen Ecke der Zeichenfläche
         //! \param gr Die Größe der Zeichenfläche
         //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb der bestehenden Zeichenfläche ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
-       DLLEXPORT bool setDrawOptions( const Punkt &pos, const Punkt &gr );
+        DLLEXPORT bool setDrawOptions( const Punkt &pos, const Punkt &gr );
         //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
         //! Wenn die Zeichenfläche über den Rand einer bestehenden Zeichenfläche hinausragt, wird sie automatisch auf die bestehende Zeichnenfläche beschnitten.
         //! \param x Die X Koordinate der linken oberen Ecke der Zeichenfläche
@@ -312,13 +311,13 @@ namespace Framework
         //! \param br Die Breite der Zeichenfläche
         //! \param hi Die Höhe der Zeichenfläche
         //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb der bestehenden Zeichenfläche ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
-       DLLEXPORT bool setDrawOptions( int x, int y, int br, int hi );
+        DLLEXPORT bool setDrawOptions( int x, int y, int br, int hi );
         //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
         //! Wenn die Zeichenfläche darf über den Rand einer bestehenden Zeichenfläche hinausragen
         //! \param pos Die Koordinaten der linken oberen Ecke der Zeichenfläche
         //! \param gr Die Größe der Zeichenfläche
         //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
-       DLLEXPORT bool setDrawOptionsErzwingen( const Punkt &pos, const Punkt &gr );
+        DLLEXPORT bool setDrawOptionsErzwingen( const Punkt &pos, const Punkt &gr );
         //! Begrenzt die Zeichenfläche in die bis zum nächsten aufruf von releaseDrawOptions() gezeichnet werden kann. Alles außerhalb der Fläche wird automatisch ignoriert.
         //! Wenn die Zeichenfläche darf über den Rand einer bestehenden Zeichenfläche hinausragen
         //! \param x Die X Koordinate der linken oberen Ecke der Zeichenfläche
@@ -326,50 +325,44 @@ namespace Framework
         //! \param br Die Breite der Zeichenfläche
         //! \param hi Die Höhe der Zeichenfläche
         //! \return 1, falls die neue Zeichenfläche ganz oder teilweise innerhalb des Bildes ligt. Wenn 0 zurückgegeben wird, wurde die Zeichenfläche nicht gesetzt und es braucht nicht releaseDrawOptions() aufgerufen werden
-       DLLEXPORT bool setDrawOptionsErzwingen( int x, int y, int br, int hi );
+        DLLEXPORT bool setDrawOptionsErzwingen( int x, int y, int br, int hi );
         //! Setzt neue Draw options auf bildgröße
-       DLLEXPORT void setDrawOptionsReset();
+        DLLEXPORT void setDrawOptionsReset();
         //! Setzt Koordinaten, die bei den Zeichenfunktionen von den Positionen abgezogen werden
         //! Vorher sollte eine Zeichenfläche mit SetDrawOptions gesetzt worden sein. Die Werte werden mit dem aufruf von releaseDrawOptions() wieder zurückgesetzt.
         //! \param xOff Ein Wert, der von allen X Koordinaten abgezogen wird
         //! \param yOff Ein Wert, der von allen Y Koordinaten abgezogen wird
-       DLLEXPORT void addScrollOffset( int xOff, int yOff );
+        DLLEXPORT void addScrollOffset( int xOff, int yOff );
         //! Entfernt die als letztes gesetzte begrenzung der Zeichenfläche und alle seit dem gesetzten Scroll Offsets
         //! Stellt die vorherige Zeichenfläche und die zugehörigen Scroll Offsets wieder her
-       DLLEXPORT void releaseDrawOptions();
+        DLLEXPORT void releaseDrawOptions();
         //! Gibt zurück, ob sich das Bild seit dem letzten Aufruf dieser Funktion verändert hat
-       DLLEXPORT bool getRend();
+        DLLEXPORT bool getRend();
         //! Gibt den Array mit A8R8G8B8 Farbwerten der Pixel zurück
         //! Der Index eines Pixels berechnet sich durch x + y * Bildbreite
-       DLLEXPORT int *getBuffer() const;
+        DLLEXPORT int *getBuffer() const;
         //! Gibt den A8R8G8B8 Farbwert eines Pixels zurück
         //! \param x Die X Koordinate des Pixels
         //! \param y Die Y Koordinate des Pixels
-       DLLEXPORT int getPixel( int x, int y ) const;
+        DLLEXPORT int getPixel( int x, int y ) const;
         //! Gibt die Größe des Bildes zurück
-       DLLEXPORT const Punkt &getSize() const;
+        DLLEXPORT const Punkt &getSize() const;
         //! Gibt die Breite des Bildes zurück
-       DLLEXPORT int getBreite() const;
+        DLLEXPORT int getBreite() const;
         //! Gibt die Höhe des Bildes zurück
-       DLLEXPORT int getHeight() const;
+        DLLEXPORT int getHeight() const;
         //! Gibt den aktuellen mindest Transparenz Wert zurück
-       DLLEXPORT unsigned char getAlpha() const;
+        DLLEXPORT unsigned char getAlpha() const;
         //! Gibt die Koordinaten der linken oberen Ecke der aktuellen Zeichenfläche zurück
-       DLLEXPORT const Punkt &getDrawPos() const;
+        DLLEXPORT const Punkt &getDrawPos() const;
         //! Gibt die Größe der aktuelen Zeichenfläche zurück
-       DLLEXPORT const Punkt &getDrawGr() const;
+        DLLEXPORT const Punkt &getDrawGr() const;
         //! Gibt die Koordinaten zurück, die zu allen Positionen vor dem Zeichnen hinzugefügt werden
-       DLLEXPORT const Punkt &getDrawOff() const;
+        DLLEXPORT const Punkt &getDrawOff() const;
         //! Wird dieser Flag gesetzt, so wird beim Alpha Blending wenn die vorheriege Farbe 0 ist nur die neue mit ihrem Alpha Wert kopiert.
         //! Das ist sinnvoll für die Verwendung im 3DBildschirm, wo das Gezeichnette Bild später mittels Alpha Blending angezeigt wird.
         //! Der Flag wird im 3DBildschirm automatisch gesetzt
-       DLLEXPORT bool hasAlpha3D();
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-       DLLEXPORT Bild *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-       DLLEXPORT Bild *release();
+        DLLEXPORT bool hasAlpha3D();
     };
 
     //! Eine Zeichnung des 2d GUI Frameworks, die ein Bild anzeigt.
@@ -389,32 +382,32 @@ namespace Framework
 
         //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
         //! \param me Das Ereignis
-       DLLEXPORT void doMausEreignis( MausEreignis &me, bool userRet ) override;
+        DLLEXPORT void doMausEreignis( MausEreignis &me, bool userRet ) override;
 
     public:
         //! Konstruktor 
-       DLLEXPORT BildZ();
+        DLLEXPORT BildZ();
         //! Destruktor 
-       DLLEXPORT virtual ~BildZ();
+        DLLEXPORT virtual ~BildZ();
         //! Setzt einen Zeiger auf das Bild, was angezeigt werden soll
         //! \param b Das Bild
-       DLLEXPORT void setBildZ( Bild *b );
+        DLLEXPORT void setBildZ( Bild *b );
         //! Setzt das Bild, was angezeigt werden soll. Der Inhalt des Bildes wird Kopiert
         //! \param b Das Bild
-       DLLEXPORT void setBild( Bild *b );
+        DLLEXPORT void setBild( Bild *b );
         //! Updated den Zeichenhintergrund
         //! \param 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
-       DLLEXPORT bool tick( double tickVal ) override;
+        DLLEXPORT bool tick( double tickVal ) override;
         //! Zeichnet die Zeihnung in ein bestimmtes Bild
         //! \param zRObj Das Bild, in das gezeichnet werden soll
-       DLLEXPORT void render( Bild &zRObj ) override;
+        DLLEXPORT void render( Bild &zRObj ) override;
         //! Gibt das angezeigte Bild zurück
-       DLLEXPORT Bild *getBild() const;
+        DLLEXPORT Bild *getBild() const;
         //! Gbt das angezeigte Bild ohne erhöhten Reference Counter zurück
-       DLLEXPORT Bild *zBild() const;
+        DLLEXPORT Bild *zBild() const;
         //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das Original verändert werden kann
-       DLLEXPORT Zeichnung *dublizieren() const override;
+        DLLEXPORT Zeichnung *dublizieren() const override;
     };
 
 #ifdef WIN32
@@ -422,7 +415,7 @@ namespace Framework
     //! \param pfad Der Pfad zur Bilddatei
     //! \param zError Ein Zeiger auf ein Text Objekt, in dem ein möglicher Fehler zurückgegeben wird
     //! \return Das geladene Bild
-   DLLEXPORT Bild *ladeBild( char *pfad, Text *zError );
+    DLLEXPORT Bild *ladeBild( char *pfad, Text *zError );
 #endif
 }
 #endif

+ 28 - 42
Bildschirm.cpp

@@ -26,9 +26,9 @@ using namespace Framework;
 // Inhalt der Bildschirmklass aus Bildschirm.h
 // Konstruktor 
 Bildschirm::Bildschirm( WFenster *f )
-    : api( 0 ),
+    : ReferenceCounter(),
+    api( 0 ),
     fenster( f ),
-    ref( 1 ),
     members( new RCArray<Zeichnung>() ),
     fillColor( 0xFF000000 ),
     deckFarbe( 0 ),
@@ -106,7 +106,7 @@ void Bildschirm::setOnTop( bool onTop ) // legt fest, ob das onTop Zeichnung ger
     rend = 1;
 }
 
-void Bildschirm::setOnTopZeichnung( Zeichnung * obj ) // setzt das OnTop Zeichnung
+void Bildschirm::setOnTopZeichnung( Zeichnung *obj ) // setzt das OnTop Zeichnung
 {
     lock();
     if( onTop )
@@ -122,7 +122,7 @@ void Bildschirm::setdeckFarbe( int f ) // setzt die deckFarbe
     rend = 1;
 }
 
-void Bildschirm::addMember( Zeichnung * obj ) // Fügt ein Zeichnung hinzu
+void Bildschirm::addMember( Zeichnung *obj ) // Fügt ein Zeichnung hinzu
 {
     lock();
     members->add( obj );
@@ -130,7 +130,7 @@ void Bildschirm::addMember( Zeichnung * obj ) // F
     unlock();
 }
 
-void Bildschirm::removeMember( Zeichnung * zObj ) // Entfernt ein Zeichnung
+void Bildschirm::removeMember( Zeichnung *zObj ) // Entfernt ein Zeichnung
 {
     lock();
     for( int i = 0; i < members->getEintragAnzahl(); i++ )
@@ -190,14 +190,14 @@ void Bildschirm::setBackBufferSize( int breite, int height ) // setzt die Gr
     unlock();
 }
 
-void Bildschirm::setBackBufferSize( Punkt & size )
+void Bildschirm::setBackBufferSize( Punkt &size )
 {
     lock();
     api->setBackBufferSize( size );
     unlock();
 }
 
-void Bildschirm::doMausEreignis( MausEreignis & me ) // sendet maus Ereignis
+void Bildschirm::doMausEreignis( MausEreignis &me ) // sendet maus Ereignis
 {
     int fBr = api->getBackBufferSize().x;
     int fHi = api->getBackBufferSize().y;
@@ -227,7 +227,7 @@ void Bildschirm::doMausEreignis( MausEreignis & me ) // sendet maus Ereignis
     unlock();
 }
 
-void Bildschirm::doTastaturEreignis( TastaturEreignis & te ) // sendet tastatur Ereignis
+void Bildschirm::doTastaturEreignis( TastaturEreignis &te ) // sendet tastatur Ereignis
 {
     lock();
     if( !renderOnTop )
@@ -240,7 +240,7 @@ void Bildschirm::doTastaturEreignis( TastaturEreignis & te ) // sendet tastatur
     unlock();
 }
 
-void Bildschirm::addToolTip( ToolTip * tip ) // fügt ToolTip hinzu
+void Bildschirm::addToolTip( ToolTip *tip ) // fügt ToolTip hinzu
 {
     lock();
     tips->add( tip, tipAnzahl );
@@ -249,7 +249,7 @@ void Bildschirm::addToolTip( ToolTip * tip ) // f
     unlock();
 }
 
-bool Bildschirm::removeToolTip( ToolTip * zTip ) // entfernt ToolTip
+bool Bildschirm::removeToolTip( ToolTip *zTip ) // entfernt ToolTip
 {
     lock();
     bool gefunden = 0;
@@ -272,7 +272,7 @@ bool Bildschirm::removeToolTip( ToolTip * zTip ) // entfernt ToolTip
 // constant 
 Bild *Bildschirm::getRenderBild() const
 {
-    return api->zUIRenderBild()->getThis();
+    return (Bild *)api->zUIRenderBild()->getThis();
 }
 
 Bild *Bildschirm::zRenderBild() const
@@ -323,23 +323,9 @@ GraphicsApi *Bildschirm::zGraphicsApi() const
 // Gibt die Grafik API zurück
 GraphicsApi *Bildschirm::getGraphicsApi() const
 {
-    return api ? api->getThis() : 0;
+    return api ? (GraphicsApi *)api->getThis() : 0;
 }
 
-// Reference Counting 
-Bildschirm *Bildschirm::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Bildschirm *Bildschirm::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
 #ifdef WIN32
 int MonitorEnum( HMONITOR m, HDC dc, LPRECT r, LPARAM p )
 {
@@ -381,11 +367,11 @@ Monitor Framework::getMonitor( int id )
 }
 // Bildschirm2D
 // Konstruktor 
-Bildschirm2D::Bildschirm2D( WFenster * fenster )
+Bildschirm2D::Bildschirm2D( WFenster *fenster )
     : Bildschirm( fenster )
 {
     api = new DirectX9();
-    api->initialize( fenster->getThis(), fenster->getKörperGröße(), 0 );
+    api->initialize( (WFenster *)fenster->getThis(), fenster->getKörperGröße(), 0 );
 }
 
 // Destruktor 
@@ -397,7 +383,7 @@ void Bildschirm2D::render() // Zeichnet das Bild
     if( !rend && testRend )
         return;
     rendering = 1;
-    Bild * ui = api->zUIRenderBild();
+    Bild *ui = api->zUIRenderBild();
     if( ui )
     {
         lock();
@@ -405,7 +391,7 @@ void Bildschirm2D::render() // Zeichnet das Bild
         api->beginFrame( fill && ( rend || !testRend ), 0, fillColor );
         if( renderZeichnungen )
         {
-            if( renderOnTop &&deckFarbe && ( deckFarbe &( fillColor | 0xFF000000 ) ) == deckFarbe )
+            if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
             {
                 ui->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
                 for( auto i = members->getIterator(); i; i++ )
@@ -416,13 +402,13 @@ void Bildschirm2D::render() // Zeichnet das Bild
             {
                 for( auto i = members->getIterator(); i; i++ )
                     i->render( *ui ); // zeichnen nach zwischenbuffer
-                if( renderOnTop &&deckFarbe )
+                if( renderOnTop && deckFarbe )
                     ui->alphaRegion( 0, 0, ui->getBreite(), ui->getHeight(), deckFarbe );
             }
             for( int i = 0; i < tipAnzahl; ++i )
                 tips->z( i )->render( *ui );
         }
-        if( renderOnTop &&onTop )
+        if( renderOnTop && onTop )
             onTop->render( *ui );
         api->presentFrame();
         renderZeit->messungEnde();
@@ -434,7 +420,7 @@ void Bildschirm2D::render() // Zeichnet das Bild
 
 // Bildschirm3D
 // Konstruktor 
-Bildschirm3D::Bildschirm3D( WFenster * fenster )
+Bildschirm3D::Bildschirm3D( WFenster *fenster )
     : Bildschirm( fenster ),
     kameras( new RCArray< Kam3D >() ),
     rend3D( 0 )
@@ -445,7 +431,7 @@ Bildschirm3D::Bildschirm3D( WFenster * fenster )
         api = new DirectX11();
     else
         api = new DirectX9();
-    api->initialize( fenster->getThis(), fenster->getKörperGröße(), 0 );
+    api->initialize( (WFenster *)fenster->getThis(), fenster->getKörperGröße(), 0 );
 }
 
 Bildschirm3D::Bildschirm3D( WFenster *fenster, GraphicApiType apiTyp )
@@ -459,7 +445,7 @@ Bildschirm3D::Bildschirm3D( WFenster *fenster, GraphicApiType apiTyp )
         api = new DirectX11();
     if( apiTyp == DIRECTX12 )
         api = new DirectX12();
-    api->initialize( fenster->getThis(), fenster->getKörperGröße(), 0 );
+    api->initialize( (WFenster *)fenster->getThis(), fenster->getKörperGröße(), 0 );
 }
 
 // Destruktor 
@@ -469,7 +455,7 @@ Bildschirm3D::~Bildschirm3D()
 }
 
 // nicht constant 
-void Bildschirm3D::addKamera( Kam3D * obj ) // Fügt ein Zeichnung hinzu
+void Bildschirm3D::addKamera( Kam3D *obj ) // Fügt ein Zeichnung hinzu
 {
     lock();
     kameras->add( obj );
@@ -477,7 +463,7 @@ void Bildschirm3D::addKamera( Kam3D * obj ) // F
     unlock();
 }
 
-void Bildschirm3D::removeKamera( Kam3D * zObj ) // Entfernt ein Zeichnung
+void Bildschirm3D::removeKamera( Kam3D *zObj ) // Entfernt ein Zeichnung
 {
     lock();
     for( int i = 0; kameras->z( i ); i++ )
@@ -501,7 +487,7 @@ void Bildschirm3D::tick( double tickval )
     unlock();
 }
 
-void Bildschirm3D::doMausEreignis( MausEreignis & me ) // sendet maus Ereignis
+void Bildschirm3D::doMausEreignis( MausEreignis &me ) // sendet maus Ereignis
 {
     lock();
     __super::doMausEreignis( me );
@@ -510,7 +496,7 @@ void Bildschirm3D::doMausEreignis( MausEreignis & me ) // sendet maus Ereignis
     unlock();
 }
 
-void Bildschirm3D::doTastaturEreignis( TastaturEreignis & te ) // sendet tastatur Ereignis
+void Bildschirm3D::doTastaturEreignis( TastaturEreignis &te ) // sendet tastatur Ereignis
 {
     lock();
     __super::doTastaturEreignis( te );
@@ -541,7 +527,7 @@ void Bildschirm3D::render() // Zeichnet das Bild
     {
         if( renderZeichnungen )
         {
-            if( renderOnTop &&deckFarbe && ( deckFarbe &( fillColor | 0xFF000000 ) ) == deckFarbe )
+            if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
             {
                 ui->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
                 for( auto i = members->getIterator(); i; i++ )
@@ -552,13 +538,13 @@ void Bildschirm3D::render() // Zeichnet das Bild
             {
                 for( auto i = members->getIterator(); i; i++ )
                     i->render( *ui ); // zeichnen nach zwischenbuffer
-                if( renderOnTop &&deckFarbe )
+                if( renderOnTop && deckFarbe )
                     ui->alphaRegion( 0, 0, ui->getBreite(), ui->getHeight(), deckFarbe );
             }
             for( int i = 0; i < tipAnzahl; ++i )
                 tips->z( i )->render( *ui );
         }
-        if( renderOnTop &&onTop )
+        if( renderOnTop && onTop )
             onTop->render( *ui );
     }
     unlock();

+ 1 - 8
Bildschirm.h

@@ -64,12 +64,11 @@ namespace Framework
     };
 
     //! Diese Klasse verwaltet das Bild auf dem Bildschirm
-    class Bildschirm
+    class Bildschirm : public virtual ReferenceCounter
     {
     protected:
         GraphicsApi *api;
         WFenster *fenster;
-        int ref;
         RCArray<Zeichnung> *members;
         int fillColor;
         int deckFarbe;
@@ -176,12 +175,6 @@ namespace Framework
         DLLEXPORT GraphicsApi *zGraphicsApi() const;
         //! Gibt die Grafik API zurück
         DLLEXPORT GraphicsApi *getGraphicsApi() const;
-        //! Erhöht den Reference Counter um 1
-        //! \param Return Ein zeiger auf diesen Shader
-        DLLEXPORT virtual Bildschirm *getThis();
-        //! Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //! \param Return 0
-        DLLEXPORT virtual Bildschirm *release();
     };
 #ifdef WIN32
     //! Diese Klasse verwaltet das Bild auf dem Bildschirm ohne 3D Elemente

+ 5 - 17
CharMap.h

@@ -1,23 +1,24 @@
 #pragma once
 
+#include "ReferenceCounter.h"
+
 namespace Framework
 {
     template<class T, class V>
-    class CharMap
+    class CharMap : public virtual ReferenceCounter
     {
     private:
         V *value;
         T **entries;
-        int ref;
 
     public:
         CharMap()
+            : ReferenceCounter()
         {
-            entries = new T*[ 256 ];
+            entries = new T * [ 256 ];
             for( int i = 0; i < 256; i++ )
                 entries[ i ] = 0;
             value = 0;
-            ref = 1;
         }
 
         ~CharMap()
@@ -65,18 +66,5 @@ namespace Framework
         {
             return value;
         }
-
-        CharMap *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        CharMap *release()
-        {
-            if( !--ref )
-                delete this;
-            return 0;
-        }
     };
 }

+ 6 - 6
Cube.cpp

@@ -19,7 +19,7 @@ Cube::Cube( float size )
     else
     {
         model = new Model3DData();
-        m3dRegister->addModel( model->getThis(), Standart3DTypes::cube );
+        m3dRegister->addModel( (Model3DData *)model->getThis(), Standart3DTypes::cube );
         float stdSize = 100;
         float left, right, top, bottom;
         // Calculate the screen coordinates of the left side of the bitmap.
@@ -164,11 +164,11 @@ Cube::Cube( float size )
 //  textur: Die Textur
 void Cube::setTextur( Textur *textur )
 {
-    this->textur->setPolygonTextur( LINKS, textur->getThis() );
-    this->textur->setPolygonTextur( OBEN, textur->getThis() );
-    this->textur->setPolygonTextur( RECHTS, textur->getThis() );
-    this->textur->setPolygonTextur( UNTEN, textur->getThis() );
-    this->textur->setPolygonTextur( VORNE, textur->getThis() );
+    this->textur->setPolygonTextur( LINKS, (Textur *)textur->getThis() );
+    this->textur->setPolygonTextur( OBEN, (Textur *)textur->getThis() );
+    this->textur->setPolygonTextur( RECHTS, (Textur *)textur->getThis() );
+    this->textur->setPolygonTextur( UNTEN, (Textur *)textur->getThis() );
+    this->textur->setPolygonTextur( VORNE, (Textur *)textur->getThis() );
     this->textur->setPolygonTextur( HINTEN, textur );
     rend = 1;
 }

+ 1 - 16
DLLRegister.cpp

@@ -5,9 +5,9 @@ using namespace Framework;
 // Inhalt der DLLDateien Klasse aus DLLDateien.h
 // Konstruktor
 DLLRegister::DLLRegister()
+    : ReferenceCounter()
 {
     dlls = new Array< DLLDatei * >();
-    ref = 1;
 }
 
 // Destruktor
@@ -85,19 +85,4 @@ void DLLRegister::releaseDLL( char *name )
         }
     }
     cs.unlock();
-}
-
-// Reference Counting
-DLLRegister *DLLRegister::getThis()
-{
-    ref++;
-    return this;
-}
-
-DLLRegister *DLLRegister::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 2 - 5
DLLRegister.h

@@ -2,6 +2,7 @@
 
 #include "Array.h"
 #include "Critical.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -12,12 +13,11 @@ namespace Framework
         int ref;
     };
 
-    class DLLRegister
+    class DLLRegister : public virtual ReferenceCounter
     {
     private:
         Array< DLLDatei * > *dlls;
         Critical cs;
-        int ref;
 
     public:
         //! Konstruktor
@@ -27,8 +27,5 @@ namespace Framework
         //! nicht constant       
         DLLEXPORT HINSTANCE ladeDLL( char *name, char *pfad );
         DLLEXPORT void releaseDLL( char *name );
-        //! Reference Counting   
-        DLLEXPORT DLLRegister *getThis();
-        DLLEXPORT DLLRegister *release();
     };
 }

+ 23 - 23
DX11GraphicsApi.cpp

@@ -167,14 +167,14 @@ void DirectX11::initialize( WFenster *fenster, Vec2<int> backBufferSize, bool fu
     // clear out the struct for use
     ZeroMemory( &scd, sizeof( DXGI_SWAP_CHAIN_DESC ) );
 
-	scd.Windowed = !fullScreen;
-	scd.BufferCount = 2;
-	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
-	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-	scd.SampleDesc.Count = 1;      //multisampling setting
-	scd.SampleDesc.Quality = 0;    //vendor-specific flag
-	scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
-	scd.OutputWindow = fenster ? fenster->getFensterHandle() : 0;
+    scd.Windowed = !fullScreen;
+    scd.BufferCount = 2;
+    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+    scd.SampleDesc.Count = 1;      //multisampling setting
+    scd.SampleDesc.Quality = 0;    //vendor-specific flag
+    scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+    scd.OutputWindow = fenster ? fenster->getFensterHandle() : 0;
     scd.BufferDesc.Width = this->backBufferSize.x;
     scd.BufferDesc.Height = this->backBufferSize.y;                 // windowed/full-screen mode
 
@@ -206,7 +206,7 @@ void DirectX11::initialize( WFenster *fenster, Vec2<int> backBufferSize, bool fu
     }
     ID3D11Texture2D *backBufferPtr;
     // Get the pointer to the back buffer.
-    result = d3d11SpawChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID *)& backBufferPtr );
+    result = d3d11SpawChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (LPVOID *)&backBufferPtr );
     if( result != S_OK )
     {
         std::cout << "ERROR: d3d11SpawChain->GetBuffer returned " << result << "\n";
@@ -214,13 +214,13 @@ void DirectX11::initialize( WFenster *fenster, Vec2<int> backBufferSize, bool fu
         return;
     }
 
-	vp = new D3D11_VIEWPORT();
-	memset(vp, 0, sizeof(D3D11_VIEWPORT));
-	vp->Width = (float)this->backBufferSize.x;
-	vp->Height = (float)this->backBufferSize.y;
-	vp->MinDepth = 0.0f;
-	vp->MaxDepth = 1.0f;
-	d3d11Context->RSSetViewports(1, vp);
+    vp = new D3D11_VIEWPORT();
+    memset( vp, 0, sizeof( D3D11_VIEWPORT ) );
+    vp->Width = (float)this->backBufferSize.x;
+    vp->Height = (float)this->backBufferSize.y;
+    vp->MinDepth = 0.0f;
+    vp->MaxDepth = 1.0f;
+    d3d11Context->RSSetViewports( 1, vp );
 
     // Create the render target view with the back buffer pointer.
     result = d3d11Device->CreateRenderTargetView( backBufferPtr, NULL, &rtview );
@@ -417,7 +417,7 @@ void DirectX11::initialize( WFenster *fenster, Vec2<int> backBufferSize, bool fu
     uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
 
     texturModel->setSize( this->backBufferSize );
-    texturModel->setTextur( uiTextur->getThis() );
+    texturModel->setTextur( (Textur *)uiTextur->getThis() );
 
     D3D11_BLEND_DESC blendState;
     ZeroMemory( &blendState, sizeof( D3D11_BLEND_DESC ) );
@@ -501,7 +501,7 @@ void DirectX11::update()
     }
     texturRegister->leeren();
     if( defaultTextur )
-        defaultTextur = defaultTextur->release();
+        defaultTextur = (Textur *)defaultTextur->release();
     if( blendStateAlphaBlend )
     {
         blendStateAlphaBlend->Release();
@@ -569,7 +569,7 @@ void DirectX11::update()
         d3d11Context->Release();
         d3d11Context = NULL;
     }
-    initialize( fenster->getThis(), backBufferSize, fullScreen );
+    initialize( (WFenster *)fenster->getThis(), backBufferSize, fullScreen );
 }
 
 void DirectX11::beginFrame( bool fill2D, bool fill3D, int fillColor )
@@ -715,7 +715,7 @@ void DirectX11::renderKamera( Kam3D *zKamera )
     if( vertexShader )
         vertexShader->füllConstBuffer( (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
     if( pixelShader )
-        pixelShader->füllConstBuffer( (char *)& kamPos, 0, sizeof( float ) * 3 );
+        pixelShader->füllConstBuffer( (char *)&kamPos, 0, sizeof( float ) * 3 );
     Welt3D *w = zKamera->zWelt();
     w->lock();
     int lc[] = { w->getDiffuseLightCount(), w->getPointLightCount() };
@@ -788,7 +788,7 @@ void DirectX11::presentFrame()
     if( vertexShader )
         vertexShader->füllConstBuffer( (char *)viewAndProj, 1, sizeof( Mat4< float > ) * 2 );
     if( pixelShader )
-        pixelShader->füllConstBuffer( (char *)& kamPos, 0, sizeof( float ) * 3 );
+        pixelShader->füllConstBuffer( (char *)&kamPos, 0, sizeof( float ) * 3 );
 
     if( fenster && !IsIconic( fenster->getFensterHandle() ) )
         renderObject( texturModel );
@@ -823,7 +823,7 @@ Textur *DirectX11::createOrGetTextur( const char *name, Bild *b )
     Textur *ret = new DX11Textur( d3d11Device, d3d11Context );
     if( b )
         ret->setBildZ( b );
-    texturRegister->addTextur( ret->getThis(), name );
+    texturRegister->addTextur( (Textur *)ret->getThis(), name );
     return ret;
 }
 
@@ -862,7 +862,7 @@ bool DirectX11::isAvailable()
 #if defined(_DEBUG)
     createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)& factory );
+    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)&factory );
     if( FAILED( res ) )
     {
         getDLLRegister()->releaseDLL( "dxgi.dll" );

+ 36 - 36
DX12GraphicsApi.cpp

@@ -120,14 +120,14 @@ DirectX12::~DirectX12()
         debug->Release();
 }
 
-typedef HRESULT( __stdcall * CreateDXGIFactory2Function )( UINT, REFIID, void ** );
+typedef HRESULT( __stdcall *CreateDXGIFactory2Function )( UINT, REFIID, void ** );
 
-typedef HRESULT( __stdcall * D3D12CreateDeviceFunction )( IDXGIAdapter *, D3D_FEATURE_LEVEL,
-                                                          REFIID, void ** );
+typedef HRESULT( __stdcall *D3D12CreateDeviceFunction )( IDXGIAdapter *, D3D_FEATURE_LEVEL,
+                                                         REFIID, void ** );
 
-typedef HRESULT( __stdcall * D3D12GetDebugInterfaceFunction )( REFIID, void ** );
+typedef HRESULT( __stdcall *D3D12GetDebugInterfaceFunction )( REFIID, void ** );
 
-void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool fullScreen )
+void DirectX12::initialize( WFenster *fenster, Vec2<int> backBufferSize, bool fullScreen )
 {
     if( device )
         return GraphicsApi::initialize( fenster, backBufferSize, fullScreen );
@@ -166,7 +166,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     D3D12SerializeRootSignatureFunction d3d12srsf = (D3D12SerializeRootSignatureFunction)GetProcAddress( d3d12DLL, "D3D12SerializeRootSignature" );
 #ifdef _DEBUG
     D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress( d3d12DLL, "D3D12GetDebugInterface" );
-    getDebugInterface( __uuidof( ID3D12Debug ), (void **)& debug );
+    getDebugInterface( __uuidof( ID3D12Debug ), (void **)&debug );
     debug->EnableDebugLayer();
 #endif
     IDXGIFactory4 *factory;
@@ -174,7 +174,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
 #if defined(_DEBUG)
     createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)& factory );
+    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)&factory );
     if( FAILED( res ) )
     {
         getDLLRegister()->releaseDLL( "dxgi.dll" );
@@ -197,7 +197,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
             current->GetDesc1( &dxgiAdapterDesc1 );
             if( ( dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE ) == 0 &&
                 dxgiAdapterDesc1.DedicatedVideoMemory > maxVideoMemory &&
-                SUCCEEDED( createDevice( current, D3D_FEATURE_LEVEL_12_1, __uuidof( ID3D12Device2 ), (void **)& device ) ) )
+                SUCCEEDED( createDevice( current, D3D_FEATURE_LEVEL_12_1, __uuidof( ID3D12Device2 ), (void **)&device ) ) )
             {
                 device->Release();
                 if( best )
@@ -209,7 +209,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
                 current->Release();
         }
     } while( res != DXGI_ERROR_NOT_FOUND );
-    res = createDevice( best, D3D_FEATURE_LEVEL_12_0, __uuidof( ID3D12Device2 ), (void **)& device );
+    res = createDevice( best, D3D_FEATURE_LEVEL_12_0, __uuidof( ID3D12Device2 ), (void **)&device );
     best->Release();
     if( FAILED( res ) )
     {
@@ -220,7 +220,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
         WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "createDevice ist Fehlgeschlagen." ), MB_ICONERROR );
         return;
     }
-    res = device->QueryInterface( __uuidof( ID3D12InfoQueue ), (void **)& infoQueue );
+    res = device->QueryInterface( __uuidof( ID3D12InfoQueue ), (void **)&infoQueue );
     if( SUCCEEDED( res ) )
     {
         infoQueue->SetBreakOnSeverity( D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE );
@@ -253,7 +253,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     computeCommandQueue = new DX12ComputeCommandQueue( device );
 
     IDXGIFactory5 *fac5 = 0;
-    factory->QueryInterface( __uuidof( IDXGIFactory5 ), (void **)& fac5 );
+    factory->QueryInterface( __uuidof( IDXGIFactory5 ), (void **)&fac5 );
     if( fac5 )
     {
         res = fac5->CheckFeatureSupport( DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing, sizeof( tearing ) );
@@ -283,7 +283,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
         WMessageBox( fenster->getFensterHandle(), new Text( "Fehler" ), new Text( "CreateSwapChainForHwnd ist Fehlgeschlagen." ), MB_ICONERROR );
         return;
     }
-    res = tmpSwapChain->QueryInterface( __uuidof( IDXGISwapChain4 ), (void **)& swapChain );
+    res = tmpSwapChain->QueryInterface( __uuidof( IDXGISwapChain4 ), (void **)&swapChain );
     tmpSwapChain->Release();
     if( FAILED( res ) )
     {
@@ -297,7 +297,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     D3D12_DESCRIPTOR_HEAP_DESC rtvhdesc = {};
     rtvhdesc.NumDescriptors = 2;
     rtvhdesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
-    res = device->CreateDescriptorHeap( &rtvhdesc, __uuidof( ID3D12DescriptorHeap ), (void **)& rtvHeap );
+    res = device->CreateDescriptorHeap( &rtvhdesc, __uuidof( ID3D12DescriptorHeap ), (void **)&rtvHeap );
     if( FAILED( res ) )
     {
         factory->Release();
@@ -312,7 +312,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     for( int i = 0; i < 2; i++ )
     {
         ID3D12Resource *backBuffer;
-        res = swapChain->GetBuffer( i, __uuidof( ID3D12Resource ), (void **)& backBuffer );
+        res = swapChain->GetBuffer( i, __uuidof( ID3D12Resource ), (void **)&backBuffer );
         if( FAILED( res ) )
         {
             factory->Release();
@@ -353,7 +353,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
 
     texturModel->setSize( Vec2<float>( 2.f, 2.f ) );
-    texturModel->setTextur( uiTextur->getThis() );
+    texturModel->setTextur( (Textur *)uiTextur->getThis() );
 
     vertexBufferView = new D3D12_VERTEX_BUFFER_VIEW();
     vertexBufferView->StrideInBytes = sizeof( Vertex3D );
@@ -369,11 +369,11 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
         &CD3DX12_HEAP_PROPERTIES( D3D12_HEAP_TYPE_DEFAULT ),
         D3D12_HEAP_FLAG_NONE,
         &CD3DX12_RESOURCE_DESC::Tex2D( DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
-        1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
+                                       1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
         D3D12_RESOURCE_STATE_DEPTH_WRITE,
         &optimizedClearValue,
         __uuidof( ID3D12Resource ),
-        (void **)& depthBuffer
+        (void **)&depthBuffer
     );
     if( FAILED( res ) )
     {
@@ -387,7 +387,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     dsvHeapDesc.NumDescriptors = 1;
     dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
     dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
-    res = device->CreateDescriptorHeap( &dsvHeapDesc, __uuidof( ID3D12DescriptorHeap ), (void **)& dsvHeap );
+    res = device->CreateDescriptorHeap( &dsvHeapDesc, __uuidof( ID3D12DescriptorHeap ), (void **)&dsvHeap );
     if( FAILED( res ) )
     {
         factory->Release();
@@ -409,7 +409,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
     sbheapDesc.NumDescriptors = 6;
     sbheapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
     sbheapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
-    res = device->CreateDescriptorHeap( &sbheapDesc, __uuidof( ID3D12DescriptorHeap ), (void **)& shaderBufferHeap );
+    res = device->CreateDescriptorHeap( &sbheapDesc, __uuidof( ID3D12DescriptorHeap ), (void **)&shaderBufferHeap );
     if( FAILED( res ) )
     {
         factory->Release();
@@ -505,7 +505,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
         return;
     }
 
-    res = device->CreateRootSignature( 0, rootSignature->GetBufferPointer(), rootSignature->GetBufferSize(), __uuidof( ID3D12RootSignature ), (void **)& signature );
+    res = device->CreateRootSignature( 0, rootSignature->GetBufferPointer(), rootSignature->GetBufferSize(), __uuidof( ID3D12RootSignature ), (void **)&signature );
     if( FAILED( res ) )
     {
         factory->Release();
@@ -577,7 +577,7 @@ void DirectX12::initialize( WFenster * fenster, Vec2<int> backBufferSize, bool f
 
     directCommandQueue->execute();
 
-    res = device->CreateGraphicsPipelineState( &psoDesc, __uuidof( ID3D12PipelineState ), (void **)& pipeline );
+    res = device->CreateGraphicsPipelineState( &psoDesc, __uuidof( ID3D12PipelineState ), (void **)&pipeline );
     if( FAILED( res ) )
     {
         factory->Release();
@@ -623,7 +623,7 @@ void DirectX12::update()
 #if defined(_DEBUG)
     createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)& factory );
+    res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)&factory );
     if( FAILED( res ) )
     {
         getDLLRegister()->releaseDLL( "dxgi.dll" );
@@ -646,7 +646,7 @@ void DirectX12::update()
     for( int i = 0; i < 2; i++ )
     {
         ID3D12Resource *backBuffer;
-        res = swapChain->GetBuffer( i, __uuidof( ID3D12Resource ), (void **)& backBuffer );
+        res = swapChain->GetBuffer( i, __uuidof( ID3D12Resource ), (void **)&backBuffer );
         if( FAILED( res ) )
         {
             getDLLRegister()->releaseDLL( "dxgi.dll" );
@@ -683,11 +683,11 @@ void DirectX12::update()
         &CD3DX12_HEAP_PROPERTIES( D3D12_HEAP_TYPE_DEFAULT ),
         D3D12_HEAP_FLAG_NONE,
         &CD3DX12_RESOURCE_DESC::Tex2D( DXGI_FORMAT_D32_FLOAT, this->backBufferSize.x, this->backBufferSize.y,
-        1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
+                                       1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL ),
         D3D12_RESOURCE_STATE_DEPTH_WRITE,
         0,
         __uuidof( ID3D12Resource ),
-        (void **)& depthBuffer
+        (void **)&depthBuffer
     );
     if( FAILED( res ) )
     {
@@ -714,7 +714,7 @@ void DirectX12::update()
     renderB->neuBild( this->backBufferSize.x, this->backBufferSize.y, 0 );
     uiTextur = createOrGetTextur( "_f_Render_Bild", renderB );
 
-    texturModel->setTextur( uiTextur->getThis() );
+    texturModel->setTextur( (Textur *)uiTextur->getThis() );
 
     factory->Release();
 }
@@ -754,7 +754,7 @@ void DirectX12::beginFrame( bool fill2D, bool fill3D, int fillColor )
     pixelShader->füllConstBuffer( (char *)lc, 4, sizeof( int ) * 2 );
 }
 
-void DirectX12::renderObject( Model3D * zObj )
+void DirectX12::renderObject( Model3D *zObj )
 {
     vertexBuffer->setData( (void *)texturModel->zVertexBuffer() );
     vertexBuffer->setLength( sizeof( Vertex3D ) * texturModel->getVertexAnzahl() );
@@ -834,7 +834,7 @@ void DirectX12::renderObject( Model3D * zObj )
 //  pos: Der Mittelpunkt der Kugel
 //  radius: Der Radius der Kugel
 //  dist: Einen Zeiger auf einen float, in dem das quadrat des Abstands zur Kammeraposition gespeichert wird, falls diese Funktion true zurückgiebt und der Zeiger nicht 0 ist
-bool DirectX12::isInFrustrum( const Vec3< float > & pos, float radius, float *dist ) const
+bool DirectX12::isInFrustrum( const Vec3< float > &pos, float radius, float *dist ) const
 {
     for( int i = 0; i < 6; i++ )
     {
@@ -846,7 +846,7 @@ bool DirectX12::isInFrustrum( const Vec3< float > & pos, float radius, float *di
     return 1;
 }
 
-void DirectX12::renderKamera( Kam3D * zKamera )
+void DirectX12::renderKamera( Kam3D *zKamera )
 {
     directCommandQueue->getCommandList()->RSSetViewports( 1, (D3D12_VIEWPORT *)zKamera->zViewPort() );
 
@@ -891,8 +891,8 @@ void DirectX12::renderKamera( Kam3D * zKamera )
     if( vertexShader )
         vertexShader->füllConstBuffer( (char *)viewAndProj, 0, sizeof( Mat4< float > ) * 2 );
     if( pixelShader )
-        pixelShader->füllConstBuffer( (char *)& kamPos, 2, sizeof( float ) * 3 );
-    Welt3D * w = zKamera->zWelt();
+        pixelShader->füllConstBuffer( (char *)&kamPos, 2, sizeof( float ) * 3 );
+    Welt3D *w = zKamera->zWelt();
     w->lock();
     for( auto obj = w->getMembers(); obj; obj++ )
     {
@@ -935,7 +935,7 @@ void DirectX12::presentFrame()
     backBufferIndex = swapChain->GetCurrentBackBufferIndex();
 }
 
-Textur *DirectX12::createOrGetTextur( const char *name, Bild * b )
+Textur *DirectX12::createOrGetTextur( const char *name, Bild *b )
 {
     if( !device )
     {
@@ -953,7 +953,7 @@ Textur *DirectX12::createOrGetTextur( const char *name, Bild * b )
     Textur *ret = new DX12Textur( device, copyCommandQueue, directCommandQueue );
     if( b )
         ret->setBildZ( b );
-    texturRegister->addTextur( ret->getThis(), name );
+    texturRegister->addTextur( (Textur *)ret->getThis(), name );
     ret->updateTextur();
     copyCommandQueue->execute();
     directCommandQueue->execute();
@@ -993,7 +993,7 @@ bool DirectX12::isAvailable()
 #ifdef _DEBUG
     D3D12GetDebugInterfaceFunction getDebugInterface = (D3D12GetDebugInterfaceFunction)GetProcAddress( d3d12DLL, "D3D12GetDebugInterface" );
     ID3D12Debug *debug = 0;
-    getDebugInterface( __uuidof( ID3D12Debug ), (void **)& debug );
+    getDebugInterface( __uuidof( ID3D12Debug ), (void **)&debug );
     debug->EnableDebugLayer();
 #endif
     IDXGIFactory4 *factory;
@@ -1001,7 +1001,7 @@ bool DirectX12::isAvailable()
 #ifdef _DEBUG
     createFactoryFlags = DXGI_CREATE_FACTORY_DEBUG;
 #endif
-    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)& factory );
+    HRESULT res = createFactory( createFactoryFlags, __uuidof( IDXGIFactory4 ), (void **)&factory );
     if( FAILED( res ) )
     {
         getDLLRegister()->releaseDLL( "dxgi.dll" );
@@ -1019,7 +1019,7 @@ bool DirectX12::isAvailable()
             current->GetDesc1( &dxgiAdapterDesc1 );
             ID3D12Device2 *device = 0;
             if( ( dxgiAdapterDesc1.Flags & DXGI_ADAPTER_FLAG_SOFTWARE ) == 0 &&
-                SUCCEEDED( createDevice( current, D3D_FEATURE_LEVEL_12_1, __uuidof( ID3D12Device2 ), (void **)& device ) ) )
+                SUCCEEDED( createDevice( current, D3D_FEATURE_LEVEL_12_1, __uuidof( ID3D12Device2 ), (void **)&device ) ) )
             {
                 device->Release();
                 current->Release();

+ 19 - 19
DX12PixelShader.h

@@ -92,10 +92,10 @@ ret
 
 const BYTE DX12PixelShaderBytes[] =
 {
-     68,  88,  66,  67,  21, 229, 
-    101, 247, 144,  69, 159, 176, 
-    164, 224,  65,  41, 172, 245, 
-    175,   8,   1,   0,   0,   0, 
+     68,  88,  66,  67, 255, 189, 
+    184, 179, 154,  30, 244, 215, 
+    243, 194,  79, 119, 147, 191, 
+    102, 237,   1,   0,   0,   0, 
     184,  91,   0,   0,   6,   0, 
       0,   0,  56,   0,   0,   0, 
      36,   2,   0,   0, 188,   2, 
@@ -763,11 +763,11 @@ const BYTE DX12PixelShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0, 148,  46, 
-     49,   1,  25,  37, 243,  94, 
-      1,   0,   0,   0,  40, 148, 
-    114,  16, 212, 244, 179,  67, 
-    144, 101,  51, 193,  97,  40, 
-    130, 207,   0,   0,   0,   0, 
+     49,   1, 208, 142,  99,  96, 
+      1,   0,   0,   0, 131, 198, 
+    131, 244, 107,  15, 147,  76, 
+    187, 113, 243, 252,  50,  97, 
+    181, 243,   0,   0,   0,   0, 
       0,   0,   0,   0,   1,   0, 
       0,   0,   1,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -938,8 +938,8 @@ const BYTE DX12PixelShaderBytes[] =
       3,   0, 242,  56,   1,   0, 
      43, 236,   3,   0,  28,  19, 
       2,   0,  65,  36,   1,   0, 
-    236, 179,   1,   0, 172, 161, 
-      1,   0, 125,  10,   2,   0, 
+    236, 179,   1,   0,  51, 177, 
+      3,   0, 125,  10,   2,   0, 
     125, 181,   2,   0, 200,  81, 
       2,   0, 193,  33,   3,   0, 
      65, 185,   2,   0, 140, 239, 
@@ -1788,8 +1788,8 @@ const BYTE DX12PixelShaderBytes[] =
     117, 114, 101,  50,  68,  32, 
     115, 104,  97, 100,  27, 226, 
      48,   1, 128,   0,   0,   0, 
-    224, 219, 240, 205,  14,  74, 
-    214,   1,   1,   0,   0,   0, 
+    205, 172,  88,  40, 166,  37, 
+    215,   1,   1,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -2348,7 +2348,7 @@ const BYTE DX12PixelShaderBytes[] =
       0,   0,  23,   0,   1,   0, 
       5,  16,   0,   0,  14,   0, 
      23,  21,   0,  16,   0,   0, 
-      3,   2, 208,   3,   0,   0, 
+      3,   2, 160,   3,   0,   0, 
     242, 241,  10,   0,  24,  21, 
       8,  16,   0,   0,   1,   0, 
       1,   0,  10,   0,  24,  21, 
@@ -3427,7 +3427,7 @@ const BYTE DX12PixelShaderBytes[] =
       2,   0,   9,   0, 220,   4, 
       0,   0,   0,   0,   0,   0, 
     156,   1,   0,   0,   1,   0, 
-      0,   0,  24, 127, 205,   3, 
+      0,   0, 168, 129, 243,   2, 
       0,   0,   0,   0,   0,   0, 
       0,   0, 109,  97, 105, 110, 
       0, 110, 111, 110, 101,   0, 
@@ -3494,10 +3494,10 @@ const BYTE DX12PixelShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0, 148,  46,  49,   1, 
-     25,  37, 243,  94,   1,   0, 
-      0,   0,  40, 148, 114,  16, 
-    212, 244, 179,  67, 144, 101, 
-     51, 193,  97,  40, 130, 207, 
+    208, 142,  99,  96,   1,   0, 
+      0,   0, 131, 198, 131, 244, 
+    107,  15, 147,  76, 187, 113, 
+    243, 252,  50,  97, 181, 243, 
     128,   0,   0,   0,  47,  76, 
     105, 110, 107,  73, 110, 102, 
     111,   0,  47, 110,  97, 109, 

+ 21 - 21
DX12VertexShader.h

@@ -129,10 +129,10 @@ ret
 
 const BYTE DX12VertexShaderBytes[] =
 {
-     68,  88,  66,  67, 107, 144, 
-    122, 236,  74, 225,   7, 191, 
-    167, 142, 149, 255,  43,  28, 
-    214, 120,   1,   0,   0,   0, 
+     68,  88,  66,  67,  75,  64, 
+    150, 185,  91,  34,   4,   9, 
+    108,  53, 127, 115, 140,  78, 
+     52,  43,   1,   0,   0,   0, 
     108,  78,   0,   0,   6,   0, 
       0,   0,  56,   0,   0,   0, 
     124,   2,   0,   0,  16,   3, 
@@ -915,11 +915,11 @@ const BYTE DX12VertexShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-    148,  46,  49,   1,  26,  37, 
-    243,  94,   1,   0,   0,   0, 
-    203, 134,  75,  72, 201,  51, 
-    137,  72, 142, 164, 219, 143, 
-     97,   6, 226, 225,   0,   0, 
+    148,  46,  49,   1, 208, 142, 
+     99,  96,   1,   0,   0,   0, 
+     28, 248,   5, 201,  76,  80, 
+    114,  77, 146,  72,  68,  13, 
+    162, 102, 183,  96,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       1,   0,   0,   0,   1,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -1095,7 +1095,7 @@ const BYTE DX12VertexShaderBytes[] =
       0,   0, 103, 159,   1,   0, 
     179, 120,   1,   0, 238,  97, 
       2,   0,  90,  28,   0,   0, 
-    234,  21,   1,   0,  53, 174, 
+    156,  32,   1,   0,  53, 174, 
       3,   0, 206,  21,   0,   0, 
     193, 205,   3,   0, 207, 193, 
       1,   0,  62,   3,   3,   0, 
@@ -1684,8 +1684,8 @@ const BYTE DX12VertexShaderBytes[] =
     112, 111, 115, 105, 116, 105, 
     111, 110,  32, 111, 102,  32, 
      27, 226,  48,   1, 128,   0, 
-      0,   0, 219,  68,  56, 206, 
-     14,  74, 214,   1,   1,   0, 
+      0,   0, 244, 143, 156,  40, 
+    166,  37, 215,   1,   1,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -2200,7 +2200,7 @@ const BYTE DX12VertexShaderBytes[] =
      12,  16,   0,   0,   1,   0, 
       1,   0,  14,   0,  23,  21, 
      13,  16,   0,   0,  36,   2, 
-     64, 121,   0,   0, 242, 241, 
+      0, 121,   0,   0, 242, 241, 
      10,   0,  24,  21,  14,  16, 
       0,   0,   1,   0,   0,   2, 
      18,   0,  22,  21,  10,  16, 
@@ -3148,19 +3148,19 @@ const BYTE DX12VertexShaderBytes[] =
       1,   0,   0,   0,   0,   0, 
       0,   0,  24,   4,   0,   0, 
      32,   0,   0,  96,   0,   0, 
-    226, 225,   0,   0,   0,   0, 
+    183,  96,   0,   0,   0,   0, 
       0,   0,   0,   0,   2,   0, 
       9,   0, 132,   5,   0,   0, 
       0,   0,   0,   0, 236,   2, 
       0,   0,   1,   0,   0,   0, 
-    232, 126,  85,   3,   0,   0, 
+    184, 129,   0,   3,   0,   0, 
       0,   0,   0,   0,   0,   0, 
     109,  97, 105, 110,   0, 110, 
     111, 110, 101,   0,   0,   0, 
      45, 186,  46, 241,   1,   0, 
       0,   0,   0,   0,   0,   0, 
      24,   4,   0,   0,  32,   0, 
-      0,  96,   0,   0, 226, 225, 
+      0,  96,   0,   0, 183,  96, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   2,   0,   2,   0, 
       7,   0,   0,   0,   0,   0, 
@@ -3219,11 +3219,11 @@ const BYTE DX12VertexShaderBytes[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
-    148,  46,  49,   1,  26,  37, 
-    243,  94,   1,   0,   0,   0, 
-    203, 134,  75,  72, 201,  51, 
-    137,  72, 142, 164, 219, 143, 
-     97,   6, 226, 225, 129,   0, 
+    148,  46,  49,   1, 208, 142, 
+     99,  96,   1,   0,   0,   0, 
+     28, 248,   5, 201,  76,  80, 
+    114,  77, 146,  72,  68,  13, 
+    162, 102, 183,  96, 129,   0, 
       0,   0,  47,  76, 105, 110, 
     107,  73, 110, 102, 111,   0, 
      47, 110,  97, 109, 101, 115, 

+ 1 - 19
DXBuffer.cpp

@@ -15,12 +15,12 @@ using namespace Framework;
 //  bind: Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER.
 //  eLän: Länge eines einzelnen Elements in Bytes
 DXBuffer::DXBuffer( int eLen )
+    : ReferenceCounter()
 {
     data = 0;
     changed = 0;
     len = 0;
     elLen = eLen;
-    ref = 1;
 }
 
 // Destruktor
@@ -60,24 +60,6 @@ int DXBuffer::getElementAnzahl() const
     return len / elLen;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-DXBuffer *DXBuffer::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-DXBuffer *DXBuffer::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 #ifdef WIN32
 // Inhalt der DX11Buffer Klasse

+ 2 - 8
DXBuffer.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 #ifdef WIN32
 struct ID3D11Buffer;
@@ -20,14 +21,13 @@ namespace Framework
     class DX12DirectCommandQueue;
 
     //! Eine Schnittstelle zwischen dem Arbeitsspeicher und dem Grafikspeicher
-    class DXBuffer
+    class DXBuffer : public virtual ReferenceCounter
     {
     protected:
         void *data;
         bool changed;
         int len;
         int elLen;
-        int ref;
 
     public:
         //! Konstruktor
@@ -50,12 +50,6 @@ namespace Framework
         DLLEXPORT int getElementLength() const;
         //! Gibt die Anzahl der Elemente im Buffer zurück
         DLLEXPORT int getElementAnzahl() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT DXBuffer *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT virtual DXBuffer *release();
     };
 
 #ifdef WIN32

+ 3 - 16
DXCommandQueue.cpp

@@ -9,10 +9,10 @@ using namespace Framework;
 
 
 DX12CommandQueue::DX12CommandQueue( int typ, ID3D12Device2 *device )
-    : device( device ),
+    : ReferenceCounter(),
+    device( device ),
     event( CreateEvent( 0, 0, 0, 0 ) ),
-    fenceValue( 0 ),
-    ref( 1 )
+    fenceValue( 0 )
 {
     D3D12_COMMAND_QUEUE_DESC desc = {};
     desc.Type = (D3D12_COMMAND_LIST_TYPE)typ;
@@ -112,19 +112,6 @@ void DX12CommandQueue::execute()
     commandList->Reset( allocator, nullptr );
 }
 
-DX12CommandQueue *DX12CommandQueue::getThis()
-{
-    ref++;
-    return this;
-}
-
-DX12CommandQueue *DX12CommandQueue::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 DX12DirectCommandQueue::DX12DirectCommandQueue( ID3D12Device2 *device )
     : DX12CommandQueue( D3D12_COMMAND_LIST_TYPE_DIRECT, device )

+ 2 - 4
DXCommandQueue.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 //! DirectX12 Datentypen
 struct ID3D12CommandAllocator;
@@ -13,7 +14,7 @@ namespace Framework
 {
     class DX12Command;
 
-    class DX12CommandQueue
+    class DX12CommandQueue : public virtual ReferenceCounter
     {
     protected:
         ID3D12CommandAllocator *allocator;
@@ -23,7 +24,6 @@ namespace Framework
         ID3D12Device2 *device;
         HANDLE event;
         unsigned __int64 fenceValue;
-        int ref;
 
         DX12CommandQueue( int typ, ID3D12Device2 *device );
 
@@ -37,8 +37,6 @@ namespace Framework
         ID3D12GraphicsCommandList2 *getCommandList() const;
         ID3D12CommandQueue *getQueue() const;
         void execute();
-        DX12CommandQueue *getThis();
-        DX12CommandQueue *release();
     };
 
     class DX12DirectCommandQueue : public DX12CommandQueue

+ 15 - 30
Datei.cpp

@@ -18,7 +18,7 @@ using namespace Encryption;
 // Inhalt der Datei Klasse aus Datei.h
 // Konstruktor 
 Datei::Datei()
-    : ref( 1 ),
+    : ReferenceCounter(),
     stream( 0 ),
     pfad( 0 ),
     gr( 0 ),
@@ -93,14 +93,14 @@ bool Datei::remove() // l
 {
     if( !pfad )
         return 0;
-    return DateiRemove( pfad->getThis() );
+    return DateiRemove( (Text*)pfad->getThis() );
 }
 
 bool Datei::erstellen() // erstellt die Datei
 {
     if( !pfad )
         return 0;
-    return DateiPfadErstellen( pfad->getThis() );
+    return DateiPfadErstellen( (Text *)pfad->getThis() );
 }
 
 bool Datei::open( int style ) // öffnet die Datei
@@ -176,7 +176,7 @@ void Datei::schreibe( const char* bytes, int len ) // schreibt bytes in datei
     {
         key->setPos( getSPosition() );
         Bytes* n = new Bytes( bytes, len );
-        key->codieren( n->getThis() );
+        key->codieren( (Bytes*)n->getThis() );
         stream->write( n->getBytes(), len );
         n->release();
     }
@@ -241,7 +241,7 @@ void Datei::close() // schlie
         {
             key->setPos( getSPosition() );
             Bytes* n = new Bytes( &tmpSByte, 1 );
-            key->codieren( n->getThis() );
+            key->codieren( (Bytes*)n->getThis() );
             stream->write( n->getBytes(), 1 );
             n->release();
         }
@@ -338,7 +338,7 @@ bool Datei::setNextBit( bool bit ) // Datei Bitweise speichern
         {
             key->setPos( getSPosition() );
             Bytes* n = new Bytes( &tmpSByte, 1 );
-            key->codieren( n->getThis() );
+            key->codieren( (Bytes*)n->getThis() );
             stream->write( n->getBytes(), 1 );
             n->release();
         }
@@ -354,7 +354,7 @@ void Datei::setKey( char* s, int l )
 {
     if( l == 0 )
     {
-        key = key->release();
+        key = (Key*)key->release();
         return;
     }
     if( key )
@@ -368,7 +368,7 @@ bool Datei::istOrdner() const // pr
 {
     if( !pfad )
         return 0;
-    return DateiIstVerzeichnis( pfad->getThis() );
+    return DateiIstVerzeichnis( (Text *)pfad->getThis() );
 }
 
 bool Datei::istOffen() const // prüft, ob die Datei geöffnet ist
@@ -385,7 +385,7 @@ int Datei::getUnterdateiAnzahl() const // gibt die Anzahl der unterdateien an
 #ifdef WIN32
     if( !pfad )
         return 0;
-    if( !DateiIstVerzeichnis( pfad->getThis() ) )
+    if( !DateiIstVerzeichnis( (Text *)pfad->getThis() ) )
         return 0;
     int ret = 0;
     HANDLE fHandle;
@@ -429,7 +429,7 @@ RCArray< Text >* Datei::getDateiListe() const // gibt eine Liste mit unterdateie
 #ifdef WIN32
     if( !pfad )
         return 0;
-    if( !DateiIstVerzeichnis( pfad->getThis() ) )
+    if( !DateiIstVerzeichnis( (Text *)pfad->getThis() ) )
         return 0;
     HANDLE fHandle;
     WIN32_FIND_DATA wfd;
@@ -547,7 +547,7 @@ bool Datei::existiert() const // pr
 {
     if( !pfad )
         return 0;
-    return DateiExistiert( pfad->getThis() );
+    return DateiExistiert( (Text *)pfad->getThis() );
 }
 
 __int64 Datei::getLPosition() const // gibt die Leseposition zurück
@@ -574,7 +574,7 @@ bool Datei::istEnde() const // pr
 
 Text* Datei::getPfad() const // gibt den Dateipfad zurück
 {
-    return pfad ? pfad->getThis() : 0;
+    return pfad ? (Text *)pfad->getThis() : 0;
 }
 
 Text* Datei::zPfad() const
@@ -582,21 +582,6 @@ Text* Datei::zPfad() const
     return pfad;
 }
 
-// Reference Counting 
-Datei* Datei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Datei* Datei::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Datei Funktionen
 void Framework::GetFreePfad( Text* zPfad ) // Sucht einen unbenutzten Dateinamen
 {
@@ -661,7 +646,7 @@ bool Framework::DateiPfadErstellen( const char* pfad ) // Erstellt eine Datei in
                 t->release();
             continue;
         }
-        if( !DateiExistiert( t->getThis() ) )
+        if( !DateiExistiert( (Text *)t->getThis() ) )
 #pragma warning(suppress: 6031)
             _mkdir( t->getText() );
         t->release();
@@ -701,13 +686,13 @@ bool Framework::DateiRemove( const char* pfad ) // L
     pfa.ersetzen( '\\', '/' );
     bool ret = 0;
     // prüfen ob Datei existiert
-    if( !DateiIstVerzeichnis( pfa.getThis() ) )
+    if( !DateiIstVerzeichnis( (Text *)pfa.getThis() ) )
         ret = DeleteFile( pfa.getText() ) == 1; // Datei löschen
     else
     {
         ret = 1;
         Datei* dat = new Datei();
-        dat->setDatei( pfa.getThis() );
+        dat->setDatei( (Text *)pfa.getThis() );
         int anz = dat->getUnterdateiAnzahl();
         RCArray< Text >* liste = dat->getDateiListe();
         for( int i = 0; i < anz; ++i )

+ 1 - 8
Datei.h

@@ -17,7 +17,7 @@ namespace Framework
     class Datei; //! aus dieser Datei
 
     //! Ließt und schreibt in eine Datei
-    class Datei : public Reader, public Writer
+    class Datei : public Reader, public Writer, public virtual ReferenceCounter
     {
     public:
         class Style
@@ -28,7 +28,6 @@ namespace Framework
             const static int ende = 0x04; //! setzt dateizeiger ans Ende der Datei
         };
     private:
-        int ref;
         std::fstream *stream;
         Text *pfad;
         __int64 gr;
@@ -138,12 +137,6 @@ namespace Framework
         DLLEXPORT Text *getPfad() const;
         //! Gibt den Pfad zur Datei ohne erhöhten Reference Counter zurück
         DLLEXPORT Text *zPfad() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Datei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Datei *release();
     };
 
     //! Datei Funktionen

+ 6 - 30
DateiDialog.cpp

@@ -14,11 +14,11 @@ using namespace Framework;
 // Inhalt der DateiDialog Klasse aus DateiDialog.h
 // Konstruktor
 DateiDialog::DateiDialog()
+    : ReferenceCounter()
 {
     typeName = new RCArray< Text >();
     type = new RCArray< Text >();
     fileIndex = 1;
-    ref = 1;
 }
 
 // Destruktor
@@ -174,21 +174,6 @@ Text *DateiDialog::anzeigen( bool open ) const
     return 0;
 }
 
-// Reference Counting
-DateiDialog *DateiDialog::getThis()
-{
-    ref++;
-    return this;
-}
-
-DateiDialog *DateiDialog::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der DateiDialogTh Klasse aus DateiDialog.h
 // Konstruktor
@@ -203,6 +188,9 @@ DateiDialogTh::DateiDialogTh()
 // Destruktor
 DateiDialogTh::~DateiDialogTh()
 {
+    warteAufThread( 5000 );
+    if( run )
+        ende();
     dialog->release();
     if( ret )
         ret->release();
@@ -237,29 +225,17 @@ void DateiDialogTh::setDateiTypAuswahl( int i )
 void DateiDialogTh::thread()
 {
     if( ret )
-        ret = ret->release();
+        ret = (Text *)ret->release();
     ret = dialog->anzeigen( open );
 }
 
 // constant
 Text *DateiDialogTh::getPfad() const
 {
-    return ret ? ret->getThis() : 0;
+    return ret ? (Text *)ret->getThis() : 0;
 }
 
 Text *DateiDialogTh::zPfad() const
 {
     return ret;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *DateiDialogTh::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 10
DateiDialog.h

@@ -11,13 +11,12 @@ namespace Framework
     void InitDialog();
 
     //! Erstellt einen Datei öffnen/speichern Dialog
-    class DateiDialog
+    class DateiDialog : public virtual ReferenceCounter
     {
     private:
         RCArray< Text > *typeName;
         RCArray< Text > *type;
         int fileIndex;
-        int ref;
 
     public:
         //! Konstruktor
@@ -41,12 +40,6 @@ namespace Framework
         //! \param open true, wenn der Dialog zum öffnen dienen soll. false zum Speichern
         //! \return Den Pfad zur ausgewählten Datei
         DLLEXPORT Text *anzeigen( bool open ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT DateiDialog *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT DateiDialog *release();
     };
 
     //! Verwaltet einen Datei öffnen/speichern Dialog ohne zu warten
@@ -87,8 +80,6 @@ namespace Framework
         //! Gibt den Pfad zur Datei ohne erhöhten Reference Counter zurück.
         //! Funktioniert erst, nachdem der Thread beendet wurde
         DLLEXPORT Text *zPfad() const;
-        //! löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-        DLLEXPORT Thread *release() override;
     };
 };
 

+ 135 - 300
DateiSystem.cpp

@@ -16,7 +16,8 @@ using namespace Framework;
 // Inhalt der LTDBPixel Klasse aus Dateisystem.h
 // Konstruktor 
 LTDBPixel::LTDBPixel( LTDBPixel *davor )
-    : davor( davor ),
+    : ReferenceCounter(),
+    davor( davor ),
     index( 0 ),
     iR( 0 ),
     iG( 0 ),
@@ -36,8 +37,7 @@ LTDBPixel::LTDBPixel( LTDBPixel *davor )
     R( 0 ),
     G( 0 ),
     B( 0 ),
-    A( 0 ),
-    ref( 1 )
+    A( 0 )
 {}
 
 // Destruktor 
@@ -210,7 +210,7 @@ char LTDBPixel::addByte( char byte, char begin ) // gibt ende des Pixels zur
                     B = (unsigned char)( davor->getB() + B );
                 if( changeA )
                     A = (unsigned char)( davor->getA() + A );
-                davor = davor->release();
+                davor = (LTDBPixel *)davor->release();
             }
             return (char)( i + 1 );
         }
@@ -413,7 +413,7 @@ char LTDBPixel::getNextByte( char &byte, int begin ) // Gibt die n
         if( index >= maxIndex )
         {
             if( davor )
-                davor = davor->release();
+                davor = (LTDBPixel *)davor->release();
             return (char)( i + 1 );
         }
     }
@@ -471,28 +471,13 @@ unsigned char LTDBPixel::getA() const // gibt Alpha zur
     return A;
 }
 
-// Reference Counting 
-LTDBPixel *LTDBPixel::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDBPixel *LTDBPixel::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDBDateiKopf Klasse aus Dateisystem.h
 // konstructor
 LTDBDateiKopf::LTDBDateiKopf()
-    : bilder( new RCArray< Text >() ),
+    : ReferenceCounter(),
+    bilder( new RCArray< Text >() ),
     pos( new Array< __int64 >() ),
-    bAnzahl( 0 ),
-    ref( 1 )
+    bAnzahl( 0 )
 {}
 
 // destructor 
@@ -686,25 +671,10 @@ RCArray< Text > *LTDBDateiKopf::zBildListe() const
     return bilder;
 }
 
-// Reference Counting 
-LTDBDateiKopf *LTDBDateiKopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDBDateiKopf *LTDBDateiKopf::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDBKopf Klasse aus DateiSystem.h
 // Konstruktor 
 LTDBKopf::LTDBKopf()
-    : ref( 1 )
+    : ReferenceCounter()
 {}
 
 // nicht constant 
@@ -1010,33 +980,18 @@ __int16 LTDBKopf::getBits( int begin, int ende )const // gibt die Bits von begin
     return ret;
 }
 
-// Reference Counting 
-LTDBKopf *LTDBKopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDBKopf *LTDBKopf::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDBKörper Klasse aus Dateisystem.h
 // Konstruktor 
 LTDBBody::LTDBBody()
-    : gr( 0, 0 ),
-    b( new Bild() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    gr( 0, 0 ),
+    b( new Bild() )
 {}
 
 LTDBBody::LTDBBody( LTDBKopf *k ) // ruft Init auf
-    : gr( 0, 0 ),
-    b( new Bild() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    gr( 0, 0 ),
+    b( new Bild() )
 {
     init( k );
 }
@@ -1085,7 +1040,7 @@ void LTDBBody::laden( FBalken *zF, std::ifstream *inF ) // l
     while( index < gr.x * gr.y ) // für jeden Pixel
     {
         if( !dieser ) // wenn es nicht der erste Pixel ist
-            dieser = new LTDBPixel( davor->getThis() );
+            dieser = new LTDBPixel( (LTDBPixel *)davor->getThis() );
         int ende = -1;
         while( ende < 0 ) // Pixel laden
         {
@@ -1099,9 +1054,9 @@ void LTDBBody::laden( FBalken *zF, std::ifstream *inF ) // l
             begin = 0;
         buff[ ( index % gr.x ) + ( index / gr.x ) * breite ] = dieser->zuFarbe();
         if( davor )
-            davor = davor->release();
-        davor = dieser->getThis();
-        dieser = dieser->release();
+            davor = (LTDBPixel *)davor->release();
+        davor = (LTDBPixel *)dieser->getThis();
+        dieser = (LTDBPixel *)dieser->release();
         ++index;
 #ifdef WIN32
         if( zF )
@@ -1109,7 +1064,7 @@ void LTDBBody::laden( FBalken *zF, std::ifstream *inF ) // l
 #endif
     }
     if( davor )
-        davor = davor->release();
+        davor = (LTDBPixel *)davor->release();
 }
 
 void LTDBBody::setBild( Bild *b ) // setzt das zu speichernde Bild
@@ -1139,7 +1094,7 @@ void LTDBBody::speichern( FBalken *zF, std::ofstream *outF ) const // speichert
         for( int i = 0; i < gr.x * gr.y; ++i ) // für jeden Pixel
         {
             if( !dieser ) // wenn es nicht der erste Pixel ist
-                dieser = new LTDBPixel( letzter->getThis() );
+                dieser = new LTDBPixel( (LTDBPixel *)letzter->getThis() );
             dieser->setFarbe( pBuff[ i ] ); // Farbe des Pixels setzen
             dieser->komprimieren(); // Pixel komprimieren
             ende = -1;
@@ -1160,15 +1115,15 @@ void LTDBBody::speichern( FBalken *zF, std::ofstream *outF ) const // speichert
                 begin = 0;
             if( letzter )
                 letzter->release();
-            letzter = dieser->getThis(); // dieser wird zu letzter
-            dieser = dieser->release();
+            letzter = (LTDBPixel *)dieser->getThis(); // dieser wird zu letzter
+            dieser = (LTDBPixel *)dieser->release();
 #ifdef WIN32
             if( zF )
                 zF->aktionPlus();
 #endif
         }
         if( letzter )
-            letzter = letzter->release();
+            letzter = (LTDBPixel *)letzter->release();
         if( !w )
         {
             outF->write( &byte, 1 ); // Das letzte byte speichern
@@ -1179,7 +1134,7 @@ void LTDBBody::speichern( FBalken *zF, std::ofstream *outF ) const // speichert
 
 Bild *LTDBBody::getBild() const // gibt das geladene Bild zurück
 {
-    return b->getThis();
+    return (Bild *)b->getThis();
 }
 
 const Punkt &LTDBBody::getSize() const // gibt die größe des Bildes zurück
@@ -1187,27 +1142,12 @@ const Punkt &LTDBBody::getSize() const // gibt die gr
     return gr;
 }
 
-// Reference Counting
-LTDBBody *LTDBBody::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDBBody *LTDBBody::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 // Inhalt det LTDBDatei Klasse aus Dateisystem.h
 // Konstruktor 
 LTDBDatei::LTDBDatei()
-    : pfad( new Text() ),
-    datKpf( 0 ),
-    ref( 1 )
+    : ReferenceCounter(),
+    pfad( new Text() ),
+    datKpf( 0 )
 {}
 
 // Destruktor 
@@ -1223,15 +1163,15 @@ LTDBDatei::~LTDBDatei()
 void LTDBDatei::setDatei( Text *pfad ) // Setzt den Pfad zur Datei
 { // Werte der eventuellen vorherigen Datei löschen
     if( datKpf )
-        datKpf = datKpf->release();
+        datKpf = (LTDBDateiKopf *)datKpf->release();
     // Pfad setzen
-    this->pfad->setText( pfad->getThis() );
+    this->pfad->setText( (Text *)pfad->getThis() );
     pfad->release();
 }
 
 void LTDBDatei::erstellen() // Erstellt die Datei
 {
-    DateiPfadErstellen( pfad->getThis() );
+    DateiPfadErstellen( (Text *)pfad->getThis() );
     std::ofstream *outF = new std::ofstream( pfad->getText(), std::ios::binary );
     int i = 0;
     outF->write( (char *)&i, 2 );
@@ -1240,7 +1180,7 @@ void LTDBDatei::erstellen() // Erstellt die Datei
 
 void LTDBDatei::leseDaten( FBalken *f ) // Die Klasse ließt alle Bilder kurz ein, und merkt sich, an welcher stelle in der Datei was ist
 { // Diese Funktion wird ein wenig Zeit in Anspruch nemen, dafüraber danach die anderen schneller machen
-    if( DateiExistiert( pfad->getThis() ) )
+    if( DateiExistiert( (Text *)pfad->getThis() ) )
     {
         if( datKpf )
             datKpf->release();
@@ -1253,9 +1193,9 @@ void LTDBDatei::leseDaten( FBalken *f ) // Die Klasse lie
 
 void LTDBDatei::remove() // Löscht die Datei
 {
-    if( DateiExistiert( pfad->getThis() ) )
+    if( DateiExistiert( (Text *)pfad->getThis() ) )
     {
-        DateiRemove( pfad->getThis() );
+        DateiRemove( (Text *)pfad->getThis() );
         if( datKpf )
             datKpf->release();
     }
@@ -1263,7 +1203,7 @@ void LTDBDatei::remove() // L
 
 void LTDBDatei::remove( FBalken *f, Text *name ) // Löscht ein Bild aus der Datei
 {
-    if( DateiExistiert( pfad->getThis() ) && name )
+    if( DateiExistiert( (Text *)pfad->getThis() ) && name )
     {
         if( !datKpf )
             leseDaten( 0 ); // Daten einlesen
@@ -1273,7 +1213,7 @@ void LTDBDatei::remove( FBalken *f, Text *name ) // L
             name->release();
             return;
         }
-        int index = datKpf->getBildIndex( name->getThis() );
+        int index = datKpf->getBildIndex( (Text *)name->getThis() );
         if( index == -1 ) // das bild existiert nicht
         {
             name->release();
@@ -1283,7 +1223,7 @@ void LTDBDatei::remove( FBalken *f, Text *name ) // L
         Text *pf_tmp = new Text( pfad->getText() );
         char c = '0';
         pf_tmp->append( "0" );
-        for( int i = 0; DateiExistiert( pf_tmp->getThis() ); ++i )
+        for( int i = 0; DateiExistiert( (Text *)pf_tmp->getThis() ); ++i )
         {
             c = (char)( '0' + ( i % 10 ) );
             if( ( i % 10 ) == 0 )
@@ -1315,10 +1255,10 @@ void LTDBDatei::remove( FBalken *f, Text *name ) // L
             } // zu löschendes Bild überspringen
             LTDBKopf *delkpf = new LTDBKopf();
             delkpf->laden( inF );
-            LTDBBody *delkpr = new LTDBBody( delkpf->getThis() );
+            LTDBBody *delkpr = new LTDBBody( (LTDBKopf *)delkpf->getThis() );
             delkpr->laden( f, inF );
-            delkpf = delkpf->release();
-            delkpr = delkpr->release(); // restliche bytes kopieren
+            delkpf = (LTDBKopf *)delkpf->release();
+            delkpr = (LTDBBody *)delkpr->release(); // restliche bytes kopieren
             pos_minus = inF->tellg() - outF->tellp();
             for( __int64 i = (__int64)inF->tellg(); i < datlen; ++i )
             {
@@ -1331,22 +1271,22 @@ void LTDBDatei::remove( FBalken *f, Text *name ) // L
             datKpf->speichern( outF );
             inF->close();
             outF->close();
-            DateiRemove( pfad->getThis() );
-            DateiUmbenennen( pf_tmp->getThis(), pfad->getThis() );
+            DateiRemove( (Text *)pfad->getThis() );
+            DateiUmbenennen( (Text *)pf_tmp->getThis(), (Text *)pfad->getThis() );
         }
         delete inF;
         delete outF;
-        pf_tmp = pf_tmp->release();
+        pf_tmp = (Text *)pf_tmp->release();
     }
     if( name )
-        name = name->release();
+        name = (Text *)name->release();
 }
 
 Bild *LTDBDatei::laden( FBalken *f, Text *name ) // Läd ein Bild aus der Datei
 {
     if( name )
     {
-        if( !DateiExistiert( pfad->getThis() ) )
+        if( !DateiExistiert( (Text *)pfad->getThis() ) )
         {
             name->release();
             return 0;
@@ -1354,7 +1294,7 @@ Bild *LTDBDatei::laden( FBalken *f, Text *name ) // L
         if( !datKpf )
             leseDaten( 0 );
         LTDBKopf *k_tmp = new LTDBKopf();
-        k_tmp->Init( name->getThis(), Punkt( 0, 0 ) );
+        k_tmp->Init( (Text *)name->getThis(), Punkt( 0, 0 ) );
         int index = datKpf->getBildIndex( k_tmp->getTitel() );
         k_tmp->release();
         if( index == -1 )
@@ -1362,7 +1302,7 @@ Bild *LTDBDatei::laden( FBalken *f, Text *name ) // L
             Text *fehler = new Text( "Das Bild " );
             fehler->append( name );
             fehler->append( " wurde nicht in der Datei\n" );
-            fehler->append( pfad->getThis() );
+            fehler->append( (Text *)pfad->getThis() );
             fehler->append( " gefunden!" );
             std::cout << fehler << "\n";
             return 0;
@@ -1374,7 +1314,7 @@ Bild *LTDBDatei::laden( FBalken *f, Text *name ) // L
         LTDBKopf *kpf = new LTDBKopf();
         kpf->laden( inF );
         Text *t = kpf->getTitel();
-        if( !t->istGleich( name->getThis() ) )
+        if( !t->istGleich( (Text *)name->getThis() ) )
         { // Fehlermeldung 
             t->release();
             kpf->release();
@@ -1390,7 +1330,7 @@ Bild *LTDBDatei::laden( FBalken *f, Text *name ) // L
             return 0;
         }
         t->release();
-        LTDBBody *kpr = new LTDBBody( kpf->getThis() );
+        LTDBBody *kpr = new LTDBBody( (LTDBKopf *)kpf->getThis() );
         kpr->laden( f, inF ); // Bild laden
         Bild *ret = kpr->getBild();
         kpr->release();
@@ -1408,16 +1348,16 @@ int LTDBDatei::speichern( FBalken *f, Bild *bild, Text *name ) // Speichert ein
     int warn = -1;
     if( name && bild )
     {
-        if( DateiExistiert( pfad->getThis() ) )
+        if( DateiExistiert( (Text *)pfad->getThis() ) )
         {
             if( !datKpf )
                 leseDaten( 0 );
-            int index = datKpf->getBildIndex( name->getThis() );
+            int index = datKpf->getBildIndex( (Text *)name->getThis() );
             if( index == -1 )
             {
                 warn = 0;
                 LTDBKopf *kpf = new LTDBKopf();
-                warn = kpf->Init( name->getThis(), bild->getSize() );
+                warn = kpf->Init( (Text *)name->getThis(), bild->getSize() );
                 if( datKpf->getBildIndex( kpf->getTitel() ) != -1 )
                 {
                     std::cout << "Es existiert bereits ein Bild mit diesem Namen!\n";
@@ -1430,7 +1370,7 @@ int LTDBDatei::speichern( FBalken *f, Bild *bild, Text *name ) // Speichert ein
                 Text *pf_tmp = new Text( pfad->getText() );
                 char c = '0';
                 pf_tmp->append( "0" );
-                for( int i = 0; DateiExistiert( pf_tmp->getThis() ); ++i )
+                for( int i = 0; DateiExistiert( (Text *)pf_tmp->getThis() ); ++i )
                 {
                     c = (char)( '0' + ( i % 10 ) );
                     if( ( i % 10 ) == 0 )
@@ -1461,8 +1401,8 @@ int LTDBDatei::speichern( FBalken *f, Bild *bild, Text *name ) // Speichert ein
                     outF->write( &byte, 1 );
                 }
                 kpf->speichern( outF ); // Bild Kopf speichern
-                LTDBBody *kpr = new LTDBBody( kpf->getThis() );
-                kpr->setBild( bild->getThis() );
+                LTDBBody *kpr = new LTDBBody( (LTDBKopf *)kpf->getThis() );
+                kpr->setBild( (Bild *)bild->getThis() );
                 kpr->speichern( f, outF ); // Bild speichern
                 kpf->release();
                 kpr->release();
@@ -1470,8 +1410,8 @@ int LTDBDatei::speichern( FBalken *f, Bild *bild, Text *name ) // Speichert ein
                 outF->close();
                 delete inF;
                 delete outF;
-                DateiRemove( pfad->getThis() );
-                DateiUmbenennen( pf_tmp, pfad->getThis() );
+                DateiRemove( (Text *)pfad->getThis() );
+                DateiUmbenennen( (Text *)pf_tmp, (Text *)pfad->getThis() );
             }
         }
     }
@@ -1494,7 +1434,7 @@ RCArray< Text > *LTDBDatei::zBildListe() // Listet alle Bilder in der datei auf
 // constant 
 Text *LTDBDatei::getPfad() const // Gibt den Pfad zur Datei zurück
 {
-    return pfad->getThis();
+    return (Text *)pfad->getThis();
 }
 
 int LTDBDatei::getBildAnzahl() const
@@ -1508,29 +1448,14 @@ bool LTDBDatei::istOffen() const // Pr
 {
     if( !pfad )
         return 0;
-    return DateiExistiert( pfad->getThis() );
-}
-
-// Reference Counting
-LTDBDatei *LTDBDatei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDBDatei *LTDBDatei::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
+    return DateiExistiert( (Text *)pfad->getThis() );
 }
 #ifdef WIN32
 // LTDS Dateivormat 
 // Inhalt der LTDSPixel Klasse aus DateiSystem.h
 // Konstruktor 
 LTDSPixel::LTDSPixel( LTDSPixel *davor )
-    : ref( 1 ),
+    : ReferenceCounter(),
     index( 0 ),
     iA( 0 ),
     miA( 8 ),
@@ -1648,7 +1573,7 @@ char LTDSPixel::addByte( char byte, char begin ) // gibt ende des Pixels zur
             {
                 if( änderA )
                     alpha = davor->getA() + alpha;
-                davor = davor->release();
+                davor = (LTDSPixel *)davor->release();
             }
             return i + 1;
         }
@@ -1773,7 +1698,7 @@ char LTDSPixel::getNextByte( char &byte, int bbegin ) // Gibt die n
         if( index >= maxIndex )
         {
             if( davor )
-                davor = davor->release();
+                davor = (LTDSPixel *)davor->release();
             return i + 1;
         }
     }
@@ -1796,25 +1721,10 @@ unsigned char LTDSPixel::getA() const // gibt Alpha zur
     return alpha;
 }
 
-// Reference Counting 
-LTDSPixel *LTDSPixel::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSPixel *LTDSPixel::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDSDateiKopf Klasse aus Dateisystem.h
 // Konstruktor 
 LTDSDateiKopf::LTDSDateiKopf()
-    : ref( 1 ),
+    : ReferenceCounter(),
     sganzahl( 0 ),
     gr( 0 ),
     pos( 0 )
@@ -1841,8 +1751,8 @@ void LTDSDateiKopf::laden( std::ifstream *inF ) // L
         pos[ sganzahl ] = 0;
         for( int i = 0; i < sganzahl; ++i )
         {
-            inF->read( (char*)&gr[ i ], 1 );
-            inF->read( (char*)&pos[ i ], 4 );
+            inF->read( (char *)&gr[ i ], 1 );
+            inF->read( (char *)&pos[ i ], 4 );
         }
     }
 }
@@ -1907,11 +1817,11 @@ void LTDSDateiKopf::speichern( std::ofstream *outF ) const // Speichert nach out
 {
     if( outF->is_open() && outF->good() )
     {
-        outF->write( (char*)&sganzahl, 1 );
+        outF->write( (char *)&sganzahl, 1 );
         for( int i = 0; i < sganzahl; ++i )
         {
-            outF->write( (char*)&gr[ i ], 1 );
-            outF->write( (char*)&pos[ i ], 4 );
+            outF->write( (char *)&gr[ i ], 1 );
+            outF->write( (char *)&pos[ i ], 4 );
         }
     }
 }
@@ -1931,25 +1841,10 @@ int LTDSDateiKopf::getSchriftGr
     return sganzahl;
 }
 
-// Reference Counting 
-LTDSDateiKopf *LTDSDateiKopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSDateiKopf *LTDSDateiKopf::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDSSchriftKopf Klasse aus Dateisystem.h
 // Konstruktor 
 LTDSSchriftKopf::LTDSSchriftKopf()
-    : ref( 1 ),
+    : ReferenceCounter(),
     schriftSize( 0 ),
     zeichen( 0 ),
     pos( 0 ),
@@ -1968,16 +1863,16 @@ void LTDSSchriftKopf::laden( std::ifstream *inF ) // l
 {
     if( inF->good() && inF->is_open() )
     {
-        inF->read( (char*)&schriftSize, 1 );
-        inF->read( (char*)&zeichenAnzahl, 1 );
+        inF->read( (char *)&schriftSize, 1 );
+        inF->read( (char *)&zeichenAnzahl, 1 );
         delete[]pos;
         delete[]zeichen;
         zeichen = new unsigned char[ zeichenAnzahl ];
         pos = new int[ zeichenAnzahl + 1 ];
         for( int i = 0; i < zeichenAnzahl; ++i )
         {
-            inF->read( (char*)&zeichen[ i ], 1 );
-            inF->read( (char*)&pos[ i ], 4 );
+            inF->read( (char *)&zeichen[ i ], 1 );
+            inF->read( (char *)&pos[ i ], 4 );
         }
         pos[ zeichenAnzahl ] = 0;
     }
@@ -2077,12 +1972,12 @@ void LTDSSchriftKopf::speichern( std::ofstream *outF ) const // speichert nach o
 {
     if( outF->good() && outF->is_open() )
     {
-        outF->write( (char*)&schriftSize, 1 );
-        outF->write( (char*)&zeichenAnzahl, 1 );
+        outF->write( (char *)&schriftSize, 1 );
+        outF->write( (char *)&zeichenAnzahl, 1 );
         for( int i = 0; i < zeichenAnzahl; ++i )
         {
-            outF->write( (char*)&zeichen[ i ], 1 );
-            outF->write( (char*)&pos[ i ], 4 );
+            outF->write( (char *)&zeichen[ i ], 1 );
+            outF->write( (char *)&pos[ i ], 4 );
         }
     }
 }
@@ -2107,25 +2002,10 @@ unsigned char *LTDSSchriftKopf::getZeichen() const // gibt die zeichen zur
     return zeichen;
 }
 
-// Reference Counting 
-LTDSSchriftKopf *LTDSSchriftKopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSSchriftKopf *LTDSSchriftKopf::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDSBuchstabenKopf Klasse aus Dateisystem.h
 // Konstruktor 
 LTDSBuchstabenKopf::LTDSBuchstabenKopf()
-    : ref( 1 ),
+    : ReferenceCounter(),
     zeichen( 0 ),
     size( 0, 0 )
 {}
@@ -2135,9 +2015,9 @@ void LTDSBuchstabenKopf::laden( std::ifstream *inF ) // l
 {
     if( inF->good() && inF->is_open() )
     {
-        inF->read( (char*)&zeichen, 1 );
-        inF->read( (char*)&size.x, 1 );
-        inF->read( (char*)&size.y, 1 );
+        inF->read( (char *)&zeichen, 1 );
+        inF->read( (char *)&size.x, 1 );
+        inF->read( (char *)&size.y, 1 );
     }
 }
 
@@ -2158,9 +2038,9 @@ void LTDSBuchstabenKopf::speichern( std::ofstream *outF ) const // speichertn na
 {
     if( outF->good() && outF->is_open() )
     {
-        outF->write( (char*)&zeichen, 1 );
-        outF->write( (char*)&size.x, 1 );
-        outF->write( (char*)&size.y, 1 );
+        outF->write( (char *)&zeichen, 1 );
+        outF->write( (char *)&size.x, 1 );
+        outF->write( (char *)&size.y, 1 );
     }
 }
 
@@ -2184,25 +2064,10 @@ const Punkt &LTDSBuchstabenKopf::getGr
     return size;
 }
 
-// Reference Counting 
-LTDSBuchstabenKopf *LTDSBuchstabenKopf::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSBuchstabenKopf *LTDSBuchstabenKopf::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDSBuchstabenKörper Klasse aus Dateisystem.h
 // Konstruktor 
 LTDSBuchstabenKörper::LTDSBuchstabenKörper( LTDSBuchstabenKopf *kopf )
-    : ref( 1 ),
+    : ReferenceCounter(),
     size( kopf->getGröße() ),
     zeichen( kopf->getZeichen() ),
     buchstabe( new Buchstabe() )
@@ -2238,7 +2103,7 @@ void LTDSBuchstabenK
         for( int i = 0; i < size.x * size.y; ++i )
         {
             if( !jetzt ) // wenn es nicht der erste Pixel ist
-                jetzt = new LTDSPixel( vorher->getThis() );
+                jetzt = new LTDSPixel( (LTDSPixel *)vorher->getThis() );
             int ende = -1;
             while( ende < 0 ) // Pixel laden
             {
@@ -2253,9 +2118,9 @@ void LTDSBuchstabenK
             if( buchstabe )
                 buchstabe->setPixel( i, jetzt->getA() );
             if( vorher )
-                vorher = vorher->release();
-            vorher = jetzt->getThis();
-            jetzt = jetzt->release();
+                vorher = (LTDSPixel *)vorher->release();
+            vorher = (LTDSPixel *)jetzt->getThis();
+            jetzt = (LTDSPixel *)jetzt->release();
         }
         if( vorher )
             vorher->release();
@@ -2278,7 +2143,7 @@ void LTDSBuchstabenK
         for( int i = 0; i < size.x * size.y; ++i ) // für jeden Pixel
         {
             if( !jetzt ) // wenn es nicht der erste Pixel ist
-                jetzt = new LTDSPixel( vorher->getThis() );
+                jetzt = new LTDSPixel( (LTDSPixel *)vorher->getThis() );
             jetzt->setAlpha( alphaBuff[ i ] ); // Farbe des Pixels setzen
             jetzt->Komp(); // Pixel komprimieren
             ende = -1;
@@ -2299,11 +2164,11 @@ void LTDSBuchstabenK
                 begin = 0;
             if( vorher )
                 vorher->release();
-            vorher = jetzt->getThis(); // dieser wird zu letzter
-            jetzt = jetzt->release();
+            vorher = (LTDSPixel *)jetzt->getThis(); // dieser wird zu letzter
+            jetzt = (LTDSPixel *)jetzt->release();
         }
         if( vorher )
-            vorher = vorher->release();
+            vorher = (LTDSPixel *)vorher->release();
         if( !w )
         {
             outF->write( &byte, 1 ); // Das letzte byte speichern
@@ -2314,7 +2179,7 @@ void LTDSBuchstabenK
 
 Buchstabe *LTDSBuchstabenKörper::getBuchstabe() const // gibt den Buchstaben zurück
 {
-    return buchstabe->getThis();
+    return (Buchstabe *)buchstabe->getThis();
 }
 
 unsigned char LTDSBuchstabenKörper::getZeichen() const // gibt das Zeichen zurück
@@ -2322,25 +2187,10 @@ unsigned char LTDSBuchstabenK
     return zeichen;
 }
 
-// Reference Counting 
-LTDSBuchstabenKörper *LTDSBuchstabenKörper::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSBuchstabenKörper *LTDSBuchstabenKörper::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der LTDSDatei Klasse aus DAteisystem.h
 // Konstruktor 
 LTDSDatei::LTDSDatei()
-    : ref( 1 ),
+    : ReferenceCounter(),
     pfad( new Text() ),
     dateiKopf( 0 )
 {}
@@ -2357,14 +2207,14 @@ LTDSDatei::~LTDSDatei()
 void LTDSDatei::setPfad( Text *txt ) // setzt den Pfad zur Datei
 {
     if( dateiKopf )
-        dateiKopf = dateiKopf->release();
+        dateiKopf = (LTDSDateiKopf *)dateiKopf->release();
     pfad->setText( txt->getText() );
     txt->release();
 }
 
 void LTDSDatei::leseDaten() // ließt den Dateikopf
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return;
     if( dateiKopf )
         dateiKopf->release();
@@ -2377,7 +2227,7 @@ void LTDSDatei::leseDaten() // lie
 
 void LTDSDatei::addSchriftgröße( Alphabet *alphabet ) // fügt eine Schriftgröße hinzu
 {
-    if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob die Datei existiert
+    if( !DateiExistiert( (Text *)pfad->getThis() ) ) // prüfen, ob die Datei existiert
         return;
     if( !dateiKopf ) // prüfen, ob der Dateikopf schon gelesen wurde
         leseDaten();
@@ -2433,7 +2283,7 @@ void LTDSDatei::addSchriftgr
     dateiKopf->speichern( outF ); // aktualisierter Dateikopf speichern
     outF->seekp( sgPosList[ sganzahl ], std::ios::beg );
     LTDSSchriftKopf *sgkopf = new LTDSSchriftKopf(); // Kopf der neuen Schriftgröße
-    sgkopf->setZeichenAlphabet( alphabet->getThis() ); // Kopf der Schriftgröße initialisieren
+    sgkopf->setZeichenAlphabet( (Alphabet *)alphabet->getThis() ); // Kopf der Schriftgröße initialisieren
     sgkopf->speichern( outF ); // Kopf der Schriftgröße speichern
     int *BuchstabenPosList = sgkopf->getPositionen(); // positionen der verschiedenen Zeichen in der Datei( nuch 0 )
     int count = 0;
@@ -2446,9 +2296,9 @@ void LTDSDatei::addSchriftgr
             LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Zeichenkopf
             zeichKpf->init( i, zeich->getBreite(), zeich->getHeight() );
             zeichKpf->speichern( outF ); // Zeichenkopf speichern
-            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Zeichenkörper
+            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)zeichKpf->getThis() ); // Zeichenkörper
             zeichKpf->release();
-            zeichKörp->setBuchstabe( zeich->getThis() );
+            zeichKörp->setBuchstabe( (Buchstabe *)zeich->getThis() );
             zeichKörp->speichern( outF ); // Zeichenkörper speichern
             zeich->release();
             ++count;
@@ -2460,8 +2310,8 @@ void LTDSDatei::addSchriftgr
     Text *pfad2 = new Text();
     pfad2->setText( pfad->getText() );
     pfad->remove( pfad->getLength() - 1, pfad->getLength() );
-    DateiRemove( pfad->getThis() ); // Alte datei Löschen
-    DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei nach alte umbenennen
+    DateiRemove( (Text *)pfad->getThis() ); // Alte datei Löschen
+    DateiUmbenennen( (Text *)pfad2->getThis(), (Text *)pfad->getThis() ); // neue Datei nach alte umbenennen
     pfad2->release(); // Speicher freigeben
     sgkopf->release();
     delete inF;
@@ -2471,7 +2321,7 @@ void LTDSDatei::addSchriftgr
 
 void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen ) // Fügt einer Schriftgröße einen Buchstaben hinzu
 {
-    if( !DateiExistiert( pfad->getThis() ) ) // prüfen ob Datei existiert
+    if( !DateiExistiert( (Text *)pfad->getThis() ) ) // prüfen ob Datei existiert
     {
         zeich->release();
         return;
@@ -2541,9 +2391,9 @@ void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen )
         LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Buchstabenkopf
         zeichKpf->init( zeichen, zeich->getSize() );
         zeichKpf->speichern( outF ); // Buchstabenkopf speichern
-        LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Buchstabenkörper
+        LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)zeichKpf->getThis() ); // Buchstabenkörper
         zeichKpf->release();
-        zeichKörp->setBuchstabe( zeich->getThis() );
+        zeichKörp->setBuchstabe( (Buchstabe *)zeich->getThis() );
         zeichKörp->speichern( outF ); // Buchstabenkörper speichern
         zeichKörp->release();
     }
@@ -2584,9 +2434,9 @@ void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen )
         LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf(); // Zeichenkopf
         zeichKpf->init( zeichen, zeich->getSize() );
         zeichKpf->speichern( outF ); // Zeichenkopf speichern
-        LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() ); // Zeichenkörper
+        LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)zeichKpf->getThis() ); // Zeichenkörper
         zeichKpf->release();
-        zeichKörp->setBuchstabe( zeich->getThis() );
+        zeichKörp->setBuchstabe( (Buchstabe *)zeich->getThis() );
         zeichKörp->speichern( outF ); // Zeichenkörper speichern
         zeichKörp->release();
         int nowPos = (int)outF->tellp();
@@ -2626,8 +2476,8 @@ void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen )
     outF->close();
     Text *pfad2 = new Text( pfad->getText() );
     pfad->remove( pfad->getLength() - 1, pfad->getLength() );
-    DateiRemove( pfad->getThis() ); // Alte Datei löschen
-    DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // Neue Datei in alte umbenennen
+    DateiRemove( (Text *)pfad->getThis() ); // Alte Datei löschen
+    DateiUmbenennen( (Text *)pfad2->getThis(), (Text *)pfad->getThis() ); // Neue Datei in alte umbenennen
     pfad2->release();// Speicher freigeben
     delete inF;
     delete outF;
@@ -2636,7 +2486,7 @@ void LTDSDatei::addBuchstabe( int gr, Buchstabe *zeich, unsigned char zeichen )
 
 void LTDSDatei::löscheSchrifrGröße( int gr ) // Löscht eine Schriftgröße aus der Datei
 {
-    if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob Datei existiert
+    if( !DateiExistiert( (Text *)pfad->getThis() ) ) // prüfen, ob Datei existiert
         return;
     if( !dateiKopf ) // prüfen, ob der Dateikopf geladen wurde
         leseDaten();
@@ -2713,8 +2563,8 @@ void LTDSDatei::l
     outF->close();
     Text *pfad2 = new Text( pfad->getText() );
     pfad->remove( pfad->getLength() - 1, pfad->getLength() );
-    DateiRemove( pfad->getThis() ); // alte Datei löschen
-    DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei zu alter umbenennen
+    DateiRemove( (Text *)pfad->getThis() ); // alte Datei löschen
+    DateiUmbenennen( (Text *)pfad2->getThis(), (Text *)pfad->getThis() ); // neue Datei zu alter umbenennen
     pfad2->release();
     delete inF;
     delete outF;
@@ -2722,7 +2572,7 @@ void LTDSDatei::l
 
 void LTDSDatei::löscheBuchstabe( int gr, unsigned char zeichen ) // Löscht einen Buchstaben aus der Datei
 {
-    if( !DateiExistiert( pfad->getThis() ) ) // prüfen, ob die Datei existiert
+    if( !DateiExistiert( (Text *)pfad->getThis() ) ) // prüfen, ob die Datei existiert
         return;
     if( !dateiKopf ) // prüfen, ob der Dateikopf gelesen wurde
         leseDaten();
@@ -2771,7 +2621,7 @@ void LTDSDatei::l
                 outF->close();
                 delete inF;
                 delete outF;
-                DateiRemove( pfad->getThis() );
+                DateiRemove( (Text *)pfad->getThis() );
                 pfad->remove( pfad->getLength() - 1, pfad->getLength() );
                 return; // abbruch
             }
@@ -2853,8 +2703,8 @@ void LTDSDatei::l
     outF->close();
     Text *pfad2 = new Text( pfad->getText() );
     pfad->remove( pfad->getLength() - 1, pfad->getLength() );
-    DateiRemove( pfad->getThis() ); // alte Datei löschen
-    DateiUmbenennen( pfad2->getThis(), pfad->getThis() ); // neue Datei nach alte umbenennen
+    DateiRemove( (Text *)pfad->getThis() ); // alte Datei löschen
+    DateiUmbenennen( (Text *)pfad2->getThis(), (Text *)pfad->getThis() ); // neue Datei nach alte umbenennen
     pfad2->release(); // Speicher freigeben
     delete inF;
     delete outF;
@@ -2862,16 +2712,16 @@ void LTDSDatei::l
 
 void LTDSDatei::löscheDatei() // Löscht die gesamte Datei
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return;
     if( !dateiKopf )
         leseDaten();
-    DateiRemove( pfad->getThis() );
+    DateiRemove( (Text *)pfad->getThis() );
 }
 
 void LTDSDatei::erstelleDatei() // erstellt die Datei
 {
-    DateiPfadErstellen( pfad->getThis() );
+    DateiPfadErstellen( (Text *)pfad->getThis() );
     if( dateiKopf )
         dateiKopf->release();
     dateiKopf = new LTDSDateiKopf();
@@ -2883,7 +2733,7 @@ void LTDSDatei::erstelleDatei() // erstellt die Datei
 
 void LTDSDatei::speicherSchrift( Schrift *schrift ) // Speichert die übergebene Schrift
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
     {
         schrift->release();
         return;
@@ -2917,8 +2767,8 @@ void LTDSDatei::speicherSchrift( Schrift *schrift ) // Speichert die 
             Buchstabe *zeichen = alp->getBuchstabe( sgKpf->getZeichen()[ i1 ] );
             zeichKpf->init( sgKpf->getZeichen()[ i1 ], zeichen->getBreite(), zeichen->getHeight() );
             zeichKpf->speichern( outF );
-            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() );
-            zeichKörp->setBuchstabe( zeichen->getThis() );
+            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)zeichKpf->getThis() );
+            zeichKörp->setBuchstabe( (Buchstabe *)zeichen->getThis() );
             zeichKörp->speichern( outF );
             zeichKörp->release();
             zeichen->release();
@@ -2941,7 +2791,7 @@ void LTDSDatei::speicherSchrift( Schrift *schrift ) // Speichert die 
 // constant 
 Schrift *LTDSDatei::ladeSchrift() // gibt die geladene Schrift zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -2958,13 +2808,13 @@ Schrift *LTDSDatei::ladeSchrift() // gibt die geladene Schrift zur
         {
             LTDSBuchstabenKopf *zeichKpf = new LTDSBuchstabenKopf();
             zeichKpf->laden( inF );
-            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( zeichKpf->getThis() );
+            LTDSBuchstabenKörper *zeichKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)zeichKpf->getThis() );
             zeichKörp->laden( inF );
             alphabet->setBuchstabe( zeichKpf->getZeichen(), zeichKörp->getBuchstabe() );
             zeichKörp->release();
             zeichKpf->release();
         }
-        ret->addAlphabet( alphabet->getThis() );
+        ret->addAlphabet( (Alphabet *)alphabet->getThis() );
         alphabet->release();
         sgKpf->release();
     }
@@ -2975,7 +2825,7 @@ Schrift *LTDSDatei::ladeSchrift() // gibt die geladene Schrift zur
 
 Alphabet *LTDSDatei::ladeAlphabet( int schriftgröße ) // gibt eine geladene Schrift nur mit der angegebenen Schriftgröße zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3002,7 +2852,7 @@ Alphabet *LTDSDatei::ladeAlphabet( int schriftgr
     {
         LTDSBuchstabenKopf *sgZKpf = new LTDSBuchstabenKopf();
         sgZKpf->laden( inF );
-        LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( sgZKpf->getThis() );
+        LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)sgZKpf->getThis() );
         sgZKörp->laden( inF );
         ret->setBuchstabe( sgZKpf->getZeichen(), sgZKörp->getBuchstabe() );
         sgZKörp->release();
@@ -3016,7 +2866,7 @@ Alphabet *LTDSDatei::ladeAlphabet( int schriftgr
 
 Buchstabe *LTDSDatei::ladeBuchstabe( int schriftgröße, unsigned char zeichen )// Läd einen bestimmten Buchstaben
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3050,7 +2900,7 @@ Buchstabe *LTDSDatei::ladeBuchstabe( int schriftgr
         inF->seekg( sgKpf->getPositionen()[ sgZNum ], std::ios::beg );
         LTDSBuchstabenKopf *sgZKpf = new LTDSBuchstabenKopf();
         sgZKpf->laden( inF );
-        LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( sgZKpf->getThis() );
+        LTDSBuchstabenKörper *sgZKörp = new LTDSBuchstabenKörper( (LTDSBuchstabenKopf *)sgZKpf->getThis() );
         sgZKörp->laden( inF );
         ret = sgZKörp->getBuchstabe();
         sgZKörp->release();
@@ -3068,12 +2918,12 @@ Buchstabe *LTDSDatei::ladeBuchstabe( int schriftgr
 
 Text *LTDSDatei::getPfad() const // gibt den Dateipfad zurück
 {
-    return pfad->getThis();
+    return (Text *)pfad->getThis();
 }
 
 int LTDSDatei::getAnzahlSchriftgrößen() const // gibt die Anzahl der Schriftgrößen aus der Datei zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3082,7 +2932,7 @@ int LTDSDatei::getAnzahlSchriftgr
 
 unsigned char *LTDSDatei::getSchriftGrößen() const // gibt einen Array von Schriftgrößen zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3091,7 +2941,7 @@ unsigned char *LTDSDatei::getSchriftGr
 
 unsigned char LTDSDatei::getAnzahlBuchstaben( int sg ) // gibt die anzahl gespeicherter Buchstaben einer Schriftgröße zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3124,7 +2974,7 @@ unsigned char LTDSDatei::getAnzahlBuchstaben( int sg ) // gibt die anzahl gespei
 
 unsigned char *LTDSDatei::getBuchstaben( int sg ) // gibt einen Array von Buchstaben einer Schriftgröße zurück
 {
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( (Text *)pfad->getThis() ) )
         return 0;
     if( !dateiKopf )
         return 0;
@@ -3157,21 +3007,6 @@ unsigned char *LTDSDatei::getBuchstaben( int sg ) // gibt einen Array von Buchst
     }
     return ret;
 }
-
-// Reference Counting 
-LTDSDatei *LTDSDatei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-LTDSDatei *LTDSDatei::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
 #endif
 // Bit Funktionen
 int Framework::Bits( int a ) // gibt 1-bits in gewinschter anzahl zurück

+ 11 - 88
DateiSystem.h

@@ -31,7 +31,7 @@ namespace Framework
     //! LTDB Dateivormat --- Dient zum speichern von mehreren Bildern in einer Datei.
 
     //! Dient zum Speichern und Laden eines einzelnen Pixels aus einem Bild im LTDB Dateiformat
-    class LTDBPixel //! Pixel einer LTDB Datei
+    class LTDBPixel : public virtual ReferenceCounter //! Pixel einer LTDB Datei
     {
     private:
         LTDBPixel *davor; //! Letzter Pixel
@@ -51,7 +51,6 @@ namespace Framework
         unsigned char A; //! Alpha
         bool addBitZuFarbe( unsigned char bit ); //! Fügt den Farbwerten ein Bit hinzu
         bool getNextFarbeBit( char &byte, int i ); //! Speichert das nächste Farbbit in byte
-        int ref;
 
     public:
         //! Konstruktor
@@ -94,22 +93,15 @@ namespace Framework
         DLLEXPORT unsigned char getB() const;
         //! Gibt den Anteil an Alpha in der Farbe des Pixels zurück
         DLLEXPORT unsigned char getA() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDBPixel *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDBPixel *release();
     };
 
     //! Der Kopf des LTDB Dateiformates. Hier werden informationen über alle Abgespeicherten Bilder verwaltet
-    class LTDBDateiKopf
+    class LTDBDateiKopf : public virtual ReferenceCounter
     {
     private:
         RCArray< Text > *bilder;
         Array< __int64 > *pos;
         int bAnzahl;
-        int ref;
 
     public:
         //! konstructor
@@ -165,22 +157,15 @@ namespace Framework
         //! Gibt eine Liste mit Bildern in der Datei ohne erhöhten Reference Counter zurück.
         //! Die Liste sollte nicht verändert werden
         DLLEXPORT RCArray< Text > *zBildListe() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDBDateiKopf *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDBDateiKopf *release();
     };
 
     //! Die im LTDB Dateikopf gespeicherten Informationen für ein einzelnes Bild
-    class LTDBKopf
+    class LTDBKopf : public virtual ReferenceCounter
     {
     private:
         __int64 a; //! Det LTDB Dateikopf ist maximal 104 Bits lang
         __int32 b; //! - bis zu 75 Bits für den Titel
         __int8 c;  //! - 12 Bits für breite
-        int ref;   //! - 12 Bits för höhe
 
     public:
         //! Konstruktor 
@@ -215,22 +200,15 @@ namespace Framework
         //! \return 16 Bits, in denen die Informationen zwischen begin und end stehen
         //! Insgesamt müssen 104 Bits gelesen werden. Hierauf bezihen sich BeginBit und EndBit
         DLLEXPORT __int16 getBits( int begin, int end )const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDBKopf *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDBKopf *release();
     };
 
     //! Verwaltet die Pixeldaten eines einzelnen Bildes einer LTDB Datei
-    class LTDBBody
+    class LTDBBody : public virtual ReferenceCounter
     {
     private:
         Punkt gr;
         Bild *b;
         int dateiSize;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -261,21 +239,14 @@ namespace Framework
         DLLEXPORT Bild *getBild() const;
         //! Gibt die Größe des Bildes zurück
         DLLEXPORT const Punkt &getSize() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDBBody *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDBBody *release();
     };
 
     //! Verwaltet eine LTDB Datei
-    class LTDBDatei
+    class LTDBDatei : public virtual ReferenceCounter
     {
     private:
         Text *pfad;
         LTDBDateiKopf *datKpf;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -317,22 +288,15 @@ namespace Framework
         DLLEXPORT int getBildAnzahl() const;
         //! Prüft, ob die LTDB Datei existiert
         DLLEXPORT bool istOffen() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDBDatei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDBDatei *release();
     };
 
 #ifdef WIN32
     //! LTDS Dateivormat --- Dient zum speichern von Schriftarten
 
     //! Verwaltet einen einzelnen Pixel von einem Buchstaben
-    class LTDSPixel
+    class LTDSPixel : public virtual ReferenceCounter
     {
     private:
-        int ref;
         char index;
         char iA;
         char miA;
@@ -372,19 +336,12 @@ namespace Framework
         DLLEXPORT bool getÄnderA() const;
         //! Gibt den Alpha Wert des Pixels zurück
         DLLEXPORT unsigned char getA() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSPixel *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSPixel *release();
     };
 
     //! Verwaltet den Kopf einer LTDS Datei. Er enthält Informationen über die in der Datei gespeicherten Schriftgrößen
-    class LTDSDateiKopf
+    class LTDSDateiKopf : public virtual ReferenceCounter
     {
     private:
-        int ref;
         unsigned char sganzahl;
         unsigned char *gr;
         int *pos;
@@ -413,19 +370,12 @@ namespace Framework
         DLLEXPORT int *getPositionList() const;
         //! Gibt die Anzahl der gespeicherten Schriftgrößen zurück
         DLLEXPORT int getSchriftGrößeAnzahl() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSDateiKopf *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSDateiKopf *release();
     };
 
     //! Der Kopf einer Schriftgröße. Enthält Informationen über die gespeicherten Zeichen
-    class LTDSSchriftKopf
+    class LTDSSchriftKopf : public virtual ReferenceCounter
     {
     private:
-        int ref;
         unsigned char schriftSize;
         unsigned char *zeichen;
         int *pos;
@@ -462,19 +412,12 @@ namespace Framework
         DLLEXPORT int *getPositionen() const;
         //! Gibt einen Array mit den ASCII codes der Gespeicherten Zeichen zurück
         DLLEXPORT unsigned char *getZeichen() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSSchriftKopf *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSSchriftKopf *release();
     };
 
     //! Der Kopf eines einzelnen Zeichens aus der LTDS Datei. Enthält informationen über die Pixelgröße des Zeichens
-    class LTDSBuchstabenKopf
+    class LTDSBuchstabenKopf : public virtual ReferenceCounter
     {
     private:
-        int ref;
         unsigned char zeichen;
         Punkt size;
 
@@ -504,19 +447,12 @@ namespace Framework
         DLLEXPORT int getHöhe() const;
         //! Gib t die Größe des Zeichens in Pixeln zurück
         DLLEXPORT const Punkt &getGröße() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSBuchstabenKopf *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSBuchstabenKopf *release();
     };
 
     //! Verwaltet die Pixeldaten eines Zeichens
-    class LTDSBuchstabenKörper
+    class LTDSBuchstabenKörper : public virtual ReferenceCounter
     {
     private:
-        int ref;
         Punkt size;
         unsigned char zeichen;
         Buchstabe *buchstabe;
@@ -540,19 +476,12 @@ namespace Framework
         DLLEXPORT Buchstabe *getBuchstabe() const;
         //! Gibt den ASCII code des Buchstabens zurück
         DLLEXPORT unsigned char getZeichen() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSBuchstabenKörper *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSBuchstabenKörper *release();
     };
 
     //! Verwaltet eine LTDS Datei
-    class LTDSDatei
+    class LTDSDatei : public virtual ReferenceCounter
     {
     private:
-        int ref;
         Text *pfad;
         LTDSDateiKopf *dateiKopf;
 
@@ -615,12 +544,6 @@ namespace Framework
         //! \param sg Die Schriftgröße
         //! \return Der Array mit den ASCII codes der Zeichen. 0, falls die Schriftgröße nicht gefunden wurde.
         DLLEXPORT unsigned char *getBuchstaben( int sg );
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT LTDSDatei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT LTDSDatei *release();
     };
 #endif
     //! Bit Funktionen 

+ 18 - 64
Diagramm.cpp

@@ -23,8 +23,7 @@ SLDiag::SLDiag()
     lastValue( new Array< int >() ),
     textRd( 0 ),
     gitterGr( 0, 0 ),
-    lines( 0 ),
-    ref( 1 )
+    lines( 0 )
 {
     style = 0;
 }
@@ -312,31 +311,16 @@ int SLDiag::getLastValue( int lNum ) const // gibt den letzten Wert zur
     return lastValue->get( lNum );
 }
 
-// Reference Counting 
-SLDiag *SLDiag::getThis()
-{
-    ++ref;
-    return this;
-}
-
-SLDiag *SLDiag::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der DiagWert Struktur aus Diagramm.h
 // Konstruktor
 DiagWert::DiagWert()
-    : style( 0 ),
+    : ReferenceCounter(),
+    style( 0 ),
     farbe( 0xFFFFFFFF ),
     hintergrund( 0 ),
     name( new Text() ),
-    punkte( new Array< DiagPunkt* > ),
-    ref( 1 )
+    punkte( new Array< DiagPunkt * > )
 {}
 
 // Destruktor
@@ -352,26 +336,12 @@ DiagWert::~DiagWert()
     punkte->release();
 }
 
-// Referenc Counting
-DiagWert *DiagWert::getThis()
-{
-    ++ref;
-    return this;
-}
-
-DiagWert *DiagWert::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der DiagDaten Struktur aus Diagramm.h
 // Konstruktor
 DiagDaten::DiagDaten()
-    : style( 0 ),
+    : ReferenceCounter(),
+    style( 0 ),
     rasterDicke( 0 ),
     rasterBreite( 0 ),
     rasterHeight( 0 ),
@@ -386,8 +356,7 @@ DiagDaten::DiagDaten()
     vIntervallWerte( new Array< double > ),
     hIntervallBreite( 0 ),
     vIntervallHeight( 0 ),
-    werte( new RCArray< DiagWert >() ),
-    ref( 1 )
+    werte( new RCArray< DiagWert >() )
 {}
 
 // Destruktor
@@ -402,21 +371,6 @@ DiagDaten::~DiagDaten()
     werte->release();
 }
 
-// Referenc Counting
-DiagDaten *DiagDaten::getThis()
-{
-    ++ref;
-    return this;
-}
-
-DiagDaten *DiagDaten::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der BaseDiag Klasse aus Diagramm.h
 // Konstruktor
@@ -914,7 +868,7 @@ void BaseDiag::addPunktZ( int wNum, DiagPunkt *p ) // f
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     daten->werte->z( wNum )->punkte->add( p );
     lock->unlock();
     changed = 1;
@@ -932,7 +886,7 @@ void BaseDiag::addPunkt( int wNum, DiagPunkt *p )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     DiagPunkt *tmp = new DiagPunkt();
     tmp->hIntervall = p->hIntervall;
     tmp->vIntervall = p->vIntervall;
@@ -953,7 +907,7 @@ void BaseDiag::addPunkt( int wNum, double hI, double vI )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     DiagPunkt *tmp = new DiagPunkt();
     tmp->hIntervall = hI;
     tmp->vIntervall = vI;
@@ -990,7 +944,7 @@ void BaseDiag::setPunktZ( int wNum, int pNum, DiagPunkt *p )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     if( daten->werte->z( wNum )->punkte->hat( pNum ) )
         delete daten->werte->z( wNum )->punkte->get( pNum );
     daten->werte->z( wNum )->punkte->set( p, pNum );
@@ -1017,7 +971,7 @@ void BaseDiag::setPunkt( int wNum, int pNum, double h, double v )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     if( !daten->werte->z( wNum )->punkte->hat( pNum ) )
         daten->werte->z( wNum )->punkte->set( new DiagPunkt(), pNum );
     daten->werte->z( wNum )->punkte->get( pNum )->hIntervall = h;
@@ -1037,7 +991,7 @@ void BaseDiag::removePunkt( int wNum, double hI )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     int anz = daten->werte->z( wNum )->punkte->getEintragAnzahl();
     for( int i = 0; i < anz; ++i )
     {
@@ -1063,7 +1017,7 @@ void BaseDiag::removePunkt( int wNum, int pNum )
     if( !daten->werte->z( wNum ) )
         daten->werte->set( new DiagWert(), wNum );
     if( !daten->werte->z( wNum )->punkte )
-        daten->werte->z( wNum )->punkte = new Array< DiagPunkt* >();
+        daten->werte->z( wNum )->punkte = new Array< DiagPunkt * >();
     if( daten->werte->z( wNum )->punkte->hat( pNum ) )
     {
         delete daten->werte->z( wNum )->punkte->get( pNum );
@@ -1200,7 +1154,7 @@ void BaseDiag::removeWertStyle( int wNum, int style )
 // constant
 DiagDaten *BaseDiag::getDiagDaten() const // Gibt die Daten des Diagramms zurück
 {
-    return daten ? daten->getThis() : 0;
+    return daten ? (DiagDaten *)daten->getThis() : 0;
 }
 
 DiagDaten *BaseDiag::zDiagDaten() const
@@ -1898,7 +1852,7 @@ Schrift *LDiag::zSchrift() const
 
 Rahmen *LDiag::getDatenRahmen() const // Gibt den inneren Rahmen um das eigentliche Diagramm zurück
 {
-    return dRam ? (Rahmen*)dRam->getThis() : 0;
+    return dRam ? (Rahmen *)dRam->getThis() : 0;
 }
 
 Rahmen *LDiag::zDatenRahmen() const
@@ -1923,7 +1877,7 @@ int LDiag::getDatenHintergrundFarbe() const // Gibt den Hintergrund des eigentli
 
 Bild *LDiag::getDatenHintergrundBild() const
 {
-    return dBgB ? dBgB->getThis() : 0;
+    return dBgB ? (Bild *)dBgB->getThis() : 0;
 }
 
 Bild *LDiag::zDatenHintergrundBild() const
@@ -1933,7 +1887,7 @@ Bild *LDiag::zDatenHintergrundBild() const
 
 AlphaFeld *LDiag::getDatenAlphaFeld() const // Gibt das AlphaFeld des eigentlichen Diagramms zurück
 {
-    return dAf ? (AlphaFeld*)dAf->getThis() : 0;
+    return dAf ? (AlphaFeld *)dAf->getThis() : 0;
 }
 
 AlphaFeld *LDiag::zDatenAlphaFeld() const

+ 2 - 29
Diagramm.h

@@ -39,7 +39,6 @@ namespace Framework
         TextRenderer *textRd;
         Punkt gitterGr;
         int lines;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -112,12 +111,6 @@ namespace Framework
         //! Gibt den y Wert des letzten Punktes eines Graphen zurück
         //! \param lNum Der Index des Graphen
         DLLEXPORT int getLastValue( int lNum ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT SLDiag *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT SLDiag *release();
     };
 
     //! Punkt eines Wertes eines Diagramms
@@ -130,7 +123,7 @@ namespace Framework
     };
 
     //! Wert der in einem Diagramm visualisiert wird
-    struct DiagWert
+    struct DiagWert : public virtual ReferenceCounter
     {
         //! Style eines Diagramm Wertes
         class Style
@@ -157,20 +150,10 @@ namespace Framework
         DLLEXPORT DiagWert();
         //! Destruktor
         DLLEXPORT ~DiagWert();
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT DiagWert *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT DiagWert *release();
-
-    private:
-        //! Reference Counting
-        int ref;
     };
 
     //! Daten für ein Diagramm
-    struct DiagDaten
+    struct DiagDaten : public virtual ReferenceCounter
     {
         class Style
         {
@@ -229,16 +212,6 @@ namespace Framework
         DLLEXPORT DiagDaten();
         //! Destruktor
         DLLEXPORT ~DiagDaten();
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT DiagDaten *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT DiagDaten *release();
-
-    private:
-        //! Reference Counting
-        int ref;
     };
 
     //! Basisklasse der verschiedenen Diagramm Arten

+ 10 - 24
Dialog.cpp

@@ -12,10 +12,10 @@ using namespace Framework;
 
 // Inhalt der MultiplChoiceDialog Klasse aus Dialog.h
 MultiplChoiceDialog::MultiplChoiceDialog()
+    : ReferenceCounter()
 {
     entrys = new RCArray<Text>();
-    ids = new Array<void*>();
-    ref = 1;
+    ids = new Array<void *>();
 }
 
 MultiplChoiceDialog::~MultiplChoiceDialog()
@@ -40,7 +40,7 @@ void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
     WNDCLASS wc = F_Normal( 0 );
     wc.lpszClassName = "Dialog";
     WFenster *f = new WFenster();
-    f->setVSchließAktion( [ &ex ]( void *p, void *o )
+    f->setVSchließAktion( [&ex]( void *p, void *o )
     {
         ex = true;
     } );
@@ -48,15 +48,15 @@ void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
     f->setTastaturAktion( _ret1TE );
     f->erstellen( WS_OVERLAPPEDWINDOW, wc );
     f->setSize( 200, 200 );
-    f->setPosition( Bildschirmmitte( f->getThis() ) );
+    f->setPosition( Bildschirmmitte( (WFenster *)f->getThis() ) );
     f->setVerschiebbar( 1 );
     f->setAnzeigeModus( 1 );
-    Bildschirm *b = new Bildschirm2D( f->getThis() );
-    f->setBildschirm( b->getThis() );
+    Bildschirm *b = new Bildschirm2D( (WFenster *)f->getThis() );
+    f->setBildschirm( (Bildschirm *)b->getThis() );
     b->update();
 
     RenderTh *r = new RenderTh();
-    r->setBildschirm( b->getThis() );
+    r->setBildschirm( (Bildschirm *)b->getThis() );
     r->beginn();
 
     AuswahlBox *ab = new AuswahlBox();
@@ -75,7 +75,7 @@ void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
     ab->setAuswAlphaFeldFarbe( 0x0000FF00 );
     ab->setAuswAlphaFeldStrength( -8 );
     ab->setStyle( AuswahlBox::Style::Normal );
-    ab->setSchriftZ( zSchrift->getThis() );
+    ab->setSchriftZ( (Schrift *)zSchrift->getThis() );
     for( auto i = entrys->getIterator(); i; i++ )
         ab->addEintrag( i->getText() );
     ab->setMausEreignis( _ret1ME );
@@ -85,9 +85,9 @@ void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
     ok->setStyle( Knopf::Style::Normal );
     ok->setPosition( 50, 150 );
     ok->setSize( 100, 20 );
-    ok->setSchriftZ( zSchrift->getThis() );
+    ok->setSchriftZ( (Schrift *)zSchrift->getThis() );
     ok->setText( "Ok" );
-    ok->setMausEreignis( [ this, &ex, &result, ab ]( void *p, void *o, MausEreignis me )
+    ok->setMausEreignis( [this, &ex, &result, ab]( void *p, void *o, MausEreignis me )
     {
         if( me.id == ME_RLinks )
         {
@@ -121,18 +121,4 @@ void *MultiplChoiceDialog::anzeigen( Schrift *zSchrift )
     ab->release();
 
     return result;
-}
-
-// Reference Counting
-MultiplChoiceDialog *MultiplChoiceDialog::getThis()
-{
-    ref++;
-    return this;
-}
-
-MultiplChoiceDialog *MultiplChoiceDialog::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 5
Dialog.h

@@ -1,18 +1,18 @@
 #pragma once
 
 #include "Thread.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
     class Text;
     class Schrift;
 
-    class MultiplChoiceDialog
+    class MultiplChoiceDialog : public virtual ReferenceCounter
     {
     private:
         RCArray< Text > *entrys;
         Array< void* > *ids;
-        int ref;
 
     public:
         DLLEXPORT MultiplChoiceDialog();
@@ -21,8 +21,5 @@ namespace Framework
         DLLEXPORT void addChoice( const char *text, void *id );
         //! Zeigt den dialog an und wartet auf benutzereingabe
         DLLEXPORT void *anzeigen( Schrift *zSchrift );
-        //! Reference Counting
-        DLLEXPORT MultiplChoiceDialog *getThis();
-        DLLEXPORT MultiplChoiceDialog *release();
     };
 }

+ 5 - 24
DreieckListe.h

@@ -30,18 +30,17 @@ namespace Framework
 
     template< typename T >
     //! Eine Liste von Dreiecken, wobei immer die Beiden letzten Punkte des vorheriegen Dreiecks mit dem nächsten Punkt ein neues Dreieck bilden
-    class DreieckListe
+    class DreieckListe : public virtual ReferenceCounter
     {
     private:
-        Array< DreieckPunkt< T >* > *punkte;
-        int ref;
+        Array< DreieckPunkt< T > * > *punkte;
 
     public:
         //! Konstruktor
         DreieckListe()
+            : ReferenceCounter()
         {
-            ref = 1;
-            punkte = new Array< DreieckPunkt< T >* >();
+            punkte = new Array< DreieckPunkt< T > * >();
         }
 
         //! Destruktor
@@ -100,28 +99,10 @@ namespace Framework
         }
 
         //! Gibt die Liste mit Punkten zurück
-        Array< DreieckPunkt< T >* > *zListe() const
+        Array< DreieckPunkt< T > * > *zListe() const
         {
             return punkte;
         }
-
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DreieckListe *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DreieckListe *release()
-        {
-            ref--;
-            if( !ref )
-                delete this;
-            return 0;
-        }
     };
 }
 

+ 19 - 0
Feld.h

@@ -0,0 +1,19 @@
+#pragma once
+
+#include "Text.h"
+#include "Typ.h"
+#include "Sichtbarkeit.h"
+#include <vector>
+
+namespace Framework
+{
+    class Feld
+    {
+    private:
+        Text name;
+        Typ typ;
+        Sichtbarkeit sichtbarkeit;
+        std::vector<std::pair<Text, Text>> annotations;
+
+    };
+}

+ 49 - 64
Fenster.cpp

@@ -308,8 +308,8 @@ unsigned char Framework::VirtualZuChar( int Virtual )
             return T_Ende;
         case VK_TAB:
             return T_Tab;
-		case VK_LMENU:
-			return T_Alt;
+        case VK_LMENU:
+            return T_Alt;
         }
     }
     if( vk == VK_TAB )
@@ -386,7 +386,8 @@ unsigned char Framework::VirtualZuChar( int Virtual )
 // Inhalt der WFenster Klasse aus Fenster.h
 // Konstruktor 
 WFenster::WFenster()
-    : hWnd( 0 ),
+    : ReferenceCounter(),
+    hWnd( 0 ),
     style( 0 ),
     makParam( 0 ),
     sakParam( 0 ),
@@ -399,7 +400,6 @@ WFenster::WFenster()
     mx( -1 ),
     my( -1 ),
     verschiebbar( 0 ),
-    ref( 1 ),
     rahmen( 0 ),
     bitmap( 0 ),
     hdc( 0 )
@@ -495,7 +495,7 @@ bool WFenster::setFokus() // Setzt den Fokus auf das Fenster
     return GetFocus() == hWnd;
 }
 
-void WFenster::setPosition( Punkt & p )// Fenster Position
+void WFenster::setPosition( Punkt &p )// Fenster Position
 {
     RECT r;
     GetWindowRect( hWnd, &r ); // Vorherige Position herausfinden
@@ -515,7 +515,7 @@ void WFenster::setPosition( Punkt & p )// Fenster Position
     SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Position ändern
 }
 
-void WFenster::setSize( Punkt & g )// Fenster Größe
+void WFenster::setSize( Punkt &g )// Fenster Größe
 {
     RECT r;
     GetWindowRect( hWnd, &r ); // vorherige Größe herausfinden
@@ -555,12 +555,12 @@ void WFenster::setSize( int breite, int h
     SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Größe ändern
 }
 
-void WFenster::setBounds( Punkt & p, Punkt & g ) // setzt größe und Position
+void WFenster::setBounds( Punkt &p, Punkt &g ) // setzt größe und Position
 {
     SetWindowPos( hWnd, 0, p.x, p.y, g.x, g.y, 0 ); // Größe und Position ändern
 }
 
-void WFenster::setBildschirm( Bildschirm * screen )
+void WFenster::setBildschirm( Bildschirm *screen )
 {
     if( this->screen )
         this->screen->release();
@@ -582,7 +582,7 @@ void WFenster::zerst
     hdc = 0;
 }
 
-void WFenster::doMausAktion( MausEreignis & me )
+void WFenster::doMausAktion( MausEreignis &me )
 {
     if( !mausAktion || !mausAktion( makParam, this, me ) )
         return;
@@ -632,7 +632,7 @@ void WFenster::doNSchlie
     nCloseAktion( sakParam, this );
 }
 
-void WFenster::doTastaturAktion( TastaturEreignis & te )
+void WFenster::doTastaturAktion( TastaturEreignis &te )
 {
     if( !tastaturAktion || !tastaturAktion( takParam, this, te ) )
         return;
@@ -692,7 +692,7 @@ void WFenster::setVerschiebbar( bool verschiebbar ) // legt fest, ob das Fenster
     this->verschiebbar = verschiebbar;
 }
 
-void WFenster::ladeRahmenFenster( Bild * zBild, HINSTANCE hinst ) // setzt einen Transpatenten Rahmen um das Fenster
+void WFenster::ladeRahmenFenster( Bild *zBild, HINSTANCE hinst ) // setzt einen Transpatenten Rahmen um das Fenster
 {
     if( !zBild )
         return;
@@ -723,7 +723,7 @@ void WFenster::ladeRahmenFenster( Bild * zBild, HINSTANCE hinst ) // setzt einen
     info.bmiHeader.biCompression = BI_RGB;
     info.bmiHeader.biPlanes = 1;
     unsigned char *pPixels = 0;
-    bitmap = CreateDIBSection( hdc, &info, DIB_RGB_COLORS, (void **)& pPixels, 0, 0 );
+    bitmap = CreateDIBSection( hdc, &info, DIB_RGB_COLORS, (void **)&pPixels, 0, 0 );
     if( !bitmap )
         DeleteDC( hdc );
     GdiFlush();
@@ -881,7 +881,7 @@ Bildschirm *WFenster::getBildschirm() const
 {
     if( !screen )
         return 0;
-    return screen->getThis();
+    return (Bildschirm *)screen->getThis();
 }
 
 Bildschirm *WFenster::zBildschirm() const
@@ -894,21 +894,6 @@ bool WFenster::istVerschiebbar() const // pr
     return verschiebbar;
 }
 
-// Reference Counting
-WFenster *WFenster::getThis()
-{
-    ++ref;
-    return this;
-}
-
-WFenster *WFenster::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der WFensterArray Klasse aus Fenster.h
 // Konstruktor 
 WFensterArray::WFensterArray()
@@ -924,7 +909,7 @@ WFensterArray::~WFensterArray()
 }
 
 // add und remove 
-bool WFensterArray::addFenster( WFenster * fenster )
+bool WFensterArray::addFenster( WFenster *fenster )
 {
     if( fenster == This )
         return 0;
@@ -938,7 +923,7 @@ bool WFensterArray::addFenster( WFenster * fenster )
     return next->addFenster( fenster );
 }
 
-bool WFensterArray::removeFenster( WFenster * fenster )
+bool WFensterArray::removeFenster( WFenster *fenster )
 {
     if( fenster == This )
         return 1;
@@ -1009,7 +994,7 @@ bool WFensterArray::sendNSchlie
     return ret | next->sendNSchließMessage( hwnd );
 }
 
-bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis & me )
+bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis &me )
 {
     if( !This )
         return 0;
@@ -1024,7 +1009,7 @@ bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis & me )
     return ret | next->sendMausMessage( hwnd, me );
 }
 
-bool WFensterArray::sendTastaturMessage( HWND hwnd, TastaturEreignis & te )
+bool WFensterArray::sendTastaturMessage( HWND hwnd, TastaturEreignis &te )
 {
     if( !This )
         return 0;
@@ -1060,7 +1045,7 @@ WFenster *WFensterArray::getThis()
 }
 
 // WMessageBox
-void Framework::WMessageBox( HWND hWnd, Text * titel, Text * meldung, UINT style )
+void Framework::WMessageBox( HWND hWnd, Text *titel, Text *meldung, UINT style )
 {
     MessageBox( hWnd, meldung->getText(), titel->getText(), style ); // Message Box
     titel->release();
@@ -1125,7 +1110,7 @@ Fenster::~Fenster()
         hScroll->release();
 }
 
-void Fenster::doMausEreignis( MausEreignis & me, bool userRet )
+void Fenster::doMausEreignis( MausEreignis &me, bool userRet )
 {
     if( hatStyleNicht( Style::Sichtbar ) || !me.insideParent || me.verarbeitet || me.mx < 0 || me.my < 0 || me.mx >= gr.x || me.my >= gr.y || !userRet )
     {
@@ -1427,7 +1412,7 @@ void Fenster::doMausEreignis( MausEreignis & me, bool userRet )
 
 // nicht const 
 // -- Rahmen -- 
-void Fenster::setRahmenZ( Rahmen * ram ) // setzt den rahmen
+void Fenster::setRahmenZ( Rahmen *ram ) // setzt den rahmen
 {
     if( rahmen )
         rahmen->release();
@@ -1452,7 +1437,7 @@ void Fenster::setRBreite( int br ) // setzt die Breite des Rahmens
 }
 
 // -- Titel -- 
-void Fenster::setTitel( Text * txt ) // setzt den Titel
+void Fenster::setTitel( Text *txt ) // setzt den Titel
 {
     if( !titel )
         titel = new TextFeld();
@@ -1460,7 +1445,7 @@ void Fenster::setTitel( Text * txt ) // setzt den Titel
     rend = 1;
 }
 
-void Fenster::setTitelZ( Text * txt )
+void Fenster::setTitelZ( Text *txt )
 {
     if( !titel )
         titel = new TextFeld();
@@ -1476,7 +1461,7 @@ void Fenster::setTitel( const char *txt )
     rend = 1;
 }
 
-void Fenster::setTTextFeldZ( TextFeld * tf ) // setzt das Titel TextFeld
+void Fenster::setTTextFeldZ( TextFeld *tf ) // setzt das Titel TextFeld
 {
     if( titel )
         titel->release();
@@ -1485,7 +1470,7 @@ void Fenster::setTTextFeldZ( TextFeld * tf ) // setzt das Titel TextFeld
 }
 
 // -- Schrift -- 
-void Fenster::setTSchriftZ( Schrift * schrift ) // setzt die Titel Schrift
+void Fenster::setTSchriftZ( Schrift *schrift ) // setzt die Titel Schrift
 {
     if( !titel )
         titel = new TextFeld();
@@ -1519,7 +1504,7 @@ void Fenster::setTBgFarbe( int f ) // setzt Titel Hintergrund farbe
 }
 
 // -- Titel AlphaFeld -- 
-void Fenster::setTAlphaFeldZ( AlphaFeld * af ) // setzt das Titel AlphaFeld
+void Fenster::setTAlphaFeldZ( AlphaFeld *af ) // setzt das Titel AlphaFeld
 {
     if( !titel )
         titel = new TextFeld();
@@ -1544,7 +1529,7 @@ void Fenster::setTAfStrength( int st ) // setzt die St
 }
 
 // -- Titel Hintergrund Bild -- 
-void Fenster::setTBgBild( Bild * b ) // setzt das Titel Hintergrund Bild
+void Fenster::setTBgBild( Bild *b ) // setzt das Titel Hintergrund Bild
 {
     if( !titel )
         titel = new TextFeld();
@@ -1552,7 +1537,7 @@ void Fenster::setTBgBild( Bild * b ) // setzt das Titel Hintergrund Bild
     rend = 1;
 }
 
-void Fenster::setTBgBildZ( Bild * b )
+void Fenster::setTBgBildZ( Bild *b )
 {
     if( !titel )
         titel = new TextFeld();
@@ -1561,7 +1546,7 @@ void Fenster::setTBgBildZ( Bild * b )
 }
 
 // -- Titel Rahmen -- 
-void Fenster::setTRahmenZ( Rahmen * ram ) // set Titel Rahmen
+void Fenster::setTRahmenZ( Rahmen *ram ) // set Titel Rahmen
 {
     if( !titel )
         titel = new TextFeld();
@@ -1593,7 +1578,7 @@ void Fenster::setKBgFarbe( int f ) // setzt die K
 }
 
 // -- Körper Hintergrund Bild -- 
-void Fenster::setKBgBild( Bild * b ) // setzt das Körper Hintergrund Bild
+void Fenster::setKBgBild( Bild *b ) // setzt das Körper Hintergrund Bild
 {
     if( !bgBodyPicture )
         bgBodyPicture = new Bild();
@@ -1607,7 +1592,7 @@ void Fenster::setKBgBild( Bild * b ) // setzt das K
     rend = 1;
 }
 
-void Fenster::setKBgBildZ( Bild * b )
+void Fenster::setKBgBildZ( Bild *b )
 {
     if( bgBodyPicture )
         bgBodyPicture->release();
@@ -1616,7 +1601,7 @@ void Fenster::setKBgBildZ( Bild * b )
 }
 
 // -- Körper AlphaFeld -- 
-void Fenster::setKAlphaFeldZ( AlphaFeld * af ) // setzt das Körper AlphaFeld
+void Fenster::setKAlphaFeldZ( AlphaFeld *af ) // setzt das Körper AlphaFeld
 {
     if( bodyBuffer )
         bodyBuffer->release();
@@ -1659,7 +1644,7 @@ void Fenster::setSBgFarbe( int f ) // setzt die Schlie
 }
 
 // -- Schließen Hintergrund Bild -- 
-void Fenster::setSBgBild( Bild * b ) // setzt das Schließ Hintergrund Bild
+void Fenster::setSBgBild( Bild *b ) // setzt das Schließ Hintergrund Bild
 {
     if( !bgClosingBild )
         bgClosingBild = new Bild();
@@ -1673,7 +1658,7 @@ void Fenster::setSBgBild( Bild * b ) // setzt das Schlie
     rend = 1;
 }
 
-void Fenster::setSBgBildZ( Bild * b )
+void Fenster::setSBgBildZ( Bild *b )
 {
     if( bgClosingBild )
         bgClosingBild->release();
@@ -1682,7 +1667,7 @@ void Fenster::setSBgBildZ( Bild * b )
 }
 
 // -- Schließen AlphaFeld -- 
-void Fenster::setSAlphaFeldZ( AlphaFeld * af ) // setzt das Schließ AlphaFeld
+void Fenster::setSAlphaFeldZ( AlphaFeld *af ) // setzt das Schließ AlphaFeld
 {
     if( closeBuffer )
         closeBuffer->release();
@@ -1707,7 +1692,7 @@ void Fenster::setSAfStrength( int st ) // setzt die St
 }
 
 // -- Schließen Klick AlphaFeld -- 
-void Fenster::setSKAlphaFeldZ( AlphaFeld * af ) // setzt das Schließ klick AlphaFeld
+void Fenster::setSKAlphaFeldZ( AlphaFeld *af ) // setzt das Schließ klick AlphaFeld
 {
     if( closeKlickBuffer )
         closeKlickBuffer->release();
@@ -1738,7 +1723,7 @@ void Fenster::setMin( int mx, int my ) // setzt die Mindest Fenster Gr
     min.y = my;
 }
 
-void Fenster::setMin( const Punkt & min )
+void Fenster::setMin( const Punkt &min )
 {
     this->min = min;
 }
@@ -1749,7 +1734,7 @@ void Fenster::setMax( int mx, int my ) // setzt die Maximale Fenster Gr
     max.y = my;
 }
 
-void Fenster::setMax( const Punkt & max )
+void Fenster::setMax( const Punkt &max )
 {
     this->max = max;
 }
@@ -1760,7 +1745,7 @@ void Fenster::setKMin( int mx, int my ) // setzt die Mindest K
     kMin.y = my;
 }
 
-void Fenster::setKMin( const Punkt & min )
+void Fenster::setKMin( const Punkt &min )
 {
     kMin = min;
 }
@@ -1771,13 +1756,13 @@ void Fenster::setKMax( int mx, int my ) // setzt die Maximale K
     kMax.y = my;
 }
 
-void Fenster::setKMax( const Punkt & max )
+void Fenster::setKMax( const Punkt &max )
 {
     kMax = max;
 }
 
 // -- scroll -- 
-void Fenster::setHScrollBarZ( HScrollBar * hScroll ) // setzt die Horizontale Scroll Bar
+void Fenster::setHScrollBarZ( HScrollBar *hScroll ) // setzt die Horizontale Scroll Bar
 {
     if( this->hScroll )
         this->hScroll->release();
@@ -1785,7 +1770,7 @@ void Fenster::setHScrollBarZ( HScrollBar * hScroll ) // setzt die Horizontale Sc
     rend = 1;
 }
 
-void Fenster::setVScrollBarZ( VScrollBar * vScroll ) // setzt die Vertikale Scroll BAr
+void Fenster::setVScrollBarZ( VScrollBar *vScroll ) // setzt die Vertikale Scroll BAr
 {
     if( this->vScroll )
         this->vScroll->release();
@@ -1841,7 +1826,7 @@ void Fenster::setVSBScroll( int scroll )
 }
 
 // -- Members -- 
-void Fenster::addMember( Zeichnung * obj ) // fügt einen Member hinzu
+void Fenster::addMember( Zeichnung *obj ) // fügt einen Member hinzu
 {
     if( !members )
         members = new RCArray<Zeichnung>();
@@ -1849,7 +1834,7 @@ void Fenster::addMember( Zeichnung * obj ) // f
     rend = 1;
 }
 
-void Fenster::removeMember( Zeichnung * zObj ) // entfernt einen Member
+void Fenster::removeMember( Zeichnung *zObj ) // entfernt einen Member
 {
     if( !members )
         return;
@@ -1891,7 +1876,7 @@ bool Fenster::tick( double tickval ) // tick
     return Zeichnung::tick( tickval );
 }
 
-void Fenster::doTastaturEreignis( TastaturEreignis & te )
+void Fenster::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ntakc = !te.verarbeitet;
     if( hatStyle( Style::Sichtbar ) )
@@ -1921,7 +1906,7 @@ void Fenster::doTastaturEreignis( TastaturEreignis & te )
 }
 
 // -- Render -- 
-void Fenster::render( Bild & zRObj ) // zeichent nach zRObj
+void Fenster::render( Bild &zRObj ) // zeichent nach zRObj
 {
     if( hatStyle( Style::Sichtbar ) )
     {
@@ -2248,7 +2233,7 @@ Bild *Fenster::getKBgBild() const // gibt das K
 {
     if( !bgBodyPicture )
         return 0;
-    return bgBodyPicture->getThis();
+    return (Bild *)bgBodyPicture->getThis();
 }
 
 Bild *Fenster::zKBgBild() const
@@ -2294,7 +2279,7 @@ Bild *Fenster::getSBgBild() const // gibt das Schlie
 {
     if( !bgClosingBild )
         return 0;
-    return bgClosingBild->getThis();
+    return (Bild *)bgClosingBild->getThis();
 }
 
 Bild *Fenster::zSBgBild() const
@@ -2434,7 +2419,7 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
         ret->setTTextFeldZ( (TextFeld *)titel->dublizieren() );
     ret->setKBgFarbe( bgBodyColor );
     if( bgBodyPicture )
-        ret->setKBgBild( bgBodyPicture->getThis() );
+        ret->setKBgBild( (Bild *)bgBodyPicture->getThis() );
     if( bodyBuffer )
     {
         ret->setKAfFarbe( bodyBuffer->getFarbe() );
@@ -2442,7 +2427,7 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
     }
     ret->setSBgFarbe( bgClosingFarbe );
     if( bgClosingBild )
-        ret->setSBgBild( bgClosingBild->getThis() );
+        ret->setSBgBild( (Bild *)bgClosingBild->getThis() );
     if( closeBuffer )
     {
         ret->setSAfFarbe( closeBuffer->getFarbe() );

+ 1 - 8
Fenster.h

@@ -36,7 +36,7 @@ namespace Framework
     DLLEXPORT unsigned char VirtualZuChar( int Virtual );
 
     //! Klasse für ein Fenster der Windows API
-    class WFenster
+    class WFenster : public virtual ReferenceCounter
     {
     private:
         HWND hWnd; //! Handel zum Fenster
@@ -51,7 +51,6 @@ namespace Framework
         Bildschirm *screen;
         int mx, my;
         bool verschiebbar;
-        int ref;
         HWND rahmen;
         HBITMAP bitmap;
         HDC hdc;
@@ -171,12 +170,6 @@ namespace Framework
         DLLEXPORT Bildschirm *zBildschirm() const;
         //! Gibt zurück, ob das Fenster verschiebbar ist
         DLLEXPORT bool istVerschiebbar() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT WFenster *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT WFenster *release();
     };
 
     //! Verwaltet alle Windows API Fenster im Framework

+ 3 - 3
Fortschritt.cpp

@@ -268,7 +268,7 @@ __int64 FBalken::getAktion() const // gibt die fertigen Aktionen zur
 Rahmen *FBalken::getFRahmen() const // gibt den Fertig Rahmen zurück
 {
     if( fRahmen )
-        return (Rahmen*)fRahmen->getThis();
+        return (Rahmen *)fRahmen->getThis();
     return 0;
 }
 
@@ -280,7 +280,7 @@ Rahmen *FBalken::zFRahmen() const
 AlphaFeld *FBalken::getFAlphaFeld() const // gibt das Fertig Alpha Feld zurück
 {
     if( fBuffer )
-        return (AlphaFeld*)fBuffer->getThis();
+        return (AlphaFeld *)fBuffer->getThis();
     return 0;
 }
 
@@ -297,7 +297,7 @@ int FBalken::getFBgFarbe() const // gibt die Fertig Hintergrund Farbe zur
 Bild *FBalken::getFBgBild() const // gibt das Fertig Hintergrund Bild zurück
 {
     if( fBgBild )
-        return fBgBild->getThis();
+        return (Bild *)fBgBild->getThis();
     return 0;
 }
 

+ 2 - 1
Framework.vcxproj

@@ -235,6 +235,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Mat4.h" />
     <ClInclude Include="Maus.h" />
     <ClInclude Include="MausEreignis.h" />
+    <ClInclude Include="ReferenceCounter.h" />
     <ClInclude Include="Slider.h" />
     <ClInclude Include="UIDialog.h" />
     <ClInclude Include="Model2D.h" />
@@ -245,7 +246,6 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClInclude Include="Random.h" />
     <ClInclude Include="Reader.h" />
     <ClInclude Include="Rect2.h" />
-    <ClInclude Include="ReferenceCounting.h" />
     <ClInclude Include="Shader.h" />
     <ClInclude Include="Textur.h" />
     <ClInclude Include="Textur2D.h" />
@@ -321,6 +321,7 @@ copy "x64\Release\Framework.dll" "..\..\Spiele Platform\SMP\Fertig\x64\framework
     <ClCompile Include="Model3D.cpp" />
     <ClCompile Include="Model3DList.cpp" />
     <ClCompile Include="Random.cpp" />
+    <ClCompile Include="ReferenceCounter.cpp" />
     <ClCompile Include="Shader.cpp" />
     <ClCompile Include="Slider.cpp" />
     <ClCompile Include="Textur.cpp" />

+ 6 - 3
Framework.vcxproj.filters

@@ -267,9 +267,6 @@
     <ClInclude Include="Textur2D.h">
       <Filter>Headerdateien\Framework\Grafik\2D</Filter>
     </ClInclude>
-    <ClInclude Include="ReferenceCounting.h">
-      <Filter>Headerdateien\Framework</Filter>
-    </ClInclude>
     <ClInclude Include="Kamera2D.h">
       <Filter>Headerdateien\Framework\Objekte2D</Filter>
     </ClInclude>
@@ -327,6 +324,9 @@
     <ClInclude Include="Writer.h">
       <Filter>Headerdateien\Framework</Filter>
     </ClInclude>
+    <ClInclude Include="ReferenceCounter.h">
+      <Filter>Headerdateien\Framework</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Maus.cpp">
@@ -533,6 +533,9 @@
     <ClCompile Include="Slider.cpp">
       <Filter>Quelldateien\Framework\Objekte2D</Filter>
     </ClCompile>
+    <ClCompile Include="ReferenceCounter.cpp">
+      <Filter>Quelldateien\Framework</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <FxCompile Include="DX12VertexShader.hlsl">

+ 18 - 0
Funktion.h

@@ -0,0 +1,18 @@
+#pragma once
+
+#include "Typ.h"
+#include "Sichtbarkeit.h"
+#include "Text.h"
+#include "Feld.h"
+
+namespace Framework
+{
+    class Funktion
+    {
+        Typ typ;
+        Sichtbarkeit sichtbarkeit;
+        std::vector<std::pair<Text, Text>> annotations;
+        std::vector<Feld> parameter;
+
+    };
+};

+ 1 - 14
GraphicsApi.cpp

@@ -6,12 +6,12 @@ using namespace Framework;
 
 
 GraphicsApi::GraphicsApi( GraphicApiType typ )
+    : ReferenceCounter()
 {
     this->typ = typ;
     fenster = 0;
     backBufferSize = Vec2<int>( 0, 0 );
     fullScreen = 0;
-    ref = 1;
 }
 
 GraphicsApi::~GraphicsApi()
@@ -73,17 +73,4 @@ Vec2< int > GraphicsApi::getBackBufferSize() const
 bool GraphicsApi::isFullScreen() const
 {
     return fullScreen;
-}
-
-GraphicsApi *GraphicsApi::getThis()
-{
-    ref++;
-    return this;
-}
-
-GraphicsApi *GraphicsApi::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 1 - 6
GraphicsApi.h

@@ -84,7 +84,7 @@ namespace Framework
         float radius;
     };
 
-    class GraphicsApi
+    class GraphicsApi : public virtual ReferenceCounter
     {
     protected:
         GraphicApiType typ;
@@ -92,9 +92,6 @@ namespace Framework
         Vec2<int> backBufferSize;
         bool fullScreen;
 
-    private:
-        int ref;
-
     public:
         DLLEXPORT GraphicsApi( GraphicApiType typ );
         DLLEXPORT virtual ~GraphicsApi();
@@ -110,8 +107,6 @@ namespace Framework
         DLLEXPORT Vec2< int > getBackBufferSize() const;
         DLLEXPORT bool isFullScreen() const;
         DLLEXPORT virtual Bild *zUIRenderBild() const = 0;
-        DLLEXPORT GraphicsApi *getThis();
-        DLLEXPORT GraphicsApi *release();
     };
 
     class DirectX9 : public GraphicsApi

+ 11 - 26
InitDatei.cpp

@@ -7,29 +7,29 @@ using namespace Framework;
 // Inhalt der InitDatei Klasse aus InitDatei.h
 // Konstruktor
 InitDatei::InitDatei()
-    : pfad( new Text() ),
+    : ReferenceCounter(),
+    pfad( new Text() ),
     feldAnzahl( 0 ),
     name( new RCArray< Text >() ),
-    wert( new RCArray< Text >() ),
-    ref( 1 )
+    wert( new RCArray< Text >() )
 {}
 
 InitDatei::InitDatei( Text *pfad )
-    : pfad( new Text() ),
+    : ReferenceCounter(),
+    pfad( new Text() ),
     feldAnzahl( 0 ),
     name( new RCArray< Text >() ),
-    wert( new RCArray< Text >() ),
-    ref( 1 )
+    wert( new RCArray< Text >() )
 {
     setPfad( pfad );
 }
 
 InitDatei::InitDatei( const char *pfad )
-    : pfad( new Text() ),
+    : ReferenceCounter(),
+    pfad( new Text() ),
     feldAnzahl( 0 ),
     name( new RCArray< Text >() ),
-    wert( new RCArray< Text >() ),
-    ref( 1 )
+    wert( new RCArray< Text >() )
 {
     setPfad( pfad );
 }
@@ -383,25 +383,10 @@ Text *InitDatei::zName( int num )
 
 Text *InitDatei::getPfad() const
 {
-    return pfad->getThis();
+    return (Text *)pfad->getThis();
 }
 
 Text *InitDatei::zPfad() const
 {
     return pfad;
-}
-
-// reference Counting
-InitDatei *InitDatei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-InitDatei *InitDatei::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
+}

+ 1 - 8
InitDatei.h

@@ -8,14 +8,13 @@ namespace Framework
     class Text; //! Text.h
 
     //! Verwaltet Initialisierungsdateien in denen Bestimmte Variablen im Format name=Wert gespeichert sind
-    class InitDatei
+    class InitDatei : public virtual ReferenceCounter
     {
     private:
         Text *pfad;
         int feldAnzahl;
         RCArray< Text > *name;
         RCArray< Text > *wert;
-        int ref;
 
     public:
         //! Konstruktor
@@ -138,12 +137,6 @@ namespace Framework
         DLLEXPORT Text *getPfad() const;
         //! Gibt den Pfad zur Datei ohne erhöhten Reference Counter zurück
         DLLEXPORT Text *zPfad() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT InitDatei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT InitDatei *release();
     };
 }
 

+ 10 - 23
JSON.cpp

@@ -5,18 +5,18 @@ using namespace Framework;
 using namespace JSON;
 
 JSONValue::JSONValue()
+    : ReferenceCounter()
 {
     this->type = NULL_;
-    ref = 1;
 }
 
 JSONValue::~JSONValue()
 {}
 
 JSONValue::JSONValue( JSONType type )
+    : ReferenceCounter()
 {
     this->type = type;
-    ref = 1;
 }
 
 JSONType JSONValue::getType() const
@@ -29,19 +29,6 @@ Text JSONValue::toString() const
     return Text( "null" );
 }
 
-JSONValue *JSONValue::getThis()
-{
-    ref++;
-    return this;
-}
-
-JSONValue *JSONValue::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 JSONBool::JSONBool( bool b )
     : JSONValue( BOOLEAN )
@@ -126,7 +113,7 @@ JSONArray::JSONArray( Text string )
 JSONArray::JSONArray( const JSONArray &arr )
     : JSONValue( ARRAY )
 {
-    array = arr.array->getThis();
+    array = ( RCArray<JSONValue>* )arr.array->getThis();
 }
 
 JSONArray::~JSONArray()
@@ -137,7 +124,7 @@ JSONArray::~JSONArray()
 JSONArray &JSONArray::operator=( const JSONArray &arr )
 {
     array->release();
-    array = arr.array->getThis();
+    array = ( RCArray<JSONValue>* )arr.array->getThis();
     return *this;
 }
 
@@ -208,8 +195,8 @@ JSONObject::JSONObject( Text string )
 JSONObject::JSONObject( const JSONObject &obj )
     : JSONValue( OBJECT )
 {
-    fields = obj.fields->getThis();
-    values = obj.values->getThis();
+    fields = ( Array<Text>* )obj.fields->getThis();
+    values = ( RCArray<JSONValue>* )obj.values->getThis();
 }
 
 JSONObject::~JSONObject()
@@ -223,8 +210,8 @@ JSONObject &JSONObject::operator=( const JSONObject &obj )
 {
     fields->release();
     values->release();
-    fields = obj.fields->getThis();
-    values = obj.values->getThis();
+    fields = ( Array<Text>* )obj.fields->getThis();
+    values = ( RCArray<JSONValue>* )obj.values->getThis();
     return *this;
 }
 
@@ -277,7 +264,7 @@ Iterator< Text > JSONObject::getFields()
     return fields->getIterator();
 }
 
-Iterator< JSONValue* > JSONObject::getValues()
+Iterator< JSONValue * > JSONObject::getValues()
 {
     return values->getIterator();
 }
@@ -420,7 +407,7 @@ JSONValue *Parser::getValue( const char *str )
     if( string.anzahlVon( '.' ) == 1 )
     {
         bool isNumber = 1;
-        for( char *c = (*string.getText() == '-' ) ? string.getText() + 1 : string.getText(); *c; c++ )
+        for( char *c = ( *string.getText() == '-' ) ? string.getText() + 1 : string.getText(); *c; c++ )
             isNumber &= ( *c >= '0' && *c <= '9' ) || *c == '.';
         if( isNumber )
             return new JSONNumber( string );

+ 2 - 4
JSON.h

@@ -2,6 +2,7 @@
 
 #include "Text.h"
 #include "Array.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -20,11 +21,10 @@ namespace Framework
         class JSONArray;
         class JSONObject;
 
-        class JSONValue
+        class JSONValue : public virtual ReferenceCounter
         {
         private:
             JSONType type;
-            int ref;
 
         protected:
             __declspec( dllexport ) JSONValue( JSONType type );
@@ -34,8 +34,6 @@ namespace Framework
             __declspec( dllexport ) virtual ~JSONValue();
             __declspec( dllexport ) JSONType getType() const;
             __declspec( dllexport ) virtual Text toString() const;
-            __declspec( dllexport ) JSONValue *getThis();
-            __declspec( dllexport ) JSONValue *release();
         };
 
         class JSONBool : public JSONValue

+ 9 - 24
KSGTDatei.cpp

@@ -7,23 +7,23 @@ using namespace Framework;
 // Inhalt der KSGTDatei Klasse aus KSGTDatei.h
 // Konstruktor
 KSGTDatei::KSGTDatei()
-    : pfad( new Text() ),
-    data( new RCArray< RCArray< Text > >() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    pfad( new Text() ),
+    data( new RCArray< RCArray< Text > >() )
 {}
 
 KSGTDatei::KSGTDatei( const char *pfad )
-    : pfad( new Text() ),
-    data( new RCArray< RCArray< Text > >() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    pfad( new Text() ),
+    data( new RCArray< RCArray< Text > >() )
 {
     setPfad( pfad );
 }
 
 KSGTDatei::KSGTDatei( Text *pfad )
-    : pfad( new Text() ),
-    data( new RCArray< RCArray< Text > >() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    pfad( new Text() ),
+    data( new RCArray< RCArray< Text > >() )
 {
     setPfad( pfad );
 }
@@ -290,19 +290,4 @@ Text *KSGTDatei::zFeld( int zeile, int feld ) const
     if( feld >= fA )
         return 0;
     return data->z( zeile )->z( feld );
-}
-
-// Reference Counting
-KSGTDatei *KSGTDatei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-KSGTDatei *KSGTDatei::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 1 - 8
KSGTDatei.h

@@ -8,12 +8,11 @@ namespace Framework
     class Text;
 
     //! Verwaltet eine Datei in der Daten tabellarisch abgespeichert werden
-    class KSGTDatei
+    class KSGTDatei : public virtual ReferenceCounter
     {
     private:
         Text *pfad;
         RCArray< RCArray< Text > > *data;
-        int ref;
 
     public:
         //! Konstruktor
@@ -107,12 +106,6 @@ namespace Framework
         //! \param feld Der Index des Wertes in der Zeile
         //! \return Den gespeicherten Wert ohne erhöhten Reference Counter
         DLLEXPORT Text *zFeld( int zeile, int feld ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT KSGTDatei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT KSGTDatei *release();
     };
 }
 

+ 2 - 21
Kam3D.cpp

@@ -12,6 +12,7 @@ using namespace Framework;
 // Inhalt der Kam3D Klasse
 // Konstruktor
 Kam3D::Kam3D()
+    : ReferenceCounter()
 {
     openingAngle = (float)PI / 4;
     minZ = 0.1f;
@@ -31,8 +32,6 @@ Kam3D::Kam3D()
     welt = 0;
     style = 0;
 
-    ref = 1;
-
     updateMatrix();
 }
 
@@ -357,29 +356,11 @@ const Mat4< float > &Kam3D::getViewMatrix() const
 // Gibt die Welt zurück
 Welt3D *Kam3D::getWelt() const
 {
-    return welt ? welt->getThis() : 0;
+    return welt ? (Welt3D *)welt->getThis() : 0;
 }
 
 // Gibt die Welt zurück
 Welt3D *Kam3D::zWelt() const
 {
     return welt;
-}
-
-// Erhöht den Reference Counter um 1
-//  Return: Ein zeiger auf diesen Shader
-Kam3D *Kam3D::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-//  Return: 0
-Kam3D *Kam3D::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 1 - 9
Kam3D.h

@@ -25,7 +25,7 @@ namespace Framework
     };
 
     //! Eine 3d Kamera, die einen Ausschnitt einer 3D Welt in einen bestimmten Teil des Bildschirms zeichnet
-    class Kam3D
+    class Kam3D : public virtual ReferenceCounter
     {
     public:
         class Style
@@ -52,7 +52,6 @@ namespace Framework
         ViewPort viewport;
         Welt3D *welt;
         __int64 style;
-        int ref;
 
         //! Aktualisiert die view und projektion matrizen
         void updateMatrix();
@@ -139,12 +138,5 @@ namespace Framework
         DLLEXPORT Welt3D *getWelt() const;
         //! Gibt die Welt zurück
         DLLEXPORT Welt3D *zWelt() const;
-        //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das Original verändert werden kann
-        //! Erhöht den Reference Counter um 1
-        //! \param Return Ein zeiger auf diesen Shader
-        DLLEXPORT Kam3D *getThis();
-        //! Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //! \param Return 0
-        DLLEXPORT Kam3D *release();
     };
 }

+ 5 - 5
Kamera2D.cpp

@@ -46,9 +46,9 @@ void Kamera2D::lookAtWorldPos( float x, float y )
             wPos.x += (float)welt->getWorldInfo().size.x;
         if( wPos.y < 0 )
             wPos.y += (float)welt->getWorldInfo().size.y;
-        if( wPos.x > (float)welt->getWorldInfo().size.x )
+        if( wPos.x > ( float )welt->getWorldInfo().size.x )
             wPos.x -= (float)welt->getWorldInfo().size.x;
-        if( wPos.y > (float)welt->getWorldInfo().size.y )
+        if( wPos.y > ( float )welt->getWorldInfo().size.y )
             wPos.y -= (float)welt->getWorldInfo().size.y;
     }
 }
@@ -118,11 +118,11 @@ Vertex Kamera2D::getWorldCoordinates( Punkt screenPos )
     {
         while( wKoord.x < 0 )
             wKoord.x += (float)welt->getWorldInfo().size.x;
-        while( wKoord.x > (float)welt->getWorldInfo().size.x )
+        while( wKoord.x > ( float )welt->getWorldInfo().size.x )
             wKoord.x -= (float)welt->getWorldInfo().size.x;
         while( wKoord.y < 0 )
             wKoord.y += (float)welt->getWorldInfo().size.y;
-        while( wKoord.y > (float)welt->getWorldInfo().size.y )
+        while( wKoord.y > ( float )welt->getWorldInfo().size.y )
             wKoord.y -= (float)welt->getWorldInfo().size.y;
     }
     return wKoord;
@@ -155,7 +155,7 @@ const Mat3< float > &Kamera2D::getMatrix()
 
 Text *Kamera2D::getName()
 {
-    return name->getThis();
+    return (Text *)name->getThis();
 }
 
 Text *Kamera2D::zName()

+ 16 - 46
Key.cpp

@@ -5,24 +5,24 @@ using namespace Framework::Encryption;
 // Inhalt der Bytes Klasse aus Schlüssel.h
 // Konstruktor
 Bytes::Bytes()
-    : bytes( 0 ),
+    : ReferenceCounter(),
+    bytes( 0 ),
     del( 1 ),
-    length( 0 ),
-    ref( 1 )
+    length( 0 )
 {}
 
 Bytes::Bytes( int len )
-    : bytes( new char[ len ] ),
+    : ReferenceCounter(),
+    bytes( new char[ len ] ),
     del( 1 ),
-	length( len ),
-    ref( 1 )
+    length( len )
 {}
 
 Bytes::Bytes( const char *daten, int len )
-    : bytes( new char[ len ] ),
+    : ReferenceCounter(),
+    bytes( new char[ len ] ),
     del( 1 ),
-	length( len ),
-    ref( 1 )
+    length( len )
 {
     setBytes( daten );
 }
@@ -125,36 +125,21 @@ char *Bytes::getBytes() const
     return bytes;
 }
 
-// Reference Counting
-Bytes *Bytes::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Bytes *Bytes::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der Schlüssel Klasse aus Schlüssel.h
 // Konstruktor
 Key::Key()
-    : key( 0 ),
+    : ReferenceCounter(),
+    key( 0 ),
     length( 0 ),
-    pos( 0 ),
-    ref( 1 )
+    pos( 0 )
 {}
 
 Key::Key( const char *s, int len )
-    : key( new unsigned char[ len ] ),
+    : ReferenceCounter(),
+    key( new unsigned char[ len ] ),
     length( len ),
-    pos( 0 ),
-    ref( 1 )
+    pos( 0 )
 {
     for( int i = 0; i < len; ++i )
         key[ i ] = s[ i ];
@@ -171,7 +156,7 @@ void Key::setPos( __int64 p )
 {
     if( p < 0 )
         p = 0;
-    pos = (int)(p % length);
+    pos = (int)( p % length );
 }
 
 void Key::setKey( const char *s, int len )
@@ -222,19 +207,4 @@ void Key::decodieren( Bytes *daten )
             pos = 0;
     }
     daten->release();
-}
-
-// Reference Counting
-Key *Key::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Key *Key::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 3 - 16
Key.h

@@ -2,19 +2,19 @@
 #define Key_H
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
     namespace Encryption
     {
         //! Speichert einen Array von bytes
-        class Bytes
+        class Bytes : public virtual ReferenceCounter
         {
         private:
             char *bytes;
             bool del;
             int length;
-            int ref;
 
         public:
             //! Erzeugt einen lehren Byte Array
@@ -63,22 +63,15 @@ namespace Framework
             DLLEXPORT int getLength() const;
             //! Gibt den Array von Bytes zurück
             DLLEXPORT char *getBytes() const;
-            //! Erhöht den Reference Counting Zähler.
-            //! \return this.
-            DLLEXPORT Bytes *getThis();
-            //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-            //! \return 0.
-            DLLEXPORT Bytes *release();
         };
 
         //! Kann Bytesequenzen mit bestimmten Schlüsseln verschlüsseln und entschlüsseln
-        class Key
+        class Key : public virtual ReferenceCounter
         {
         private:
             unsigned char *key;
             int length;
             int pos;
-            int ref;
 
         public:
             //! Erzeugt ein leeres Zeichnung
@@ -102,12 +95,6 @@ namespace Framework
             //! Entschlüsselt einen Byte Array mit dem gesetzten Schlüssel
             //! \param daten Der Byte Array, der entschlüsselt werden soll. Wird von der Funktion verändert
             DLLEXPORT void decodieren( Bytes *daten );
-            //! Erhöht den Reference Counting Zähler.
-            //! \return this.
-            DLLEXPORT Key *getThis();
-            //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-            //! \return 0.
-            DLLEXPORT Key *release();
         };
     }
 }

+ 34 - 0
Klasse.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "Text.h"
+#include "Funktion.h"
+#include "Typ.h"
+#include "Feld.h"
+#include <vector>
+
+namespace Framework
+{
+    class Klasse : public Typ
+    {
+    private:
+        Text name;
+        std::vector<Funktion> funktions;
+        std::vector<Feld> felder;
+
+    public:
+        Klasse( Text name )
+        {
+            this->name = name;
+        }
+
+        void addFunction(Funktion f)
+        {
+            this->funktions.push_back( f );
+        }
+
+        void addFeld( Feld f )
+        {
+            this->felder.push_back( f );
+        }
+    };
+};

+ 30 - 30
Knopf.cpp

@@ -45,7 +45,7 @@ Knopf::~Knopf()
         klickBild->release();
 }
 
-void Knopf::doMausEreignis( MausEreignis & me, bool userRet ) // Maus Ereignis
+void Knopf::doMausEreignis( MausEreignis &me, bool userRet ) // Maus Ereignis
 {
     if( hatStyleNicht( Style::Erlaubt ) || !userRet )
         return;
@@ -79,7 +79,7 @@ void Knopf::setKlickFarbe( int fc ) // setzt die Klick Farbe
     rend = 1;
 }
 
-void Knopf::setKlickBild( Bild * bild ) // setzt das Klick Bild
+void Knopf::setKlickBild( Bild *bild ) // setzt das Klick Bild
 {
     if( bild )
     {
@@ -95,7 +95,7 @@ void Knopf::setKlickBild( Bild * bild ) // setzt das Klick Bild
     }
 }
 
-void Knopf::setKlickBildZ( Bild * bild ) // setzt einen Zeiger zum Klick Bild
+void Knopf::setKlickBildZ( Bild *bild ) // setzt einen Zeiger zum Klick Bild
 {
     if( klickBild )
         klickBild->release();
@@ -103,7 +103,7 @@ void Knopf::setKlickBildZ( Bild * bild ) // setzt einen Zeiger zum Klick Bild
     rend = 1;
 }
 
-void Knopf::setKBZ( AlphaFeld * af )
+void Knopf::setKBZ( AlphaFeld *af )
 {
     if( klickBuffer )
         klickBuffer->release();
@@ -129,10 +129,10 @@ void Knopf::setKBFarbe( int fc ) // setzt die Farbe des Klick Buffers
 
 // Verarbeitet Maus Nachrichten
 //  te: Das Ereignis, was durch die Tastatur Eingabe ausgelößt wurde
-void Knopf::doTastaturEreignis( TastaturEreignis & te )
+void Knopf::doTastaturEreignis( TastaturEreignis &te )
 {}
 
-void Knopf::render( Bild & zRObj ) // zeichenet nach zRObj
+void Knopf::render( Bild &zRObj ) // zeichenet nach zRObj
 {
     if( !hatStyle( Style::Sichtbar ) )
         return;
@@ -144,7 +144,7 @@ void Knopf::render( Bild & zRObj ) // zeichenet nach zRObj
         zRObj.setAlpha( 0x20 );
         rA = 1;
     }
-	bool tmpRend = rend;
+    bool tmpRend = rend;
     removeStyle( Style::VScroll | Style::HScroll | Style::Erlaubt );
     TextFeld::render( zRObj );
     if( !zRObj.setDrawOptions( innenPosition, innenSize ) )
@@ -180,7 +180,7 @@ void Knopf::render( Bild & zRObj ) // zeichenet nach zRObj
         zRObj.releaseAlpha();
     zRObj.releaseDrawOptions();
     setStyle( Style::Erlaubt, erlaubt );
-	rend = tmpRend;
+    rend = tmpRend;
 }
 
 // constant 
@@ -193,7 +193,7 @@ Bild *Knopf::getKlickBild() const // gibt getThis des Klick Bildes zur
 {
     if( !klickBild )
         return 0;
-    return klickBild->getThis();
+    return (Bild *)klickBild->getThis();
 }
 
 Bild *Knopf::zKlickBild() const // gibt einen Zeiger zum Klick Bild zurück
@@ -251,7 +251,7 @@ Zeichnung *Knopf::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     if( rahmen )
         obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( vertikalScrollBar )
     {
         obj->setVertikalKlickScroll( vertikalScrollBar->getKlickScroll() );
@@ -268,7 +268,7 @@ Zeichnung *Knopf::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     //obj->setAuswahl( getSelectionPos(), getCursorPos() );
     obj->setKlickFarbe( klickFarbe );
     if( klickBild )
-        obj->setKlickBild( klickBild->getThis() );
+        obj->setKlickBild( (Bild *)klickBild->getThis() );
     if( klickBuffer )
         obj->setKBZ( (AlphaFeld *)klickBuffer->dublizieren() );
     return obj;
@@ -320,7 +320,7 @@ KontrollKnopf::~KontrollKnopf()
         textRd->release();
 }
 
-void KontrollKnopf::doMausEreignis( MausEreignis & me, bool userRet ) // Nachrichten verarbeitung
+void KontrollKnopf::doMausEreignis( MausEreignis &me, bool userRet ) // Nachrichten verarbeitung
 {
     if( me.id == ME_Leaves || !userRet )
         style &= ~Style::MausKlick;
@@ -339,7 +339,7 @@ void KontrollKnopf::doMausEreignis( MausEreignis & me, bool userRet ) // Nachric
 }
 
 // nicht constant 
-void KontrollKnopf::setTextZ( Text * txt ) // setzt den Text
+void KontrollKnopf::setTextZ( Text *txt ) // setzt den Text
 {
     if( this->txt )
         this->txt->release();
@@ -347,7 +347,7 @@ void KontrollKnopf::setTextZ( Text * txt ) // setzt den Text
     rend = 1;
 }
 
-void KontrollKnopf::setText( Text * txt )
+void KontrollKnopf::setText( Text *txt )
 {
     if( !this->txt )
         this->txt = new Text();
@@ -364,7 +364,7 @@ void KontrollKnopf::setText( const char *txt )
     rend = 1;
 }
 
-void KontrollKnopf::setSTextZ( Text * txt ) // setzt den Text bei Selectiert
+void KontrollKnopf::setSTextZ( Text *txt ) // setzt den Text bei Selectiert
 {
     if( sTxt )
         sTxt->release();
@@ -372,7 +372,7 @@ void KontrollKnopf::setSTextZ( Text * txt ) // setzt den Text bei Selectiert
     rend = 1;
 }
 
-void KontrollKnopf::setSText( Text * txt )
+void KontrollKnopf::setSText( Text *txt )
 {
     if( !sTxt )
         sTxt = new Text();
@@ -389,14 +389,14 @@ void KontrollKnopf::setSText( const char *txt )
     rend = 1;
 }
 
-void KontrollKnopf::setTextRendererZ( TextRenderer * textRd )
+void KontrollKnopf::setTextRendererZ( TextRenderer *textRd )
 {
     if( this->textRd )
         this->textRd->release();
     this->textRd = textRd;
 }
 
-void KontrollKnopf::setSchriftZ( Schrift * schrift ) // setzt die Schrift
+void KontrollKnopf::setSchriftZ( Schrift *schrift ) // setzt die Schrift
 {
     if( !this->textRd )
         textRd = new TextRenderer( schrift );
@@ -429,7 +429,7 @@ void KontrollKnopf::setKBgFarbe( int f ) // setzt die Klick Hintergrundfarbe
     rend = 1;
 }
 
-void KontrollKnopf::setSBgBildZ( Bild * b ) // setzt das Select Hintergrundbild
+void KontrollKnopf::setSBgBildZ( Bild *b ) // setzt das Select Hintergrundbild
 {
     if( sBgB )
         sBgB->release();
@@ -437,7 +437,7 @@ void KontrollKnopf::setSBgBildZ( Bild * b ) // setzt das Select Hintergrundbild
     rend = 1;
 }
 
-void KontrollKnopf::setSBgBild( Bild * b )
+void KontrollKnopf::setSBgBild( Bild *b )
 {
     if( !sBgB )
         sBgB = new Bild();
@@ -447,7 +447,7 @@ void KontrollKnopf::setSBgBild( Bild * b )
     rend = 1;
 }
 
-void KontrollKnopf::setKBgBildZ( Bild * b ) // setzt das Klick Hintergrundbild
+void KontrollKnopf::setKBgBildZ( Bild *b ) // setzt das Klick Hintergrundbild
 {
     if( kBgB )
         kBgB->release();
@@ -455,7 +455,7 @@ void KontrollKnopf::setKBgBildZ( Bild * b ) // setzt das Klick Hintergrundbild
     rend = 1;
 }
 
-void KontrollKnopf::setKBgBild( Bild * b )
+void KontrollKnopf::setKBgBild( Bild *b )
 {
     if( !kBgB )
         kBgB = new Bild();
@@ -465,7 +465,7 @@ void KontrollKnopf::setKBgBild( Bild * b )
     rend = 1;
 }
 
-void KontrollKnopf::setSAlphaFeldZ( AlphaFeld * af ) // setzt das Select Alpha Feld
+void KontrollKnopf::setSAlphaFeldZ( AlphaFeld *af ) // setzt das Select Alpha Feld
 {
     if( sAf )
         sAf->release();
@@ -489,7 +489,7 @@ void KontrollKnopf::setSAFStrength( int st ) // setzt die Select AlphaFeld St
     rend = 1;
 }
 
-void KontrollKnopf::setKAlphaFeldZ( AlphaFeld * af ) // setzt das Klick Alpha Feld
+void KontrollKnopf::setKAlphaFeldZ( AlphaFeld *af ) // setzt das Klick Alpha Feld
 {
     if( kAf )
         kAf->release();
@@ -513,7 +513,7 @@ void KontrollKnopf::setKAFStrength( int st ) // setzt die Klick AlphaFeld St
     rend = 1;
 }
 
-void KontrollKnopf::loadData( LTDBDatei * dat ) // läht die Systembilder
+void KontrollKnopf::loadData( LTDBDatei *dat ) // läht die Systembilder
 {
     if( DateiExistiert( new Text( "data/normal.ltdb" ) ) && ( !dat || !dat->istOffen() ) )
     {
@@ -546,7 +546,7 @@ void KontrollKnopf::loadData( const char *ltdb ) // l
     }
 }
 
-void KontrollKnopf::render( Bild & zRObj ) // zeichnet nach zRObj
+void KontrollKnopf::render( Bild &zRObj ) // zeichnet nach zRObj
 {
     if( !hatStyle( Style::Sichtbar ) )
         return;
@@ -667,7 +667,7 @@ void KontrollKnopf::render( Bild & zRObj ) // zeichnet nach zRObj
 // constant 
 Text *KontrollKnopf::getText() const // gibt den Text zurück
 {
-    return txt ? txt->getThis() : 0;
+    return txt ? (Text *)txt->getThis() : 0;
 }
 
 Text *KontrollKnopf::zText() const
@@ -677,7 +677,7 @@ Text *KontrollKnopf::zText() const
 
 Text *KontrollKnopf::getSText() const // gibt den Select Text zurück
 {
-    return sTxt ? sTxt->getThis() : 0;
+    return sTxt ? (Text *)sTxt->getThis() : 0;
 }
 
 Text *KontrollKnopf::zSText() const
@@ -717,7 +717,7 @@ int KontrollKnopf::getKBgFarbe() const // gibt die Klick Hintergrundfarbe zur
 
 Bild *KontrollKnopf::getSBgBild() const // gibt das Select Hintergrundbild zurück
 {
-    return sBgB ? sBgB->getThis() : 0;
+    return sBgB ? (Bild *)sBgB->getThis() : 0;
 }
 
 Bild *KontrollKnopf::zSBgBild() const
@@ -727,7 +727,7 @@ Bild *KontrollKnopf::zSBgBild() const
 
 Bild *KontrollKnopf::getKBgBild() const // gibt das Klick Hintergrundbild zurück
 {
-    return kBgB ? kBgB->getThis() : 0;
+    return kBgB ? (Bild *)kBgB->getThis() : 0;
 }
 
 Bild *KontrollKnopf::zKBgBild() const

+ 30 - 33
Liste.cpp

@@ -34,7 +34,6 @@ AuswahlListe::AuswahlListe()
     style = 0;
     this->setMausEreignis( _ret1ME );
     this->setTastaturEreignis( _ret1TE );
-    ref = 1;
 }
 
 // Destruktor 
@@ -156,7 +155,7 @@ void AuswahlListe::update() // aktualisiert die Auswahl Liste
             tf->setStyle( TextFeld::Style::HAlpha, FeldHAlpha );
             tf->setStyle( TextFeld::Style::Buffered, FeldBuffer );
             if( schrift )
-                tf->setSchriftZ( schrift->getThis() );
+                tf->setSchriftZ( (Schrift *)schrift->getThis() );
         }
     }
     if( hatStyle( Style::MultiStyled ) && tfListe && styles )
@@ -174,7 +173,7 @@ void AuswahlListe::update() // aktualisiert die Auswahl Liste
     rend = 1;
 }
 
-void AuswahlListe::addEintrag( Text * txt ) // fügt einen Eintrag hinzu
+void AuswahlListe::addEintrag( Text *txt ) // fügt einen Eintrag hinzu
 {
     TextFeld *tf = new TextFeld();
     tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
@@ -194,18 +193,18 @@ void AuswahlListe::addEintrag( const char *txt )
     rend = 1;
 }
 
-void AuswahlListe::addEintragZ( TextFeld * tf )
+void AuswahlListe::addEintragZ( TextFeld *tf )
 {
     if( !tfListe )
         tfListe = new RCArray< TextFeld >();
     if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
-        tf->setSchriftZ( schrift->getThis() );
+        tf->setSchriftZ( (Schrift *)schrift->getThis() );
     tfListe->set( tf, entries );
     ++entries;
     rend = 1;
 }
 
-void AuswahlListe::addEintrag( int pos, Text * txt ) // fügt einen Eintrag bei position pos ein
+void AuswahlListe::addEintrag( int pos, Text *txt ) // fügt einen Eintrag bei position pos ein
 {
     TextFeld *tf = new TextFeld();
     tf->setStyle( TextFeld::Style::Center | TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen );
@@ -225,18 +224,18 @@ void AuswahlListe::addEintrag( int pos, const char *txt )
     rend = 1;
 }
 
-void AuswahlListe::addEintragZ( int pos, TextFeld * tf )
+void AuswahlListe::addEintragZ( int pos, TextFeld *tf )
 {
     if( !tfListe )
         tfListe = new RCArray< TextFeld >();
     if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
-        tf->setSchriftZ( schrift->getThis() );
+        tf->setSchriftZ( (Schrift *)schrift->getThis() );
     tfListe->add( tf, pos );
     ++entries;
     rend = 1;
 }
 
-void AuswahlListe::setEintrag( int pos, Text * txt ) // ändert den pos - ten Eintrag
+void AuswahlListe::setEintrag( int pos, Text *txt ) // ändert den pos - ten Eintrag
 {
     TextFeld *tf = 0;
     if( tfListe )
@@ -265,12 +264,12 @@ void AuswahlListe::setEintrag( int pos, unsigned char *txt )
     rend = 1;
 }
 
-void AuswahlListe::setEintragZ( int pos, TextFeld * tf )
+void AuswahlListe::setEintragZ( int pos, TextFeld *tf )
 {
     if( !tfListe )
         tfListe = new RCArray< TextFeld >();
     if( schrift && ( !tf->zSchrift() || hatStyleNicht( Style::MultiStyled ) ) )
-        tf->setSchriftZ( schrift->getThis() );
+        tf->setSchriftZ( (Schrift *)schrift->getThis() );
     tfListe->set( tf, pos );
     rend = 1;
 }
@@ -301,7 +300,7 @@ void AuswahlListe::removeEintrag( int pos ) // l
     rend = 1;
 }
 
-void AuswahlListe::setSchriftZ( Schrift * schrift ) // legt die Schrift der Einträge fest
+void AuswahlListe::setSchriftZ( Schrift *schrift ) // legt die Schrift der Einträge fest
 {
     if( this->schrift )
         this->schrift->release();
@@ -333,7 +332,7 @@ void AuswahlListe::updateVScroll() // scrollt zur Curser Position oder nach Unte
     }
 }
 
-void AuswahlListe::setALRZ( Rahmen * rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur ohne MulitStyled)
+void AuswahlListe::setALRZ( Rahmen *rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur ohne MulitStyled)
 {
     if( aRahmen )
         aRahmen->release();
@@ -357,7 +356,7 @@ void AuswahlListe::setALRFarbe( int fc ) // setzt die Farbe des Auswahl Rahmens
     rend = 1;
 }
 
-void AuswahlListe::setAAFZ( AlphaFeld * buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur ohne MultiStyled)
+void AuswahlListe::setAAFZ( AlphaFeld *buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur ohne MultiStyled)
 {
     if( aBuffer )
         aBuffer->release();
@@ -381,7 +380,7 @@ void AuswahlListe::setAAFFarbe( int fc ) // setzt die Farbe des Auswahl Hintergr
     rend = 1;
 }
 
-void AuswahlListe::setAHBild( Bild * bild ) // setzt das Auswahl Hintergrund Bild (nur ohne MultiStyled)
+void AuswahlListe::setAHBild( Bild *bild ) // setzt das Auswahl Hintergrund Bild (nur ohne MultiStyled)
 {
     if( !ahBild )
         ahBild = new Bild();
@@ -400,7 +399,7 @@ void AuswahlListe::setAHFarbe( int f ) // setzt einen Zeiger zur Auswahl Hinterg
     rend = 1;
 }
 
-void AuswahlListe::setAHBildZ( Bild * b ) // setzt einen Zeiger zum Hintergrund Bild (nur ohne MultiStyled)
+void AuswahlListe::setAHBildZ( Bild *b ) // setzt einen Zeiger zum Hintergrund Bild (nur ohne MultiStyled)
 {
     if( ahBild )
         ahBild->release();
@@ -408,7 +407,7 @@ void AuswahlListe::setAHBildZ( Bild * b ) // setzt einen Zeiger zum Hintergrund
     rend = 1;
 }
 
-void AuswahlListe::setALRZ( int pos, Rahmen * rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur mit MulitStyled)
+void AuswahlListe::setALRZ( int pos, Rahmen *rahmen ) // setzt einen Zeiger zum Auswahl Rahmen (nur mit MulitStyled)
 {
     if( !aRahmenListe )
         aRahmenListe = new RCArray< Rahmen >();
@@ -436,7 +435,7 @@ void AuswahlListe::setALRFarbe( int pos, int fc ) // setzt die Farbe des Auswahl
     rend = 1;
 }
 
-void AuswahlListe::setAAFZ( int pos, AlphaFeld * buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur mit MultiStyled)
+void AuswahlListe::setAAFZ( int pos, AlphaFeld *buffer ) // setzt einen Zeiger zum Auswahl AlpaFeld (nur mit MultiStyled)
 {
     if( !aBufferListe )
         aBufferListe = new RCArray< AlphaFeld >();
@@ -464,7 +463,7 @@ void AuswahlListe::setAAFFarbe( int pos, int fc ) // setzt die Farbe des Auswahl
     rend = 1;
 }
 
-void AuswahlListe::setAHBild( int pos, Bild * bild ) // setzt das Auswahl Hintergrund Bild (nur mit MultiStyled)
+void AuswahlListe::setAHBild( int pos, Bild *bild ) // setzt das Auswahl Hintergrund Bild (nur mit MultiStyled)
 {
     if( ahBildListe )
         ahBildListe = new RCArray< Bild >();
@@ -487,7 +486,7 @@ void AuswahlListe::setAHFarbe( int pos, int f ) // setzt einen Zeiger zur Auswah
     rend = 1;
 }
 
-void AuswahlListe::setAHBildZ( int pos, Bild * b ) // setzt einen Zeiger zum Hintergrund Bild (nur mit MultiStyled)
+void AuswahlListe::setAHBildZ( int pos, Bild *b ) // setzt einen Zeiger zum Hintergrund Bild (nur mit MultiStyled)
 {
     if( ahBildListe )
         ahBildListe = new RCArray< Bild >();
@@ -530,12 +529,12 @@ void AuswahlListe::removeMsStyle( int pos, __int64 style )
     rend = 1;
 }
 
-void AuswahlListe::doTastaturEreignis( TastaturEreignis & te )
+void AuswahlListe::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ntakc = !te.verarbeitet;
     if( hatStyleNicht( Style::Fokus ) || !tak || te.verarbeitet )
         return;
-    ++ref;
+    getThis();
     if( tak( takParam, this, te ) )
     {
         if( te.id == TE_Press )
@@ -585,14 +584,12 @@ void AuswahlListe::doTastaturEreignis( TastaturEreignis & te )
         }
         te.verarbeitet = 1;
     }
-    --ref;
     if( ntakc && te.verarbeitet && nTak )
         te.verarbeitet = nTak( ntakParam, this, te );
-    if( !ref )
-        delete this;
+    release();
 }
 
-void AuswahlListe::render( Bild & zRObj ) // zeichnet nach zRObj
+void AuswahlListe::render( Bild &zRObj ) // zeichnet nach zRObj
 {
     if( !hatStyle( Style::Sichtbar ) )
         return;
@@ -628,14 +625,14 @@ void AuswahlListe::render( Bild & zRObj ) // zeichnet nach zRObj
                 selected = hatMsStyle( i, Style::Selected );
             else
                 selected = auswahl == i;
-            AlphaFeld * tmpBuffer = 0;
+            AlphaFeld *tmpBuffer = 0;
             bool tmpB = 0;
             int tmpHFarbe = 0;
             bool tmpH = 0;
-            Bild * tmpHBild = 0;
+            Bild *tmpHBild = 0;
             bool tmpHB = 0;
             bool tmpHAlpha = 0;
-            Rahmen * tmpRahmen = 0;
+            Rahmen *tmpRahmen = 0;
             bool tmpR = 0;
             if( selected )
             {
@@ -657,7 +654,7 @@ void AuswahlListe::render( Bild & zRObj ) // zeichnet nach zRObj
                         if( hatStyle( Style::AuswahlHBild ) && ahBild )
                         {
                             tmpHBild = tf->getHintergrundBild();
-                            tf->setHintergrundBildZ( ahBild->getThis() );
+                            tf->setHintergrundBildZ( (Bild *)ahBild->getThis() );
                             tmpHB = tf->hatStyle( TextFeld::Style::HBild );
                             tf->setStyle( TextFeld::Style::HBild, hatStyle( Style::HBild ) );
                         }
@@ -832,7 +829,7 @@ int AuswahlListe::getAuswahl() const // gibt den ersten ausgew
     return auswahl;
 }
 
-int AuswahlListe::getEintragPos( Text * eintragText ) // gibt die Position des eintrages mit dem entsprechenden Textes zurück
+int AuswahlListe::getEintragPos( Text *eintragText ) // gibt die Position des eintrages mit dem entsprechenden Textes zurück
 {
     for( int i = 0; i < entries; ++i )
     {
@@ -882,7 +879,7 @@ int AuswahlListe::getAHFarbe() const // gibt die Auswahl Hintergrund Farbe zur
 Bild *AuswahlListe::getAHBild() const // gibt das Auswahl Hintergrund Bild zurück (ohne MultiStyled)
 {
     if( ahBild )
-        return ahBild->getThis();
+        return (Bild *)ahBild->getThis();
     return 0;
 }
 
@@ -934,7 +931,7 @@ Bild *AuswahlListe::getAHBild( int pos ) const // gibt das Auswahl Hintergrund B
     if( ahBildListe )
         ret = (Bild *)ahBildListe->get( pos );
     if( ret )
-        return ret->getThis();
+        return (Bild *)ret->getThis();
     return 0;
 }
 

+ 16 - 30
M2Datei.cpp

@@ -8,27 +8,27 @@ using namespace Framework;
 // Inhalt der M2Datei Klasse aus M2Datei.h
 // Konstruktor
 M2Datei::M2Datei()
+    : ReferenceCounter()
 {
     pfad = new Text();
     modelName = new RCArray< Text >();
     modelPos = new Array< __int64 >();
-    ref = 1;
 }
 
 M2Datei::M2Datei( const char *pfad )
+    : ReferenceCounter()
 {
     this->pfad = new Text( pfad );
     modelName = new RCArray< Text >();
     modelPos = new Array< __int64 >();
-    ref = 1;
 }
 
 M2Datei::M2Datei( Text *pfad )
+    : ReferenceCounter()
 {
     this->pfad = pfad;
     modelName = new RCArray< Text >();
     modelPos = new Array< __int64 >();
-    ref = 1;
 }
 
 // Destruktor
@@ -71,7 +71,7 @@ void M2Datei::leseDaten()
         modelName->set( new Text( txt ), i );
         delete[] txt;
         __int64 pos = 0;
-        d.lese( (char*)&pos, 8 );
+        d.lese( (char *)&pos, 8 );
         modelPos->set( pos, i );
     }
     d.close();
@@ -128,7 +128,7 @@ bool M2Datei::saveModel( Model2DData *zMdr, const char *name )
         neu.schreibe( &len, 1 );
         neu.schreibe( modelName->z( i )->getText(), len );
         __int64 pos = modelPos->get( i );
-        neu.schreibe( (char*)&pos, 8 );
+        neu.schreibe( (char *)&pos, 8 );
     }
     if( d.existiert() )
     {
@@ -163,19 +163,19 @@ bool M2Datei::saveModel( Model2DData *zMdr, const char *name )
             neu.schreibe( &pNameL, 1 );
             neu.schreibe( zMdr->polygons->get( p ).name->getText(), pNameL );
         }
-        neu.schreibe( (char*)&vAnz, 4 );
+        neu.schreibe( (char *)&vAnz, 4 );
         for( int i = 0; i < vAnz; i++ )
         {
             float v = zMdr->polygons->get( p ).vertex->get( i ).x;
-            neu.schreibe( (char*)&v, 4 );
+            neu.schreibe( (char *)&v, 4 );
             v = zMdr->polygons->get( p ).vertex->get( i ).y;
-            neu.schreibe( (char*)&v, 4 );
+            neu.schreibe( (char *)&v, 4 );
             if( ( options | 1 ) == options ) // textur
             {
                 float t = zMdr->polygons->get( p ).tKordinaten->get( i ).x;
-                neu.schreibe( (char*)&t, 4 );
+                neu.schreibe( (char *)&t, 4 );
                 t = zMdr->polygons->get( p ).tKordinaten->get( i ).y;
-                neu.schreibe( (char*)&t, 4 );
+                neu.schreibe( (char *)&t, 4 );
             }
         }
     }
@@ -247,7 +247,7 @@ bool M2Datei::removeModel( const char *name )
             pos -= offs;
             neu.schreibe( &nLen, 1 );
             neu.schreibe( n, nLen );
-            neu.schreibe( (char*)&pos, 8 );
+            neu.schreibe( (char *)&pos, 8 );
         }
     }
     if( d.istOffen() )
@@ -333,7 +333,7 @@ Model2DData *M2Datei::ladeModel( const char *name ) const
             delete[] name;
         }
         int vAnz = 0;
-        d.lese( (char*)&vAnz, 4 );
+        d.lese( (char *)&vAnz, 4 );
         if( polygons->hat( p ) )
         {
             if( polygons->get( p ).vertex )
@@ -349,15 +349,15 @@ Model2DData *M2Datei::ladeModel( const char *name ) const
         for( int v = 0; v < vAnz; v++ )
         {
             Vertex p;
-            d.lese( (char*)&p.x, 4 );
-            d.lese( (char*)&p.y, 4 );
+            d.lese( (char *)&p.x, 4 );
+            d.lese( (char *)&p.y, 4 );
             *polygon.schwerpunkt += p * (float)( 1.0 / vAnz );
             polygon.vertex->add( p );
             if( ( options | 1 ) == options ) // wenn textur
             {
                 Vertex tp;
-                d.lese( (char*)&tp.x, 4 );
-                d.lese( (char*)&tp.y, 4 );
+                d.lese( (char *)&tp.x, 4 );
+                d.lese( (char *)&tp.y, 4 );
                 polygon.tKordinaten->add( tp );
             }
         }
@@ -388,18 +388,4 @@ int M2Datei::getModelAnzahl() const
 Text *M2Datei::zModelName( int i ) const
 {
     return modelName->z( i );
-}
-
-// Reference Counting
-M2Datei *M2Datei::getThis()
-{
-    ++ref;
-    return this;
-}
-
-M2Datei *M2Datei::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 1 - 8
M2Datei.h

@@ -10,13 +10,12 @@ namespace Framework
 
     //! Diese Klasse verwaltet das Framework eigenen Dateivormat für 2D Modell Daten
     //! Es können mehrere 2D Modell Daten in einer Datei gespeichert werden
-    class M2Datei
+    class M2Datei : public virtual ReferenceCounter
     {
     private:
         Text *pfad;
         RCArray< Text > *modelName;
         Array< __int64 > *modelPos;
-        int ref;
 
     public:
         //! Konstruktor
@@ -73,12 +72,6 @@ namespace Framework
         //! \param i Der Index des Modells
         //! \return Ein Zeiger aud den Namen des Modells ohne erhöhten Reference Counter
         DLLEXPORT Text *zModelName( int i ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT M2Datei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT M2Datei *release();
     };
 }
 

+ 56 - 72
M3Datei.cpp

@@ -7,6 +7,7 @@ using namespace Framework;
 // Inhalt der M3Datei Klasse
 // Konstruktor
 M3Datei::M3Datei()
+    : ReferenceCounter()
 {
     modelName = 0;
     modelPos = 0;
@@ -40,23 +41,23 @@ M3Datei::~M3Datei()
 void M3Datei::saveKnochen( Knochen *k, Datei *zDat )
 {
     bool c = k != 0;
-    zDat->schreibe( (char *)& c, 1 );
+    zDat->schreibe( (char *)&c, 1 );
     if( c )
     {
         int id = k->getId();
-        zDat->schreibe( (char *)& id, 4 );
+        zDat->schreibe( (char *)&id, 4 );
         float f = k->getPosition().x;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         f = k->getPosition().y;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         f = k->getPosition().z;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         f = k->getDrehung().x;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         f = k->getDrehung().y;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         f = k->getDrehung().z;
-        zDat->schreibe( (char *)& f, 4 );
+        zDat->schreibe( (char *)&f, 4 );
         saveKnochen( k->zGeschwister(), zDat );
         saveKnochen( k->zKind(), zDat );
     }
@@ -65,21 +66,21 @@ void M3Datei::saveKnochen( Knochen *k, Datei *zDat )
 Knochen *Framework::M3Datei::readKnochen( Datei *zDat ) const
 {
     bool c;
-    zDat->lese( (char *)& c, 1 );
+    zDat->lese( (char *)&c, 1 );
     if( c )
     {
         int id;
-        zDat->lese( (char *)& id, 4 );
+        zDat->lese( (char *)&id, 4 );
         Knochen *k = new Knochen( id );
         Vec3< float > pos;
-        zDat->lese( (char *)& pos.x, 4 );
-        zDat->lese( (char *)& pos.y, 4 );
-        zDat->lese( (char *)& pos.z, 4 );
+        zDat->lese( (char *)&pos.x, 4 );
+        zDat->lese( (char *)&pos.y, 4 );
+        zDat->lese( (char *)&pos.z, 4 );
         k->setPosition( pos );
         Vec3< float > rot;
-        zDat->lese( (char *)& rot.x, 4 );
-        zDat->lese( (char *)& rot.y, 4 );
-        zDat->lese( (char *)& rot.z, 4 );
+        zDat->lese( (char *)&rot.x, 4 );
+        zDat->lese( (char *)&rot.y, 4 );
+        zDat->lese( (char *)&rot.z, 4 );
         k->setDrehung( rot );
         k->addGeschwisterKnochen( readKnochen( zDat ) );
         k->addKind( id, readKnochen( zDat ) );
@@ -95,18 +96,18 @@ void M3Datei::setPfad( const char *pfad )
 {
     this->pfad = pfad;
     if( modelName )
-        modelName = modelName->release();
+        modelName = ( RCArray<Text>* )modelName->release();
     if( modelPos )
-        modelPos = modelPos->release();
+        modelPos = ( Array<__int64>* )modelPos->release();
 }
 
 // Ließt grundlegende Informationen aus der Datei, die für ihre Verwendung benötigt werden
 void M3Datei::leseDaten()
 {
     if( modelName )
-        modelName = modelName->release();
+        modelName = ( RCArray<Text>* )modelName->release();
     if( modelPos )
-        modelPos = modelPos->release();
+        modelPos = ( Array<__int64>* )modelPos->release();
     modelName = new RCArray< Text >();
     modelPos = new Array< __int64 >();
     Datei d;
@@ -114,7 +115,7 @@ void M3Datei::leseDaten()
     if( !d.open( Datei::Style::lesen ) )
         return;
     unsigned char anz = 0;
-    d.lese( (char *)& anz, 1 );
+    d.lese( (char *)&anz, 1 );
     for( int i = 0; i < anz; i++ )
     {
         char len = 0;
@@ -125,7 +126,7 @@ void M3Datei::leseDaten()
         modelName->add( new Text( n ) );
         delete[] n;
         __int64 p = 0;
-        d.lese( (char *)& p, 8 );
+        d.lese( (char *)&p, 8 );
         modelPos->add( p );
     }
     d.close();
@@ -185,7 +186,7 @@ bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
         neu.schreibe( &len, 1 );
         neu.schreibe( modelName->z( i )->getText(), len );
         __int64 pos = modelPos->get( i );
-        neu.schreibe( (char *)& pos, 8 );
+        neu.schreibe( (char *)&pos, 8 );
     }
     if( d.existiert() )
     {
@@ -202,45 +203,45 @@ bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
     }
     d.close();
     int vAnz = zMdr->getVertexAnzahl();
-    neu.schreibe( (char *)& vAnz, 4 );
+    neu.schreibe( (char *)&vAnz, 4 );
     for( int i = 0; i < vAnz; i++ )
     {
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].knochenId, 4 );
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.x, 4 );
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.y, 4 );
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.z, 4 );
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].tPos.x, 4 );
-        neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].tPos.y, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].knochenId, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].pos.x, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].pos.y, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].pos.z, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].tPos.x, 4 );
+        neu.schreibe( (char *)&zMdr->zVertexBuffer()[ i ].tPos.y, 4 );
     }
     int pAnz = zMdr->getPolygonAnzahl();
-    neu.schreibe( (char *)& pAnz, 4 );
+    neu.schreibe( (char *)&pAnz, 4 );
     for( int p = 0; p < pAnz; p++ )
     {
         Polygon3D *pol = zMdr->getPolygon( p );
         int anz = pol->indexAnz;
-        neu.schreibe( (char *)& anz, 4 );
+        neu.schreibe( (char *)&anz, 4 );
         neu.schreibe( (char *)pol->indexList, anz * 4 );
     }
     float factor = zMdr->getAmbientFactor();
-    neu.schreibe( (char *)& factor, 4 );
+    neu.schreibe( (char *)&factor, 4 );
     factor = zMdr->getDiffusFactor();
-    neu.schreibe( (char *)& factor, 4 );
+    neu.schreibe( (char *)&factor, 4 );
     factor = zMdr->getSpecularFactor();
-    neu.schreibe( (char *)& factor, 4 );
+    neu.schreibe( (char *)&factor, 4 );
     Skelett *skelet = zMdr->copySkelett();
     if( skelet )
     {
         bool b = 1;
-        neu.schreibe( (char*)&b, 1 );
+        neu.schreibe( (char *)&b, 1 );
         int nId = skelet->zNextKnochenId();
-        neu.schreibe( (char *)& nId, 4 );
+        neu.schreibe( (char *)&nId, 4 );
         saveKnochen( skelet->zKnochen(), &neu );
         skelet->release();
     }
     else
     {
         bool b = 0;
-        neu.schreibe( (char *)& b, 1 );
+        neu.schreibe( (char *)&b, 1 );
     }
     d.remove();
     neu.close();
@@ -264,7 +265,7 @@ bool M3Datei::removeModel( Text *name )
 bool M3Datei::removeModel( const char *name )
 {
     if( !modelName || !pfad.getLength() )
-        return 0; 
+        return 0;
     if( !hatModel( name ) )
         return 0;
     Datei d;
@@ -282,7 +283,7 @@ bool M3Datei::removeModel( const char *name )
         d.close();
         return 0;
     }
-    char anz = (char)(modelName->getEintragAnzahl() - 1);
+    char anz = (char)( modelName->getEintragAnzahl() - 1 );
     neu.schreibe( &anz, 1 );
     __int64 offset = textLength( name ) + 9;
     __int64 removedLength = 0;
@@ -297,7 +298,7 @@ bool M3Datei::removeModel( const char *name )
             neu.schreibe( modelName->z( i )->getText(), len );
             modelPos->set( modelPos->get( i ) - offset, i );
             __int64 pos = modelPos->get( i );
-            neu.schreibe( (char *)& pos, 8 );
+            neu.schreibe( (char *)&pos, 8 );
         }
         else
         {
@@ -376,42 +377,42 @@ Model3DData *M3Datei::ladeModel( const char *name ) const
         d.setLPosition( pos, 0 );
         Model3DData *model = new Model3DData();
         int vAnz;
-        d.lese( (char *)& vAnz, 4 );
+        d.lese( (char *)&vAnz, 4 );
         Vertex3D *vertices = new Vertex3D[ vAnz ];
         for( int i = 0; i < vAnz; i++ )
         {
-            d.lese( (char *)& vertices[ i ].knochenId, 4 );
-            d.lese( (char *)& vertices[ i ].pos.x, 4 );
-            d.lese( (char *)& vertices[ i ].pos.y, 4 );
-            d.lese( (char *)& vertices[ i ].pos.z, 4 );
-            d.lese( (char *)& vertices[ i ].tPos.x, 4 );
-            d.lese( (char *)& vertices[ i ].tPos.y, 4 );
+            d.lese( (char *)&vertices[ i ].knochenId, 4 );
+            d.lese( (char *)&vertices[ i ].pos.x, 4 );
+            d.lese( (char *)&vertices[ i ].pos.y, 4 );
+            d.lese( (char *)&vertices[ i ].pos.z, 4 );
+            d.lese( (char *)&vertices[ i ].tPos.x, 4 );
+            d.lese( (char *)&vertices[ i ].tPos.y, 4 );
         }
         model->setVertecies( vertices, vAnz );
         int pAnz;
-        d.lese( (char *)& pAnz, 4 );
+        d.lese( (char *)&pAnz, 4 );
         for( int i = 0; i < pAnz; i++ )
         {
             Polygon3D *p = new Polygon3D();
-            d.lese( (char *)& p->indexAnz, 4 );
+            d.lese( (char *)&p->indexAnz, 4 );
             p->indexList = new int[ p->indexAnz ];
             d.lese( (char *)p->indexList, p->indexAnz * 4 );
             model->addPolygon( p );
         }
         float factor;
-        d.lese( (char *)& factor, 4 );
+        d.lese( (char *)&factor, 4 );
         model->setAmbientFactor( factor );
-        d.lese( (char *)& factor, 4 );
+        d.lese( (char *)&factor, 4 );
         model->setDiffusFactor( factor );
-        d.lese( (char *)& factor, 4 );
+        d.lese( (char *)&factor, 4 );
         model->setSpecularFactor( factor );
         bool b;
-        d.lese( (char *)& b, 1 );
+        d.lese( (char *)&b, 1 );
         if( b )
         {
             Skelett *s = new Skelett();
             int nId;
-            d.lese( (char *)& nId, 4 );
+            d.lese( (char *)&nId, 4 );
             s->setNextKnochenId( nId );
             s->addKnochen( readKnochen( &d ) );
             model->setSkelettZ( s );
@@ -454,21 +455,4 @@ Text *M3Datei::zModelName( int i ) const
     if( !modelName || !pfad.getLength() )
         return 0;
     return modelName->z( i );
-}
-
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-M3Datei *M3Datei::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-M3Datei *M3Datei::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 7
M3Datei.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Array.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -10,7 +11,7 @@ namespace Framework
     class Datei;
 
     //! Verwaltet eine Datei, in der 3d Modelle abgespeichert wurden
-    class M3Datei
+    class M3Datei : public virtual ReferenceCounter
     {
     private:
         Text pfad;
@@ -73,11 +74,5 @@ namespace Framework
         //! \param i Der Index des Modells
         //! \return Ein Zeiger aud den Namen des Modells ohne erhöhten Reference Counter
         DLLEXPORT Text *zModelName( int i ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT M3Datei *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT M3Datei *release();
     };
 }

+ 2 - 17
Maus.cpp

@@ -7,8 +7,8 @@ using namespace Framework;
 // Inhalt der Maus Klasse aus Maus.h
 // Konstruktor 
 Maus::Maus()
-    : hMaus( LoadCursor( 0, IDC_ARROW ) ),
-    ref( 1 )
+    : ReferenceCounter(),
+    hMaus( LoadCursor( 0, IDC_ARROW ) )
 {}
 
 // nicht constant
@@ -100,19 +100,4 @@ void Maus::update()
 HCURSOR Maus::getMausHandle()
 {
     return hMaus;
-}
-
-// Reference Counting
-Maus *Maus::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Maus *Maus::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 2 - 8
Maus.h

@@ -2,6 +2,7 @@
 #define Maus_H
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -26,11 +27,10 @@ namespace Framework
     //! Diese Klasse verwaltet das Bild des Mauszeigers
     //! Sie wird vom Framework intern verwendet
     //! Siehe Globals.h MausZeiger
-    class Maus
+    class Maus : public virtual ReferenceCounter
     {
     private:
         HCURSOR hMaus;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -46,12 +46,6 @@ namespace Framework
         DLLEXPORT void update();
         //! gibt ein Händle zur maus zurück
         DLLEXPORT HCURSOR getMausHandle();
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Maus *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Maus *release();
     };
 }
 

+ 28 - 44
Model2D.cpp

@@ -10,13 +10,12 @@ using namespace Framework;
 // Inhalt der Model2DData Klasse aus Model2D.h
 // Konstruktor
 Model2DData::Model2DData()
-    : polygons( 0 ),
+    : ReferenceCounter(),
+    polygons( 0 ),
     vListen( 0 ),
     minP( 0, 0 ),
     maxP( 0, 0 )
-{
-    ref = 1;
-}
+{}
 
 // Destruktor
 Model2DData::~Model2DData()
@@ -35,7 +34,7 @@ Model2DData::~Model2DData()
             if( polygons->get( i ).schwerpunkt )
                 delete polygons->get( i ).schwerpunkt;
         }
-        polygons = polygons->release();
+        polygons = ( Array<Polygon2D> * )polygons->release();
     }
     if( vListen )
         vListen->release();
@@ -154,7 +153,7 @@ bool Model2DData::istLinieInnen( Vertex a, Vertex b, int polygonId ) const
 }
 
 // nicht constant
-bool Model2DData::erstelleModell( Array< Polygon2D > * polygons )
+bool Model2DData::erstelleModell( Array< Polygon2D > *polygons )
 {
     removeModell();
     if( !polygons || !polygons->getEintragAnzahl() )
@@ -391,16 +390,16 @@ void Model2DData::removeModell() // setzt die Vertex daten zur
             if( polygons->get( i ).schwerpunkt )
                 delete polygons->get( i ).schwerpunkt;
         }
-        polygons = polygons->release();
+        polygons = ( Array<Polygon2D>* )polygons->release();
     }
     if( vListen )
-        vListen = vListen->release();
+        vListen = ( RCArray< RCArray< DreieckListe< Vertex > > > * )vListen->release();
     outList.leeren();
     minP = Punkt( 0, 0 );
     maxP = Punkt( 0, 0 );
 }
 
-bool Model2DData::calcHitPoint( Vertex pos, Vertex dir, const char *polygonName, Vertex & hitpoint, Vertex & moveSpeed, float &rotSpeed ) const
+bool Model2DData::calcHitPoint( Vertex pos, Vertex dir, const char *polygonName, Vertex &hitpoint, Vertex &moveSpeed, float &rotSpeed ) const
 {
     if( dir.x == 0 && dir.y == 0 )
         return 0;
@@ -456,7 +455,7 @@ bool Model2DData::calcHitPoint( Vertex pos, Vertex dir, const char *polygonName,
     return ret;
 }
 
-bool Model2DData::split( Vertex pos, Vertex dir, char *polygonName, Polygon2D & partA, Polygon2D & partB, Punkt & posA, Punkt & posB, std::function< double() > random ) const
+bool Model2DData::split( Vertex pos, Vertex dir, char *polygonName, Polygon2D &partA, Polygon2D &partB, Punkt &posA, Punkt &posB, std::function< double() > random ) const
 {
     Vertex originalDir = dir;
     bool ret = 0;
@@ -631,8 +630,8 @@ bool Model2DData::split( Vertex pos, Vertex dir, char *polygonName, Polygon2D &
                 partB.tKordinaten->add( polygon._.tKordinaten->get( rightI ) );
                 *partA.schwerpunkt /= (float)partA.vertex->getEintragAnzahl();
                 *partB.schwerpunkt /= (float)partB.vertex->getEintragAnzahl();
-                posA = (Punkt)* partA.schwerpunkt;
-                posB = (Punkt)* partB.schwerpunkt;
+                posA = (Punkt)*partA.schwerpunkt;
+                posB = (Punkt)*partB.schwerpunkt;
                 for( int i = 0; i < partA.vertex->getEintragAnzahl(); i++ )
                     partA.vertex->set( partA.vertex->get( i ) - *partA.schwerpunkt, i );
                 for( int i = 0; i < partB.vertex->getEintragAnzahl(); i++ )
@@ -669,21 +668,6 @@ float Model2DData::getMasse() const
     return m;
 }
 
-// Reference Counting
-Model2DData * Model2DData::getThis()
-{
-    ref++;
-    return this;
-}
-
-Model2DData *Model2DData::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 
 // Inhalt der Model2D Klasse aus Model2D.h
@@ -704,20 +688,20 @@ Model2DObject::~Model2DObject()
 }
 
 // nicht constant
-void Model2DObject::setModel( Model2DData * mdl )
+void Model2DObject::setModel( Model2DData *mdl )
 {
     if( rData )
         rData->release();
     rData = mdl;
 }
 
-void Model2DObject::setTextur( Textur2D * t )
+void Model2DObject::setTextur( Textur2D *t )
 {
     int index = 0;
     if( rData )
     {
         for( auto i = rData->polygons->getIterator(); i; i++ )
-            textur->set( t->getThis(), index++ );
+            textur->set( (Textur2D *)t->getThis(), index++ );
     }
     t->release();
 }
@@ -758,18 +742,18 @@ void Model2DObject::impuls( Vertex start, Vertex speed, float strength )
     }
 }
 
-void Model2DObject::setTextur( Textur2D * t, const char *polygonName )
+void Model2DObject::setTextur( Textur2D *t, const char *polygonName )
 {
     int index = 0;
     for( auto i = rData->polygons->getIterator(); i; i++, index++ )
     {
         if( i._.name->istGleich( polygonName ) )
-            textur->set( t->getThis(), index );
+            textur->set( (Textur2D *)t->getThis(), index );
     }
     t->release();
 }
 
-void Model2DObject::render( Mat3< float > & kamMat, Bild & zRObj, const char *kamName )
+void Model2DObject::render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName )
 {
     if( !rData || !rData->polygons || !textur )
         return;
@@ -893,7 +877,7 @@ bool Model2DObject::istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent )
     return 0;
 }
 
-bool Model2DObject::istModelInnen( const Object2D * zObj, Vertex * sp, bool end, bool ignoreTransparent ) const
+bool Model2DObject::istModelInnen( const Object2D *zObj, Vertex *sp, bool end, bool ignoreTransparent ) const
 {
     if( !end )
     {
@@ -928,7 +912,7 @@ Rect2< float > Model2DObject::getBoundingBox() const
     return Rect2< float >();
 }
 
-bool Model2DObject::calcHitPoint( Vertex pos, Vertex dir, Vertex & hitpoint ) const
+bool Model2DObject::calcHitPoint( Vertex pos, Vertex dir, Vertex &hitpoint ) const
 {
     pos = getObjectPos( pos );
     dir = getObjectDir( dir );
@@ -1038,7 +1022,7 @@ Textur2D *Model2DObject::zTextur( const char *polygonName ) const
 
 Model2DData *Model2DObject::getModel() const
 {
-    return rData ? rData->getThis() : 0;
+    return rData ? (Model2DData *)rData->getThis() : 0;
 }
 
 Model2DData *Model2DObject::zModel() const
@@ -1070,7 +1054,7 @@ Model2D::~Model2D()
 }
 
 // nicht constant
-void Model2D::setModel( Model2DData * mdl )
+void Model2D::setModel( Model2DData *mdl )
 {
     if( rData )
         rData->release();
@@ -1109,24 +1093,24 @@ void Model2D::addSize( float size )
     rend = 1;
 }
 
-void Model2D::setTextur( Textur2D * t )
+void Model2D::setTextur( Textur2D *t )
 {
     int index = 0;
     if( rData )
     {
         for( auto i = rData->polygons->getIterator(); i; i++ )
-            textur->set( t->getThis(), index++ );
+            textur->set( (Textur2D *)t->getThis(), index++ );
     }
     t->release();
 }
 
-void Model2D::setTextur( Textur2D * t, const char *polygonName )
+void Model2D::setTextur( Textur2D *t, const char *polygonName )
 {
     int index = 0;
     for( auto i = rData->polygons->getIterator(); i; i++, index++ )
     {
         if( i._.name->istGleich( polygonName ) )
-            textur->set( t->getThis(), index );
+            textur->set( (Textur2D *)t->getThis(), index );
     }
     t->release();
 }
@@ -1142,7 +1126,7 @@ bool Model2D::tick( double tickVal )
     return Zeichnung::tick( tickVal );
 }
 
-void Model2D::render( Bild & zRObj )
+void Model2D::render( Bild &zRObj )
 {
     if( !rData || hatStyleNicht( Model2D::Style::Sichtbar ) || !rData->polygons )
         return;
@@ -1333,7 +1317,7 @@ bool Model2D::istLinieInnen( Vertex a, Vertex b ) const
     return 0;
 }
 
-bool Model2D::istModelInnen( const Model2D * zMdl, bool end ) const
+bool Model2D::istModelInnen( const Model2D *zMdl, bool end ) const
 {
     if( !end )
     {
@@ -1363,7 +1347,7 @@ bool Model2D::istModelInnen( const Model2D * zMdl, bool end ) const
 
 Model2DData *Model2D::getModel() const
 {
-    return rData ? rData->getThis() : 0;
+    return rData ? (Model2DData *)rData->getThis() : 0;
 }
 
 Model2DData *Model2D::zModel() const

+ 2 - 9
Model2D.h

@@ -25,11 +25,10 @@ namespace Framework
     };
 
     //! Die Daten für ein 2D Model
-    class Model2DData
+    class Model2DData : public virtual ReferenceCounter
     {
     private:
         RCArray< Array< Punkt > > outList;
-        int ref;
 
         //! Überprüft, ob ein Punkt im Model ist
         //! \param p Der Punkt
@@ -76,18 +75,12 @@ namespace Framework
         __declspec( dllexport ) bool split( Vertex pos, Vertex dir, char *polygonName, Polygon2D &partA, Polygon2D &partB, Punkt &posA, Punkt &posB, std::function< double() > random ) const;
         //! Gibt die Masse des 2D Modells zurück (summe der Flächen der nicht transparenten Polygone)
         __declspec( dllexport ) float getMasse() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        __declspec( dllexport ) Model2DData *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        __declspec( dllexport ) Model2DData *release();
     };
 
     class Model2DObject : public Object2D
     {
     private:
-        Model2DData * rData;
+        Model2DData *rData;
         RCArray< Textur2D > *textur;
 
     public:

+ 22 - 75
Model3D.cpp

@@ -159,10 +159,10 @@ float Knochen::getRadius() const
 
 // Konstruktor
 Skelett::Skelett()
+    : ReferenceCounter()
 {
     k = 0;
     nextId = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -203,7 +203,7 @@ void Skelett::addKnochen( Knochen *k, int elternId )
 //  scaleFactor: Die skallierung des Objektes
 //  kamMatrix: Die vereiniegung der view und projektions Matrizen
 //  return: gibt die Anzahl der verwendeten Matrizen zurück
-int Skelett::kalkulateMatrix( Mat4< float > & modelMatrix, Mat4< float > * matBuffer, float scaleFactor, Mat4< float > & kamMatrix )
+int Skelett::kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix )
 {
     k->kalkulateMatrix( modelMatrix, matBuffer, scaleFactor, kamMatrix );
     return nextId;
@@ -238,23 +238,6 @@ int Framework::Skelett::zNextKnochenId() const
     return nextId;
 }
 
-// Erhöht den Reference Counting Zähler.
-Skelett *Skelett::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Skelett *Skelett::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt des Polygon3D Struct
 
 // Konstruktor
@@ -274,6 +257,7 @@ Polygon3D::~Polygon3D()
 
 // Konstruktor
 Model3DData::Model3DData()
+    : ReferenceCounter()
 {
     id = -1;
     skelett = 0;
@@ -284,7 +268,6 @@ Model3DData::Model3DData()
     diffusFactor = 0.f;
     specularFactor = 0.f;
     radius = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -338,7 +321,7 @@ void Model3DData::calculateNormals()
 
 // Setzt den Zeiger auf ein standartmäßig verwendete Skelett
 //  s: Das Skelett, das verwendet werden soll
-void Model3DData::setSkelettZ( Skelett * s )
+void Model3DData::setSkelettZ( Skelett *s )
 {
     if( skelett )
         skelett->release();
@@ -348,7 +331,7 @@ void Model3DData::setSkelettZ( Skelett * s )
 // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
 //  vertexList: Ein Array mit Vertecies
 //  anz: Die Anzahl der Vertecies im Array
-void Model3DData::setVertecies( Vertex3D * vertexList, int anz )
+void Model3DData::setVertecies( Vertex3D *vertexList, int anz )
 {
     delete[] this->vertexList;
     this->vertexList = vertexList;
@@ -364,7 +347,7 @@ void Model3DData::setVertecies( Vertex3D * vertexList, int anz )
 
 // Fügt ein Polygon zum Model hinzu
 //  polygon: Das Polygon, das hinzugefügt erden soll
-void Model3DData::addPolygon( Polygon3D * polygon )
+void Model3DData::addPolygon( Polygon3D *polygon )
 {
     polygons->add( polygon );
 }
@@ -393,7 +376,7 @@ void Model3DData::setSpecularFactor( float f )
 // Konvertiert ein 2d Model zu 3D
 //  model: Das 2d Model, das zu 3d konvertiert werden soll
 //  z: Die z koordinate aller punkte des Models
-void Model3DData::copyModel2D( Model2DData * model, float z )
+void Model3DData::copyModel2D( Model2DData *model, float z )
 {
     if( model && model->vListen && model->polygons )
     {
@@ -453,7 +436,7 @@ void Model3DData::removePolygon( int index )
 //  scaleFactor: Die Skallierung des Modells
 //  kamMatrix: Die vereiniegung der view und projektions Matrizen
 //  return: gibt die Anzahl der verwendeten Matrizen zurück
-int Model3DData::kalkulateMatrix( Mat4< float > & modelMatrix, Mat4< float > * matBuffer, float scaleFactor, Mat4< float > & kamMatrix ) const
+int Model3DData::kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix ) const
 {
     if( !skelett )
         return 0;
@@ -529,32 +512,14 @@ const Vertex3D *Model3DData::zVertexBuffer() const
     return vertexList;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Model3DData *Model3DData::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Model3DData *Model3DData::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der Model3DTextur
 
 // Konstruktor
 Model3DTextur::Model3DTextur()
+    : ReferenceCounter()
 {
     textures = new RCArray< Textur >();
-    ref = 1;
 }
 
 // Destruktor
@@ -566,7 +531,7 @@ Model3DTextur::~Model3DTextur()
 // Legt fest, welche Textur für welches Polygon ist
 //  pI: Der Index des Polygons
 //  txt: Die Textur des Polygons
-void Model3DTextur::setPolygonTextur( int pI, Textur * txt )
+void Model3DTextur::setPolygonTextur( int pI, Textur *txt )
 {
     textures->set( txt, pI );
 }
@@ -578,24 +543,6 @@ Textur *Model3DTextur::zPolygonTextur( int i ) const
     return textures->z( i );
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Model3DTextur *Model3DTextur::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Model3DTextur *Model3DTextur::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der AnimationData Struktur
 Model3D::AnimationData *Model3D::AnimationData::getThis()
 {
@@ -637,7 +584,7 @@ Model3D::~Model3D()
 
 // Fügt eine Animation hinzu
 //  a: Die neue Animation
-void Model3D::addAnimation( Animation3D * a, double speed )
+void Model3D::addAnimation( Animation3D *a, double speed )
 {
     AnimationData *d = new AnimationData();
     d->a = a;
@@ -648,7 +595,7 @@ void Model3D::addAnimation( Animation3D * a, double speed )
 
 // Entfernt eine Animation
 //  zA: Die zu entfernende Animation
-void Model3D::removeAnimation( Animation3D * zA )
+void Model3D::removeAnimation( Animation3D *zA )
 {
     for( int i = 0; i < animations->getEintragAnzahl(); i++ )
     {
@@ -662,12 +609,12 @@ void Model3D::removeAnimation( Animation3D * zA )
 
 // Setzt die Daten des Models
 //  data: Die Daten
-void Model3D::setModelDaten( Model3DData * data )
+void Model3D::setModelDaten( Model3DData *data )
 {
     if( model )
         model->release();
     if( skelett )
-        skelett = skelett->release();
+        skelett = (Skelett *)skelett->release();
     model = data;
     if( model )
     {
@@ -680,7 +627,7 @@ void Model3D::setModelDaten( Model3DData * data )
 
 // Setzt die zum Zeichnen zu benutzenden Texturen
 //  txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
-void Model3D::setModelTextur( Model3DTextur * txt )
+void Model3D::setModelTextur( Model3DTextur *txt )
 {
     if( textur )
         textur->release();
@@ -712,7 +659,7 @@ void Framework::Model3D::setSpecularFactor( float f )
 //  viewProj: Die miteinander multiplizierten Kameramatrizen
 //  matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
 //  return: Die Anzahl der Matrizen, die das Model benötigt
-int Model3D::errechneMatrizen( Mat4< float > & viewProj, Mat4< float > * matBuffer )
+int Model3D::errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer )
 {
     int ret = 0;
     if( skelett )
@@ -745,7 +692,7 @@ bool Model3D::tick( double tickval )
 // Gibt die Textur zurück
 Model3DTextur *Model3D::getTextur()
 {
-    return textur ? textur->getThis() : 0;
+    return textur ? (Model3DTextur *)textur->getThis() : 0;
 }
 
 // Gibt die Textur zurück (ohne erhöhten Reference Counter)
@@ -757,7 +704,7 @@ Model3DTextur *Model3D::zTextur()
 // Gibt die ModelDaten zurück
 Model3DData *Model3D::getModelData()
 {
-    return model ? model->getThis() : 0;
+    return model ? (Model3DData *)model->getThis() : 0;
 }
 
 // Gibt die ModelDaten zurück (ohne erhöhten Reference Counter)
@@ -772,7 +719,7 @@ Model3DData *Model3D::zModelData()
 //  maxSqDist: Die maximale quadratische distanz die erlaubt ist
 //  pId: die Id des Polygons, zu dem der Schnittpunkt gehört
 //  return: den quadratischen Abstand des Schnittpunktes zum Ursprung des Strahls oder -1, wenn kein schnittpunkt existiert 
-float Model3D::traceRay( Vec3< float > & p, Vec3< float > & d, float maxSqDist, int &pId ) const
+float Model3D::traceRay( Vec3< float > &p, Vec3< float > &d, float maxSqDist, int &pId ) const
 {
     if( !model )
         return -1;
@@ -833,7 +780,7 @@ float Model3D::traceRay( Vec3< float > & p, Vec3< float > & d, float maxSqDist,
 //  dir: die Richtung des Strahls in Weltkoordinaten
 //  zWelt: die Welt, aus der der Strahl kommt
 //  return: die Farbe des Schnittpunktes 
-int Model3D::traceRay( Vec3< float > &p, Vec3< float > &d, int pId, Welt3D * zWelt ) const
+int Model3D::traceRay( Vec3< float > &p, Vec3< float > &d, int pId, Welt3D *zWelt ) const
 {
     Vec3< float > dir = d;
     dir.rotateY( -angle.y );
@@ -867,9 +814,9 @@ int Model3D::traceRay( Vec3< float > &p, Vec3< float > &d, int pId, Welt3D * zWe
                     float a2 = ( c - hit ).crossProduct( a - hit ).getLength() / 2 / a0;
                     float a3 = ( a - hit ).crossProduct( b - hit ).getLength() / 2 / a0;
                     Vertex ht = at * a1 + bt * a2 + ct * a3;
-                    Bild * tex = textur->zPolygonTextur( index )->zBild();
+                    Bild *tex = textur->zPolygonTextur( index )->zBild();
                     if( ht.x >= 0 && ht.y >= 0 && ht.x <= 1 && ht.y <= 1 )
-                        return tex->getPixel( (int)( ht.x * ( (float)tex->getBreite() - 1.f ) + 0.5f ), (int)( ht.y * ((float)tex->getHeight() - 1.f ) + 0.5f ) );
+                        return tex->getPixel( (int)( ht.x * ( (float)tex->getBreite() - 1.f ) + 0.5f ), (int)( ht.y * ( (float)tex->getHeight() - 1.f ) + 0.5f ) );
                     return 0xFF000000;
                 }
                 pId--;

+ 3 - 24
Model3D.h

@@ -72,12 +72,11 @@ namespace Framework
     };
 
     //! Repräsentiert alle Knochen eines Models, mit denen es Annimiert werden kann
-    class Skelett
+    class Skelett : public virtual ReferenceCounter
     {
     private:
         Knochen *k;
         int nextId;
-        int ref;
 
     public:
         //! Konstruktor
@@ -109,12 +108,6 @@ namespace Framework
         DLLEXPORT Skelett *kopiereSkelett() const;
         //! Gibt die id des nächsten Knochens zurück ohne sie zu erhöhen
         DLLEXPORT int zNextKnochenId() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Skelett *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Skelett *release();
 
         friend Animation3D;
     };
@@ -142,7 +135,7 @@ namespace Framework
 
     //! Speichert alle Geometrischen Daten eines Modells, also
     //! Raum - und Textur Koordinaten und Knochenzugehörigkeit aller Eckpunkte
-    class Model3DData
+    class Model3DData : public virtual ReferenceCounter
     {
     private:
         Skelett *skelett;
@@ -154,7 +147,6 @@ namespace Framework
         float specularFactor;
         float radius;
         int id;
-        int ref;
 
     public:
         //! Konstruktor
@@ -221,22 +213,15 @@ namespace Framework
         DLLEXPORT int getVertexAnzahl() const;
         //! Gibt einen Buffer mit allen Vertecies des Models zurück
         DLLEXPORT const Vertex3D *zVertexBuffer() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Model3DData *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Model3DData *release();
 
         friend Model3DList;
     };
 
     //! Speichert eine Liste mit Texturen und für welche Polygone welche Textur benutzt werden soll
-    class Model3DTextur
+    class Model3DTextur : public virtual ReferenceCounter
     {
     private:
         RCArray< Textur > *textures;
-        int ref;
 
     public:
         //! Konstruktor
@@ -250,12 +235,6 @@ namespace Framework
         //! Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
         //! \param i Der Index des Polygons
         DLLEXPORT Textur *zPolygonTextur( int i ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Model3DTextur *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Model3DTextur *release();
     };
 
     //! Eine Zeichnung des 3D Frameworks, die ein 3D Model mit Textur und Animation darstellen kann

+ 2 - 21
Model3DList.cpp

@@ -12,10 +12,10 @@ const char *Standart3DTypes::cube = "f_w
 // Inhalt der Model3DList Klasse
 // Konstruktor
 Model3DList::Model3DList()
+    : ReferenceCounter()
 {
     models = new RCArray< Model3DData >();
     names = new RCArray< Text >();
-    ref = 1;
 }
 
 // Destruktor
@@ -123,24 +123,6 @@ Model3DData *Model3DList::zModel( const char *name ) const
     return 0;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Model3DList *Model3DList::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Model3DList *Model3DList::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // statische Funktionen
 
 // Initialisiert statische private member. Wird vom Framework automatisch aufgerufen.
@@ -151,5 +133,4 @@ void Model3DList::init()
 
 // Löscht statische private member. Wird vom Framework automatisch aufgerufen.
 void Model3DList::destroy()
-{
-}
+{}

+ 1 - 8
Model3DList.h

@@ -15,14 +15,13 @@ namespace Framework
     };
 
     //! Verwaltet alle geladenen Modeldaten, so dass mehrere Zeichnungen die selben Daten benutzen können
-    class Model3DList
+    class Model3DList : public virtual ReferenceCounter
     {
     private:
         static int id;
         static Critical cs;
         RCArray< Model3DData > *models;
         RCArray< Text > *names;
-        int ref;
 
     public:
         //! Konstruktor
@@ -46,12 +45,6 @@ namespace Framework
         //! Gibt ein bestimmtes Model ohne erhöhten Reference Counter zurück
         //! \param name Der Name des Models
         Model3DData *zModel( const char *name ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        Model3DList *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        Model3DList *release();
         //! Initialisiert statische private member. Wird vom Framework automatisch aufgerufen.
         static void init();
         //! Löscht statische private member. Wird vom Framework automatisch aufgerufen.

+ 5 - 17
Pair.h

@@ -1,26 +1,27 @@
 #pragma once
 
+#include "ReferenceCounter.h"
+
 namespace Framework
 {
     template< class A, class B >
-    class Pair
+    class Pair : public virtual ReferenceCounter
     {
     private:
         A *va;
         B *vb;
-        int ref;
 
     public:
         Pair()
+            : ReferenceCounter()
         {
-            ref = 1;
             va = 0;
             vb = 0;
         }
 
         Pair( A *a, B *b )
+            : ReferenceCounter()
         {
-            ref = 1;
             va = a;
             vb = b;
         }
@@ -66,18 +67,5 @@ namespace Framework
                 vb->release();
             vb = b;
         }
-
-        Pair *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        Pair *release()
-        {
-            if( !--ref )
-                delete this;
-            return 0;
-        }
     };
 }

+ 2 - 15
Prozess.cpp

@@ -13,6 +13,7 @@ using namespace Framework;
 // Inhalt der Prozess Klasse aus Prozess.h
 // Konstruktor 
 Prozess::Prozess()
+    : ReferenceCounter()
 {
 #ifdef WIN32
     pHandle = GetCurrentProcess();
@@ -29,7 +30,6 @@ Prozess::Prozess()
     memcpy( &lastSysCPU, &fsys, sizeof( FILETIME ) );
     memcpy( &lastUserCPU, &fuser, sizeof( FILETIME ) );
 #endif
-    ref = 1;
 }
 
 // nicht constant 
@@ -167,17 +167,4 @@ int Prozess::getThreadAnzahl() const
     }
     return ret;
 }
-#endif
-Prozess *Prozess::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Prozess *Prozess::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
+#endif

+ 2 - 8
Prozess.h

@@ -2,6 +2,7 @@
 #define Prozess_H
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 #ifdef WIN32
 #pragma comment( lib, "Psapi.lib" )
@@ -30,7 +31,7 @@ namespace Framework
 #endif
     //! Diese Klasse findet informationen über einen laufenden Prozess heraus (CPU, MEM)
     //! Bei Ubuntu immer der eigene Prozess
-    class Prozess
+    class Prozess : public virtual ReferenceCounter
     {
     private:
 #ifdef WIN32
@@ -38,7 +39,6 @@ namespace Framework
         ULARGE_INTEGER lastCPU, lastSysCPU, lastUserCPU;
         void *pHandle;
 #endif
-        int ref;
 
     public:
         //! Konstruktor 
@@ -58,12 +58,6 @@ namespace Framework
         //! Gibt die Anzahl der Threads zurück (Nur für Windows)
         DLLEXPORT int getThreadAnzahl() const;
 #endif
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Prozess *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Prozess *release();
     };
 }
 

+ 5 - 23
Random.cpp

@@ -5,8 +5,9 @@
 using namespace Framework;
 
 RandomGenerator::RandomGenerator()
+    : ReferenceCounter()
 {
-    int tmp[] = 
+    int tmp[] =
     {
         3,
         -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
@@ -18,7 +19,6 @@ RandomGenerator::RandomGenerator()
         -205601318,
     };
     memcpy( randtbl, tmp, 32 * 4 );
-    ref = 1;
     unsafe_state = {
         &randtbl[ 4 ],
         &randtbl[ 1 ],
@@ -34,8 +34,7 @@ RandomGenerator::RandomGenerator()
 
 // Destruktor
 RandomGenerator::~RandomGenerator()
-{
-}
+{}
 
 void RandomGenerator::srand( int seed )
 {
@@ -65,7 +64,7 @@ void RandomGenerator::srand( int seed )
     {
         long int hi = word / 127773;
         long int lo = word % 127773;
-        word = (int)(16807 * lo - 2836 * hi);
+        word = (int)( 16807 * lo - 2836 * hi );
         if( word < 0 )
             word += 2147483647;
         *++dst = word;
@@ -81,7 +80,7 @@ void RandomGenerator::srand( int seed )
 void RandomGenerator::setSeed( __int64 seed )
 {
     this->offset = 0;
-    int offset = (int)(seed >> 32);
+    int offset = (int)( seed >> 32 );
     srand( (int)seed );
     offset -= this->offset;
     while( offset-- > 0 )
@@ -135,21 +134,4 @@ __int64 RandomGenerator::getSeed() const
 {
     __int64 ret = ( (__int64)offset << 32 ) | seed;
     return ret;
-}
-
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-RandomGenerator *RandomGenerator::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-//  return: 0.
-RandomGenerator *RandomGenerator::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 8
Random.h

@@ -1,12 +1,13 @@
 #pragma once
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
     class Datei;
 
-    class RandomGenerator
+    class RandomGenerator : public virtual ReferenceCounter
     {
     private:
         struct random_data
@@ -24,7 +25,6 @@ namespace Framework
         random_data unsafe_state;
         int seed;
         int offset;
-        int ref;
 
         void srand( int seed );
 
@@ -41,11 +41,5 @@ namespace Framework
         DLLEXPORT void setSeed( __int64 seed );
         //! Gibt den aktuellen Seed zurück, mit dem alle weiteren Zufallszahlen vorherbestimmt werden können
         DLLEXPORT __int64 getSeed() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT RandomGenerator *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT RandomGenerator *release();
     };
 }

+ 24 - 0
ReferenceCounter.cpp

@@ -0,0 +1,24 @@
+#include "ReferenceCounter.h"
+
+using namespace Framework;
+
+
+ReferenceCounter::ReferenceCounter()
+{
+    ref = 1;
+}
+
+ReferenceCounter::~ReferenceCounter() {}
+
+void *ReferenceCounter::getThis()
+{
+    ref++;
+    return this;
+}
+
+void *ReferenceCounter::release()
+{
+    if( !--ref )
+        delete this;
+    return 0;
+}

+ 18 - 0
ReferenceCounter.h

@@ -0,0 +1,18 @@
+#pragma once
+
+
+namespace Framework
+{
+    class ReferenceCounter
+    {
+    private:
+        int ref;
+
+    public:
+        ReferenceCounter();
+        virtual ~ReferenceCounter();
+
+        void *getThis();
+        void *release();
+    };
+}

+ 0 - 31
ReferenceCounting.h

@@ -1,31 +0,0 @@
-#pragma once
-
-namespace Framework
-{
-    template< class T >
-    class ReferenceCounting : public T
-    {
-    private:
-        int ref;
-
-    public:
-        ReferenceCounting()
-            : T()
-        {
-            ref = 1;
-        }
-
-        T *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        T *release()
-        {
-            if( !--ref )
-                delete this;
-            return 0;
-        }
-    };
-}

+ 9 - 0
Reflection.h

@@ -0,0 +1,9 @@
+#pragma once
+
+#include "Klasse.h"
+
+#define REFLECTABLE_CLASS(NAME) \
+class NAME { \
+    public: \
+        static const Klasse<NAME> klasse(#NAME); \
+    private:

+ 21 - 0
ReflectionExample.h

@@ -0,0 +1,21 @@
+#pragma once
+
+#include "Reflection.h"
+
+using namespace Framework;
+
+REFLECTABLE_CLASS( AReflectableClass )
+
+};
+
+
+class AReflectableClass
+{
+#define CLASS_NAME "AReflectableClass"
+public:
+    static Klasse klasse;
+private:
+};
+
+Klasse AReflectableClass::klasse = Klasse( CLASS_NAME );
+#undef CLASS_NAME

+ 1 - 0
ReflectionStuff.cpp

@@ -0,0 +1 @@
+#include "ReflectionExample.h"

+ 5 - 13
RenderThread.cpp

@@ -20,12 +20,12 @@ RenderTh::RenderTh()
     tickFunktion( 0 ),
     pause( 0 ),
     maxFps( 30 )
-{
-}
+{}
 
 // Destruktor 
 RenderTh::~RenderTh()
 {
+    beenden();
     if( bildschirm )
         bildschirm->release();
     zeit->release();
@@ -117,12 +117,12 @@ void RenderTh::setPause( bool p ) // Renderpause
     pause = p;
 }
 
-void RenderTh::setRenderFunktion( std::function< void( void*, void*, Bild* ) > rF ) // setzt die Rückruf Funktion beim Rendern
+void RenderTh::setRenderFunktion( std::function< void( void *, void *, Bild * ) > rF ) // setzt die Rückruf Funktion beim Rendern
 {
     renderFunktion = rF;
 }
 
-void RenderTh::setTickFunktion( std::function< void( void*, void*, double ) > tF ) // setzt die Rückruf Funktion beim Tick
+void RenderTh::setTickFunktion( std::function< void( void *, void *, double ) > tF ) // setzt die Rückruf Funktion beim Tick
 {
     tickFunktion = tF;
 }
@@ -140,7 +140,7 @@ void RenderTh::setTickFunktionParameter( void *p ) // setzt den Parameter der R
 // constant
 Bildschirm *RenderTh::getBildschirm() const // gibt den Bildschirm zurück
 {
-    return bildschirm ? bildschirm->getThis() : 0;
+    return bildschirm ? (Bildschirm *)bildschirm->getThis() : 0;
 }
 
 Bildschirm *RenderTh::zBildschirm() const
@@ -151,12 +151,4 @@ Bildschirm *RenderTh::zBildschirm() const
 double RenderTh::getRenderTickZeit() const // gibt die Zeit zurück, die zum Rendern und zum Tick benötigt wird
 {
     return renderTickZeit;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *RenderTh::release()
-{
-    if( ref == 2 && run )
-        beenden();
-    return Thread::release();
 }

+ 0 - 2
RenderThread.h

@@ -70,8 +70,6 @@ namespace Framework
         DLLEXPORT Bildschirm *zBildschirm() const;
         //! Gibt die Zeit zurück, mit der die tick() Funktion des Bildschirms als letztes aufgerufen wurde
         DLLEXPORT double getRenderTickZeit() const;
-        //! löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-        DLLEXPORT Thread *release() override;
     };
 }
 

+ 36 - 94
Schrift.cpp

@@ -13,10 +13,10 @@ using namespace Framework;
 // Inhalt der Buchstabe Klasse aus Schrift.h
 // Konstruktor 
 Buchstabe::Buchstabe()
-    : size( 0, 0 ),
+    : ReferenceCounter(),
+    size( 0, 0 ),
     alpha( 0 ),
-    schriftSize( 0 ),
-    ref( 1 )
+    schriftSize( 0 )
 {}
 
 // Destruktor 
@@ -82,28 +82,13 @@ unsigned char *Buchstabe::getBuff() const // gibt den Alphabuffer zur
     return alpha;
 }
 
-// Reference Counting 
-Buchstabe *Buchstabe::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Buchstabe *Buchstabe::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der Alphabet Klasse aus Schrift.h
 // Konstruktor 
 Alphabet::Alphabet()
-    : zeichen( new Buchstabe * [ 256 ] ),
-    schriftSize( 12 ),
-    ref( 1 )
+    : ReferenceCounter(),
+    zeichen( new Buchstabe *[ 256 ] ),
+    schriftSize( 12 )
 {
     for( int i = 0; i < 256; ++i )
         zeichen[ i ] = 0;
@@ -132,7 +117,7 @@ void Alphabet::NeuAlphabet() // Initialisierung
         zeichen[ i ] = 0;
 }
 
-void Alphabet::setBuchstabe( unsigned char i, Buchstabe * buchstabe ) // setzt einen Buchstaben
+void Alphabet::setBuchstabe( unsigned char i, Buchstabe *buchstabe ) // setzt einen Buchstaben
 {
     if( zeichen[ i ] )
         zeichen[ i ]->release();
@@ -157,7 +142,7 @@ void Alphabet::setSchriftSize( int gr ) // setzt die Schriftgr
 Buchstabe *Alphabet::getBuchstabe( unsigned char i ) const // gibt einen Buchstaben zurück
 {
     if( zeichen[ i ] )
-        return zeichen[ i ]->getThis();
+        return (Buchstabe *)zeichen[ i ]->getThis();
     return 0;
 }
 
@@ -176,21 +161,6 @@ int Alphabet::getSchriftSize() const // gibt die Schriftgr
     return schriftSize;
 }
 
-// Reference Counting 
-Alphabet *Alphabet::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Alphabet *Alphabet::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der AlphabetArray Klasse aus Schrift.h
 // Konstruktor 
 AlphabetArray::AlphabetArray()
@@ -207,7 +177,7 @@ AlphabetArray::~AlphabetArray()
 }
 
 // nicht constant 
-bool AlphabetArray::addAlphabet( Alphabet * alphabet ) // Fügt ein Alphabet hinzu
+bool AlphabetArray::addAlphabet( Alphabet *alphabet ) // Fügt ein Alphabet hinzu
 {
     if( This )
     {
@@ -232,7 +202,7 @@ bool AlphabetArray::removeAlphabet( int sg ) // entfernt ein Alphabet
     if( This )
     {
         if( This->getSchriftSize() == sg )
-            This = This->release();
+            This = (Alphabet *)This->release();
         return 1;
     }
     if( !next )
@@ -258,7 +228,7 @@ Alphabet *AlphabetArray::getAlphabet( unsigned char sg ) const // gibt getThis v
     if( !This )
         return 0;
     if( This->getSchriftSize() == sg )
-        return This->getThis();
+        return (Alphabet *)This->getThis();
     if( next )
         return next->getAlphabet( sg );
     return 0;
@@ -278,13 +248,13 @@ Alphabet *AlphabetArray::zAlphabet( unsigned char sg ) const // gibt ein Alphabe
 Alphabet *AlphabetArray::getAlphabetI( int index, int count ) const
 {
     if( count == index )
-        return This->getThis();
+        return (Alphabet *)This->getThis();
     if( next )
         return next->getAlphabetI( index, count + 1 );
     return 0;
 }
 
-Alphabet * AlphabetArray::zAlphabetI( int index, int count ) const
+Alphabet *AlphabetArray::zAlphabetI( int index, int count ) const
 {
     if( count == index )
         return This;
@@ -293,7 +263,7 @@ Alphabet * AlphabetArray::zAlphabetI( int index, int count ) const
     return 0;
 }
 
-AlphabetArray * AlphabetArray::getNext() const // gibt das nächste Alphabet zurück
+AlphabetArray *AlphabetArray::getNext() const // gibt das nächste Alphabet zurück
 {
     return next;
 }
@@ -301,9 +271,9 @@ AlphabetArray * AlphabetArray::getNext() const // gibt das n
 // Inhalt der Schrift Klasse aus Schrift.h
 // Konstruktor 
 Schrift::Schrift()
-    : alphabetAnzahl( 0 ),
-    alphabet( new AlphabetArray() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    alphabetAnzahl( 0 ),
+    alphabet( new AlphabetArray() )
 {}
 
 // Destruktor 
@@ -312,7 +282,7 @@ Schrift::~Schrift()
     delete alphabet;
 }
 
-bool Schrift::addAlphabet( Alphabet * alphabet ) // Fügt der Schrift ein Alphabet hinzu
+bool Schrift::addAlphabet( Alphabet *alphabet ) // Fügt der Schrift ein Alphabet hinzu
 {
     if( this->alphabet->addAlphabet( alphabet ) )
     {
@@ -344,10 +314,10 @@ Alphabet *Schrift::getAlphabet( int sg ) const
                 break;
         }
     }
-    return drawAlphabet->getThis();
+    return (Alphabet *)drawAlphabet->getThis();
 }
 
-Alphabet * Schrift::zAlphabet( int sg ) const
+Alphabet *Schrift::zAlphabet( int sg ) const
 {
     Alphabet *drawAlphabet = alphabet->zAlphabet( (unsigned char)sg );
     if( !drawAlphabet )
@@ -365,7 +335,7 @@ Alphabet * Schrift::zAlphabet( int sg ) const
     return drawAlphabet;
 }
 
-Alphabet * Schrift::getAlphabetI( int index ) const
+Alphabet *Schrift::getAlphabetI( int index ) const
 {
     return alphabet->getAlphabetI( index, 0 );
 }
@@ -380,33 +350,18 @@ unsigned char Schrift::getAlphabetAnzahl() const // gibt die anzahl von in der S
     return alphabetAnzahl;
 }
 
-// Reference Counting 
-Schrift *Schrift::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Schrift *Schrift::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 
 TextRenderer::TextRenderer()
     : TextRenderer( 0 )
 {}
 
-TextRenderer::TextRenderer( Schrift * schrift )
+TextRenderer::TextRenderer( Schrift *schrift )
+    : ReferenceCounter()
 {
     s = schrift;
     schriftSize = 12;
     zeilenAbstand = 5;
     zeichenAbstand = 0;
-    ref = 1;
 }
 
 TextRenderer::~TextRenderer()
@@ -416,7 +371,7 @@ TextRenderer::~TextRenderer()
 }
 
 
-void TextRenderer::setSchriftZ( Schrift * schrift )
+void TextRenderer::setSchriftZ( Schrift *schrift )
 {
     if( s )
         s->release();
@@ -426,7 +381,7 @@ void TextRenderer::setSchriftZ( Schrift * schrift )
 Schrift *TextRenderer::getSchrift()
 {
     if( s )
-        return s->getThis();
+        return (Schrift *)s->getThis();
     return 0;
 }
 
@@ -459,7 +414,7 @@ void TextRenderer::setZeichenAbstand( int za )
 // Fügt Zeilenumbrüche in den Text ein, so dass er bei einer vorgegebenen Breite follständig angezeigt wird
 //  zText: Der text, in den die Zeilenumbrüche eingefügt werden sollen
 //  maxBreite: Die Breite in Pixeln auf der der Text follständig angezeigt werden soll
-void TextRenderer::textFormatieren( Text * zTxt, int maxBreite )
+void TextRenderer::textFormatieren( Text *zTxt, int maxBreite )
 {
     int lastPos = -1;
     int x = 0;
@@ -509,7 +464,7 @@ void TextRenderer::textFormatieren( Text * zTxt, int maxBreite )
 //  fbeg: Die Position des Zeichens im Text, wo die Einfärbung beginnen soll. Der Text wird von dort bis zur Cursorposition eingefärbt
 //  ff: Die Hintergrund Farbe des eingefärbten Textes
 //  f: Eine Funktion die für jeden Buchstaben aufgerufen wird und seine Farbe zurückgibt
-void TextRenderer::renderText( int x, int y, const char *txt, Bild & zRObj, std::function< int( int, int, int ) > f, int cpos, int cf, int fbeg, int ff )
+void TextRenderer::renderText( int x, int y, const char *txt, Bild &zRObj, std::function< int( int, int, int ) > f, int cpos, int cf, int fbeg, int ff )
 {
     if( !s )
         return;
@@ -570,9 +525,9 @@ void TextRenderer::renderText( int x, int y, const char *txt, Bild & zRObj, std:
 //  fbeg: Die Position des Zeichens im Text, wo die Einfärbung beginnen soll. Der Text wird von dort bis zur Cursorposition eingefärbt
 //  ff: Die Hintergrund Farbe des eingefärbten Textes
 //  f: Die Farbe, in der der Text gezeichnet werden soll
-void TextRenderer::renderText( int x, int y, const char *txt, Bild & zRObj, int f, int cpos, int cf, int fbeg, int ff )
+void TextRenderer::renderText( int x, int y, const char *txt, Bild &zRObj, int f, int cpos, int cf, int fbeg, int ff )
 {
-    return renderText( x, y, txt, zRObj, [ f ]( int a, int b, int c ) { return f; }, cpos, cf, fbeg, ff );
+    return renderText( x, y, txt, zRObj, [f]( int a, int b, int c ) { return f; }, cpos, cf, fbeg, ff );
 }
 
 // Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
@@ -585,7 +540,7 @@ void TextRenderer::renderText( int x, int y, const char *txt, Bild & zRObj, int
 //  underlined: 1, falls der Text unterstrichen sein soll
 //  selected: 1, falls das zeichen eingefärbt sein soll
 //  selectedBackgroundColor: Die Hintergrund Farbe des eingefärbten Textes
-void TextRenderer::renderChar( int &x, int y, char c, Bild & zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
+void TextRenderer::renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
 {
     if( !s )
         return;
@@ -616,7 +571,7 @@ void TextRenderer::renderChar( int &x, int y, char c, Bild & zRObj, int color, b
                 color &= 0x00FFFFFF;
                 float xoff = (float)b->getSchriftSize() / (float)schriftSize,
                     yoff = (float)b->getSchriftSize() / (float)schriftSize;
-				float x = (float)xs * xoff, y = (float)ys * yoff;
+                float x = (float)xs * xoff, y = (float)ys * yoff;
                 int maxX = getCharWidth( c ), maxY = getCharHeight( c );
                 maxX = ( xp + maxX ) >= zRObjGr.x ? ( zRObjGr.x - xp ) : maxX;
                 maxY = ( yp + maxY ) >= zRObjGr.y ? ( zRObjGr.y - yp ) : maxY;
@@ -812,25 +767,12 @@ int TextRenderer::textPos( const char *txt, int mausX, int mausY ) const
     return -1;
 }
 
-TextRenderer * TextRenderer::getThis()
-{
-    ref++;
-    return this;
-}
-
-TextRenderer *TextRenderer::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 GravurTextRenderer::GravurTextRenderer()
     : GravurTextRenderer( 0 )
 {}
 
-GravurTextRenderer::GravurTextRenderer( Schrift * schrift )
+GravurTextRenderer::GravurTextRenderer( Schrift *schrift )
     : TextRenderer( schrift )
 {}
 
@@ -847,7 +789,7 @@ GravurTextRenderer::~GravurTextRenderer()
 //  underlined: 1, falls der Text unterstrichen sein soll
 //  selected: 1, falls das zeichen eingefärbt sein soll
 //  selectedBackgroundColor: Die Hintergrund Farbe des eingefärbten Textes
-void GravurTextRenderer::renderChar( int &x, int y, char c, Bild & zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
+void GravurTextRenderer::renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
 {
     if( !s )
         return;
@@ -983,7 +925,7 @@ KursivTextRenderer::KursivTextRenderer()
     : KursivTextRenderer( 0 )
 {}
 
-KursivTextRenderer::KursivTextRenderer( Schrift * schrift )
+KursivTextRenderer::KursivTextRenderer( Schrift *schrift )
     : TextRenderer( schrift )
 {}
 
@@ -1000,7 +942,7 @@ KursivTextRenderer::~KursivTextRenderer()
 //  underlined: 1, falls der Text unterstrichen sein soll
 //  selected: 1, falls das zeichen eingefärbt sein soll
 //  selectedBackgroundColor: Die Hintergrund Farbe des eingefärbten Textes
-void KursivTextRenderer::renderChar( int &x, int y, char c, Bild & zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
+void KursivTextRenderer::renderChar( int &x, int y, char c, Bild &zRObj, int color, bool underlined, bool selected, int selectedBackgroundColor )
 {
     if( !s )
         return;
@@ -1036,7 +978,7 @@ void KursivTextRenderer::renderChar( int &x, int y, char c, Bild & zRObj, int co
                 int maxXBuffer = getCharWidth( c ), maxYBuffer = charHeight;
                 maxXBuffer = ( xp + maxXBuffer ) >= zRObjGr.x ? ( zRObjGr.x - xp ) : maxXBuffer;
                 maxYBuffer = ( yp + maxYBuffer ) >= zRObjGr.y ? ( zRObjGr.y - yp ) : maxYBuffer;
-                std::function< int( int x, int y ) > colorF = [ charHeight, bufferBreite, bufferHeight, colorAlpha, b, color ]( int x, int y )
+                std::function< int( int x, int y ) > colorF = [charHeight, bufferBreite, bufferHeight, colorAlpha, b, color]( int x, int y )
                 {
                     x -= (int)( (float)( charHeight - y ) / 4.f + 0.5f );
                     if( x < 0 || x >= bufferBreite )

+ 5 - 32
Schrift.h

@@ -3,6 +3,7 @@
 
 #include "Critical.h"
 #include "Punkt.h"
+#include "ReferenceCounter.h"
 #include <functional>
 
 namespace Framework
@@ -15,13 +16,12 @@ namespace Framework
 
     //! Speichert die Alphawerte eines Zeichens einer bestimmten Schrift
     //! Die anderen Farbwerte werden durch die Schriftfarbe bestimmt. Daher nur die Alpha werte.
-    class Buchstabe
+    class Buchstabe : public virtual ReferenceCounter
     {
     private:
         Punkt size;
         unsigned char *alpha;
         int schriftSize;
-        int ref;
 
     public:
         //! Erstellt ein neues leeres Zeichnung
@@ -57,22 +57,15 @@ namespace Framework
         DLLEXPORT int getBreite() const;
         //! Gibt die Höhe des Buchstabens in Pixeln zurück
         DLLEXPORT int getHeight() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Buchstabe *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Buchstabe *release();
     };
 
     //! Speichert alle Buchstaben der selben Schriftgröße.
     //! Wird von der Schrift klasse verwendet
-    class Alphabet
+    class Alphabet : public virtual ReferenceCounter
     {
     private:
         Buchstabe **zeichen;
         int schriftSize;
-        int ref;
 
     public:
         //! Erzeugt ein leeres Zeichnung
@@ -103,12 +96,6 @@ namespace Framework
         DLLEXPORT bool hatBuchstabe( unsigned char b ) const;
         //! Gibt die Schriftgröße zurück, deren Zeichen in diesem Alphabet gespeichert werden
         DLLEXPORT int getSchriftSize() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Alphabet *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Alphabet *release();
     };
 
     //! Specihert eine Liste von Alphabeten mit verschiedener Schriftgröße.
@@ -160,12 +147,11 @@ namespace Framework
     };
 
     //! Speichert alle Buchstaben einer Schrift in verschiedenen Schriftgrößen
-    class Schrift
+    class Schrift : public virtual ReferenceCounter
     {
     private:
         unsigned char alphabetAnzahl;
         AlphabetArray *alphabet;
-        int ref;
 
     public:
         //! Erzeugt eine leere Schrift
@@ -197,22 +183,15 @@ namespace Framework
         DLLEXPORT Alphabet *zAlphabetI( int index ) const;
         //! Gibt zurück, wie viele Alphabete (und damit Schriftgrößen) in der Schrift enthalten sind
         DLLEXPORT unsigned char getAlphabetAnzahl() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Schrift *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Schrift *release();
     };
 
-    class TextRenderer
+    class TextRenderer : public virtual ReferenceCounter
     {
     protected:
         Schrift *s;
         int schriftSize;
         int zeilenAbstand;
         int zeichenAbstand;
-        int ref;
 
     public:
         DLLEXPORT TextRenderer();
@@ -296,12 +275,6 @@ namespace Framework
         //! \param mausX Die X Position der Maus in Pixeln Relativ zur Position des ersten Zeichens
         //! \param mausY Die Y Position der Maus in Pixeln Relativ zur Position des ersten Zeichens
         DLLEXPORT virtual int textPos( const char *txt, int mausX, int mausY ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT TextRenderer *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT virtual TextRenderer *release();
     };
 
     class GravurTextRenderer : public TextRenderer

+ 3 - 18
Scroll.cpp

@@ -7,7 +7,8 @@ using namespace Framework;
 // Inhalt der VScrollBar Klasse aus Scroll.h
 // Konstruktor 
 ScrollBar::ScrollBar()
-    : data( new ScrollData() ),
+    : ReferenceCounter(),
+    data( new ScrollData() ),
     knopfdruck( 0 ),
     farbe( 0xFF808080 ),
     bgFarbe( 0xFF000000 ),
@@ -16,8 +17,7 @@ ScrollBar::ScrollBar()
     mx( -1 ),
     my( -1 ),
     mp( 0 ),
-    rend( 0 ),
-    ref( 1 )
+    rend( 0 )
 {}
 
 // Destruktor 
@@ -130,21 +130,6 @@ int ScrollBar::getScroll() const
     return data->scrollPos;
 }
 
-// Reference Counting
-ScrollBar *ScrollBar::getThis()
-{
-    ++ref;
-    return this;
-}
-
-ScrollBar *ScrollBar::release()
-{
-    --ref;
-    if( ref == 0 )
-        delete this;
-    return 0;
-}
-
 // Inhalt der VScrollBar Klasse
 VScrollBar::VScrollBar()
     : ScrollBar()

+ 6 - 12
Scroll.h

@@ -2,6 +2,7 @@
 #define Scroll_H
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -16,7 +17,7 @@ namespace Framework
     };
 
     //! Die Baseklasse vür die Horizontale und Vertikale Scrollbar
-    class ScrollBar
+    class ScrollBar : public virtual ReferenceCounter
     {
     protected:
         ScrollData *data;
@@ -28,7 +29,6 @@ namespace Framework
         int mx, my;
         bool mp;
         bool rend;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -78,12 +78,6 @@ namespace Framework
         DLLEXPORT int getBgFarbe() const;
         //! Gibt die aktuelle Scroll Position zurück
         DLLEXPORT int getScroll() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT ScrollBar *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT ScrollBar *release();
     };
 
     //! Eine vertikale Scrollbar, wie sie in manchen 2D GUI Zeichnungen des Frameworks verwendet wird
@@ -92,8 +86,8 @@ namespace Framework
     public:
         //! Konstruktor 
         DLLEXPORT VScrollBar();
-		//! Destruktor 
-		DLLEXPORT virtual ~VScrollBar();
+        //! Destruktor 
+        DLLEXPORT virtual ~VScrollBar();
         //! Verarbeitet ein Maus Ereignis
         //! \param x Die X Position der Scroll Bar im Fenster
         //! \param y Die Y Position der Scroll Bar im Fenster
@@ -116,8 +110,8 @@ namespace Framework
     public:
         //! Konstruktor 
         DLLEXPORT HScrollBar();
-		//! Destruktor 
-		DLLEXPORT virtual ~HScrollBar();
+        //! Destruktor 
+        DLLEXPORT virtual ~HScrollBar();
         //! Verarbeitet ein Maus Ereignis
         //! \param x Die X Position der Scroll Bar im Fenster
         //! \param y Die Y Position der Scroll Bar im Fenster

+ 1 - 19
Shader.cpp

@@ -12,10 +12,10 @@ using namespace Framework;
 
 // Konstruktor
 Shader::Shader()
+    : ReferenceCounter()
 {
     type = UNBEKANNT;
     constBuffers = new RCArray< DXBuffer >();
-    ref = 1;
 }
 
 // Destruktor
@@ -72,24 +72,6 @@ ShaderType Shader::getType() const
     return type;
 }
 
-// Erhöht den Reference Counter um 1
-//  Return: Ein zeiger auf diesen Shader
-Shader *Shader::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-//  Return: 0
-Shader *Shader::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 DX11Shader::DX11Shader( ID3D11Device * device, ID3D11DeviceContext * context )
     : Shader()
 {

+ 1 - 8
Shader.h

@@ -32,12 +32,11 @@ namespace Framework
     };
 
     //! Eine Shader Klasse, die alle Constanten Buffers eines Shaders verwaltet
-    class Shader
+    class Shader : public virtual ReferenceCounter
     {
     protected:
         ShaderType type;
         RCArray< DXBuffer > *constBuffers;
-        int ref;
 
     public:
         //! Konstruktor
@@ -73,12 +72,6 @@ namespace Framework
         int getConstBufferLänge( int index ) const;
         //! Gibt den Shadertyp zurück
         ShaderType getType() const;
-        //! Erhöht den Reference Counter um 1
-        //! \param Return Ein zeiger auf diesen Shader
-        Shader *getThis();
-        //! Verringert den Reference Counter und löscht den Shader, falls der Refeence Counter auf 0 ist
-        //! \param Return 0
-        Shader *release();
     };
 
     class DX11Shader : public Shader

+ 11 - 0
Sichtbarkeit.h

@@ -0,0 +1,11 @@
+#pragma once
+
+namespace Framework
+{
+    enum Sichtbarkeit
+    {
+        PRIVATE,
+        PROTECTED,
+        PUBLIC
+    };
+}

+ 54 - 54
Tabelle.cpp

@@ -269,7 +269,7 @@ void ObjTabelle::addSpalte( const char *name ) // Spalte hinzuf
     unlockZeichnung();
 }
 
-void ObjTabelle::addSpalte( Text * name )
+void ObjTabelle::addSpalte( Text *name )
 {
     lockZeichnung();
     members->add( new RCArray< Zeichnung >(), spaltenAnzahl );
@@ -300,7 +300,7 @@ void ObjTabelle::addSpalte( int sNum, const char *name ) // Spalte bei sNum einf
     unlockZeichnung();
 }
 
-void ObjTabelle::addSpalte( int sNum, Text * name )
+void ObjTabelle::addSpalte( int sNum, Text *name )
 {
     if( sNum > spaltenAnzahl )
         return;
@@ -328,7 +328,7 @@ void ObjTabelle::addZeile( const char *name ) // Zeile Hinzuf
     unlockZeichnung();
 }
 
-void ObjTabelle::addZeile( Text * name )
+void ObjTabelle::addZeile( Text *name )
 {
     lockZeichnung();
     zeilenNamen->add( name, zeilenAnzahl );
@@ -363,7 +363,7 @@ void ObjTabelle::addZeile( int zNum, const char *name ) // Zeile bei zNum einf
     unlockZeichnung();
 }
 
-void ObjTabelle::addZeile( int zNum, Text * name )
+void ObjTabelle::addZeile( int zNum, Text *name )
 {
     if( zNum > zeilenAnzahl )
         return;
@@ -415,7 +415,7 @@ void ObjTabelle::removeSpalte( const char *name )
     removeSpalte( getSpaltenNummer( name ) );
 }
 
-void ObjTabelle::removeSpalte( Text * name )
+void ObjTabelle::removeSpalte( Text *name )
 {
     removeSpalte( getSpaltenNummer( name ) );
 }
@@ -450,7 +450,7 @@ void ObjTabelle::removeZeile( const char *name )
     removeZeile( getZeilenNummer( name ) );
 }
 
-void ObjTabelle::removeZeile( Text * name )
+void ObjTabelle::removeZeile( Text *name )
 {
     removeZeile( getZeilenNummer( name ) );
 }
@@ -460,7 +460,7 @@ void ObjTabelle::setSpaltePosition( const char *name, int pos ) // setzt die Pos
     setSpaltePosition( getSpaltenNummer( name ), pos );
 }
 
-void ObjTabelle::setSpaltePosition( Text * name, int pos )
+void ObjTabelle::setSpaltePosition( Text *name, int pos )
 {
     setSpaltePosition( getSpaltenNummer( name ), pos );
 }
@@ -499,7 +499,7 @@ void ObjTabelle::setZeilePosition( const char *name, int pos ) // setzt die Zeil
     setZeilePosition( getZeilenNummer( name ), pos );
 }
 
-void ObjTabelle::setZeilePosition( Text * name, int pos )
+void ObjTabelle::setZeilePosition( Text *name, int pos )
 {
     setZeilePosition( getZeilenNummer( name ), pos );
 }
@@ -550,7 +550,7 @@ void ObjTabelle::setZeilePosition( int zNum, int pos )
     unlockZeichnung();
 }
 
-void ObjTabelle::setZeichnungZ( int sNum, int zNum, Zeichnung * obj ) // setzt ein Zeichnung
+void ObjTabelle::setZeichnungZ( int sNum, int zNum, Zeichnung *obj ) // setzt ein Zeichnung
 {
     if( sNum >= spaltenAnzahl || zNum >= zeilenAnzahl )
         return;
@@ -562,12 +562,12 @@ void ObjTabelle::setZeichnungZ( int sNum, int zNum, Zeichnung * obj ) // setzt e
     unlockZeichnung();
 }
 
-void ObjTabelle::setZeichnungZ( const char *spaltenName, const char *zeilenName, Zeichnung * zZeichnung )
+void ObjTabelle::setZeichnungZ( const char *spaltenName, const char *zeilenName, Zeichnung *zZeichnung )
 {
     setZeichnungZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), zZeichnung );
 }
 
-void ObjTabelle::setZeichnungZ( Text * spaltenName, Text * zeilenName, Zeichnung * zZeichnung )
+void ObjTabelle::setZeichnungZ( Text *spaltenName, Text *zeilenName, Zeichnung *zZeichnung )
 {
     setZeichnungZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), zZeichnung );
 }
@@ -587,7 +587,7 @@ void ObjTabelle::setSpaltenBreite( const char *name, int br )
     setSpaltenBreite( getSpaltenNummer( name ), br );
 }
 
-void ObjTabelle::setSpaltenBreite( Text * name, int br )
+void ObjTabelle::setSpaltenBreite( Text *name, int br )
 {
     setSpaltenBreite( getSpaltenNummer( name ), br );
 }
@@ -607,7 +607,7 @@ void ObjTabelle::setZeilenHeight( const char *name, int hi )
     setZeilenHeight( getZeilenNummer( name ), hi );
 }
 
-void ObjTabelle::setZeilenHeight( Text * name, int hi )
+void ObjTabelle::setZeilenHeight( Text *name, int hi )
 {
     setZeilenHeight( getZeilenNummer( name ), hi );
 }
@@ -627,7 +627,7 @@ void ObjTabelle::setMinSpaltenBreite( const char *name, int minBr )
     setMinSpaltenBreite( getSpaltenNummer( name ), minBr );
 }
 
-void ObjTabelle::setMinSpaltenBreite( Text * name, int minBr )
+void ObjTabelle::setMinSpaltenBreite( Text *name, int minBr )
 {
     setMinSpaltenBreite( getSpaltenNummer( name ), minBr );
 }
@@ -647,7 +647,7 @@ void ObjTabelle::setMaxSpaltenBreite( const char *name, int maxBr )
     setMaxSpaltenBreite( getSpaltenNummer( name ), maxBr );
 }
 
-void ObjTabelle::setMaxSpaltenBreite( Text * name, int maxBr )
+void ObjTabelle::setMaxSpaltenBreite( Text *name, int maxBr )
 {
     setMaxSpaltenBreite( getSpaltenNummer( name ), maxBr );
 }
@@ -667,7 +667,7 @@ void ObjTabelle::setMinZeilenHeight( const char *name, int minHi )
     setMinZeilenHeight( getZeilenNummer( name ), minHi );
 }
 
-void ObjTabelle::setMinZeilenHeight( Text * name, int minHi )
+void ObjTabelle::setMinZeilenHeight( Text *name, int minHi )
 {
     setMinZeilenHeight( getZeilenNummer( name ), minHi );
 }
@@ -687,7 +687,7 @@ void ObjTabelle::setMaxZeilenHeight( const char *name, int maxHi )
     setMaxZeilenHeight( getZeilenHeight( name ), maxHi );
 }
 
-void ObjTabelle::setMaxZeilenHeight( Text * name, int maxHi )
+void ObjTabelle::setMaxZeilenHeight( Text *name, int maxHi )
 {
     setMaxZeilenHeight( getZeilenHeight( name ), maxHi );
 }
@@ -708,7 +708,7 @@ void ObjTabelle::setAuswahl( const char *spaltenName, const char *zeilenName )
     setAuswahl( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-void ObjTabelle::setAuswahl( Text * spaltenName, Text * zeilenName )
+void ObjTabelle::setAuswahl( Text *spaltenName, Text *zeilenName )
 {
     setAuswahl( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
@@ -725,7 +725,7 @@ void ObjTabelle::setRasterBreite( int br ) // setzt die Breite des Rasters
     rend = 1;
 }
 
-void ObjTabelle::setARahmenZ( Rahmen * ram ) // setzt den auswahl Rahmen
+void ObjTabelle::setARahmenZ( Rahmen *ram ) // setzt den auswahl Rahmen
 {
     if( aRam )
         aRam->release();
@@ -749,7 +749,7 @@ void ObjTabelle::setARBreite( int br ) // setzt die auswahl Rahmen Breite
     rend = 1;
 }
 
-void ObjTabelle::setAAlphaFeldZ( AlphaFeld * af ) // setzt das auswahl AlphaFeld
+void ObjTabelle::setAAlphaFeldZ( AlphaFeld *af ) // setzt das auswahl AlphaFeld
 {
     if( aAf )
         aAf->release();
@@ -773,19 +773,19 @@ void ObjTabelle::setAAfStrength( int st ) // setzt die St
     rend = 1;
 }
 
-void ObjTabelle::setARahmenZ( int sNum, int zNum, Rahmen * ram ) // setzt den auswahl Rahmen
+void ObjTabelle::setARahmenZ( int sNum, int zNum, Rahmen *ram ) // setzt den auswahl Rahmen
 {
     if( msaRam->z( sNum ) )
         msaRam->z( sNum )->set( ram, zNum );
     rend = 1;
 }
 
-void ObjTabelle::setARahmenZ( const char *spaltenName, const char *zeilenName, Rahmen * ram )
+void ObjTabelle::setARahmenZ( const char *spaltenName, const char *zeilenName, Rahmen *ram )
 {
     setARahmenZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), ram );
 }
 
-void ObjTabelle::setARahmenZ( Text * spaltenName, Text * zeilenName, Rahmen * ram )
+void ObjTabelle::setARahmenZ( Text *spaltenName, Text *zeilenName, Rahmen *ram )
 {
     setARahmenZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), ram );
 }
@@ -810,7 +810,7 @@ void ObjTabelle::setARFarbe( const char *spaltenName, const char *zeilenName, in
     setARFarbe( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), f );
 }
 
-void ObjTabelle::setARFarbe( Text * spaltenName, Text * zeilenName, int f )
+void ObjTabelle::setARFarbe( Text *spaltenName, Text *zeilenName, int f )
 {
     setARFarbe( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), f );
 }
@@ -835,24 +835,24 @@ void ObjTabelle::setARBreite( const char *spaltenName, const char *zeilenName, i
     setARBreite( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), br );
 }
 
-void ObjTabelle::setARBreite( Text * spaltenName, Text * zeilenName, int br )
+void ObjTabelle::setARBreite( Text *spaltenName, Text *zeilenName, int br )
 {
     setARBreite( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), br );
 }
 
-void ObjTabelle::setAAlphaFeldZ( int sNum, int zNum, AlphaFeld * af ) // setzt das auswahl AlphaFeld
+void ObjTabelle::setAAlphaFeldZ( int sNum, int zNum, AlphaFeld *af ) // setzt das auswahl AlphaFeld
 {
     if( msaAf->z( sNum ) )
         msaAf->z( sNum )->set( af, zNum );
     rend = 1;
 }
 
-void ObjTabelle::setAAlphaFeldZ( const char *spaltenName, const char *zeilenName, AlphaFeld * af )
+void ObjTabelle::setAAlphaFeldZ( const char *spaltenName, const char *zeilenName, AlphaFeld *af )
 {
     setAAlphaFeldZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), af );
 }
 
-void ObjTabelle::setAAlphaFeldZ( Text * spaltenName, Text * zeilenName, AlphaFeld * af )
+void ObjTabelle::setAAlphaFeldZ( Text *spaltenName, Text *zeilenName, AlphaFeld *af )
 {
     setAAlphaFeldZ( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), af );
 }
@@ -877,7 +877,7 @@ void ObjTabelle::setAAfFarbe( const char *spaltenName, const char *zeilenName, i
     setAAfFarbe( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), f );
 }
 
-void ObjTabelle::setAAfFarbe( Text * spaltenName, Text * zeilenName, int f )
+void ObjTabelle::setAAfFarbe( Text *spaltenName, Text *zeilenName, int f )
 {
     setAAfFarbe( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), f );
 }
@@ -902,7 +902,7 @@ void ObjTabelle::setAAfStrength( const char *spaltenName, const char *zeilenName
     setAAfStrength( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), st );
 }
 
-void ObjTabelle::setAAfStrength( Text * spaltenName, Text * zeilenName, int st )
+void ObjTabelle::setAAfStrength( Text *spaltenName, Text *zeilenName, int st )
 {
     setAAfStrength( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), st );
 }
@@ -921,7 +921,7 @@ void ObjTabelle::addMsStyle( const char *spaltenName, const char *zeilenName, __
     addMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
 
-void ObjTabelle::addMsStyle( Text * spaltenName, Text * zeilenName, __int64 style )
+void ObjTabelle::addMsStyle( Text *spaltenName, Text *zeilenName, __int64 style )
 {
     addMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
@@ -940,7 +940,7 @@ void ObjTabelle::setMsStyle( const char *spaltenName, const char *zeilenName, __
     setMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
 
-void ObjTabelle::setMsStyle( Text * spaltenName, Text * zeilenName, __int64 style )
+void ObjTabelle::setMsStyle( Text *spaltenName, Text *zeilenName, __int64 style )
 {
     setMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
@@ -964,7 +964,7 @@ void ObjTabelle::setMsStyle( const char *spaltenName, const char *zeilenName, __
     setMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style, add_remove );
 }
 
-void ObjTabelle::setMsStyle( Text * spaltenName, Text * zeilenName, __int64 style, bool add_remove )
+void ObjTabelle::setMsStyle( Text *spaltenName, Text *zeilenName, __int64 style, bool add_remove )
 {
     setMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style, add_remove );
 }
@@ -983,7 +983,7 @@ void ObjTabelle::removeMsStyle( const char *spaltenName, const char *zeilenName,
     removeMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
 
-void ObjTabelle::removeMsStyle( Text * spaltenName, Text * zeilenName, __int64 style )
+void ObjTabelle::removeMsStyle( Text *spaltenName, Text *zeilenName, __int64 style )
 {
     removeMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
@@ -1004,7 +1004,7 @@ bool ObjTabelle::tick( double tickVal ) // tick Message
     return ZeichnungHintergrund::tick( tickVal );
 }
 
-void ObjTabelle::doTastaturEreignis( TastaturEreignis & te )
+void ObjTabelle::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ntakc = !te.verarbeitet;
     if( hatStyleNicht( Style::Fokus ) || hatStyleNicht( Style::Erlaubt ) || hatStyleNicht( Style::Sichtbar ) )
@@ -1046,7 +1046,7 @@ void ObjTabelle::doTastaturEreignis( TastaturEreignis & te )
         te.verarbeitet = nTak( ntakParam, this, te );
 }
 
-void ObjTabelle::render( Bild & zRObj ) // zeichnet nach zRObj
+void ObjTabelle::render( Bild &zRObj ) // zeichnet nach zRObj
 {
     if( hatStyleNicht( Style::Sichtbar ) )
         return;
@@ -1159,7 +1159,7 @@ int ObjTabelle::getSpaltenNummer( const char *name ) const // gibt die Nummer de
     return -1;
 }
 
-int ObjTabelle::getSpaltenNummer( Text * name ) const
+int ObjTabelle::getSpaltenNummer( Text *name ) const
 {
     int ret = getSpaltenNummer( name->getText() );
     name->release();
@@ -1186,7 +1186,7 @@ int ObjTabelle::getZeilenNummer( const char *name ) const // gibt die Nummer der
     return -1;
 }
 
-int ObjTabelle::getZeilenNummer( Text * name ) const
+int ObjTabelle::getZeilenNummer( Text *name ) const
 {
     int ret = getZeilenNummer( name->getText() );
     name->release();
@@ -1203,7 +1203,7 @@ Text *ObjTabelle::zZeilenName( int num ) const
     return zeilenNamen->z( num );
 }
 
-Punkt ObjTabelle::getZeichnungPosition( Zeichnung * zObj ) const // gibt die Position eines Zeichnungs zurück
+Punkt ObjTabelle::getZeichnungPosition( Zeichnung *zObj ) const // gibt die Position eines Zeichnungs zurück
 {
     for( int x = 0; x < spaltenAnzahl; ++x )
     {
@@ -1231,7 +1231,7 @@ Zeichnung *ObjTabelle::zZeichnung( const char *spaltenName, const char *zeilenNa
     return zZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-Zeichnung *ObjTabelle::zZeichnung( Text * spaltenName, Text * zeilenName ) const
+Zeichnung *ObjTabelle::zZeichnung( Text *spaltenName, Text *zeilenName ) const
 {
     return zZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
@@ -1251,7 +1251,7 @@ Zeichnung *ObjTabelle::getZeichnung( const char *spaltenName, const char *zeilen
     return getZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-Zeichnung *ObjTabelle::getZeichnung( Text * spaltenName, Text * zeilenName ) const
+Zeichnung *ObjTabelle::getZeichnung( Text *spaltenName, Text *zeilenName ) const
 {
     return getZeichnung( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
@@ -1266,7 +1266,7 @@ int ObjTabelle::getSpaltenBreite( const char *name ) const
     return getSpaltenBreite( getSpaltenNummer( name ) );
 }
 
-int ObjTabelle::getSpaltenBreite( Text * name ) const
+int ObjTabelle::getSpaltenBreite( Text *name ) const
 {
     return getSpaltenBreite( getSpaltenNummer( name ) );
 }
@@ -1281,7 +1281,7 @@ int ObjTabelle::getZeilenHeight( const char *name ) const
     return getZeilenHeight( getZeilenNummer( name ) );
 }
 
-int ObjTabelle::getZeilenHeight( Text * name ) const
+int ObjTabelle::getZeilenHeight( Text *name ) const
 {
     return getZeilenHeight( getZeilenNummer( name ) );
 }
@@ -1296,7 +1296,7 @@ int ObjTabelle::getMinSpaltenBreite( const char *name ) const
     return getMinSpaltenBreite( getSpaltenNummer( name ) );
 }
 
-int ObjTabelle::getMinSpaltenBreite( Text * name ) const
+int ObjTabelle::getMinSpaltenBreite( Text *name ) const
 {
     return getMinSpaltenBreite( getSpaltenNummer( name ) );
 }
@@ -1311,7 +1311,7 @@ int ObjTabelle::getMaxSpaltenBreite( const char *name ) const
     return getMaxSpaltenBreite( getSpaltenNummer( name ) );
 }
 
-int ObjTabelle::getMaxSpaltenBreite( Text * name ) const
+int ObjTabelle::getMaxSpaltenBreite( Text *name ) const
 {
     return getMaxSpaltenBreite( getSpaltenNummer( name ) );
 }
@@ -1326,7 +1326,7 @@ int ObjTabelle::getMinZeilenHeight( const char *name ) const
     return getMinZeilenHeight( getZeilenNummer( name ) );
 }
 
-int ObjTabelle::getMinZeilenHeight( Text * name ) const
+int ObjTabelle::getMinZeilenHeight( Text *name ) const
 {
     return getMinZeilenHeight( getZeilenNummer( name ) );
 }
@@ -1341,7 +1341,7 @@ int ObjTabelle::getMaxZeilenHeight( const char *name ) const
     return getMaxZeilenHeight( getZeilenNummer( name ) );
 }
 
-int ObjTabelle::getMaxZeilenHeight( Text * name ) const
+int ObjTabelle::getMaxZeilenHeight( Text *name ) const
 {
     return getMaxZeilenHeight( getZeilenNummer( name ) );
 }
@@ -1498,22 +1498,22 @@ AlphaFeld *ObjTabelle::zAAlphaFeld( const char *spaltenName, const char *zeilenN
     return zAAlphaFeld( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-Rahmen *ObjTabelle::getARahmen( Text * spaltenName, Text * zeilenName ) const // gibt den auswahl Rahmen zurück
+Rahmen *ObjTabelle::getARahmen( Text *spaltenName, Text *zeilenName ) const // gibt den auswahl Rahmen zurück
 {
     return getARahmen( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-Rahmen *ObjTabelle::zARahmen( Text * spaltenName, Text * zeilenName ) const
+Rahmen *ObjTabelle::zARahmen( Text *spaltenName, Text *zeilenName ) const
 {
     return zARahmen( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-AlphaFeld *ObjTabelle::getAAlphaFeld( Text * spaltenName, Text * zeilenName ) const // gibt das auswahl AlphaFeld zurück
+AlphaFeld *ObjTabelle::getAAlphaFeld( Text *spaltenName, Text *zeilenName ) const // gibt das auswahl AlphaFeld zurück
 {
     return getAAlphaFeld( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
 
-AlphaFeld *ObjTabelle::zAAlphaFeld( Text * spaltenName, Text * zeilenName ) const
+AlphaFeld *ObjTabelle::zAAlphaFeld( Text *spaltenName, Text *zeilenName ) const
 {
     return zAAlphaFeld( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ) );
 }
@@ -1540,12 +1540,12 @@ bool ObjTabelle::hatMsStyleNicht( const char *spaltenName, const char *zeilenNam
     return hatMsStyleNicht( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
 
-bool ObjTabelle::hatMsStyle( Text * spaltenName, Text * zeilenName, __int64 style ) const // prüft, ob style vorhanden ist
+bool ObjTabelle::hatMsStyle( Text *spaltenName, Text *zeilenName, __int64 style ) const // prüft, ob style vorhanden ist
 {
     return hatMsStyle( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
 
-bool ObjTabelle::hatMsStyleNicht( Text * spaltenName, Text * zeilenName, __int64 style ) const // prüft, ob style nicht vorhanden ist
+bool ObjTabelle::hatMsStyleNicht( Text *spaltenName, Text *zeilenName, __int64 style ) const // prüft, ob style nicht vorhanden ist
 {
     return hatMsStyleNicht( getSpaltenNummer( spaltenName ), getZeilenNummer( zeilenName ), style );
 }
@@ -1566,7 +1566,7 @@ Zeichnung *ObjTabelle::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
         obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     obj->setHintergrundFarbe( hintergrundFarbe );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( hintergrundFeld )
         obj->setAlphaFeldZ( (AlphaFeld *)hintergrundFeld->dublizieren() );
     obj->setRasterFarbe( rasterFarbe );

+ 33 - 85
Text.cpp

@@ -11,41 +11,29 @@ using namespace Framework;
 // inhalt der Text Klasse aus Text.h
 // Konstruktor 
 Text::Text()
-    : txt( 0 ),
+    : ReferenceCounter(),
+    txt( 0 ),
     suchGBeg( 0 ),
     suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    precision( 0 )
 {
     setText( "" );
 }
 
 Text::Text( const Text &txt )
-    : txt( 0 ),
-    suchGBeg( 0 ),
-    suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    : Text()
 {
     setText( txt );
 }
 
 Text::Text( const char *t )
-    : txt( 0 ),
-    suchGBeg( 0 ),
-    suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    : Text()
 {
     setText( t ); // Text setzen
 }
 
 Text::Text( int zahl )
-    : txt( 0 ),
-    suchGBeg( 0 ),
-    suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    : Text()
 {
     *this = zahl;
 }
@@ -53,11 +41,7 @@ Text::Text( int zahl )
 // Erstellt ein neues Text Objekt mit einer zahl als text
 //  num: Die Zahl, die im Text sein soll
 Text::Text( double num )
-    : txt( 0 ),
-    suchGBeg( 0 ),
-    suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    : Text()
 {
     *this = num;
 }
@@ -65,11 +49,7 @@ Text::Text( double num )
 // Erstellt ein neues Text Objekt mit einer zahl als text
 //  num: Die Zahl, die im Text sein soll
 Text::Text( float num )
-    : txt( 0 ),
-    suchGBeg( 0 ),
-    suchGEnd( 0 ),
-    precision( 0 ),
-    ref( 1 )
+    : Text()
 {
     *this = num;
 }
@@ -158,12 +138,12 @@ void Text::setText( const char *t, int l ) // ersetzt den Text
 void Text::setText( Text *t )
 {
     setText( t->getText() ); // Text setzen
-    t = t->release(); // übergabe loslassen
+    t->release(); // übergabe loslassen
 }
 
 void Text::append( char c ) // hängt an den Text an
 {
-	append( &c, 1 );
+    append( &c, 1 );
 }
 
 void Text::append( const char *t ) // hängt an den Text an
@@ -213,7 +193,7 @@ void Text::append( Text *t )
 {
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         append( t->getText() ); // Text anhängen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
 }
 
 void Text::append( int num )
@@ -293,7 +273,7 @@ void Text::insert( int p, Text *t )
 {
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         insert( p, t->getText() ); // Text einfügen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( int p1, int p2, const char *t ) // Ersetzt den Text von p1 bis p2
@@ -312,7 +292,7 @@ void Text::ersetzen( int p1, int p2, Text *t )
 {
     if( t->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( p1, p2, t->getText() ); // Text ersetzen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( char c1, char c2 ) // ersetzt jedes c1 durch c2
@@ -393,22 +373,22 @@ void Text::ersetzen( Text *t1, const char *t2 )
 {
     if( t1->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( t1->getText(), t2 ); // ersetzen
-    t1 = t1->release(); // Übergabe loslassen
+    t1->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( const char *t1, Text *t2 )
 {
     if( t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( t1, t2->getText() ); // ersetzen
-    t2 = t2->release(); // Übergabe loslassen
+    t2->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( Text *t1, Text *t2 )
 {
     if( t1->getLength() > 0 && t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( t1->getText(), t2->getText() ); // ersetzen
-    t1 = t1->release(); // Übergaben loslassen
-    t2 = t2->release();
+    t1->release(); // Übergaben loslassen
+    t2->release();
 }
 
 void Text::ersetzen( int index, char c1, char c2 ) // ersetzt das i-te c1 durch c2
@@ -443,22 +423,22 @@ void Text::ersetzen( int i, Text *t1, const char *t2 )
 {
     if( t1->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( i, t1->getText(), t2 ); // ersetzen
-    t1 = t1->release(); // Übergabe loslassen
+    t1->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( int i, const char *t1, Text *t2 )
 {
     if( t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( i, t1, t2->getText() ); // ersetzen
-    t2 = t2->release(); // Übergabe loslassen
+    t2->release(); // Übergabe loslassen
 }
 
 void Text::ersetzen( int i, Text *t1, Text *t2 )
 {
     if( t1->getLength() > 0 || t2->getLength() >= 0 ) // Auf unsinnige übergabe prüfen
         ersetzen( i, t1->getText(), t2->getText() ); // ersetzen
-    t1 = t1->release(); // Übergaben loslassen
-    t2 = t2->release();
+    t1->release(); // Übergaben loslassen
+    t2->release();
 }
 
 void Text::fillText( char c, int len ) // setzt den Text zu so vielen c wie län groß ist
@@ -580,7 +560,7 @@ void Text::remove( Text *t )
 {
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         remove( t->getText() ); // löschen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
 }
 
 void Text::remove( int index, char c )
@@ -634,7 +614,7 @@ void Text::remove( int i, Text *t )
 {
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         remove( i, t->getText() ); // löschen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
 }
 
 // Löscht alle ' ', '\n', '\r', '\t' bis zu einem anderen buchstaben
@@ -725,7 +705,7 @@ int Text::getRKick( int pos ) const
     else
     {
         int ret = 1;
-        for( ; ret + pos < tl && txt[ pos + ret ] != ' '&& txt[ pos + ret ] != '\n'; ++ret );
+        for( ; ret + pos < tl && txt[ pos + ret ] != ' ' && txt[ pos + ret ] != '\n'; ++ret );
         return pos + ret;
     }
 }
@@ -755,7 +735,7 @@ bool Text::hat( Text *t ) const // enth
     bool ret = 0;
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ret = hat( t->getText() ); // prüfen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
     return ret;
 }
 
@@ -801,7 +781,7 @@ bool Text::hatAt( int pos, Text *t ) const
     bool ret = 0;
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ret = hatAt( pos, t->getText() ); // prüfen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
     return ret;
 }
 
@@ -925,7 +905,7 @@ int Text::anzahlVon( Text *t ) const
     int ret = 0;
     if( t->getLength() > 0 )  // Auf unsinnige übergabe prüfen
         ret = anzahlVon( t->getText() ); // zählen
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
     return ret;
 }
 
@@ -987,7 +967,7 @@ int Text::positionVon( Text *t ) const
     int ret = 0;
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ret = positionVon( t->getText() ); // position ermitteln
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
     return ret;
 }
 
@@ -1071,7 +1051,7 @@ int Text::positionVon( Text *t, int i ) const
     int ret = 0;
     if( t->getLength() > 0 ) // Auf unsinnige übergabe prüfen
         ret = positionVon( t->getText(), i ); // position ermitteln
-    t = t->release(); // Übergabe loslassen
+    t->release(); // Übergabe loslassen
     return ret;
 }
 
@@ -1102,21 +1082,6 @@ Text *Text::getTeilText( int p ) const // gibt den Text von p bis zum Ende zur
     return getTeilText( p, getLength() ); // Text zurückgeben
 }
 
-// Reference Counting
-Text *Text::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Text *Text::release()
-{
-    --ref;
-    if( ref < 1 )
-        delete this;
-    return 0;
-}
-
 // Operatoren
 Text &Text::operator+=( const int num )
 {
@@ -1188,7 +1153,7 @@ Text &Text::operator=( const Text &txt )
     return *this;
 }
 
-Text::operator char*( ) const
+Text::operator char *( ) const
 {
     return txt;
 }
@@ -1292,10 +1257,10 @@ Text Text::operator+( const float num ) const
 // Konstructor
 //  txt: Der Text der gelesen werden soll. Er wird nicht kopiert sondern direkt gelesen.
 TextReader::TextReader( Text *txt )
+    : ReferenceCounter()
 {
     this->txt = txt;
     lPos = 0;
-    ref = 1;
 }
 
 // Destructor
@@ -1341,7 +1306,7 @@ Text *TextReader::leseZeile()
     {
         lese( &c, 1 );
         if( c )
-            ret->append( (const char*)&c, 1 );
+            ret->append( (const char *)&c, 1 );
     }
     return ret;
 }
@@ -1366,23 +1331,6 @@ __int64 TextReader::getSize() const
     return txt->getLength();
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-TextReader *TextReader::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-TextReader *TextReader::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 // char* operationen
 int Framework::stringPositionVonChar( char *string, char c, int num ) // sucht die position des num-ten c-s in string, -1 bei nicht gefunden
 {
@@ -1451,7 +1399,7 @@ char *Framework::TextInsert() // gibt den Text aus der Zwischenablage zur
     if( !OpenClipboard( 0 ) )
         return "";
     HANDLE hClipData = GetClipboardData( CF_TEXT );
-    char *cBuffer = (char*)GlobalLock( hClipData );
+    char *cBuffer = (char *)GlobalLock( hClipData );
     GlobalUnlock( hClipData );
     CloseClipboard();
     return cBuffer;

+ 3 - 16
Text.h

@@ -2,20 +2,20 @@
 #define Text_H
 
 #include "Reader.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
     class Text; //! aus dieser Datei
 
     //! Ein ersatz für String
-    class Text
+    class Text : public virtual ReferenceCounter
     {
     private:
         char *txt;
         char suchGBeg;
         char suchGEnd;
         int precision;
-        int ref;
 
     public:
         //! Erstellt ein neues Text Objekt mit dem Wert ""
@@ -288,12 +288,6 @@ namespace Framework
         //! Gibt einen Text zurück, der eine Kopie eines bestimmten Textabschnittes enthält
         //!  p1: Die Startposition des Textabschnittes (Der Textabschnitt geht bis ans Ende des Textes)
         DLLEXPORT Text *getTeilText( int p ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Text *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Text *release();
         //! Hängt eine Zahl ans Ende des Textes an
         DLLEXPORT Text &operator+=( const int num );
         //! Hängt eine Zahl ans Ende des Textes an
@@ -344,12 +338,11 @@ namespace Framework
         DLLEXPORT Text operator+( const float num ) const;
     };
 
-    class TextReader : public Reader
+    class TextReader : public Reader, public virtual ReferenceCounter
     {
     private:
         Text *txt;
         __int64 lPos;
-        int ref;
 
     public:
         //! Konstructor
@@ -376,12 +369,6 @@ namespace Framework
         DLLEXPORT __int64 getLPosition() const override;
         //! Gibt die Anzahl der zu lesenden Bytes zurück
         DLLEXPORT __int64 getSize() const override;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT TextReader *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT TextReader *release();
     };
 
     //! Durchsucht eine Zeichenkette nach dem num-ten Vorkommen eines bestimmten Buchstabens

+ 29 - 50
TextFeld.cpp

@@ -25,11 +25,11 @@ bool TextFeld::TextStyle::operator==( const TextStyle &rhs )
 
 
 TextFeld::TextStyleManager::TextStyleManager()
-    : renderer( new RCArray< TextRenderer >() ),
+    : ReferenceCounter(),
+    renderer( new RCArray< TextRenderer >() ),
     index( 0 ),
     styleIndex( 0 ),
-    text( 0 ),
-    ref( 1 )
+    text( 0 )
 {
     current.beginIndex = 0;
     current.fontColor = 0xFFFFFFFF;
@@ -236,23 +236,6 @@ TextFeld::TextStyle TextFeld::TextStyleManager::getTextStyle( int index ) const
     return last;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-TextFeld::TextStyleManager *TextFeld::TextStyleManager::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-TextFeld::TextStyleManager *TextFeld::TextStyleManager::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der TextFeld Klasse aus TextFeld.h 
 // Konstruktor 
@@ -277,7 +260,7 @@ TextFeld::~TextFeld()
     tm->release();
 }
 
-void TextFeld::doMausEreignis( MausEreignis & me, bool userRet ) // Maus Ereignis
+void TextFeld::doMausEreignis( MausEreignis &me, bool userRet ) // Maus Ereignis
 {
     if( !userRet )
         return;
@@ -287,7 +270,7 @@ void TextFeld::doMausEreignis( MausEreignis & me, bool userRet ) // Maus Ereigni
         if( rahmen )
             rbr = rahmen->getRBreite();
         if( ( ( vertikalScrollBar && hatStyle( Style::VScroll ) ) ||
-            ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ) &&
+              ( horizontalScrollBar && hatStyle( Style::HScroll ) ) ) &&
             me.mx > rbr && me.mx < gr.x - rbr &&
             me.my > rbr && me.my < gr.y - rbr )
         {
@@ -490,7 +473,7 @@ void TextFeld::setCharEvent( std::function< void( int, int, MausEreignis me ) >
     this->charEvent = charEvent;
 }
 
-void TextFeld::setText( Text * txt ) // setzt den angezeigten Text
+void TextFeld::setText( Text *txt ) // setzt den angezeigten Text
 {
     lockZeichnung();
     if( !tm->text )
@@ -504,7 +487,7 @@ void TextFeld::setText( Text * txt ) // setzt den angezeigten Text
     rend = 1;
 }
 
-void TextFeld::setTextZ( Text * txt ) // setzt einen Zeiger zum angezeigten Text
+void TextFeld::setTextZ( Text *txt ) // setzt einen Zeiger zum angezeigten Text
 {
     lockZeichnung();
     if( tm->text )
@@ -778,7 +761,7 @@ void TextFeld::addZeile( const char *zeile ) // f
         Text *txt = new Text( zeile );
         if( zeile[ txt->getLength() - 1 ] != '\n' )
             txt->append( "\n" );
-        TextRenderer * r = tm->renderer->z( 0 );
+        TextRenderer *r = tm->renderer->z( 0 );
         if( tm->textStyle.get( tm->textStyle.getEintragAnzahl() - 1 ).rendererIndex < tm->renderer->getEintragAnzahl() )
             r = tm->renderer->z( tm->textStyle.get( tm->textStyle.getEintragAnzahl() - 1 ).rendererIndex );
         if( r )
@@ -810,7 +793,7 @@ void TextFeld::addZeile( const char *zeile, int color )
         Text *txt = new Text( zeile );
         if( zeile[ txt->getLength() - 1 ] != '\n' )
             txt->append( "\n" );
-        TextRenderer * r = tm->renderer->z( 0 );
+        TextRenderer *r = tm->renderer->z( 0 );
         if( tm->textStyle.get( tm->textStyle.getEintragAnzahl() - 1 ).rendererIndex < tm->renderer->getEintragAnzahl() )
             r = tm->renderer->z( tm->textStyle.get( tm->textStyle.getEintragAnzahl() - 1 ).rendererIndex );
         if( r )
@@ -856,7 +839,7 @@ void TextFeld::setAuswahl( int pos1, int pos2 ) // setzt den Ausgew
     tm->setTextStyle( pos1, pos2, s );
 }
 
-void TextFeld::setAuswahl( Punkt & auswahl )
+void TextFeld::setAuswahl( Punkt &auswahl )
 {
     deselectAuswahl();
     TextStyle s = tm->getTextStyle( auswahl.x );
@@ -872,7 +855,7 @@ void TextFeld::addAuswahl( int pos1, int pos2 )
     tm->setTextStyle( pos1, pos2, s );
 }
 
-void TextFeld::addAuswahl( Punkt & auswahl )
+void TextFeld::addAuswahl( Punkt &auswahl )
 {
     TextStyle s = tm->getTextStyle( auswahl.x );
     s.selected = 1;
@@ -921,7 +904,7 @@ void TextFeld::replaceAuswahl( const char *text )
     }
 }
 
-void TextFeld::setTextRendererZ( TextRenderer * textRd )
+void TextFeld::setTextRendererZ( TextRenderer *textRd )
 {
     if( tm->renderer )
         tm->renderer->leeren();
@@ -933,7 +916,7 @@ void TextFeld::setTextRendererZ( TextRenderer * textRd )
 
 // Fügt einen TextRenderer hinzu
 //  textRd: Der Textrenderer
-void TextFeld::addTextRendererZ( TextRenderer * textRd )
+void TextFeld::addTextRendererZ( TextRenderer *textRd )
 {
     if( !tm->renderer )
         tm->renderer = new RCArray< TextRenderer >();
@@ -942,14 +925,14 @@ void TextFeld::addTextRendererZ( TextRenderer * textRd )
 
 // Setzt die verwendeten TextRenderer
 //  textRd: Die Textrenderer
-void TextFeld::setTextRendererZ( RCArray< TextRenderer > * textRd )
+void TextFeld::setTextRendererZ( RCArray< TextRenderer > *textRd )
 {
     if( tm->renderer )
         tm->renderer->release();
     tm->renderer = textRd;
 }
 
-void TextFeld::setSchriftZ( Schrift * schrift ) // setzt einen Zeiger zur Schrift
+void TextFeld::setSchriftZ( Schrift *schrift ) // setzt einen Zeiger zur Schrift
 {
     if( !tm->renderer )
         tm->renderer = new RCArray< TextRenderer >();
@@ -963,7 +946,7 @@ void TextFeld::setSchriftZ( Schrift * schrift ) // setzt einen Zeiger zur Schrif
 // Setzt einen Zeiger zur Schrift
 //  rendererIndex: Der Index des Renderers dessen Schrift gesetzt werden soll
 //  schrift: Die Schrift, die zum Textzeichnen verwendet werden soll.
-void TextFeld::setSchriftZ( int rendererIndex, Schrift * schrift )
+void TextFeld::setSchriftZ( int rendererIndex, Schrift *schrift )
 {
     if( !tm->renderer )
         tm->renderer = new RCArray< TextRenderer >();
@@ -1206,21 +1189,19 @@ bool TextFeld::tick( double tickval ) // tick
     return ZeichnungHintergrund::tick( tickval );
 }
 
-void TextFeld::doTastaturEreignis( TastaturEreignis & te )
+void TextFeld::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ntakc = !te.verarbeitet;
     if( te.verarbeitet || hatStyleNicht( Style::Fokus ) )
         return;
     if( !tak )
         return;
-    ++ref;
+    getThis();
     if( tak( takParam, this, te ) )
     {
         if( hatStyleNicht( Style::Editierbar ) )
         {
-            --ref;
-            if( !ref )
-                delete this;
+            release();
             return;
         }
         if( te.id == TE_Press )
@@ -1427,14 +1408,12 @@ void TextFeld::doTastaturEreignis( TastaturEreignis & te )
             updateHScroll( cpos );
         te.verarbeitet = 1;
     }
-    --ref;
     if( ntakc && te.verarbeitet && nTak )
         te.verarbeitet = nTak( ntakParam, this, te );
-    if( !ref )
-        delete this;
+    release();
 }
 
-void TextFeld::render( Bild & zRObj ) // zeichenet nach zRObj
+void TextFeld::render( Bild &zRObj ) // zeichenet nach zRObj
 {
     if( hatStyleNicht( Style::Sichtbar ) )
         return;
@@ -1471,14 +1450,14 @@ void TextFeld::render( Bild & zRObj ) // zeichenet nach zRObj
     char *text = tm->text->getText();
     lockZeichnung();
     tm->resetIteration();
-    TextStyle & style = tm->currentStyle();
+    TextStyle &style = tm->currentStyle();
     int maxLH = 0;
     for( int i = 0; i <= len; i++ )
     {
         int oldX = x;
-        if( i < len && tm->zCurrentRenderer() )
-            tm->zCurrentRenderer()->renderChar( x, y, istSchreibbar( showChar ) ? showChar : text[ i ], 
-				zRObj, style.selected ? style.selectedColor : style.fontColor, style.underlined, style.selected, style.selectedBackcroundColor );
+        if( i < len &&tm->zCurrentRenderer() )
+            tm->zCurrentRenderer()->renderChar( x, y, istSchreibbar( showChar ) ? showChar : text[ i ],
+                                                zRObj, style.selected ? style.selectedColor : style.fontColor, style.underlined, style.selected, style.selectedBackcroundColor );
         if( i == cpos && tickVal <= 0.5 && hatStyle( Style::Fokus ) && hatStyle( Style::Editierbar ) && tm->zCurrentRenderer() )
             zRObj.drawLinieV( oldX, y, tm->zCurrentRenderer()->getZeilenHeight(), 0xFFFF5555 );
         if( tm->zCurrentRenderer() )
@@ -1503,7 +1482,7 @@ Text *TextFeld::getText() const // gibt vom Text zur
 {
     if( !tm->text )
         return 0;
-    return tm->text->getThis();
+    return (Text *)tm->text->getThis();
 }
 
 Text *TextFeld::zText() const // gibt den Text zurück
@@ -1546,7 +1525,7 @@ Schrift *TextFeld::zSchrift( int rendererIndex ) const
 TextRenderer *TextFeld::getTextRenderer() const
 {
     tm->resetIteration();
-    return tm->zCurrentRenderer()->getThis();
+    return (TextRenderer *)tm->zCurrentRenderer()->getThis();
 }
 
 TextRenderer *TextFeld::zTextRenderer() const
@@ -1738,7 +1717,7 @@ Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
         obj->setToolTipZ( (ToolTip *)toolTip->dublizieren() );
     obj->setStyle( style );
     obj->tm->renderer->release();
-    obj->tm->renderer = tm->renderer->getThis();
+    obj->tm->renderer = ( RCArray<TextRenderer> * )tm->renderer->getThis();
     obj->tm->textStyle.leeren();
     for( auto i = tm->textStyle.getIterator(); i; i++ )
         obj->tm->textStyle.add( i._ );
@@ -1753,7 +1732,7 @@ Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     if( rahmen )
         obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( vertikalScrollBar )
     {
         obj->setVertikalKlickScroll( vertikalScrollBar->getKlickScroll() );

+ 1 - 8
TextFeld.h

@@ -33,7 +33,7 @@ namespace Framework
             DLLEXPORT bool operator==( const TextStyle& rhs );
         };
 
-        class TextStyleManager
+        class TextStyleManager : public virtual ReferenceCounter
         {
         protected:
             RCArray< TextRenderer > *renderer;
@@ -42,7 +42,6 @@ namespace Framework
             int styleIndex;
             TextStyle current;
             Text *text;
-            int ref;
 
         public:
             DLLEXPORT TextStyleManager();
@@ -77,12 +76,6 @@ namespace Framework
             //! Gibt den Style eines bestimmten zeichens zurück
             //! \param index Der index des Zeichens
             DLLEXPORT TextStyle getTextStyle( int index ) const;
-            //! Erhöht den Reference Counting Zähler.
-            //! \return this.
-            DLLEXPORT TextStyleManager *getThis();
-            //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-            //! \return 0.
-            DLLEXPORT virtual TextStyleManager *release();
             friend TextFeld;
         };
 

+ 5 - 23
Textur.cpp

@@ -13,11 +13,11 @@ using namespace Framework;
 // Inhalt der Textur Klasse
 // Konstruktor
 Textur::Textur()
+    : ReferenceCounter()
 {
     bild = 0;
     lastGr = Punkt( 0, 0 );
     id = -1;
-    ref = 1;
 }
 
 // Destruktor
@@ -55,7 +55,7 @@ void Textur::setBild( Bild *b )
 // Gibt einen Zeiger auf das Bild zurück
 Bild *Textur::getBild() const
 {
-    return bild ? bild->getThis() : 0;
+    return bild ? (Bild *)bild->getThis() : 0;
 }
 
 // Gibt einen Zeiger auf das Bild ohne erhöhten Reference Counter zurück
@@ -70,24 +70,6 @@ int Textur::getId() const
     return id;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Textur *Textur::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Textur *Textur::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Aktualisiert die Textur. Die Pixel des aktuellen Bildes werden in den Graphikspeicher kopiert
 bool DX9Textur::updateTextur()
@@ -151,7 +133,7 @@ bool DX11Textur::updateTextur()
     int *bgBuff = bild->getBuffer();
     int tmpBr = 4 * bild->getBreite();
     for( int y = 0, pitch = 0, bry = 0; y < bild->getHeight(); ++y, pitch += buffer.RowPitch, bry += bild->getBreite() )
-        memcpy( &( (BYTE *)buffer.pData )[ pitch ], ( void * ) & ( bgBuff[ bry ] ), tmpBr );
+        memcpy( &( (BYTE *)buffer.pData )[ pitch ], (void *)&( bgBuff[ bry ] ), tmpBr );
     context->Unmap( txt, 0 );
     if( !view || lastGr != bild->getSize() )
     {
@@ -230,7 +212,7 @@ bool DX12Textur::updateTextur()
         hprop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
         hprop.CreationNodeMask = 1;
         hprop.VisibleNodeMask = 1;
-        device->CreateCommittedResource( &hprop, D3D12_HEAP_FLAG_NONE, &description, D3D12_RESOURCE_STATE_COPY_DEST, 0, __uuidof( ID3D12Resource ), (void **)& buffer );
+        device->CreateCommittedResource( &hprop, D3D12_HEAP_FLAG_NONE, &description, D3D12_RESOURCE_STATE_COPY_DEST, 0, __uuidof( ID3D12Resource ), (void **)&buffer );
         const UINT64 uploadBufferSize = GetRequiredIntermediateSize( buffer, 0, 1 );
         D3D12_RESOURCE_DESC iDescription;
         iDescription.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
@@ -245,7 +227,7 @@ bool DX12Textur::updateTextur()
         iDescription.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
         iDescription.Flags = D3D12_RESOURCE_FLAG_NONE;
         hprop.Type = D3D12_HEAP_TYPE_UPLOAD;
-        device->CreateCommittedResource( &hprop, D3D12_HEAP_FLAG_NONE, &iDescription, D3D12_RESOURCE_STATE_GENERIC_READ, 0, __uuidof( ID3D12Resource ), (void **)& intermediate );
+        device->CreateCommittedResource( &hprop, D3D12_HEAP_FLAG_NONE, &iDescription, D3D12_RESOURCE_STATE_GENERIC_READ, 0, __uuidof( ID3D12Resource ), (void **)&intermediate );
         shaderResource = 0;
     }
     if( bild )

+ 2 - 8
Textur.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Punkt.h"
+#include "ReferenceCounter.h"
 
 struct ID3D11Texture2D;
 struct ID3D11ShaderResourceView;
@@ -21,13 +22,12 @@ namespace Framework
     class DX12DirectCommandQueue;
 
     //! Wandelt ein Bild in eine Textur um, die an die Grafikkarte zum rendern übergeben werden kann
-    class Textur
+    class Textur : public virtual ReferenceCounter
     {
     protected:
         Bild *bild;
         Punkt lastGr;
         int id;
-        int ref;
 
     public:
         //! Konstruktor
@@ -50,12 +50,6 @@ namespace Framework
         DLLEXPORT Bild *zBild() const;
         //! Gibt die Id der Textur zurück, wenn sie in einer TexturList registriert wurde. (siehe Framework::zTexturRegister())
         DLLEXPORT int getId() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Textur *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Textur *release();
 
         friend TexturList;
     };

+ 3 - 19
Textur2D.cpp

@@ -7,12 +7,12 @@ using namespace Framework;
 
 // Konstructor
 Textur2D::Textur2D()
+    : ReferenceCounter()
 {
     circularAnimation = 0;
     animationIndex = -1;
     txt = 0;
-    animData = new Array< Animation* >();
-    ref = 1;
+    animData = new Array< Animation * >();
 }
 
 // Destructor
@@ -100,7 +100,7 @@ bool Textur2D::tick( double t )
         if( a->ausgleich >= 1.0 / a->data->getFPS() )
         {
             a->ausgleich -= 1.0 / a->data->getFPS();
-            if( ++(a->jetzt) >= a->data->getBildAnzahl() )
+            if( ++( a->jetzt ) >= a->data->getBildAnzahl() )
             {
                 a->jetzt = 0;
                 if( !a->data->istWiederhohlend() )
@@ -120,20 +120,4 @@ Bild *Textur2D::zTextur() const
     if( animationIndex != -1 )
         return animData->get( animationIndex )->data->zBild( animData->get( animationIndex )->jetzt );
     return txt;
-}
-
-// erhöht den Reference Counter um 1 und gibt this zurück
-Textur2D *Textur2D::getThis()
-{
-    ref++;
-    return this;
-}
-
-// verringert den reference counter um 1 und löscht sich selbst, falls er 0 erreicht
-//  gibt 0 zurück
-Textur2D *Textur2D::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 8
Textur2D.h

@@ -7,7 +7,7 @@ namespace Framework
     class Bild;
     class Animation2DData;
 
-    class Textur2D
+    class Textur2D : public virtual ReferenceCounter
     {
     private:
         struct Animation
@@ -19,8 +19,7 @@ namespace Framework
         bool circularAnimation;
         int animationIndex;
         Bild *txt;
-        Array< Animation* > *animData;
-        int ref;
+        Array< Animation * > *animData;
 
     public:
         //! Konstructor
@@ -46,10 +45,5 @@ namespace Framework
         DLLEXPORT bool tick( double t );
         //! gibt die aktuelle Textur zurück
         DLLEXPORT Bild *zTextur() const;
-        //! erhöht den Reference Counter um 1 und gibt this zurück
-        DLLEXPORT Textur2D *getThis();
-        //! verringert den reference counter um 1 und löscht sich selbst, falls er 0 erreicht
-        //!  gibt 0 zurück
-        DLLEXPORT Textur2D *release();
     };
 }

+ 3 - 22
TexturList.cpp

@@ -10,10 +10,10 @@ Critical TexturList::cs;
 // Inhalt der TexturList Klasse
 // Konstruktor
 TexturList::TexturList()
+    : ReferenceCounter()
 {
     textures = new RCArray< Textur >();
     names = new RCArray< Text >();
-    ref = 1;
 }
 
 // Destruktor
@@ -121,7 +121,7 @@ Textur *TexturList::getTextur( int id ) const
         if( i->getId() == id )
         {
             cs.unlock();
-            return i->getThis();
+            return (Textur *)i->getThis();
         }
     }
     cs.unlock();
@@ -164,24 +164,6 @@ Textur *TexturList::zTextur( int id ) const
     return 0;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-TexturList *TexturList::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-TexturList *TexturList::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // statische Funktionen
 
 // Initialisiert statische private member. Wird vom Framework automatisch aufgerufen.
@@ -192,5 +174,4 @@ void TexturList::init()
 
 // Löscht statische private member. Wird vom Framework automatisch aufgerufen.
 void TexturList::destroy()
-{
-}
+{}

+ 1 - 8
TexturList.h

@@ -8,14 +8,13 @@ namespace Framework
     class Textur; //! Textur.h
 
     //! Verwaltet alle geladenen Texturdaten, so dass mehrere Zeichnungen die selben Daten benutzen können
-    class TexturList
+    class TexturList : public virtual ReferenceCounter
     {
     private:
         static int id;
         static Critical cs;
         RCArray< Textur > *textures;
         RCArray< Text > *names;
-        int ref;
 
     public:
         //! Konstruktor
@@ -47,12 +46,6 @@ namespace Framework
         //! Gibt eine bestimmte Textur ohne erhöhten Reference Counter zurück
         //! \param id Die Id der Textur
         DLLEXPORT Textur *zTextur( int id ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT TexturList *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT TexturList *release();
         //! Initialisiert statische private member. Wird vom Framework automatisch aufgerufen.
         static void init();
         //! Löscht statische private member. Wird vom Framework automatisch aufgerufen.

+ 2 - 19
Thread.cpp

@@ -6,6 +6,7 @@ using namespace Framework;
 // inhalt der Thread Klasse aus Thread.h
 // Konstruktor 
 Thread::Thread()
+    : ReferenceCounter()
 {
     threadHandleSys = 0;
     threadHandle = 0;
@@ -13,7 +14,6 @@ Thread::Thread()
     thRegister->add( this );
     run = 0;
     lockCount = 0;
-    ref = 1;
 }
 
 // Destruktor 
@@ -38,7 +38,7 @@ void Thread::start() // startet den Thread
 {
     if( !run )
     {
-        ref++;
+        getThis();
 #ifdef WIN32
         threadHandle = CreateThread( 0, 0, threadStart, this, 0, &threadId );
 #else
@@ -149,23 +149,6 @@ void Thread::removeCriticalLock()
     lockCount--;
 }
 
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Thread *Thread::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Thread *Thread::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 // funktionen 
 #ifdef WIN32
 unsigned long __stdcall Framework::threadStart( void *param )

+ 2 - 8
Thread.h

@@ -2,6 +2,7 @@
 #define Thread_H
 
 #include "Array.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -9,7 +10,7 @@ namespace Framework
     class Critical;
 
     //! Ein neuer Thread wie die Thread Klasse aus Java
-    class Thread
+    class Thread : public virtual ReferenceCounter
     {
     private:
         pthread_t *threadHandleSys;
@@ -18,7 +19,6 @@ namespace Framework
         unsigned long threadId;
         pthread_t threadHandle;
         bool run;
-        int ref;
 
     public:
         //! Konstruktor 
@@ -51,12 +51,6 @@ namespace Framework
         void setSystemHandlePointer( pthread_t *ths );
         //! Gibt ein Handle auf den Thread zurück
         DLLEXPORT pthread_t getThreadHandle() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Thread *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT virtual Thread *release();
 
     private:
         void addCriticalLock();

+ 2 - 21
ToolTip.cpp

@@ -30,7 +30,7 @@ ToolTip::ToolTip( Bildschirm *zScreen )
 {
     style = Style::MEIgnoreInside | Style::MEIgnoreParentInside | Style::MEIgnoreSichtbar | Style::MEIgnoreVerarbeitet | Style::Erlaubt;
     members = new RCArray< Zeichnung >();
-    bildschirm->addToolTip( (ToolTip*)this->getThis() );
+    bildschirm->addToolTip( (ToolTip *)this->getThis() );
     setMausEreignis( _ret1ME );
 }
 
@@ -321,25 +321,6 @@ Zeichnung *ToolTip::dublizieren() const
     ret->zeichnen = zeichnen;
     ret->mausIn2 = mausIn2;
     for( auto z = members->getIterator(); z; z++ )
-        ret->addMember( z->getThis() );
+        ret->addMember( (Zeichnung *)z->getThis() );
     return ret;
-}
-
-// Reference Counting
-Zeichnung *ToolTip::release()
-{
-    if( ref == 1 )
-    {
-        Zeichnung::release();
-        return 0;
-    }
-    else
-        Zeichnung::release();
-    if( ref == 1 )
-    {
-        members->leeren();
-        if( !bildschirm->removeToolTip( this ) )
-            delete this;
-    }
-    return 0;
 }

+ 0 - 3
ToolTip.h

@@ -88,9 +88,6 @@ namespace Framework
         DLLEXPORT int getMemberAnzahl() const;
         //! Erzeugt eine komplette kopie eines tooltips
         DLLEXPORT Zeichnung *dublizieren() const override;
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Zeichnung *release() override;
     };
 }
 

+ 4 - 17
Tree.h

@@ -8,29 +8,28 @@ namespace Framework
     class TreeIterator;
 
     template< class T >
-    class Tree
+    class Tree : public virtual ReferenceCounter
     {
     private:
         T *value;
         RCArray< Tree > *subtrees;
         Tree *zParent;
-        int ref;
 
     public:
         Tree()
+            : ReferenceCounter()
         {
             value = 0;
             zParent = 0;
             subtrees = new RCArray< Tree >();
-            ref = 1;
         }
 
         Tree( T *value )
+            : ReferenceCounter()
         {
             zParent = 0;
             this->value = value;
             subtrees = new RCArray< Tree >();
-            ref = 1;
         }
 
         ~Tree()
@@ -86,18 +85,6 @@ namespace Framework
             return zParent;
         }
 
-        Tree *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        Tree *release()
-        {
-            if( !--ref )
-                delete this;
-            return 0;
-        }
         friend TreeIterator;
     };
 
@@ -189,7 +176,7 @@ namespace Framework
             return current != 0;
         }
 
-        operator T*()
+        operator T *( )
         {
             return current->zValue();
         }

+ 3 - 16
Trie.h

@@ -119,7 +119,7 @@ namespace Framework
             return data.map != 0;
         }
 
-        operator T*( )
+        operator T *( )
         {
             return data.map->zValue();
         }
@@ -137,17 +137,16 @@ namespace Framework
 
 
     template<class T>
-    class Trie
+    class Trie : public virtual ReferenceCounter
     {
     private:
         CharMap< Trie< T >, T > *map;
-        int ref;
 
     public:
         Trie()
+            : ReferenceCounter()
         {
             map = new CharMap< Trie< T >, T >();
-            ref = 1;
         }
 
         ~Trie()
@@ -214,18 +213,6 @@ namespace Framework
             return TrieIterator< T >( TrieIteratorData<T>( map, TrieIteratorData<T>() ) );
         }
 
-        Trie *getThis()
-        {
-            ref++;
-            return this;
-        }
-
-        Trie *release()
-        {
-            if( !--ref )
-                delete this;
-            return 0;
-        }
         friend TrieIterator<T>;
     };
 }

+ 13 - 0
Typ.h

@@ -0,0 +1,13 @@
+#pragma once
+
+#include "Text.h"
+
+namespace Framework
+{
+    class Typ
+    {
+    protected:
+        Text name;
+        bool simple;
+    };
+}

+ 6 - 6
UIDialog.cpp

@@ -28,7 +28,7 @@ UIDialog::UIDialog( Schrift *schrift )
     setTAfStrength( -15 );
     setSKAfFarbe( 0xFF00FF00 );
     setSKAfStrength( 30 );
-    setClosingMe( [ this ]( void *p, void *o, MausEreignis me )
+    setClosingMe( [this]( void *p, void *o, MausEreignis me )
     {
         if( me.id == ME_RLinks )
             removeStyle( Fenster::Style::Sichtbar );
@@ -50,9 +50,9 @@ void UIDialog::adjustSize()
             max.y = MAX( max.y, m->getY() + m->getHeight() + 5 );
         }
     }
-    setSize( max + Punkt( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0, 
-        ( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0 ) + 
-             ( hatStyle( Fenster::Style::Titel ) ? zTTextFeld()->getHeight() : 0 ) ) );
+    setSize( max + Punkt( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0,
+                          ( hatStyle( Fenster::Style::Rahmen ) ? getRBreite() * 2 : 0 ) +
+                          ( hatStyle( Fenster::Style::Titel ) ? zTTextFeld()->getHeight() : 0 ) ) );
 }
 
 // Fügt dem Fenster eine Zeichnung hinzu
@@ -88,14 +88,14 @@ UIMessageDialog::UIMessageDialog( const char *titel, const char *message, Schrif
     msg->setStyle( TextFeld::Style::Text );
     msg->setText( message );
     msg->setPosition( 5, 5 );
-    TextRenderer tr( schrift->getThis() );
+    TextRenderer tr( (Schrift *)schrift->getThis() );
     tr.textFormatieren( msg->zText(), 590 );
     int br = tr.getTextBreite( message );
     int hö = tr.getTextHeight( message );
     msg->setSize( br, hö );
     Knopf *ok = init.createKnopf( init.initParam );
     ok->setText( "Ok" );
-    ok->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me )
+    ok->setMausEreignis( [this]( void *p, void *o, MausEreignis me )
     {
         if( me.id == ME_RLinks )
             removeStyle( Fenster::Style::Sichtbar );

+ 8 - 8
UIInitialization.cpp

@@ -24,7 +24,7 @@ AuswahlBox *createAuswahlBox( UIInitParam &p )
     ret->setHintergrundFarbe( 0xFF000000 );
     ret->setMausEreignis( _ret1ME );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setRahmenBreite( 1 );
     ret->setRahmenFarbe( 0xFFFFFFFF );
     ret->setMaxAuskappHeight( 100 );
@@ -44,7 +44,7 @@ AuswahlListe *createAuswahlListe( UIInitParam &p )
     AuswahlListe *ret = new AuswahlListe();
     ret->setStyle( AuswahlListe::Style::Normal );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setAlphaFeldFarbe( 0x5500FF00 );
     ret->setAlphaFeldStrength( -5 );
     ret->setRahmenBreite( 1 );
@@ -73,7 +73,7 @@ FBalken *createFBalken( UIInitParam &p )
     FBalken *ret = new FBalken();
     ret->setStyle( FBalken::Style::normal );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setSFarbe( 0xFFFFFFFF );
     ret->setSSize( 12 );
     ret->setRahmenFarbe( 0xFFFFFFFF );
@@ -109,7 +109,7 @@ Fenster *createFenster( UIInitParam &p )
     ret->setRFarbe( 0xFFFFFFFF );
     ret->setTitel( "" );
     if( p.schrift )
-        ret->setTSchriftZ( p.schrift->getThis() );
+        ret->setTSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setTSFarbe( 0xFFFFFFFF );
     ret->zTTextFeld()->setSize( 0, 20 );
     ret->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
@@ -126,7 +126,7 @@ Knopf *createKnopf( UIInitParam &p )
 {
     Knopf *ret = new Knopf();
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setStyle( Knopf::Style::Normal );
     return ret;
 }
@@ -137,7 +137,7 @@ KontrollKnopf *createKontrollKnopf( UIInitParam &p )
     ret->setMausEreignis( _ret1ME );
     ret->setStyle( KontrollKnopf::Style::Normal );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setSFarbe( 0xFFFFFFFF );
     ret->setSSize( 12 );
     ret->setAlphaFeldFarbe( 0x5500FF00 );
@@ -155,7 +155,7 @@ LDiag *createLDiag( UIInitParam &p )
     LDiag *ret = new LDiag();
     ret->setStyle( LDiag::Style::normal );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setRahmenBreite( 1 );
     ret->setRahmenFarbe( 0xFFFFFFFF );
     ret->setDatenRahmenBreite( 1 );
@@ -191,7 +191,7 @@ TextFeld *createTextFeld( UIInitParam &p )
     TextFeld *ret = new TextFeld();
     ret->setStyle( TextFeld::Style::Text );
     if( p.schrift )
-        ret->setSchriftZ( p.schrift->getThis() );
+        ret->setSchriftZ( (Schrift *)p.schrift->getThis() );
     ret->setSchriftFarbe( 0xFFFFFFFF );
     ret->setSchriftSize( 12 );
     ret->setAlphaFeldFarbe( 0x5500FF00 );

+ 15 - 15
UIMLView.cpp

@@ -97,7 +97,7 @@ void UIMLView::doMausEreignis( MausEreignis &me, bool userRet )
     }
 }
 
-void UIMLView::parseTable( Iterator<XML::Element *> childs, ObjTabelle * table )
+void UIMLView::parseTable( Iterator<XML::Element *> childs, ObjTabelle *table )
 {
     for( auto i = childs; i; i++ )
     {
@@ -120,24 +120,24 @@ void UIMLView::parseTable( Iterator<XML::Element *> childs, ObjTabelle * table )
                 if( table->getSpaltenAnzahl() < c )
                     table->addSpalte( Text( c - 1 ) );
                 if( z )
-                    table->setZeichnungZ( (char *)Text( c - 1 ), (char *)line, z->getThis() );
+                    table->setZeichnungZ( (char *)Text( c - 1 ), (char *)line, (Zeichnung *)z->getThis() );
                 c++;
             }
         }
     }
 }
 
-void UIMLView::parseFrame( Iterator<XML::Element *> childs, Fenster * frame )
+void UIMLView::parseFrame( Iterator<XML::Element *> childs, Fenster *frame )
 {
     for( auto i = childs; i; i++ )
     {
         Zeichnung *z = parseElement( i._ );
         if( z )
-            frame->addMember( z->getThis() );
+            frame->addMember( (Zeichnung *)z->getThis() );
     }
 }
 
-Zeichnung *UIMLView::parseElement( XML::Element * e )
+Zeichnung *UIMLView::parseElement( XML::Element *e )
 {
     Text id;
     if( e->hasAttribute( "id" ) )
@@ -283,7 +283,7 @@ Zeichnung *UIMLView::parseElement( XML::Element * e )
     return z;
 }
 
-void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
+void UIMLView::layout( XML::Element *e, int pWidth, int pHeight )
 {
     Text id = e->getAttributeValue( "id" );
     Zeichnung *z = members->z( id );
@@ -319,7 +319,7 @@ void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", la );
                 for( auto i = ed.getIterator(); i; i++ )
                     layout( i, pWidth, pHeight );
-                Zeichnung * laz = members->z( la );
+                Zeichnung *laz = members->z( la );
                 if( laz )
                     x = laz->getX() + laz->getBreite();
             }
@@ -346,7 +346,7 @@ void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ra );
                 for( auto i = ed.getIterator(); i; i++ )
                     layout( i, pWidth, pHeight );
-                Zeichnung * raz = members->z( ra );
+                Zeichnung *raz = members->z( ra );
                 if( raz )
                     x = raz->getX() - z->getBreite();
             }
@@ -373,7 +373,7 @@ void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ta );
                 for( auto i = ed.getIterator(); i; i++ )
                     layout( i, pWidth, pHeight );
-                Zeichnung * taz = members->z( ta );
+                Zeichnung *taz = members->z( ta );
                 if( taz )
                     y = taz->getY() + taz->getHeight();
             }
@@ -400,7 +400,7 @@ void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
                 XML::Editor ed = e->zParent()->selectChildsByAttribute( "id", ba );
                 for( auto i = ed.getIterator(); i; i++ )
                     layout( i, pWidth, pHeight );
-                Zeichnung * baz = members->z( ba );
+                Zeichnung *baz = members->z( ba );
                 if( baz )
                     y = baz->getY() - z->getHeight();
             }
@@ -469,7 +469,7 @@ void UIMLView::layout( XML::Element * e, int pWidth, int pHeight )
 
 // setzt den inhalt der view
 //  uiml: Ein xml element gemät des ksg uiml standarts
-void UIMLView::setUIML( XML::Element * uiml )
+void UIMLView::setUIML( XML::Element *uiml )
 {
     if( dom )
         dom->release();
@@ -537,7 +537,7 @@ Text UIMLView::addMember( Text uiml, Text parentId )
                 Zeichnung *z = parseElement( e );
                 if( z )
                 {
-                    ( (Fenster *)members->z( parentId ) )->addMember( z->getThis() );
+                    ( (Fenster *)members->z( parentId ) )->addMember( (Zeichnung *)z->getThis() );
                     ed2.getIterator()->addChild( e );
                 }
                 return e->getAttributeValue( "id" );
@@ -560,7 +560,7 @@ void UIMLView::removeMember( Text id )
 
 // Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
 //  te: Das Ereignis
-void UIMLView::doTastaturEreignis( TastaturEreignis & te )
+void UIMLView::doTastaturEreignis( TastaturEreignis &te )
 {
     bool verarbeitet = te.verarbeitet;
     ZeichnungHintergrund::doTastaturEreignis( te );
@@ -594,7 +594,7 @@ bool UIMLView::tick( double tickVal )
 }
 
 // Zeichnet den Hintergrund eines Zeichnunges nach rObj
-void UIMLView::render( Bild & rObj )
+void UIMLView::render( Bild &rObj )
 {
     ZeichnungHintergrund::render( rObj );
     if( dom )
@@ -626,5 +626,5 @@ XML::Element *UIMLView::zDom() const
 // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
 XML::Element *UIMLView::getDom() const
 {
-    return dom ? dom->getThis() : 0;
+    return dom ? (XML::Element *)dom->getThis() : 0;
 }

+ 17 - 17
UIPixelShader.h

@@ -284,10 +284,10 @@ ret
 
 const BYTE UIPixelShader[] =
 {
-     68,  88,  66,  67, 215, 226, 
-    237,  52, 249, 202,  37, 235, 
-     58, 134,  28,  21, 187,  98, 
-    181, 174,   1,   0,   0,   0, 
+     68,  88,  66,  67, 222, 255, 
+    118, 181, 123,   6,  66, 245, 
+    242,  82, 107,  37,  64, 144, 
+    167,  34,   1,   0,   0,   0, 
     132, 113,   0,   0,   6,   0, 
       0,   0,  56,   0,   0,   0, 
     124,   5,   0,   0,  12,   6, 
@@ -1544,10 +1544,10 @@ const BYTE UIPixelShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0, 148,  46,  49,   1, 
-     26,  37, 243,  94,   1,   0, 
-      0,   0, 222, 114,  62,  19, 
-     77, 227, 139,  78, 132, 252, 
-    204, 143, 100,  37, 157, 134, 
+    208, 142,  99,  96,   1,   0, 
+      0,   0,  29, 172, 123,  53, 
+     28, 174, 155,  72, 129, 159, 
+    248, 238, 133, 221, 229, 171, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   1,   0,   0,   0, 
       1,   0,   0,   0,   0,   0, 
@@ -1719,7 +1719,7 @@ const BYTE UIPixelShader[] =
     242,  56,   1,   0,  43, 236, 
       3,   0,  28,  19,   2,   0, 
      65,  36,   1,   0, 236, 179, 
-      1,   0, 127, 166,   1,   0, 
+      1,   0, 118, 170,   3,   0, 
     125,  10,   2,   0, 125, 181, 
       2,   0, 200,  81,   2,   0, 
     193,  33,   3,   0,  65, 185, 
@@ -2568,8 +2568,8 @@ const BYTE UIPixelShader[] =
      84, 101, 120, 116, 117, 114, 
     101,  50,  68,  32, 115, 104, 
      97, 100,  27, 226,  48,   1, 
-    128,   0,   0,   0,  53, 224, 
-    103, 206,  14,  74, 214,   1, 
+    128,   0,   0,   0, 246,  77, 
+    198,  40, 166,  37, 215,   1, 
       1,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -3641,7 +3641,7 @@ const BYTE UIPixelShader[] =
      23,   0,   1,   0,   5,  16, 
       0,   0,  14,   0,  23,  21, 
       0,  16,   0,   0,   3,   2, 
-    240,   3,   0,   0, 242, 241, 
+    128,   3,   0,   0, 242, 241, 
      10,   0,  24,  21,   8,  16, 
       0,   0,   1,   0,   1,   0, 
      10,   0,  24,  21,   9,  16, 
@@ -4805,7 +4805,7 @@ const BYTE UIPixelShader[] =
       2,   0,   9,   0, 164,   7, 
       0,   0,   0,   0,   0,   0, 
      68,  11,   0,   0,   1,   0, 
-      0,   0,  88, 130, 187,   3, 
+      0,   0, 248, 130,  87,   3, 
       0,   0,   0,   0,   0,   0, 
       0,   0,  84, 101, 120, 116, 
     117, 114, 101,  80, 105, 120, 
@@ -4872,10 +4872,10 @@ const BYTE UIPixelShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0, 148,  46,  49,   1, 
-     26,  37, 243,  94,   1,   0, 
-      0,   0, 222, 114,  62,  19, 
-     77, 227, 139,  78, 132, 252, 
-    204, 143, 100,  37, 157, 134, 
+    208, 142,  99,  96,   1,   0, 
+      0,   0,  29, 172, 123,  53, 
+     28, 174, 155,  72, 129, 159, 
+    248, 238, 133, 221, 229, 171, 
     128,   0,   0,   0,  47,  76, 
     105, 110, 107,  73, 110, 102, 
     111,   0,  47, 110,  97, 109, 

+ 19 - 19
UIVertexShader.h

@@ -119,10 +119,10 @@ ret
 
 const BYTE UIVertexShader[] =
 {
-     68,  88,  66,  67,  15, 147, 
-    220,   5, 244, 234,  25,  24, 
-     68,  15, 130, 247, 244, 145, 
-    108, 201,   1,   0,   0,   0, 
+     68,  88,  66,  67,  90,  37, 
+    142,  25,  80, 233, 144, 153, 
+     90, 175,  92,  56,  52, 208, 
+    185, 144,   1,   0,   0,   0, 
     168,  77,   0,   0,   6,   0, 
       0,   0,  56,   0,   0,   0, 
      20,   2,   0,   0, 168,   2, 
@@ -873,10 +873,10 @@ const BYTE UIVertexShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0, 148,  46,  49,   1, 
-     27,  37, 243,  94,   1,   0, 
-      0,   0,  22, 227, 229, 131, 
-    248,  69,  48,  66, 175,   3, 
-    128, 194, 186,  42, 213, 182, 
+    209, 142,  99,  96,   1,   0, 
+      0,   0, 216,   6, 133, 153, 
+    230, 104, 154,  69, 156,  47, 
+    136, 175,  59, 191,  36, 254, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   1,   0,   0,   0, 
       1,   0,   0,   0,   0,   0, 
@@ -1556,8 +1556,8 @@ const BYTE UIVertexShader[] =
      32,  32,  32,  32,  32,  32, 
      32,  32,  32,  32,  32,  32, 
      27, 226,  48,   1, 128,   0, 
-      0,   0, 148,  25, 179, 206, 
-     14,  74, 214,   1,   1,   0, 
+      0,   0, 232,  87,  12,  41, 
+    166,  37, 215,   1,   1,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
@@ -2934,13 +2934,13 @@ const BYTE UIVertexShader[] =
       0,   0,   0,   0,   1,   0, 
       0,   0,   0,   0,   0,   0, 
     196,   3,   0,   0,  32,   0, 
-      0,  96,   0,   0, 213, 182, 
+      0,  96,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   2,   0,   9,   0, 
      80,   5,   0,   0,   0,   0, 
       0,   0, 236,   2,   0,   0, 
-      1,   0,   0,   0, 152, 128, 
-    161,   0,   0,   0,   0,   0, 
+      1,   0,   0,   0, 152, 130, 
+     14,   3,   0,   0,   0,   0, 
       0,   0,   0,   0,  84, 101, 
     120, 116, 117, 114, 101,  86, 
     101, 114, 116, 101, 120,  83, 
@@ -2950,7 +2950,7 @@ const BYTE UIVertexShader[] =
       1,   0,   0,   0,   0,   0, 
       0,   0, 196,   3,   0,   0, 
      32,   0,   0,  96,   0,   0, 
-    213, 182,   0,   0,   0,   0, 
+      0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   2,   0, 
       2,   0,   7,   0,   0,   0, 
       0,   0,   1,   0, 255, 255, 
@@ -3006,11 +3006,11 @@ const BYTE UIVertexShader[] =
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0,   0,   0, 
       0,   0,   0,   0, 148,  46, 
-     49,   1,  27,  37, 243,  94, 
-      1,   0,   0,   0,  22, 227, 
-    229, 131, 248,  69,  48,  66, 
-    175,   3, 128, 194, 186,  42, 
-    213, 182, 129,   0,   0,   0, 
+     49,   1, 209, 142,  99,  96, 
+      1,   0,   0,   0, 216,   6, 
+    133, 153, 230, 104, 154,  69, 
+    156,  47, 136, 175,  59, 191, 
+     36, 254, 129,   0,   0,   0, 
      47,  76, 105, 110, 107,  73, 
     110, 102, 111,   0,  47, 110, 
      97, 109, 101, 115,   0,  47, 

+ 17 - 43
Welt2D.cpp

@@ -4,12 +4,12 @@
 using namespace Framework;
 
 Object2D::Object2D()
+    : ReferenceCounter()
 {
     rSpeed = 0;
     rotation = 0;
     size = 1;
     collision = 1;
-    ref = 1;
 }
 
 Object2D::~Object2D()
@@ -88,7 +88,7 @@ void Object2D::setCollision( bool handle )
     collision = handle;
 }
 
-bool Object2D::handleCollision( Object2D* obj )
+bool Object2D::handleCollision( Object2D *obj )
 {
     Vertex hp;
     if( istModelInnen( obj, &hp ) ) // hp wird auf den aufprallpunkt gesetzt
@@ -129,7 +129,7 @@ bool Object2D::handleCollision( Object2D* obj )
     return 0;
 }
 
-bool Object2D::tick( const WeltInfo& info, double zeit )
+bool Object2D::tick( const WeltInfo &info, double zeit )
 {
     while( !actions.empty() )
     {
@@ -174,7 +174,7 @@ bool Object2D::istLinieInnen( Vertex a, Vertex b, bool ignoreTransparent ) const
     return 0;
 }
 
-bool Object2D::istModelInnen( const Object2D* zObj, Vertex* sp, bool end, bool ignoreTransparent ) const
+bool Object2D::istModelInnen( const Object2D *zObj, Vertex *sp, bool end, bool ignoreTransparent ) const
 {
     return 0;
 }
@@ -234,7 +234,7 @@ float Object2D::getSize() const
     return size;
 }
 
-bool Object2D::calcHitPoint( Vertex pos, Vertex dir, Vertex& hitpoint ) const
+bool Object2D::calcHitPoint( Vertex pos, Vertex dir, Vertex &hitpoint ) const
 {
     return 0;
 }
@@ -254,25 +254,12 @@ bool Object2D::canCollide()
     return collision;
 }
 
-Object2D* Object2D::getThis()
-{
-    ref++;
-    return this;
-}
-
-Object2D* Object2D::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 Welt2D::Welt2D()
+    : ReferenceCounter()
 {
     objects = new RCArray< Object2D >();
     memset( &info, 0, sizeof( WeltInfo ) );
-    ref = 1;
 }
 
 Welt2D::~Welt2D()
@@ -301,7 +288,7 @@ void Welt2D::setCircular( bool circular )
     info.circular = circular;
 }
 
-Object2D* Welt2D::zObjectAt( int x, int y, bool ignoreTransparentFlag )
+Object2D *Welt2D::zObjectAt( int x, int y, bool ignoreTransparentFlag )
 {
     for( auto o = objects->getIterator(); o; o++ )
     {
@@ -311,18 +298,18 @@ Object2D* Welt2D::zObjectAt( int x, int y, bool ignoreTransparentFlag )
     return 0;
 }
 
-Object2D* Welt2D::getObjectAt( int x, int y, bool ignoreTransparentFlag )
+Object2D *Welt2D::getObjectAt( int x, int y, bool ignoreTransparentFlag )
 {
-    Object2D* tmp = zObjectAt( x, y, ignoreTransparentFlag );
-    return tmp ? tmp->getThis() : 0;
+    Object2D *tmp = zObjectAt( x, y, ignoreTransparentFlag );
+    return tmp ? (Object2D *)tmp->getThis() : 0;
 }
 
-void Welt2D::addObject( Object2D* obj )
+void Welt2D::addObject( Object2D *obj )
 {
     objects->add( obj );
 }
 
-void Welt2D::removeObject( Object2D* zObj )
+void Welt2D::removeObject( Object2D *zObj )
 {
     int anz = objects->getEintragAnzahl();
     for( int i = 0; i < anz; i++ )
@@ -380,7 +367,7 @@ void Welt2D::impuls( Vertex worldPos, Vertex worldDir )
 {
     Vertex hitPoint;
     float dist = INFINITY;
-    Object2D* o = 0;
+    Object2D *o = 0;
     for( auto obj = objects->getIterator(); obj; obj++ )
     {
         if( obj->calcHitPoint( worldPos, worldDir, hitPoint ) )
@@ -414,7 +401,7 @@ bool Welt2D::tick( double zeit )
     return ret;
 }
 
-void Welt2D::render( Mat3< float >& kamMat, Punkt size, Bild& zRObj, int xOffset, int yOffset, const char* kamName )
+void Welt2D::render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, int xOffset, int yOffset, const char *kamName )
 {
     for( auto obj = objects->getIterator(); obj; obj++ )
     {
@@ -438,7 +425,7 @@ void Welt2D::render( Mat3< float >& kamMat, Punkt size, Bild& zRObj, int xOffset
     }
 }
 
-void Welt2D::render( Mat3< float >& kamMat, Punkt size, Bild& zRObj, const char* kamName )
+void Welt2D::render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, const char *kamName )
 {
     if( !info.hasSize || !info.circular )
     {
@@ -476,25 +463,12 @@ void Welt2D::render( Mat3< float >& kamMat, Punkt size, Bild& zRObj, const char*
     }
 }
 
-const WeltInfo& Welt2D::getWorldInfo() const
+const WeltInfo &Welt2D::getWorldInfo() const
 {
     return info;
 }
 
-Iterator< Object2D* > Welt2D::getMembers()
+Iterator< Object2D * > Welt2D::getMembers()
 {
     return objects->getIterator();
-}
-
-Welt2D* Welt2D::getThis()
-{
-    ref++;
-    return this;
-}
-
-Welt2D* Welt2D::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 11
Welt2D.h

@@ -20,7 +20,7 @@ namespace Framework
         Punkt size;
     };
 
-    class Object2D
+    class Object2D : public virtual ReferenceCounter
     {
     protected:
         std::queue< std::function< void() > > actions;
@@ -30,7 +30,6 @@ namespace Framework
         float rotation;
         float size;
         bool collision;
-        int ref;
 
     public:
         DLLEXPORT Object2D();
@@ -143,19 +142,13 @@ namespace Framework
         //! Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen können
         //! \return 0, falls keine Kollisionen existieren
         DLLEXPORT bool canCollide();
-        //! Erhöht den Reference Counter um 1 und gibt this zurück
-        DLLEXPORT Object2D *getThis();
-        //! Verringert den Reference Counter um 1 (bei 0 löscht sich das Objekt selbst)
-        //!  Gibt 0 zurück
-        DLLEXPORT Object2D *release();
     };
 
-    class Welt2D
+    class Welt2D : public virtual ReferenceCounter
     {
     private:
         RCArray< Object2D > *objects;
         WeltInfo info;
-        int ref;
 
         void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, int xOffset, int yOffset, const char *kamName );
 
@@ -177,7 +170,5 @@ namespace Framework
         DLLEXPORT void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, const char *kamName );
         DLLEXPORT const WeltInfo &getWorldInfo() const;
         DLLEXPORT Iterator< Object2D * > getMembers();
-        DLLEXPORT Welt2D *getThis();
-        DLLEXPORT Welt2D *release();
     };
 }

+ 2 - 20
Welt3D.cpp

@@ -10,13 +10,13 @@ using namespace Framework;
 // Inhalt der Welt3D Klasse aus Welt3D.h
 // Konstructor
 Welt3D::Welt3D()
+    : ReferenceCounter()
 {
     members = new RCArray< Model3D >();
     pointLightCount = 0;
     diffuseLightCount = 0;
     pointLights = 0;
     diffuseLights = 0;
-    ref = 1;
     rend = 0;
 }
 
@@ -187,22 +187,4 @@ void Framework::Welt3D::copyLight( DXBuffer *zDiffuse, DXBuffer *zPoints ) const
     zPoints->setData( pointLights );
     zPoints->setLength( pointLightCount * (int)sizeof( PointLight ) );
     zPoints->copieren();
-}
-
-// Erhöht den Reference Counting Zähler.
-//  return: this.
-Welt3D *Welt3D::getThis()
-{
-    ref++;
-    return this;
-}
-
-// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-//  return: 0.
-Welt3D *Welt3D::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
+}

+ 1 - 8
Welt3D.h

@@ -15,7 +15,7 @@ namespace Framework
     class DXBuffer;
 
     //! Speichert alle 3D Zeichnungen einer Szene ab
-    class Welt3D
+    class Welt3D : public virtual ReferenceCounter
     {
     protected:
         DiffuseLight *diffuseLights;
@@ -27,7 +27,6 @@ namespace Framework
         RCArray< Model3D > *members;
         bool rend;
         Critical cs;
-        int ref;
 
     public:
         //! Konstructor
@@ -66,11 +65,5 @@ namespace Framework
         //! \param zDiffuse der Buffer für die rechtungs Lichtquellen
         //! \param zPoints der Buffer für die Punkt Lichtquellen
         DLLEXPORT void copyLight( DXBuffer *zDiffuse, DXBuffer *zPoints ) const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Welt3D *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT Welt3D *release();
     };
 }

+ 25 - 39
XML.cpp

@@ -13,8 +13,8 @@ Element::Element( Text string )
 //  string: entweder der name des Elements oder ein XML Text der geparsed werden soll
 //  zParent: Ein Zeiger auf das eltern element (ohne erhöhten reference Counter)
 Element::Element( Text string, Element *zParent )
+    : ReferenceCounter()
 {
-    ref = 1;
     children = new RCArray< Element >();
     attributes = new RCArray< Text >();
     attributeValues = new RCArray< Text >();
@@ -306,7 +306,7 @@ void Element::removeAllChilds()
 void Element::removeChilds( RCArray<Element> *childs )
 {
     for( auto i = childs->getIterator(); i; i++ )
-        removeChild( i->getThis() );
+        removeChild( (XML::Element *)i->getThis() );
     childs->release();
 }
 
@@ -314,7 +314,7 @@ void Element::removeChilds( RCArray<Element> *childs )
 void Element::remove()
 {
     if( parent )
-        parent->removeChild( getThis() );
+        parent->removeChild( (XML::Element *)getThis() );
 }
 
 // setzt den Text in dem Element falls es keine childs gibt
@@ -351,7 +351,7 @@ Element *Element::zChild( int i ) const
 // gibt das parent element zurück
 Element *Element::getParent() const
 {
-    return parent ? parent->getThis() : 0;
+    return parent ? (Element *)parent->getThis() : 0;
 }
 
 // gibt das parent element zurück (ohne erhöhten reference Counter)
@@ -361,7 +361,7 @@ Element *Element::zParent() const
 }
 
 // gibt einen iterator zurück mit dem durch alle childs iteriert werden kann
-Iterator< Element* > Element::getChilds() const
+Iterator< Element * > Element::getChilds() const
 {
     return children->getIterator();
 }
@@ -369,7 +369,7 @@ Iterator< Element* > Element::getChilds() const
 // gibt einen selector zurück der alle childs beinhaltet
 Editor Element::selectChildren() const
 {
-    return Editor( children->getThis() );
+    return Editor( ( RCArray<XML::Element> * )children->getThis() );
 }
 
 // gibt eine Liste mit childs zurück, die einen bestimmten Namen haben
@@ -380,7 +380,7 @@ Editor Element::selectChildsByName( Text name ) const
     for( auto i = children->getIterator(); i; i++ )
     {
         if( i->getName().istGleich( name ) )
-            tmp->add( i->getThis() );
+            tmp->add( (XML::Element *)i->getThis() );
     }
     return Editor( tmp );
 }
@@ -393,7 +393,7 @@ Editor Element::selectChildsByAttribute( Text attribute ) const
     for( auto i = children->getIterator(); i; i++ )
     {
         if( i->hasAttribute( attribute ) )
-            tmp->add( i->getThis() );
+            tmp->add( (XML::Element *)i->getThis() );
     }
     return Editor( tmp );
 }
@@ -407,7 +407,7 @@ Editor Element::selectChildsByAttribute( Text attribute, Text value ) const
     for( auto i = children->getIterator(); i; i++ )
     {
         if( i->hasAttribute( attribute ) && i->getAttributeValue( attribute ).istGleich( value ) )
-            tmp->add( i->getThis() );
+            tmp->add( (XML::Element *)i->getThis() );
     }
     return Editor( tmp );
 }
@@ -454,13 +454,13 @@ Text Element::getAttributeValue( Text attribut ) const
 }
 
 // gibt einen iterator zurück mit dem durch alle Attribut Namen iteriert werden kann
-Iterator< Text* > Element::getAttributeNames() const
+Iterator< Text * > Element::getAttributeNames() const
 {
     return attributes->getIterator();
 }
 
 // gibt einen iterator zurück mit dem durch alle Attribut Werte iteriert werden kann
-Iterator< Text* > Element::getAttributeValues() const
+Iterator< Text * > Element::getAttributeValues() const
 {
     return attributeValues->getIterator();
 }
@@ -528,33 +528,19 @@ Element *Element::dublicate() const
     return new Element( toString() );
 }
 
-// erhöht den reference Counter um 1 und gibt this zurück
-Element *Element::getThis()
-{
-    ref++;
-    return this;
-}
-
-// verringert den reference Counter um 1 und gibt 0 zurück
-Element *Element::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 // Erzeugt einen neuen XML Editor mit einer Liste von Objekten die editiert werden sollen
 Editor::Editor( RCArray< Element > *elements )
+    : ReferenceCounter()
 {
     this->elements = new RCArray< Element >();
     for( auto i = elements->getIterator(); i; i++ )
-        this->elements->add( i->getThis() );
+        this->elements->add( (XML::Element *)i->getThis() );
     elements->release();
 }
 
 Editor::Editor( const Editor &e )
-    : Editor( e.elements->getThis() )
+    : Editor( ( RCArray<XML::Element> * )e.elements->getThis() )
 {}
 
 Editor::~Editor()
@@ -593,7 +579,7 @@ void Editor::addChild( Element *child )
 void Editor::removeChild( Element *child )
 {
     for( auto i = elements->getIterator(); i; i++ )
-        i->removeChild( child->getThis() );
+        i->removeChild( (XML::Element *)child->getThis() );
     child->release();
 }
 
@@ -617,7 +603,7 @@ void Editor::removeAllChilds()
 void Editor::removeChilds( RCArray<Element> *childs )
 {
     for( auto i = elements->getIterator(); i; i++ )
-        i->removeChilds( childs->getThis() );
+        i->removeChilds( ( RCArray<XML::Element> * )childs->getThis() );
     childs->release();
 }
 
@@ -650,7 +636,7 @@ Editor Editor::selectChildren() const
     {
         for( auto j = i->selectChildren().getIterator(); j; j++ )
         {
-            list->add( j->getThis() );
+            list->add( (XML::Element *)j->getThis() );
         }
     }
     return Editor( list );
@@ -663,7 +649,7 @@ Editor Editor::selectParents() const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->parent )
-            list->add( i->parent->getThis() );
+            list->add( (XML::Element *)i->parent->getThis() );
     }
     return Editor( list );
 }
@@ -676,7 +662,7 @@ Editor Editor::whereNameEquals( Text name ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->getName().istGleich( name ) )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -689,7 +675,7 @@ Editor Editor::whereChildWithNameExists( Text name ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->selectChildsByName( name ).elements->getEintragAnzahl() )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -702,7 +688,7 @@ Editor Editor::whereChildWithAttributeExists( Text attribute ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->selectChildsByAttribute( attribute ).elements->getEintragAnzahl() )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -716,7 +702,7 @@ Editor Editor::whereChildWithAttributeExists( Text attribute, Text value ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->selectChildsByAttribute( attribute, value ).elements->getEintragAnzahl() )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -729,7 +715,7 @@ Editor Editor::whereAttributeExists( Text attribute ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->hasAttribute( attribute ) )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -743,7 +729,7 @@ Editor Editor::whereAttributeEquals( Text attribute, Text value ) const
     for( auto i = elements->getIterator(); i; i++ )
     {
         if( i->hasAttribute( attribute ) && i->getAttributeValue( attribute ).istGleich( value ) )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }
@@ -759,7 +745,7 @@ Editor Editor::without( Editor e ) const
         for( auto j = e.elements->getIterator(); j; j++ )
             found |= i._ == j._;
         if( !found )
-            list->add( i->getThis() );
+            list->add( (XML::Element *)i->getThis() );
     }
     return Editor( list );
 }

+ 3 - 7
XML.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Array.h"
+#include "ReferenceCounter.h"
 #include <functional>
 
 namespace Framework
@@ -12,10 +13,9 @@ namespace Framework
         class Editor;
 
         //! Ein XML element der Form \code <name attribut1 attribut2="value">text oder childs</name> \endcode
-        class Element
+        class Element : public virtual ReferenceCounter
         {
         private:
-            int ref;
             RCArray< Element > *children;
             RCArray< Text > *attributes;
             RCArray< Text > *attributeValues;
@@ -108,16 +108,12 @@ namespace Framework
             DLLEXPORT Text toString() const;
             //! Erzeugt eine Kopie ohne referenzen auf dieses objekt
             DLLEXPORT Element *dublicate() const;
-            //! erhöht den reference Counter um 1 und gibt this zurück
-            DLLEXPORT Element *getThis();
-            //! verringert den reference Counter um 1 und gibt 0 zurück
-            DLLEXPORT Element *release();
 
             friend Editor;
         };
 
         //! Ein XML Editor der immer gleich mehrere Elemente editieren kann
-        class Editor
+        class Editor : public virtual ReferenceCounter
         {
         private:
             RCArray< Element > *elements;

+ 21 - 29
Zeichnung.cpp

@@ -11,6 +11,7 @@
 #include "TextFeld.h"
 #include "UIInitialization.h"
 #include "Schrift.h"
+#include "Bildschirm.h"
 #ifdef WIN32
 #include <Windows.h>
 #endif
@@ -20,7 +21,8 @@ using namespace Framework;
 // Inhalt der Zeichnung Klasse aus Zeichnung.h
 // Konstruktor 
 Zeichnung::Zeichnung()
-    : pos( 0, 0 ),
+    : ReferenceCounter(),
+    pos( 0, 0 ),
     gr( 0, 0 ),
     makParam( 0 ),
     takParam( 0 ),
@@ -34,15 +36,18 @@ Zeichnung::Zeichnung()
     toolTip( 0 ),
     style( 0 ),
     rend( 0 ),
-    onNeedToolTip( 0 ),
-    ref( 1 )
+    onNeedToolTip( 0 )
 {}
 
 // Destruktor 
 Zeichnung::~Zeichnung()
 {
     if( toolTip )
+    {
+        if( toolTip->zBildschirm() )
+            toolTip->zBildschirm()->removeToolTip( toolTip );
         toolTip->release();
+    }
 }
 
 void Zeichnung::doMausEreignis( MausEreignis &me, bool userRet )
@@ -95,7 +100,7 @@ void Zeichnung::setNeedToolTipEvent( std::function< void( Zeichnung * ) > onNeed
 
 // legt den tooltip fest
 // tt: der tooltip
-void Zeichnung::setToolTipZ( ToolTip * tt )
+void Zeichnung::setToolTipZ( ToolTip *tt )
 {
     if( toolTip )
         toolTip->release();
@@ -154,7 +159,7 @@ void Zeichnung::setNTastaturEreignis( TastaturAktion ak ) // setzt das TastaturE
     nTak = ak;
 }
 
-void Zeichnung::doPublicMausEreignis( MausEreignis & me ) // ruft Mak auf
+void Zeichnung::doPublicMausEreignis( MausEreignis &me ) // ruft Mak auf
 {
     bool lock = hatStyle( Style::MELockZeichnung );
     if( lock )
@@ -219,7 +224,7 @@ void Zeichnung::doPublicMausEreignis( MausEreignis & me ) // ruft Mak auf
         unlockZeichnung();
 }
 
-void Zeichnung::doTastaturEreignis( TastaturEreignis & te ) // ruft Tak auf
+void Zeichnung::doTastaturEreignis( TastaturEreignis &te ) // ruft Tak auf
 {
     if( te.verarbeitet )
         return;
@@ -229,7 +234,7 @@ void Zeichnung::doTastaturEreignis( TastaturEreignis & te ) // ruft Tak auf
         te.verarbeitet = nTak( ntakParam, this, te );
 }
 
-void Zeichnung::setPosition( const Punkt & pos ) // setzt die position
+void Zeichnung::setPosition( const Punkt &pos ) // setzt die position
 {
     lockZeichnung();
     if( this->pos != pos )
@@ -260,7 +265,7 @@ void Zeichnung::setY( int yPos )
     unlockZeichnung();
 }
 
-void Zeichnung::setSize( const Punkt & gr ) // setzt die Größe
+void Zeichnung::setSize( const Punkt &gr ) // setzt die Größe
 {
     lockZeichnung();
     if( this->gr != gr )
@@ -336,7 +341,7 @@ void Zeichnung::removeStyle( __int64 style )
     }
 }
 
-void Zeichnung::render( Bild & zRObj )
+void Zeichnung::render( Bild &zRObj )
 {
     if( toolTip && ( style | Style::Sichtbar ) == style )
         toolTip->setZeichnen();
@@ -446,19 +451,6 @@ Zeichnung *Zeichnung::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     return obj;
 }
 
-Zeichnung *Zeichnung::getThis()
-{
-    ref++;
-    return this;
-}
-
-Zeichnung *Zeichnung::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der ZeichnungHintergrund Klasse aus Zeichnung.h
 // Konstruktor 
@@ -492,7 +484,7 @@ ZeichnungHintergrund::~ZeichnungHintergrund()
         vertikalScrollBar->release();
 }
 
-void ZeichnungHintergrund::setHintergrundBild( Bild * bild ) // setzt das Hintergrund Bild
+void ZeichnungHintergrund::setHintergrundBild( Bild *bild ) // setzt das Hintergrund Bild
 {
     if( !hintergrundBild )
         hintergrundBild = new Bild();
@@ -505,7 +497,7 @@ void ZeichnungHintergrund::setHintergrundBild( Bild * bild ) // setzt das Hinter
     rend = 1;
 }
 
-void ZeichnungHintergrund::setHintergrundBildZ( Bild * bild ) // setzt einen Zeiger zum Hintergrund Bild
+void ZeichnungHintergrund::setHintergrundBildZ( Bild *bild ) // setzt einen Zeiger zum Hintergrund Bild
 {
     if( hintergrundBild != bild )
     {
@@ -525,7 +517,7 @@ void ZeichnungHintergrund::setHintergrundFarbe( int fc ) // setzt die Hintergrun
     }
 }
 
-void ZeichnungHintergrund::setAlphaFeldZ( AlphaFeld * buff ) // setzt einen Zeiger zum Hintergrund Buffer
+void ZeichnungHintergrund::setAlphaFeldZ( AlphaFeld *buff ) // setzt einen Zeiger zum Hintergrund Buffer
 {
     if( hintergrundFeld != buff )
     {
@@ -564,7 +556,7 @@ void ZeichnungHintergrund::setAlphaFeldFarbe( int fc ) // setzt die Farbe des Hi
     }
 }
 
-void ZeichnungHintergrund::setRahmenZ( Rahmen * ram ) // setzt einen Zeiger zum Rahmen
+void ZeichnungHintergrund::setRahmenZ( Rahmen *ram ) // setzt einen Zeiger zum Rahmen
 {
     if( rahmen != ram )
     {
@@ -698,7 +690,7 @@ bool ZeichnungHintergrund::tick( double tickVal )
     return Zeichnung::tick( tickVal );
 }
 
-void ZeichnungHintergrund::render( Bild & rObj )
+void ZeichnungHintergrund::render( Bild &rObj )
 {
     innenPosition.x = pos.x;
     innenPosition.y = pos.y;
@@ -815,7 +807,7 @@ Bild *ZeichnungHintergrund::getHintergrundBild() const // gibt getThis vom Hinte
 {
     if( !hintergrundBild )
         return 0;
-    return hintergrundBild->getThis();
+    return (Bild *)hintergrundBild->getThis();
 }
 
 Bild *ZeichnungHintergrund::zHintergrundBild() const // gibt das Hintergrund Bild zurück
@@ -934,7 +926,7 @@ Zeichnung *ZeichnungHintergrund::dublizieren() const // Erzeugt eine Kopie des Z
     if( rahmen )
         obj->setRahmenZ( (Rahmen *)rahmen->dublizieren() );
     if( hintergrundBild )
-        obj->setHintergrundBild( hintergrundBild->getThis() );
+        obj->setHintergrundBild( (Bild *)hintergrundBild->getThis() );
     if( vertikalScrollBar )
     {
         obj->setVertikalKlickScroll( vertikalScrollBar->getKlickScroll() );

+ 3 - 9
Zeichnung.h

@@ -5,6 +5,7 @@
 #include "MausEreignis.h"
 #include "TastaturEreignis.h"
 #include "Critical.h"
+#include "ReferenceCounter.h"
 #include <queue>
 #include <functional>
 
@@ -23,14 +24,14 @@ namespace Framework
     class Schrift;
 
     //! Eine Zeichnung für das 2D GUI Framework
-    class Zeichnung
+    class Zeichnung : public virtual ReferenceCounter
     {
     public:
         class Style
         {
         public:
             //! Wenn dieser Style gesetzt ist, wird die Zeichnung beim Zeichnen angezeigt
-            const static __int64 Sichtbar = 0x00001; 
+            const static __int64 Sichtbar = 0x00001;
             //! Wenn dieser Style gesetzt ist, kann der Benutzer mit der Zeichnung interagieren
             const static __int64 Erlaubt = 0x00002;
             //! Wenn dieser Style gesetzt ist, wird ein TastaturEreignis von der Zeichnung verarbeitet
@@ -64,7 +65,6 @@ namespace Framework
         bool rend;
         std::queue< std::function< void() > > actions;
         std::function< void( Zeichnung * ) > onNeedToolTip;
-        int ref;
 
         //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
         //! \param me Das MausEreignis
@@ -219,12 +219,6 @@ namespace Framework
         DLLEXPORT bool hatStyleNicht( __int64 style ) const;
         //! Kopiert die Komplette Zeichnung, so dass sie ohne Effekt auf das Original verändert werden kann
         DLLEXPORT virtual Zeichnung *dublizieren() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Zeichnung *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT virtual Zeichnung *release();
     };
 
     //! Eine Zeichnung für das 2D GUI Framework mit Hintergrund, Rahmen und Scroll Balken

+ 1 - 14
Zeichnung3D.cpp

@@ -5,6 +5,7 @@ using namespace Framework;
 
 // Konstruktor
 Zeichnung3D::Zeichnung3D()
+    : ReferenceCounter()
 {
     welt = welt.identity();
     pos = Vec3< float >( 0, 0, 0 );
@@ -13,7 +14,6 @@ Zeichnung3D::Zeichnung3D()
     alpha = 0;
     radius = 0;
     size = 1.f;
-    ref = 1;
 }
 
 Zeichnung3D::~Zeichnung3D()
@@ -213,17 +213,4 @@ float Zeichnung3D::getZDrehung() const
 const Mat4< float > &Zeichnung3D::getMatrix() const
 {
     return welt;
-}
-
-Zeichnung3D *Zeichnung3D::getThis()
-{
-    ref++;
-    return this;
-}
-
-Zeichnung3D *Zeichnung3D::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 2 - 8
Zeichnung3D.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include "Mat4.h"
+#include "ReferenceCounter.h"
 
 namespace Framework
 {
@@ -9,7 +10,7 @@ namespace Framework
     class Render3D; //! Render3D.h
 
     //! Ein Objekt, das von der Bildschirm3D Klasse gezeichnet werden kann.
-    class Zeichnung3D
+    class Zeichnung3D : public virtual ReferenceCounter
     {
     protected:
         Vec3< float > pos; //! Position des Objekts
@@ -19,7 +20,6 @@ namespace Framework
         bool alpha; //! Speichert ob das Objekt teilweise oder ganz transparente stellen enthält
         bool rend;
         float size;
-        int ref;
 
     public:
         //! Konstruktor
@@ -99,11 +99,5 @@ namespace Framework
         DLLEXPORT float getZDrehung() const;
         //! Gibt die Matrix zurück, die die Zeichnung in den Welt Raum übersetzt
         DLLEXPORT const Mat4< float > &getMatrix() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT Zeichnung3D *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT virtual Zeichnung3D *release();
     };
 }

+ 87 - 147
Zeit.cpp

@@ -57,7 +57,7 @@ int gettimeofday( struct timeval *tv, struct timezone *tz )
             _tzset();
             ++tzflag;
         }
-        _get_timezone( ( long* )&( tz->tz_minuteswest ) );
+        _get_timezone( (long *)&( tz->tz_minuteswest ) );
         tz->tz_minuteswest /= 60;
         _get_daylight( &( tz->tz_dsttime ) );
     }
@@ -109,10 +109,10 @@ int Uhrzeit::update() // berechnet die neue Zeit
 }
 
 Uhrzeit::Uhrzeit()
-    : stunde( 0 ),
+    : ReferenceCounter(),
+    stunde( 0 ),
     minute( 0 ),
-    sekunde( 0 ),
-    ref( 1 )
+    sekunde( 0 )
 {}
 
 int Uhrzeit::setUhrzeit( Uhrzeit *zeit ) // setzt die Uhrzeit
@@ -141,17 +141,17 @@ int Uhrzeit::setUhrzeit( const char *format, const char *zeit ) // format Beispi
         switch( *f )
         {
         case 'h':
-            stunde = TextZuInt( (char*)zeit, &ende, 10 );
+            stunde = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            minute = TextZuInt( (char*)zeit, &ende, 10 );
+            minute = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sekunde = TextZuInt( (char*)zeit, &ende, 10 );
+            sekunde = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -213,17 +213,17 @@ int Uhrzeit::plusUhrzeit( const char *format, const char *zeit )
         switch( *f )
         {
         case 'h':
-            stunde += TextZuInt( (char*)zeit, &ende, 10 );
+            stunde += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            minute += TextZuInt( (char*)zeit, &ende, 10 );
+            minute += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sekunde += TextZuInt( (char*)zeit, &ende, 10 );
+            sekunde += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -286,17 +286,17 @@ int Uhrzeit::minusUhrzeit( const char *format, const char *zeit )
         switch( *f )
         {
         case 'h':
-            stunde -= TextZuInt( (char*)zeit, &ende, 10 );
+            stunde -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            minute -= TextZuInt( (char*)zeit, &ende, 10 );
+            minute -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sekunde -= TextZuInt( (char*)zeit, &ende, 10 );
+            sekunde -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -393,17 +393,17 @@ bool Uhrzeit::istGleich( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'h':
-            st = TextZuInt( (char*)zeit, &ende, 10 );
+            st = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            min = TextZuInt( (char*)zeit, &ende, 10 );
+            min = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sek = TextZuInt( (char*)zeit, &ende, 10 );
+            sek = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -488,17 +488,17 @@ bool Uhrzeit::istKleiner( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'h':
-            st = TextZuInt( (char*)zeit, &ende, 10 );
+            st = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            min = TextZuInt( (char*)zeit, &ende, 10 );
+            min = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sek = TextZuInt( (char*)zeit, &ende, 10 );
+            sek = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -558,17 +558,17 @@ bool Uhrzeit::istLater( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'h':
-            st = TextZuInt( (char*)zeit, &ende, 10 );
+            st = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            min = TextZuInt( (char*)zeit, &ende, 10 );
+            min = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            sek = TextZuInt( (char*)zeit, &ende, 10 );
+            sek = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -587,21 +587,6 @@ bool Uhrzeit::istLater( const char *format, Text *zeit ) const
     return ret;
 }
 
-// Reference Counting 
-Uhrzeit *Uhrzeit::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Uhrzeit *Uhrzeit::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der Datum Klasse aus Zeit.h
 // Privat 
 void Datum::update() // berechnet die neue Zeit
@@ -652,10 +637,10 @@ void Datum::update() // berechnet die neue Zeit
 
 // Konstruktor 
 Datum::Datum()
-    : jahr( 0 ),
+    : ReferenceCounter(),
+    jahr( 0 ),
     monat( 0 ),
-    tag( 0 ),
-    ref( 1 )
+    tag( 0 )
 {
     int maxT[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
     maxTage = new int[ 12 ];
@@ -695,17 +680,17 @@ void Datum::setDatum( const char *format, const char *datum ) // format Beispiel
         switch( *f )
         {
         case 'y':
-            jahr = TextZuInt( (char*)datum, &ende, 10 );
+            jahr = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            monat = TextZuInt( (char*)datum, &ende, 10 );
+            monat = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            tag = TextZuInt( (char*)datum, &ende, 10 );
+            tag = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -767,17 +752,17 @@ void Datum::plusDatum( const char *format, const char *datum )
         switch( *f )
         {
         case 'y':
-            jahr += TextZuInt( (char*)datum, &ende, 10 );
+            jahr += TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            monat += TextZuInt( (char*)datum, &ende, 10 );
+            monat += TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            tag += TextZuInt( (char*)datum, &ende, 10 );
+            tag += TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -839,17 +824,17 @@ void Datum::minusDatum( const char *format, const char *datum )
         switch( *f )
         {
         case 'y':
-            jahr -= TextZuInt( (char*)datum, &ende, 10 );
+            jahr -= TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            monat -= TextZuInt( (char*)datum, &ende, 10 );
+            monat -= TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            tag -= TextZuInt( (char*)datum, &ende, 10 );
+            tag -= TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -945,17 +930,17 @@ bool Datum::istGleich( const char *format, const char *datum ) const
         switch( *f )
         {
         case 'y':
-            j = TextZuInt( (char*)datum, &ende, 10 );
+            j = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)datum, &ende, 10 );
+            m = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            t = TextZuInt( (char*)datum, &ende, 10 );
+            t = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -1040,17 +1025,17 @@ bool Datum::istKleiner( const char *format, const char *datum ) const
         switch( *f )
         {
         case 'y':
-            j = TextZuInt( (char*)datum, &ende, 10 );
+            j = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)datum, &ende, 10 );
+            m = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            t = TextZuInt( (char*)datum, &ende, 10 );
+            t = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -1110,17 +1095,17 @@ bool Datum::istLater( const char *format, const char *datum ) const
         switch( *f )
         {
         case 'y':
-            j = TextZuInt( (char*)datum, &ende, 10 );
+            j = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)datum, &ende, 10 );
+            m = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
         case 'd':
-            t = TextZuInt( (char*)datum, &ende, 10 );
+            t = TextZuInt( (char *)datum, &ende, 10 );
             datum = ende;
             ende = 0;
             break;
@@ -1139,27 +1124,12 @@ bool Datum::istLater( const char *format, Text *datum ) const
     return ret;
 }
 
-// Reference Counting 
-Datum *Datum::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Datum *Datum::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der Zeit Klasse aus Zeit.h
 // Konstruktor 
 Zeit::Zeit()
-    : datum( new Datum() ),
-    uhrzeit( new Uhrzeit() ),
-    ref( 1 )
+    : ReferenceCounter(),
+    datum( new Datum() ),
+    uhrzeit( new Uhrzeit() )
 {}
 
 // Destruktor 
@@ -1199,32 +1169,32 @@ void Zeit::setZeit( const char *format, const char *zeit ) // format Beispiele:
         switch( *f )
         {
         case 'y':
-            y = TextZuInt( (char*)zeit, &ende, 10 );
+            y = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)zeit, &ende, 10 );
+            m = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d = TextZuInt( (char*)zeit, &ende, 10 );
+            d = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h = TextZuInt( (char*)zeit, &ende, 10 );
+            h = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i = TextZuInt( (char*)zeit, &ende, 10 );
+            i = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s = TextZuInt( (char*)zeit, &ende, 10 );
+            s = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1302,32 +1272,32 @@ void Zeit::plusZeit( const char *format, const char *zeit )
         switch( *f )
         {
         case 'y':
-            y += TextZuInt( (char*)zeit, &ende, 10 );
+            y += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m += TextZuInt( (char*)zeit, &ende, 10 );
+            m += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d += TextZuInt( (char*)zeit, &ende, 10 );
+            d += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h += TextZuInt( (char*)zeit, &ende, 10 );
+            h += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i += TextZuInt( (char*)zeit, &ende, 10 );
+            i += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s += TextZuInt( (char*)zeit, &ende, 10 );
+            s += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1405,32 +1375,32 @@ void Zeit::minusZeit( const char *format, const char *zeit )
         switch( *f )
         {
         case 'y':
-            y -= TextZuInt( (char*)zeit, &ende, 10 );
+            y -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m -= TextZuInt( (char*)zeit, &ende, 10 );
+            m -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d -= TextZuInt( (char*)zeit, &ende, 10 );
+            d -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h += TextZuInt( (char*)zeit, &ende, 10 );
+            h += TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i -= TextZuInt( (char*)zeit, &ende, 10 );
+            i -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s -= TextZuInt( (char*)zeit, &ende, 10 );
+            s -= TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1536,32 +1506,32 @@ bool Zeit::istGleich( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'y':
-            y = TextZuInt( (char*)zeit, &ende, 10 );
+            y = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)zeit, &ende, 10 );
+            m = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d = TextZuInt( (char*)zeit, &ende, 10 );
+            d = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h = TextZuInt( (char*)zeit, &ende, 10 );
+            h = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i = TextZuInt( (char*)zeit, &ende, 10 );
+            i = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s = TextZuInt( (char*)zeit, &ende, 10 );
+            s = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1587,7 +1557,7 @@ bool Zeit::istGleich( int jahr, int monat, int tag, int stunde, int minute, int
 
 Datum *Zeit::getDatum() const // gibt das Datum zurück
 {
-    return datum->getThis();
+    return (Datum *)datum->getThis();
 }
 
 Datum *Zeit::zDatum() const
@@ -1597,7 +1567,7 @@ Datum *Zeit::zDatum() const
 
 Uhrzeit *Zeit::getUhrzeit() const // gibt die Uhrzeit zurück
 {
-    return uhrzeit->getThis();
+    return (Uhrzeit *)uhrzeit->getThis();
 }
 
 Uhrzeit *Zeit::zUhrzeit() const
@@ -1663,32 +1633,32 @@ bool Zeit::istKleiner( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'y':
-            y = TextZuInt( (char*)zeit, &ende, 10 );
+            y = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)zeit, &ende, 10 );
+            m = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d = TextZuInt( (char*)zeit, &ende, 10 );
+            d = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h = TextZuInt( (char*)zeit, &ende, 10 );
+            h = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i = TextZuInt( (char*)zeit, &ende, 10 );
+            i = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s = TextZuInt( (char*)zeit, &ende, 10 );
+            s = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1775,32 +1745,32 @@ bool Zeit::istLater( const char *format, const char *zeit ) const
         switch( *f )
         {
         case 'y':
-            y = TextZuInt( (char*)zeit, &ende, 10 );
+            y = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'm':
-            m = TextZuInt( (char*)zeit, &ende, 10 );
+            m = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'd':
-            d = TextZuInt( (char*)zeit, &ende, 10 );
+            d = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'h':
-            h = TextZuInt( (char*)zeit, &ende, 10 );
+            h = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 'i':
-            i = TextZuInt( (char*)zeit, &ende, 10 );
+            i = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
         case 's':
-            s = TextZuInt( (char*)zeit, &ende, 10 );
+            s = TextZuInt( (char *)zeit, &ende, 10 );
             zeit = ende;
             ende = 0;
             break;
@@ -1829,28 +1799,13 @@ bool Zeit::istLater( const char *format, Text *zeit ) const
     return ret;
 }
 
-// Reference Counting 
-Zeit *Zeit::getThis()
-{
-    ++ref;
-    return this;
-}
-
-Zeit *Zeit::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der ZeitMesser Klasse aus Zeit.h
 // Konstruktor 
 ZeitMesser::ZeitMesser()
-    : start( 0 ),
+    : ReferenceCounter(),
+    start( 0 ),
     ende( 0 ),
-    messung( 0 ),
-    ref( 1 )
+    messung( 0 )
 {}
 
 // Destruktor 
@@ -1891,21 +1846,6 @@ double ZeitMesser::getStunden() const // gibt den stundenabstand zwischen start
     return messung / 3600;
 }
 
-// Reference Counting 
-ZeitMesser *ZeitMesser::getThis()
-{
-    ++ref;
-    return this;
-}
-
-ZeitMesser *ZeitMesser::release()
-{
-    --ref;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Globale Funktionen 
 Uhrzeit *Framework::getUhrzeit() // gibt die aktuelle Uhrzeit zurück
 {

+ 5 - 32
Zeit.h

@@ -2,6 +2,7 @@
 #define Zeit_H
 
 #include "Betriebssystem.h"
+#include "ReferenceCounter.h"
 #include <time.h>
 
 namespace Framework
@@ -13,11 +14,10 @@ namespace Framework
     class ZeitMesser; //! Aus dieser Datei
 
     //! Diese Klasse speichert eine Uhrzeit in form von Stunden, Minuten und Sekunden
-    class Uhrzeit
+    class Uhrzeit : public virtual ReferenceCounter
     {
     private:
         int stunde, minute, sekunde;
-        int ref;
         int update();
 
     public:
@@ -234,20 +234,13 @@ namespace Framework
         //! \return (true), wenn die gespeicherte Zeit größer als die übergebene Zeit ist. (false) sonst.
         //! Beispiel: (5:30:00).istGrößer( "h:i:s", "10:40:29" ); return false
         DLLEXPORT bool istLater( const char *format, Text *zeit ) const;
-        //! Erhöht den Reference Counting Zähler
-        //! \return this
-        DLLEXPORT Uhrzeit *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht
-        //! \return 0
-        DLLEXPORT Uhrzeit *release();
     };
 
     //! Diese Klasse speichert ein Datum in Form von Jahr, Monat und Tagen
-    class Datum
+    class Datum : public virtual ReferenceCounter
     {
     private:
         int jahr, monat, tag;
-        int ref;
         int *maxTage;
         void update();
 
@@ -442,21 +435,14 @@ namespace Framework
         //! \return (true), wenn das gespeicherte Datum hinter dem übergebenen liegt. (false) sonnst.
         //! Beispiel: ( 1.11.1995 ).istGrößer( "y, m, d", new Text( "2016, 1, 23" ) ) ); return true
         DLLEXPORT bool istLater( const char *format, Text *datum ) const;
-        //! Erhöht den Reference Counting Zähler
-        //! \return this
-        DLLEXPORT Datum *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht
-        //! \return 0
-        DLLEXPORT Datum *release();
     };
 
     //! Diese Klasse vereint die beiden Klassen Datum und Uhrzeit und speichert somit einen Zeitstempel mit Jahr, Monat, Tag, Stunde, Minute und Sekunde
-    class Zeit
+    class Zeit : public virtual ReferenceCounter
     {
     private:
         Datum *datum;
         Uhrzeit *uhrzeit;
-        int ref;
 
     public:
         //! Erzeugt ein neues Zeichnung mit den Standartwerten 0.0.0 0:0:0.
@@ -656,22 +642,15 @@ namespace Framework
         //! \param zeit Eine Text Zeichnung, welches die zu überprüfende Zeit enthält.
         //! \return (true) wenn die gespeicherte Zeit nach der übergebenen Zeit liegt. (false) sonnst.
         DLLEXPORT bool istLater( const char *format, Text *zeit ) const;
-        //! Erhöht den Reference Counting Zähler
-        //! \return this
-        DLLEXPORT Zeit *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht
-        //! \return 0
-        DLLEXPORT Zeit *release();
     };
 
     //! Diese Klasse kann messen, wie viel Zeit zwischen zwei Zeitpunkten verstrichen ist
-    class ZeitMesser
+    class ZeitMesser : public virtual ReferenceCounter
     {
     private:
         double start;
         double ende;
         double messung;
-        int ref;
 
     public:
         //! Erzeugt ein neues ZeitMesser Zeichnung
@@ -688,12 +667,6 @@ namespace Framework
         DLLEXPORT double getMinuten() const;
         //! gibt den Abstand zwischen start und ende der Messung in Stunden zurück
         DLLEXPORT double getStunden() const;
-        //! Erhöht den Reference Counting Zähler.
-        //! \return this.
-        DLLEXPORT ZeitMesser *getThis();
-        //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
-        //! \return 0.
-        DLLEXPORT ZeitMesser *release();
     };
 
     //! gibt die aktuelle Uhrzeit zurück.

+ 5 - 5
main.h

@@ -71,8 +71,8 @@ class OutputDebugStringBuf : public std::basic_stringbuf<TChar, TTraits>
 public:
     explicit OutputDebugStringBuf() : _buffer( 1 )
     {
-        setg( nullptr, nullptr, nullptr );
-        setp( _buffer.data(), _buffer.data(), _buffer.data() + _buffer.size() );
+        __super::setg( nullptr, nullptr, nullptr );
+        __super::setp( _buffer.data(), _buffer.data(), _buffer.data() + _buffer.size() );
     }
 
     ~OutputDebugStringBuf()
@@ -82,8 +82,8 @@ public:
 
     int sync() try
     {
-        MessageOutputer<TChar, TTraits>()( pbase(), pptr() );
-        setp( _buffer.data(), _buffer.data(), _buffer.data() + _buffer.size() );
+        MessageOutputer<TChar, TTraits>()( __super::pbase(), __super::pptr() );
+        __super::setp( _buffer.data(), _buffer.data(), _buffer.data() + _buffer.size() );
         return 0;
     } catch( ... )
     {
@@ -96,7 +96,7 @@ public:
         if( c != TTraits::eof() )
         {
             _buffer[ 0 ] = c;
-            setp( _buffer.data(), _buffer.data() + 1, _buffer.data() + _buffer.size() );
+            __super::setp( _buffer.data(), _buffer.data() + 1, _buffer.data() + _buffer.size() );
         }
         return syncRet == -1 ? TTraits::eof() : 0;
     }