Sfoglia il codice sorgente

use framework ui initialisation and reference counting

Kolja Strohm 3 anni fa
parent
commit
be8b34fba4
125 ha cambiato i file con 10721 aggiunte e 12619 eliminazioni
  1. 106 106
      KSGClient/Aktionen/AktionsThread.cpp
  2. 2 15
      KSGClient/Global/Bilder.cpp
  3. 5 8
      KSGClient/Global/Bilder.h
  4. 42 61
      KSGClient/Global/Fps.cpp
  5. 29 32
      KSGClient/Global/Fps.h
  6. 24 203
      KSGClient/Global/Initialisierung.cpp
  7. 14 14
      KSGClient/Global/Initialisierung.h
  8. 24 50
      KSGClient/Global/Render.cpp
  9. 14 19
      KSGClient/Global/Render.h
  10. 18 20
      KSGClient/Global/Variablen.cpp
  11. 6 4
      KSGClient/Global/Variablen.h
  12. 4 20
      KSGClient/Leser/KartenLeser.cpp
  13. 18 22
      KSGClient/Leser/KartenLeser.h
  14. 601 596
      KSGClient/NachLogin/Account/AccountAnsehen.cpp
  15. 47 47
      KSGClient/NachLogin/Account/AccountAnsehen.h
  16. 244 256
      KSGClient/NachLogin/Account/Aktivität/AccountAktivität.cpp
  17. 24 26
      KSGClient/NachLogin/Account/Aktivität/AccountAktivität.h
  18. 1024 1107
      KSGClient/NachLogin/Account/Historie/AccountHistorie.cpp
  19. 181 206
      KSGClient/NachLogin/Account/Historie/AccountHistorie.h
  20. 879 896
      KSGClient/NachLogin/Account/SpielPartner/AccountSpielPartner.cpp
  21. 88 93
      KSGClient/NachLogin/Account/SpielPartner/AccountSpielPartner.h
  22. 632 663
      KSGClient/NachLogin/Account/Spiele_Karten/AccountSpieleUndKarten.cpp
  23. 113 122
      KSGClient/NachLogin/Account/Spiele_Karten/AccountSpieleUndKarten.h
  24. 292 294
      KSGClient/NachLogin/Account/Statistik/AccountStatistik.cpp
  25. 32 33
      KSGClient/NachLogin/Account/Statistik/AccountStatistik.h
  26. 231 245
      KSGClient/NachLogin/Account/Suchen/AccountSuchen.cpp
  27. 36 39
      KSGClient/NachLogin/Account/Suchen/AccountSuchen.h
  28. 74 138
      KSGClient/NachLogin/Chat/ChatLeiste.cpp
  29. 122 140
      KSGClient/NachLogin/Chat/ChatLeiste.h
  30. 86 101
      KSGClient/NachLogin/Chat/FreundesListe.cpp
  31. 117 120
      KSGClient/NachLogin/Chat/FreundesListe.h
  32. 72 108
      KSGClient/NachLogin/Chat/NachrichtenListe.cpp
  33. 52 63
      KSGClient/NachLogin/Chat/NachrichtenListe.h
  34. 35 49
      KSGClient/NachLogin/Editor/Auswahl/Auswahl.cpp
  35. 30 33
      KSGClient/NachLogin/Editor/Auswahl/Auswahl.h
  36. 160 157
      KSGClient/NachLogin/Editor/Editor.cpp
  37. 32 33
      KSGClient/NachLogin/Editor/Editor.h
  38. 22 22
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBEditor.cpp
  39. 1 1
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBEditor.h
  40. 23 25
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBVorschau.cpp
  41. 2 3
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBVorschau.h
  42. 23 37
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.cpp
  43. 1 4
      KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.h
  44. 99 141
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDEditor.cpp
  45. 7 19
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDEditor.h
  46. 76 122
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.cpp
  47. 7 21
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.h
  48. 6 20
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.cpp
  49. 1 4
      KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.h
  50. 5 15
      KSGClient/NachLogin/Editor/Karte/Dateien/WAVDatei.cpp
  51. 0 3
      KSGClient/NachLogin/Editor/Karte/Dateien/WAVDatei.h
  52. 49 63
      KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.cpp
  53. 23 26
      KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.h
  54. 70 36
      KSGClient/NachLogin/Editor/Karte/KartenEditor.cpp
  55. 26 29
      KSGClient/NachLogin/Editor/Karte/KartenEditor.h
  56. 14 28
      KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.cpp
  57. 1 4
      KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.h
  58. 66 93
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSEditor.cpp
  59. 5 13
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSEditor.h
  60. 54 72
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSVorschau.cpp
  61. 4 9
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSVorschau.h
  62. 8 22
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.cpp
  63. 1 4
      KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.h
  64. 37 51
      KSGClient/NachLogin/Editor/Karte/Teams/KETeams.cpp
  65. 1 4
      KSGClient/NachLogin/Editor/Karte/Teams/KETeams.h
  66. 27 42
      KSGClient/NachLogin/Einstellungen/Einstellungen.cpp
  67. 11 15
      KSGClient/NachLogin/Einstellungen/Einstellungen.h
  68. 150 149
      KSGClient/NachLogin/ImSpiel/ImSpiel.cpp
  69. 28 29
      KSGClient/NachLogin/ImSpiel/ImSpiel.h
  70. 384 427
      KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.cpp
  71. 88 99
      KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.h
  72. 227 242
      KSGClient/NachLogin/MiniGames/MiniGame.cpp
  73. 31 35
      KSGClient/NachLogin/MiniGames/MiniGame.h
  74. 23 25
      KSGClient/NachLogin/MiniGames/Minigames.cpp
  75. 58 59
      KSGClient/NachLogin/MiniGames/Minigames.h
  76. 47 51
      KSGClient/NachLogin/NachLogin.cpp
  77. 47 49
      KSGClient/NachLogin/NachLogin.h
  78. 22 20
      KSGClient/NachLogin/Neuigkeiten/Neuigkeiten.cpp
  79. 44 44
      KSGClient/NachLogin/Neuigkeiten/Neuigkeiten.h
  80. 73 138
      KSGClient/NachLogin/Shop/Karten/KartenKaufen.cpp
  81. 92 105
      KSGClient/NachLogin/Shop/Karten/KartenKaufen.h
  82. 201 196
      KSGClient/NachLogin/Shop/Shop.cpp
  83. 32 32
      KSGClient/NachLogin/Shop/Shop.h
  84. 69 124
      KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.cpp
  85. 90 103
      KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.h
  86. 15 30
      KSGClient/NachLogin/Spiele/Angemeldet/Angemeldet.cpp
  87. 39 43
      KSGClient/NachLogin/Spiele/Angemeldet/Angemeldet.h
  88. 102 246
      KSGClient/NachLogin/Spiele/Gruppe/Gruppe.cpp
  89. 271 316
      KSGClient/NachLogin/Spiele/Gruppe/Gruppe.h
  90. 20 60
      KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp
  91. 4 13
      KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.h
  92. 60 100
      KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.cpp
  93. 4 13
      KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.h
  94. 654 649
      KSGClient/NachLogin/Spiele/Spiele.cpp
  95. 84 84
      KSGClient/NachLogin/Spiele/Spiele.h
  96. 159 177
      KSGClient/NachLogin/Spiele/Statistik/SpielStatistik.cpp
  97. 31 36
      KSGClient/NachLogin/Spiele/Statistik/SpielStatistik.h
  98. 61 166
      KSGClient/NachLogin/Spiele/Team Auswahl/TeamAuswahl.cpp
  99. 154 184
      KSGClient/NachLogin/Spiele/Team Auswahl/TeamAuswahl.h
  100. 64 72
      KSGClient/NachLogin/Titel/TitelLeiste.cpp
  101. 45 47
      KSGClient/NachLogin/Titel/TitelLeiste.h
  102. 44 75
      KSGClient/NachLogin/Update/Update.cpp
  103. 26 32
      KSGClient/NachLogin/Update/Update.h
  104. 83 83
      KSGClient/Netzwerk/ChatMessageProcessor.cpp
  105. 20 20
      KSGClient/Netzwerk/KSGServer.cpp
  106. 2 17
      KSGClient/Netzwerk/Patcher.cpp
  107. 13 17
      KSGClient/Netzwerk/Patcher.h
  108. 7 7
      KSGClient/Netzwerk/SpielMessageProcessor.cpp
  109. 13 14
      KSGClient/Start/Start.cpp
  110. 52 82
      KSGClient/VorLogin/Account verwalten/EMail.cpp
  111. 44 52
      KSGClient/VorLogin/Account verwalten/EMail.h
  112. 48 78
      KSGClient/VorLogin/Account verwalten/Geheimnis.cpp
  113. 42 50
      KSGClient/VorLogin/Account verwalten/Geheimnis.h
  114. 21 36
      KSGClient/VorLogin/Account verwalten/Name.cpp
  115. 19 23
      KSGClient/VorLogin/Account verwalten/Name.h
  116. 51 81
      KSGClient/VorLogin/Account verwalten/Passwort.cpp
  117. 44 52
      KSGClient/VorLogin/Account verwalten/Passwort.h
  118. 41 80
      KSGClient/VorLogin/Account verwalten/Registrierung.cpp
  119. 28 32
      KSGClient/VorLogin/Account verwalten/Registrierung.h
  120. 25 40
      KSGClient/VorLogin/Account verwalten/Unregistrierung.cpp
  121. 22 26
      KSGClient/VorLogin/Account verwalten/Unregistrierung.h
  122. 303 318
      KSGClient/VorLogin/Login/Login.cpp
  123. 25 29
      KSGClient/VorLogin/Login/Login.h
  124. 44 68
      KSGClient/VorLogin/VorLogin.cpp
  125. 51 57
      KSGClient/VorLogin/VorLogin.h

+ 106 - 106
KSGClient/Aktionen/AktionsThread.cpp

@@ -26,8 +26,8 @@ void AktionsThread::thread()
         // arg2 = char* -- Account Passwort
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !loginClient )
@@ -90,34 +90,34 @@ void AktionsThread::thread()
                 loginClient->trenne( 0 );
             } while( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zLogin()->setLoginReturn( ret );
         }
         break;
     case 2: // Login Erfolgreich
-        hauptScreen->setdeckFarbe( 0x00000000 );
-        hauptScreen->setOnTop( 1 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+        uiFactory.initParam.bildschirm->setOnTop( 1 );
         ladeAnimation->setSichtbar( 1 );
         for( unsigned char deckAlpha = 0; deckAlpha < 255; )
         {
-            hauptScreen->setdeckFarbe( deckAlpha << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
             Sleep( 40 );
             deckAlpha += 15;
         }
-        hauptScreen->setdeckFarbe( 255 << 24 );
-        hauptScreen->setRenderZeichnungen( 0 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
+        uiFactory.initParam.bildschirm->setRenderZeichnungen( 0 );
         vorLogin->setSichtbar( 0 );
         nachLogin->setAnzeige( NLANormal );
-        hauptScreen->setRenderZeichnungen( 1 );
+        uiFactory.initParam.bildschirm->setRenderZeichnungen( 1 );
         ladeAnimation->setSichtbar( 0 );
         for( unsigned char deckAlpha = 255; deckAlpha > 0; )
         {
-            hauptScreen->setdeckFarbe( deckAlpha << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
             Sleep( 40 );
             deckAlpha -= 15;
         }
-        hauptScreen->setdeckFarbe( 0 << 24 );
-        hauptScreen->setOnTop( 0 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+        uiFactory.initParam.bildschirm->setOnTop( 0 );
         break;
     case 3: // Kick
         // arg1 = char* -- Account Name
@@ -125,8 +125,8 @@ void AktionsThread::thread()
         // arg3 = char* -- Account Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !loginClient )
@@ -188,15 +188,15 @@ void AktionsThread::thread()
                 loginClient->trenne( 0 );
             } while( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zLogin()->setKickReturn( ret );
         }
         break;
     case 4: // Logout
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             if( loginClient )
             {
@@ -205,17 +205,17 @@ void AktionsThread::thread()
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Das Ausloggen konnte nicht erfolgreich abgeschlossen werden." ),
                                                                   new Text( "Ok" ), 0 );
                     ladeAnimation->setSichtbar( 0 );
-                    hauptScreen->setOnTop( 0 );
+                    uiFactory.initParam.bildschirm->setOnTop( 0 );
                     break;
                 }
                 bool ret = loginClient->logout();
                 if( ret )
                 {
-                    hauptScreen->lock();
+                    uiFactory.initParam.bildschirm->lock();
                     nachLogin->zChatLeiste()->removeAll();
                     nachLogin->zFreundesListe()->removeAll();
                     nachLogin->zNachrichtenListe()->removeAll();
-                    hauptScreen->unlock();
+                    uiFactory.initParam.bildschirm->unlock();
                     if( infoClient )
                         infoClient->trenne( 0 );
                     if( spielClient )
@@ -234,39 +234,39 @@ void AktionsThread::thread()
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Das Ausloggen konnte nicht erfolgreich abgeschlossen werden." ),
                                                                   new Text( "Ok" ), 0 );
                     ladeAnimation->setSichtbar( 0 );
-                    hauptScreen->setOnTop( 0 );
+                    uiFactory.initParam.bildschirm->setOnTop( 0 );
                     break;
                 }
             }
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
     case 5: // Logout Erfolgreich
-        hauptScreen->setdeckFarbe( 0x00000000 );
-        hauptScreen->setOnTop( 1 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+        uiFactory.initParam.bildschirm->setOnTop( 1 );
         ladeAnimation->setSichtbar( 1 );
         for( unsigned char deckAlpha = 0; deckAlpha < 255; )
         {
-            hauptScreen->setdeckFarbe( deckAlpha << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
             Sleep( 40 );
             deckAlpha += 15;
         }
-        hauptScreen->setdeckFarbe( 255 << 24 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
         _render = 0;
-        hauptScreen->lock();
+        uiFactory.initParam.bildschirm->lock();
         nachLogin->setAnzeige( NLALogin );
         vorLogin->setSichtbar( 1 );
-        hauptScreen->unlock();
+        uiFactory.initParam.bildschirm->unlock();
         _render = 1;
         ladeAnimation->setSichtbar( 0 );
         for( unsigned char deckAlpha = 255; deckAlpha > 0; )
         {
-            hauptScreen->setdeckFarbe( deckAlpha << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
             Sleep( 40 );
             deckAlpha -= 15;
         }
-        hauptScreen->setdeckFarbe( 0 << 24 );
-        hauptScreen->setOnTop( 0 );
+        uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+        uiFactory.initParam.bildschirm->setOnTop( 0 );
         break;
     case 8: // Account E-Mail ändern
         // arg1 = char* -- Account Name
@@ -275,8 +275,8 @@ void AktionsThread::thread()
         // arg4 = char* -- Neue E-Mail
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -302,7 +302,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zEMailÄndern()->setReturn( ret );
         }
         break;
@@ -312,8 +312,8 @@ void AktionsThread::thread()
         // arg3 = char* -- Account Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             char *eMail = 0;
             char **pEMail = &eMail;
@@ -341,7 +341,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zEMailVergessen()->setReturn( ret, *pEMail );
         }
         break;
@@ -352,8 +352,8 @@ void AktionsThread::thread()
         // arg4 = char* -- Neues Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -379,7 +379,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zGeheimnisÄndern()->setResult( ret );
         }
         break;
@@ -388,8 +388,8 @@ void AktionsThread::thread()
         // arg2 = char* -- Account Passwort
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -415,7 +415,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zGeheimnisVergessen()->setResult( ret );
         }
         break;
@@ -424,8 +424,8 @@ void AktionsThread::thread()
         // arg2 = char* -- Account Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -451,7 +451,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zNameVergessen()->setResult( ret );
         }
         break;
@@ -462,8 +462,8 @@ void AktionsThread::thread()
         // arg4 = char* -- Neues Passwort
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -489,7 +489,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zPasswortÄndern()->setResult( ret );
         }
         break;
@@ -498,8 +498,8 @@ void AktionsThread::thread()
         // arg2 = char* -- Account Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -525,7 +525,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zPasswortVergessen()->setResult( ret );
         }
         break;
@@ -537,8 +537,8 @@ void AktionsThread::thread()
         // arg5 = Datum* -- Geburtsdatum
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -556,7 +556,7 @@ void AktionsThread::thread()
                     continue;
                 }
                 ret = registerClient->accountErstellen( (const char *)arg1,
-                    (const char *)arg2,
+                                                        (const char *)arg2,
                                                         (const char *)arg3,
                                                         (const char *)arg4,
                                                         (unsigned short)( (Datum *)arg5 )->getJahr(),
@@ -570,7 +570,7 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zRegistrierung()->setWeiterReturn( ret );
             ( (Datum *)arg5 )->release();
         }
@@ -581,8 +581,8 @@ void AktionsThread::thread()
         // arg3 = char* -- Account Geheimnis
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             int ret = 0;
             if( !registerClient )
@@ -608,159 +608,159 @@ void AktionsThread::thread()
             } while( 0 );
             registerClient->trenne( 0 );
             ladeAnimation->setSichtbar( 0 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             vorLogin->zUnregistrierung()->setWeiterReturn( ret );
         }
         break;
     case 19: // Spiel Laden
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             for( unsigned char deckAlpha = 0; deckAlpha < 255; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha += 15;
             }
-            hauptScreen->setdeckFarbe( 255 << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
             _render = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             int karteId = nachLogin->zSpielenFenster()->getKarteId();
-            SpielerTeamStruktur * sts = nachLogin->zSpielenFenster()->getSTS();
+            SpielerTeamStruktur *sts = nachLogin->zSpielenFenster()->getSTS();
             nachLogin->setAnzeige( NLAImSpiel );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             _render = 1;
             nachLogin->zImSpiel()->beginnLaden( karteId, sts );
             ladeAnimation->setSichtbar( 0 );
             for( unsigned char deckAlpha = 255; deckAlpha > 0; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha -= 15;
             }
-            hauptScreen->setdeckFarbe( 0 << 24 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
         break;
     case 20: // Spiel Statistik laden
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             for( unsigned char deckAlpha = 0; deckAlpha < 255; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha += 15;
             }
-            hauptScreen->setdeckFarbe( 255 << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
             _render = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             int karteId = nachLogin->zImSpiel()->getKarteId();
             nachLogin->setAnzeige( NLANormal );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             _render = 1;
-            if( spielClient &&spielClient->istVerbunden() )
+            if( spielClient && spielClient->istVerbunden() )
                 nachLogin->zSpielenFenster()->ladeSpielStatistik( karteId );
             ladeAnimation->setSichtbar( 0 );
             for( unsigned char deckAlpha = 255; deckAlpha > 0; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha -= 15;
             }
-            hauptScreen->setdeckFarbe( 0 << 24 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
         break;
     case 21: // Spiel Aufzeichnung betreten
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             for( unsigned char deckAlpha = 0; deckAlpha < 255; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha += 15;
             }
-            hauptScreen->setdeckFarbe( 255 << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
             _render = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             nachLogin->setAnzeige( NLASpielVideo );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             _render = 1;
             ladeAnimation->setSichtbar( 0 );
             for( unsigned char deckAlpha = 255; deckAlpha > 0; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha -= 15;
             }
-            hauptScreen->setdeckFarbe( 0 << 24 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
         break;
     case 22: // Spiel Aufzeichnung / Editor verlassen
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             for( unsigned char deckAlpha = 0; deckAlpha < 255; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha += 15;
             }
-            hauptScreen->setdeckFarbe( 255 << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
             _render = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             nachLogin->setAnzeige( NLANormal );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             _render = 1;
             ladeAnimation->setSichtbar( 0 );
             for( unsigned char deckAlpha = 255; deckAlpha > 0; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha -= 15;
             }
-            hauptScreen->setdeckFarbe( 0 << 24 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
         break;
     case 23: // Editor betreten
         if( 1 )
         {
-            hauptScreen->setdeckFarbe( 0x00000000 );
-            hauptScreen->setOnTop( 1 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0x00000000 );
+            uiFactory.initParam.bildschirm->setOnTop( 1 );
             ladeAnimation->setSichtbar( 1 );
             for( unsigned char deckAlpha = 0; deckAlpha < 255; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha += 15;
             }
-            hauptScreen->setdeckFarbe( 255 << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 255 << 24 );
             _render = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             nachLogin->setAnzeige( NLAEditor );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             _render = 1;
             ladeAnimation->setSichtbar( 0 );
             for( unsigned char deckAlpha = 255; deckAlpha > 0; )
             {
-                hauptScreen->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
                 Sleep( 40 );
                 deckAlpha -= 15;
             }
-            hauptScreen->setdeckFarbe( 0 << 24 );
-            hauptScreen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( 0 << 24 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
         }
         break;
     }

+ 2 - 15
KSGClient/Global/Bilder.cpp

@@ -4,10 +4,10 @@
 // Inhalt der Bilder Klasse aus Bilder.h
 // Konstruktor
 Bilder::Bilder()
+    : ReferenceCounter()
 {
     bilder = new RCArray< Bild >();
     paths = new RCArray< Text >();
-    ref = 1;
 }
 
 // Destruktor
@@ -42,20 +42,7 @@ Bild *Bilder::get( const char *path )
         return 0;
     }
     paths->add( new Text( path ) );
-    bilder->add( b->getThis() );
+    bilder->add( dynamic_cast<Bild *>( b->getThis() ) );
     c.unlock();
     return b;
-}
-
-BilderV *Bilder::getThis()
-{
-    ref++;
-    return this;
-}
-
-BilderV *Bilder::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }

+ 5 - 8
KSGClient/Global/Bilder.h

@@ -15,17 +15,14 @@ private:
     RCArray< Bild > *bilder;
     RCArray< Text > *paths;
     Critical c;
-    int ref;
 
 public:
-	// Konstruktor
-	Bilder();
-	// Destruktor
-	~Bilder();
-	// nicht constant
+    // Konstruktor
+    Bilder();
+    // Destruktor
+    ~Bilder();
+    // nicht constant
     virtual Bild *get( const char *path ) override;
-    virtual BilderV *getThis() override;
-	virtual BilderV *release() override;
 };
 
 #endif

+ 42 - 61
KSGClient/Global/Fps.cpp

@@ -3,6 +3,7 @@
 #include <Prozess.h>
 #include <Schrift.h>
 #include <Text.h>
+#include "Variablen.h"
 
 using namespace Framework;
 
@@ -11,101 +12,81 @@ using namespace Framework;
 Fps::Fps()
     : Zeichnung()
 {
-	pr = new Prozess();
-	i = 0;
-	fpsCount = 0;
-	nowFps = 0;
-	nowCpu = 0;
-	nowMem = 0;
-    textRd = 0;
-	sFarbe = 0;
+    pr = new Prozess();
+    i = 0;
+    fpsCount = 0;
+    nowFps = 0;
+    nowCpu = 0;
+    nowMem = 0;
+    textRd = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
+    textRd->setSchriftSize( 12 );
+    sFarbe = 0;
 }
 
 // Destruktor 
 Fps::~Fps()
 {
-	delete pr;
-	if( textRd )
-		textRd->release();
+    delete pr;
+    textRd->release();
 }
 
 // nicht constant
-void Fps::setSchriftZ( Schrift *schrift ) // setzt die Schrift
-{
-    if( !this->textRd )
-        textRd = new TextRenderer( schrift );
-    else
-        textRd->setSchriftZ( schrift );
-    textRd->setSchriftSize( 12 );
-	rend = 1;
-}
-
 void Fps::setSFarbe( int f ) // setzt die Schrift Farbe
 {
-	sFarbe = f;
-	rend = 1;
+    sFarbe = f;
+    rend = 1;
 }
 
 bool Fps::tick( double tickval ) // tick
 {
-	i += tickval * 60;
-	if( i >= 60 )
-	{
-		nowFps = fpsCount;
-		nowCpu = (int)pr->getCPU();
-		nowMem = (int)(pr->getMem() / 1024);
-		fpsCount = 0;
-		i -= 60;
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    i += tickval * 60;
+    if( i >= 60 )
+    {
+        nowFps = fpsCount;
+        nowCpu = (int)pr->getCPU();
+        nowMem = (int)( pr->getMem() / 1024 );
+        fpsCount = 0;
+        i -= 60;
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void Fps::render( Bild &zrObj ) // zeichnet nach zrObj
 {
-	fpsCount++;
-	if( textRd && sFarbe )
-	{
-		Text renderT( "FPS: " );
-		renderT.append( nowFps );
-		renderT.append( "\nCPU: " );
-		renderT.append( nowCpu );
-		renderT.append( "%\nMem: " );
-		renderT.append( nowMem );
-		renderT.append( "kb" );
+    fpsCount++;
+    if( textRd && sFarbe )
+    {
+        Text renderT( "FPS: " );
+        renderT.append( nowFps );
+        renderT.append( "\nCPU: " );
+        renderT.append( nowCpu );
+        renderT.append( "%\nMem: " );
+        renderT.append( nowMem );
+        renderT.append( "kb" );
         textRd->renderText( 10, 10, renderT, zrObj, sFarbe );
-	}
+    }
 }
 
 // constant
 int Fps::getFps() const // gibt fps zurück
 {
-	return nowFps;
+    return nowFps;
 }
 
 int Fps::getCpu() const // gibt die Cpu zurück
 {
-	return nowCpu;
+    return nowCpu;
 }
 
 int Fps::getMem() const // gibt den Arbeitsspeicher zurück
 {
-	return nowMem;
-}
-
-Schrift *Fps::getSchrift() const // gibt die Schrift zurück
-{
-	return textRd ? textRd->getSchrift() : 0;
-}
-
-Schrift *Fps::zSchrift() const
-{
-	return textRd ? textRd->zSchrift() : 0;
+    return nowMem;
 }
 
 int Fps::getFarbe() const // gibt die Farbe zurück
 {
-	return sFarbe;
+    return sFarbe;
 }

+ 29 - 32
KSGClient/Global/Fps.h

@@ -5,42 +5,39 @@
 
 namespace Framework
 {
-	class Prozess; // Prozess.h
-	class Bild; // Bild.h
-	class Schrift; // Schrift.h
-	class Fps; // aus dieser Datei
+    class Prozess; // Prozess.h
+    class Bild; // Bild.h
+    class Schrift; // Schrift.h
+    class Fps; // aus dieser Datei
     class TextRenderer;
 
-	class Fps : public Zeichnung
-	{
-	private:
-		Prozess *pr;
-		double i;
-		int fpsCount;
-		int nowFps;
-		int nowCpu;
-		int nowMem;
+    class Fps : public Zeichnung
+    {
+    private:
+        Prozess *pr;
+        double i;
+        int fpsCount;
+        int nowFps;
+        int nowCpu;
+        int nowMem;
         TextRenderer *textRd;
-		int sFarbe;
+        int sFarbe;
 
-	public:
-		// Konstruktor 
-		Fps();
-		// Destruktor 
-		~Fps();
-		// nicht constant
-		void setSchriftZ( Schrift *schrift ); // setzt die Schrift
-		void setSFarbe( int f ); // setzt die Schrift Farbe
-		bool tick( double tickval ) override; // tick
-		void render( Bild &zRObj ) override; // zeichnet nach zrObj
-		// constant
-		Schrift *getSchrift() const; // gibt die Schrift zurück
-		Schrift *zSchrift() const;
-		int getFarbe() const; // gibt die Farbe zurück
-		int getFps() const; // gibt fps zurück
-		int getCpu() const; // gibt die Cpu zurück
-		int getMem() const; // gibt den Arbeitsspeicher zurück
-	};
+    public:
+        // Konstruktor 
+        Fps();
+        // Destruktor 
+        ~Fps();
+        // nicht constant
+        void setSFarbe( int f ); // setzt die Schrift Farbe
+        bool tick( double tickval ) override; // tick
+        void render( Bild &zRObj ) override; // zeichnet nach zrObj
+        // constant
+        int getFarbe() const; // gibt die Farbe zurück
+        int getFps() const; // gibt fps zurück
+        int getCpu() const; // gibt die Cpu zurück
+        int getMem() const; // gibt den Arbeitsspeicher zurück
+    };
 }
 
 #endif

+ 24 - 203
KSGClient/Global/Initialisierung.cpp

@@ -5,188 +5,78 @@
 #include <DateiSystem.h>
 #include "Variablen.h"
 
-Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel )
+Knopf *initKnopf( int x, int y, int br, int hö, __int64 style, char *titel )
 {
-    Knopf *ret = new Knopf();
+    Knopf *ret = uiFactory.createKnopf( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( zSchrift )
-        ret->setSchriftZ( zSchrift->getThis() );
     ret->setText( titel );
     return ret;
 }
 
-KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, char *txt )
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, __int64 style, char *txt )
 {
-    KontrollKnopf *ret = new KontrollKnopf();
-    ret->setMausEreignis( _ret1ME );
+    KontrollKnopf *ret = uiFactory.createKontrollKnopf( uiFactory.initParam );
     ret->addStyle( style );
-    ret->setSchriftZ( zSchrift->getThis() );
     ret->setText( txt );
     ret->setSText( txt );
-    ret->setSFarbe( 0xFFFFFFFF );
-    ret->setSSize( 12 );
-    if( ret->hatStyle( TextFeld::Style::Buffered ) )
-    {
-        ret->setAlphaFeldFarbe( 0x5500FF00 );
-        ret->setAlphaFeldStrength( -5 );
-    }
-    if( ret->hatStyle( TextFeld::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFF00FF00 );
-    }
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    ret->loadData( "data/bilder/system.ltdb" );
     return ret;
 }
 
-Fenster *initFenster( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, char *titel )
+Fenster *initFenster( int x, int y, int br, int hö, __int64 style, char *titel )
 {
-    Fenster *ret = new Fenster();
-    ret->setMausEreignis( _ret1ME );
-    ret->setTastaturEreignis( _ret1TE );
+    Fenster *ret = uiFactory.createFenster( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( ret->hatStyle( Fenster::Style::Rahmen ) )
-    {
-        ret->setRBreite( 1 );
-        ret->setRFarbe( 0xFFFFFFFF );
-    }
     if( ret->hatStyle( Fenster::Style::Titel ) )
     {
         ret->setTitel( titel );
-        ret->setTSchriftZ( zSchrift->getThis() );
-        ret->setTSFarbe( 0xFFFFFFFF );
-        ret->zTTextFeld()->setSize( 0, 20 );
-        ret->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
-        ret->setTRFarbe( 0xFF00FF00 );
-        ret->setTRBreite( 1 );
-        if( ret->hatStyle( Fenster::Style::TitelBuffered ) )
-        {
-            ret->setTAfFarbe( 0x1000FF00 );
-            ret->setTAfStrength( -15 );
-        }
-    }
-    if( ret->hatStyle( Fenster::Style::Closable ) )
-    {
-        if( ret->hatStyle( Fenster::Style::ClosingKlickBuffer ) )
-        {
-            ret->setSKAfFarbe( 0xFF00FF00 );
-            ret->setSKAfStrength( 30 );
-        }
     }
     return ret;
 }
 
-TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, char *txt )
+TextFeld *initTextFeld( int x, int y, int br, int hö, __int64 style, char *txt )
 {
-    TextFeld *ret = new TextFeld();
+    TextFeld *ret = uiFactory.createTextFeld( uiFactory.initParam );
     ret->addStyle( style );
-    ret->setSchriftZ( zSchrift->getThis() );
     ret->setText( txt );
-    ret->setSchriftFarbe( 0xFFFFFFFF );
-    ret->setSchriftSize( 12 );
-    if( ret->hatStyle( TextFeld::Style::Buffered ) )
-    {
-        ret->setAlphaFeldFarbe( 0x5500FF00 );
-        ret->setAlphaFeldStrength( -5 );
-    }
-    if( ret->hatStyle( TextFeld::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFF00FF00 );
-    }
     ret->setPosition( x, y );
     ret->setSize( br, hö );
     return ret;
 }
 
-BildZ *initBildZ( int x, int y, int br, int hö, __int64 style, Bild * b )
+BildZ *initBildZ( int x, int y, int br, int hö, __int64 style, Bild *b )
 {
-    BildZ *ret = new BildZ();
+    BildZ *ret = uiFactory.createBildZ( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
     if( b )
         ret->setBildZ( b );
-    if( ( style | BildZ::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
     return ret;
 }
 
-AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, std::initializer_list< char * > values )
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, __int64 style, std::initializer_list< char * > values )
 {
-    AuswahlBox *ret = new AuswahlBox();
+    AuswahlBox *ret = uiFactory.createAuswahlBox( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( ( style | AuswahlBox::Style::Hintergrund ) == style )
-        ret->setHintergrundFarbe( 0xFF000000 );
-    if( ( style | AuswahlBox::Style::Erlaubt ) == style )
-        ret->setMausEreignis( _ret1ME );
-    if( zSchrift )
-        ret->setSchriftZ( zSchrift->getThis() );
-    if( ( style | AuswahlBox::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | AuswahlBox::Style::MaxHeight ) == style )
-        ret->setMaxAuskappHeight( 100 );
-    if( ( style | AuswahlBox::Style::MausRahmen ) == style )
-    {
-        ret->setMausRahmenBreite( 1 );
-        ret->setMausRahmenFarbe( 0xFF005500 );
-    }
-    if( ( style | AuswahlBox::Style::MausBuffer ) == style )
-    {
-        ret->setMausAlphaFeldFarbe( 0x00008700 );
-        ret->setMausAlphaFeldStrength( -8 );
-    }
-    if( ( style | AuswahlBox::Style::AuswahlRahmen ) == style )
-    {
-        ret->setAuswRahmenBreite( 1 );
-        ret->setAuswRahmenFarbe( 0xFF00FF00 );
-    }
-    if( ( style | AuswahlBox::Style::AuswahlBuffer ) == style )
-    {
-        ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
-        ret->setAuswAlphaFeldStrength( -8 );
-    }
     for( auto i = values.begin(); i != values.end(); i++ )
         ret->addEintrag( *i );
     return ret;
 }
 
-ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe )
 {
-    ObjTabelle *ret = new ObjTabelle();
+    ObjTabelle *ret = uiFactory.createObjTabelle( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( ( style | ObjTabelle::Style::Erlaubt ) == style )
-        ret->setMausEreignis( _ret1ME );
-    if( ( style | ObjTabelle::Style::Rahmen ) == style )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | ObjTabelle::Style::Raster ) == style )
-    {
-        ret->setRasterBreite( 1 );
-        ret->setRasterFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | ObjTabelle::Style::VScroll ) == style )
-        ret->setVertikalKlickScroll( 5 );
-    if( ( style | ObjTabelle::Style::HScroll ) == style )
-        ret->setHorizontalKlickScroll( 5 );
     for( auto i = spalten.begin(); i != spalten.end(); i++ )
     {
         ret->addSpalte( i->name );
@@ -202,105 +92,38 @@ ObjTabelle *initObjTabelle( int x, int y, int br, int h
                 ret->addZeile( 0, "Überschrift" );
                 ret->setZeilenHeight( 0, 20 );
             }
-            ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, i->name ) );
+            ret->setZeichnungZ( i->name, "Überschrift", initTextFeld( 0, 0, i->breite, 20, TextFeld::Style::Text | TextFeld::Style::Center, i->name ) );
         }
     }
     return ret;
 }
 
-LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, DiagDaten * data )
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, __int64 style, DiagDaten *data )
 {
-    LDiag *ret = new LDiag();
+    LDiag *ret = uiFactory.createLDiag( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( zSchrift )
-    {
-        ret->setSchriftZ( zSchrift->getThis() );
-        ret->setSchriftSize( 12 );
-    }
     if( data )
         ret->setDiagDatenZ( data );
-    if( ret->hatStyle( LDiag::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ret->hatStyle( LDiag::Style::DatenRahmen ) )
-    {
-        ret->setDatenRahmenBreite( 1 );
-        ret->setDatenRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ret->hatStyle( LDiag::Style::Hintergrund ) )
-        ret->setHintergrundFarbe( 0xFF000000 );
-    if( ret->hatStyle( LDiag::Style::DatenHintergrund ) )
-        ret->setHintergrundFarbe( 0xFF000000 );
     return ret;
 }
 
-FBalken * initFBalken( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style )
+FBalken *initFBalken( int x, int y, int br, int hö, __int64 style )
 {
-    FBalken *ret = new FBalken();
+    FBalken *ret = uiFactory.createFBalken( uiFactory.initParam );
     ret->addStyle( style );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
-    if( zSchrift )
-    {
-        ret->setSchriftZ( zSchrift->getThis() );
-        ret->setSFarbe( 0xFFFFFFFF );
-        ret->setSSize( 12 );
-    }
-    if( ret->hatStyle( FBalken::Style::Rahmen ) )
-    {
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-        ret->setRahmenBreite( 1 );
-    }
-    if( ret->hatStyle( FBalken::Style::HBild ) )
-    {
-        Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
-        ret->setHintergrundBildZ( fbhb );
-    }
-    if( ret->hatStyle( FBalken::Style::FBild ) )
-    {
-        Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
-        ret->setFBgBildZ( fbfhb );
-    }
-    else if( ret->hatStyle( FBalken::Style::FFarbe ) )
-        ret->setFBgFarbe( 0xFF00FF00 );
     return ret;
 }
 
-AuswahlListe *initAuswahlListe( int x, int y, int br, int hö, Schrift * zSchrift, __int64 style, std::initializer_list< char * > values )
+AuswahlListe *initAuswahlListe( int x, int y, int br, int hö, __int64 style, std::initializer_list< char * > values )
 {
-    AuswahlListe *ret = new AuswahlListe();
+    AuswahlListe *ret = uiFactory.createAuswahlListe( uiFactory.initParam );
     ret->setPosition( x, y );
     ret->setSize( br, hö );
     ret->addStyle( style );
-    ret->setSchriftZ( zSchrift->getThis() );
-    if( ret->hatStyle( AuswahlListe::Style::Buffered ) )
-    {
-        ret->setAlphaFeldFarbe( 0x5500FF00 );
-        ret->setAlphaFeldStrength( -5 );
-    }
-    if( ret->hatStyle( AuswahlListe::Style::Rahmen ) )
-    {
-        ret->setRahmenBreite( 1 );
-        ret->setRahmenFarbe( 0xFFFFFFFF );
-    }
-    if( ( style | AuswahlListe::Style::Hintergrund ) == style )
-        ret->setHintergrundFarbe( 0xFF000000 );
-    if( ( style | AuswahlListe::Style::Erlaubt ) == style )
-        ret->setMausEreignis( _ret1ME );
-    if( ( style | AuswahlListe::Style::AuswahlRahmen ) == style )
-    {
-        ret->setALRBreite( 1 );
-        ret->setALRFarbe( 0xFF00FF00 );
-    }
-    if( ( style | AuswahlListe::Style::AuswahlBuffer ) == style )
-    {
-        ret->setAAFFarbe( 0x0000FF00 );
-        ret->setAAFStrength( -8 );
-    }
     for( auto i = values.begin(); i != values.end(); i++ )
         ret->addEintrag( *i );
     ret->update();
@@ -322,10 +145,8 @@ ZeichnungHintergrund *initZeichnungHintergrund( int x, int y, int br, int h
     return ret;
 }
 
-void initToolTip( Zeichnung * obj, const char *txt, Schrift * zSchrift, Bildschirm * zBs )
+void initToolTip( Zeichnung *obj, const char *txt )
 {
-    obj->setToolTipText( txt, zBs, zSchrift );
-    obj->zToolTip()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Hintergrund | TextFeld::Style::HAlpha | TextFeld::Style::Mehrzeilig );
-    obj->zToolTip()->setHintergrundFarbe( 0xA0000000 );
-    obj->zToolTip()->setRahmenFarbe( 0xFFFFFFFF );
+    obj->setToolTipText( txt, uiFactory.initParam.bildschirm, uiFactory.initParam.schrift );
+    obj->zToolTip()->addStyle( TextFeld::Style::Mehrzeilig );
 }

+ 14 - 14
KSGClient/Global/Initialisierung.h

@@ -17,26 +17,26 @@ using namespace Framework;
 
 struct OBJTabelleSpalteIni
 {
-	char *name;
-	int breite;
-	int minBreite;
-	int maxBreite;
+    char *name;
+    int breite;
+    int minBreite;
+    int maxBreite;
 };
 
 #define ABSTYLE AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::Hintergrund | AuswahlBox::Style::VScroll
 #define OTSTYLE ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::Raster
 
-Knopf *initKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel );
-KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
-Fenster *initFenster( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *titel );
-TextFeld *initTextFeld( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, char *txt );
+Knopf *initKnopf( int x, int y, int br, int hö, __int64 style, char *titel );
+KontrollKnopf *initKontrollKnopf( int x, int y, int br, int hö, __int64 style, char *txt );
+Fenster *initFenster( int x, int y, int br, int hö, __int64 style, char *titel );
+TextFeld *initTextFeld( int x, int y, int br, int hö, __int64 style, char *txt );
 BildZ *initBildZ( int x, int y, int br, int hö, __int64 style, Bild *b );
-AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values );
-ObjTabelle *initObjTabelle( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe );
-LDiag *initLinienDiagramm( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, DiagDaten *data );
-FBalken *initFBalken( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style );
-AuswahlListe *initAuswahlListe( int x, int y, int br, int hö, Schrift *zSchrift, __int64 style, std::initializer_list< char * > values );
+AuswahlBox *initAuswahlBox( int x, int y, int br, int hö, __int64 style, std::initializer_list< char * > values );
+ObjTabelle *initObjTabelle( int x, int y, int br, int hö, __int64 style, std::initializer_list< OBJTabelleSpalteIni > spalten, int überschriftHöhe );
+LDiag *initLinienDiagramm( int x, int y, int br, int hö, __int64 style, DiagDaten *data );
+FBalken *initFBalken( int x, int y, int br, int hö, __int64 style );
+AuswahlListe *initAuswahlListe( int x, int y, int br, int hö, __int64 style, std::initializer_list< char * > values );
 ZeichnungHintergrund *initZeichnungHintergrund( int x, int y, int br, int hö, __int64 style, int farbe );
-void initToolTip( Zeichnung *obj, const char *txt, Schrift *zSchrift, Bildschirm *zBs );
+void initToolTip( Zeichnung *obj, const char *txt );
 
 #endif

+ 24 - 50
KSGClient/Global/Render.cpp

@@ -7,15 +7,13 @@
 
 // Inhalt der Render Klasse aus Render.h
 // Konstruktor 
-Render::Render( Schrift *schrift )
+Render::Render()
     : Thread()
 {
     exit = 0;
-    bildschirm = 0;
     time = new ZeitMesser();
     tickval = 1.0 / 60;
     fps = new Fps();
-    fps->setSchriftZ( schrift );
     fps->setSFarbe( 0xFFFFFFFF );
     deckAlpha = 0;
     inAnimation = 0;
@@ -25,18 +23,10 @@ Render::Render( Schrift *schrift )
 // Destruktor 
 Render::~Render()
 {
-    if( bildschirm )
-        bildschirm = bildschirm->release();
-    time = time->release();
+    time->release();
     fps = (Fps *)fps->release();
 }
 
-// nicht constant 
-void Render::setBildschirm( Bildschirm * bildschirm ) // setzt den Bildschirm
-{
-    this->bildschirm = bildschirm;
-}
-
 void Render::thread() // Render Schleife
 {
     bool fpsAdd = 0;
@@ -45,38 +35,33 @@ void Render::thread() // Render Schleife
     int maxFPS = 0;
     while( !exit )
     {
-        if( bildschirm )
+        if( Framework::getTastenStand( T_F1 ) )
         {
-            if( Framework::getTastenStand( T_F1 ) )
+            if( !fpsAdd )
             {
-                if( !fpsAdd )
-                {
-                    bildschirm->addMember( fps->getThis() );
-                    fpsAdd = 1;
-                }
+                uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( fps->getThis() ) );
+                fpsAdd = 1;
             }
-            else
+        }
+        else
+        {
+            if( fpsAdd )
             {
-                if( fpsAdd )
-                {
-                    bildschirm->removeMember( fps );
-                    fpsAdd = 0;
+                uiFactory.initParam.bildschirm->removeMember( fps );
+                fpsAdd = 0;
 
-                }
             }
-            if( _render == 1 )
-            {
-                bildschirm->render();
-                bildschirm->tick( tickval );
-            }
-            else
-                Sleep( 100 );
-            bildschirm->lock();
-            maxFPS = userOptions->wertExistiert( "MaxFPS" ) ? *userOptions->zWert( "MaxFPS" ) : 30;
-            bildschirm->unlock();
+        }
+        if( _render == 1 )
+        {
+            uiFactory.initParam.bildschirm->render();
+            uiFactory.initParam.bildschirm->tick( tickval );
         }
         else
             Sleep( 100 );
+        uiFactory.initParam.bildschirm->lock();
+        maxFPS = userOptions->wertExistiert( "MaxFPS" ) ? *userOptions->zWert( "MaxFPS" ) : 30;
+        uiFactory.initParam.bildschirm->unlock();
         ausgleich += 1.0 / maxFPS - tickval;
         if( ausgleich > 0 )
             Sleep( (int)( ausgleich * 1000 ) );
@@ -104,8 +89,8 @@ void Render::thread() // Render Schleife
             if( !inAnimation )
             {
                 deckAlpha = 250;
-                bildschirm->setdeckFarbe( deckAlpha << 24 );
-                bildschirm->setOnTop( 1 );
+                uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
+                uiFactory.initParam.bildschirm->setOnTop( 1 );
                 vorLogin->setSichtbar( 1 );
                 inAnimation = 1;
                 aktion = 0;
@@ -143,10 +128,10 @@ void Render::thread() // Render Schleife
         if( inAnimation )
         {
             deckAlpha -= 25;
-            bildschirm->setdeckFarbe( deckAlpha << 24 );
+            uiFactory.initParam.bildschirm->setdeckFarbe( deckAlpha << 24 );
             if( deckAlpha == 0 )
             {
-                bildschirm->setOnTop( 0 );
+                uiFactory.initParam.bildschirm->setOnTop( 0 );
                 inAnimation = 0;
             }
         }
@@ -164,15 +149,4 @@ void Render::beenden() // exit = 1;
 {
     exit = 1;
     WaitForSingleObject( threadHandle, 5000 );
-}
-
-// constant
-Bildschirm *Render::getBildschirm() // gibt den Bildschirm zurück
-{
-    return bildschirm ? bildschirm->getThis() : 0;
-}
-
-Bildschirm *Render::zBildschirm()
-{
-    return bildschirm;
 }

+ 14 - 19
KSGClient/Global/Render.h

@@ -12,27 +12,22 @@ using namespace Framework;
 class Render : public Thread
 {
 private:
-	bool exit;
-	Bildschirm *bildschirm;
-	ZeitMesser *time;
-	double tickval;
-	Fps *fps;
-	unsigned char deckAlpha;
-	bool inAnimation;
+    bool exit;
+    ZeitMesser *time;
+    double tickval;
+    Fps *fps;
+    unsigned char deckAlpha;
+    bool inAnimation;
 
 public:
-	// Konstruktor 
-	Render( Schrift *schrift );
-	// Destruktor 
-	~Render();
-	// nicht constant 
-	void setBildschirm( Bildschirm *bildschirm ); // setzt den Bildschirm
-	virtual void thread(); // Render Schleife
-	void beginn(); // beginnt rendering
-	void beenden(); // exit = 1;
-	// constant
-	Bildschirm *getBildschirm(); // gibt den Bildschirm zurück
-	Bildschirm *zBildschirm();
+    // Konstruktor 
+    Render();
+    // Destruktor 
+    ~Render();
+    // nicht constant 
+    virtual void thread(); // Render Schleife
+    void beginn(); // beginnt rendering
+    void beenden(); // exit = 1;
 };
 
 #endif

+ 18 - 20
KSGClient/Global/Variablen.cpp

@@ -21,9 +21,9 @@ void initVariables( Schrift *zSchrift, Bildschirm *zBildschirm )
     editorClient = 0;
     minigameClient = 0;
     cmProcessor = 0;
-    hauptScreen = zBildschirm->getThis();
-    vorLogin = new VorLogin( zSchrift, zBildschirm );
-    nachLogin = new NachLogin( zSchrift, zBildschirm );
+    uiFactory = Framework::defaultUI( zSchrift, zBildschirm );
+    vorLogin = new VorLogin();
+    nachLogin = new NachLogin();
     Animation2DData *lad = new Animation2DData();
     LTDBDatei *ladd = new LTDBDatei();
     ladd->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
@@ -31,14 +31,14 @@ void initVariables( Schrift *zSchrift, Bildschirm *zBildschirm )
     lad->setFPS( 30 );
     lad->setWiederhohlend( 1 );
     ladeAnimation = new Animation2D();
-    ladeAnimation->setPosition( hauptScreen->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
+    ladeAnimation->setPosition( zBildschirm->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
     ladeAnimation->setSize( 50, 50 );
     ladeAnimation->setAPS( 450 );
     ladeAnimation->setAnimationDataZ( lad );
     ladeAnimation->setRahmen( 1 );
     ladeAnimation->setRahmenBreite( 1 );
     ladeAnimation->setRahmenFarbe( 0xFFFFFFFF );
-    zBildschirm->setOnTopZeichnung( ladeAnimation->getThis() );
+    zBildschirm->setOnTopZeichnung( dynamic_cast<Zeichnung *>( ladeAnimation->getThis() ) );
     bilder = new Bilder();
     updateH = new UpdateHandler();
     keepAliveTh = new KeepAliveTh();
@@ -49,7 +49,7 @@ void initVariables( Schrift *zSchrift, Bildschirm *zBildschirm )
         WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden." ), MB_ICONERROR );
         exit( 0 );
     }
-    KSGClient::KSGNetworkCreateRegisterdMain getMainClient = ( KSGClient::KSGNetworkCreateRegisterdMain )GetProcAddress( networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN );
+    KSGClient::KSGNetworkCreateRegisterdMain getMainClient = (KSGClient::KSGNetworkCreateRegisterdMain)GetProcAddress( networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN );
     if( !getMainClient )
     {
         WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGNETWORK_CREATE_REGISTERD_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
@@ -80,15 +80,15 @@ void releaseVariables()
     delete keepAliveTh;
     keepAliveTh = 0;
     if( vorLogin )
-        vorLogin = vorLogin->release();
+        vorLogin = (VorLogin *)vorLogin->release();
     if( nachLogin )
         nachLogin = (NachLogin *)nachLogin->release();
     if( loginClient )
-        loginClient = loginClient->release();
+        loginClient = (KSGClient::LoginServerClient *)loginClient->release();
     if( registerClient )
-        registerClient = registerClient->release();
+        registerClient = (KSGClient::RegisterServerClient *)registerClient->release();
     if( infoClient )
-        infoClient = infoClient->release();
+        infoClient = (KSGClient::InformationServerClient *)infoClient->release();
     if( chatClient )
         chatClient->trenne( 1 );
     if( cmProcessor )
@@ -98,9 +98,9 @@ void releaseVariables()
         cmProcessor = (ChatMessageProcessor *)cmProcessor->release();
     }
     if( chatClient )
-        chatClient = chatClient->release();
+        chatClient = (KSGClient::ChatServerClient *)chatClient->release();
     if( anmeldungClient )
-        anmeldungClient = anmeldungClient->release();
+        anmeldungClient = (KSGClient::AnmeldungServerClient *)anmeldungClient->release();
     if( spielClient )
         spielClient->trenne();
     if( smProcessor )
@@ -110,21 +110,19 @@ void releaseVariables()
         smProcessor = (SpielMessageProcessor *)smProcessor->release();
     }
     if( spielClient )
-        spielClient = spielClient->release();
+        spielClient = (KSGClient::SpielServerClient *)spielClient->release();
     if( shopClient )
-        shopClient = shopClient->release();
+        shopClient = (KSGClient::ShopServerClient *)shopClient->release();
     if( newsClient )
-        newsClient = newsClient->release();
+        newsClient = (KSGClient::NewsServerClient *)newsClient->release();
     if( editorClient )
-        editorClient = editorClient->release();
+        editorClient = (KSGClient::EditorServerClient *)editorClient->release();
     if( minigameClient )
-        minigameClient = minigameClient->release();
+        minigameClient = (KSGClient::MinigameServerClient *)minigameClient->release();
     if( ladeAnimation )
         ladeAnimation = (Animation2D *)ladeAnimation->release();
-    if( hauptScreen )
-        hauptScreen = hauptScreen->release();
     if( mainClient )
-        mainClient = mainClient->release();
+        mainClient = (KSGClient::MainServerClient *)mainClient->release();
     KartenLeser::cleanUp();
     if( bilder )
     {

+ 6 - 4
KSGClient/Global/Variablen.h

@@ -6,14 +6,16 @@
 #endif
 
 #include <KSGNetwork.h>
+#include "Bilder.h"
+#include <DLLRegister.h>
+#include <Animation.h>
+#include <UIInitialization.h>
+
 #include "../Netzwerk/KeepAlive.h"
 #include "..\VorLogin\Login\Login.h"
 #include "..\VorLogin\VorLogin.h"
 #include "..\NachLogin\NachLogin.h"
 #include "..\NachLogin\Update\Update.h"
-#include "Bilder.h"
-#include <DLLRegister.h>
-#include <Animation.h>
 #include "../Netzwerk/ChatMessageProcessor.h"
 #include "../Netzwerk/SpielMessageProcessor.h"
 
@@ -35,12 +37,12 @@ variable VorLogin *vorLogin;
 variable NachLogin *nachLogin;
 variable int aktion;
 variable Framework::Animation2D *ladeAnimation;
-variable Bildschirm *hauptScreen;
 variable Bilder *bilder;
 variable UpdateHandler *updateH;
 variable bool _render;
 variable KeepAliveTh *keepAliveTh;
 variable InitDatei *userOptions;
+variable UIInit uiFactory;
 
 void initVariables( Schrift *zSchrift, Bildschirm *zBildschirm );
 void releaseVariables();

+ 4 - 20
KSGClient/Leser/KartenLeser.cpp

@@ -10,7 +10,7 @@ KartenLeser *KartenLeser::instance = new KartenLeser();
 
 KartenLeser *KartenLeser::getInstance()
 {
-    return instance->getThis();
+    return dynamic_cast<KartenLeser *>( instance->getThis() );
 }
 
 void KartenLeser::cleanUp()
@@ -26,18 +26,17 @@ KartenLeser &KartenLeser::operator=( const KartenLeser &l )
     letzterFehler = new Text( l.letzterFehler->getText() );
     kartenClient = 0;
     karteId = 0;
-    ref = 1;
     return *this;
 }
 
 // Inhalt der KartenLeser Klasse aus KartenLeser.h
 // Konstruktor
 KartenLeser::KartenLeser()
+    : ReferenceCounter()
 {
     letzterFehler = new Text( "" );
     kartenClient = 0;
     karteId = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -70,7 +69,7 @@ void KartenLeser::unlock()
 }
 
 // constant
-Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift )
+Bild *KartenLeser::getKartenTitelBild()
 {
     bool ok = 1;
     int port = 0;
@@ -103,7 +102,7 @@ Bild *KartenLeser::getKartenTitelBild( Schrift *zSchrift )
     {
         ret = new Bild();
         ret->neuBild( 200, 100, 0xFF000000 );
-        TextRenderer tr( zSchrift->getThis() );
+        TextRenderer tr( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
         tr.setSchriftSize( 12 );
         Text *kn = getKarteName();
         tr.renderText( 10, 10, kn->getText(), *ret, 0xFFFFFFFF );
@@ -277,19 +276,4 @@ Text *KartenLeser::getKartePfad() const
 char *KartenLeser::getLetzterFehler() const
 {
     return letzterFehler->getText();
-}
-
-// Reference Counting
-KartenLeser *KartenLeser::getThis()
-{
-    ref++;
-    return this;
-}
-
-KartenLeser *KartenLeser::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 18 - 22
KSGClient/Leser/KartenLeser.h

@@ -8,14 +8,13 @@
 
 using namespace Framework;
 
-class KartenLeser
+class KartenLeser : public virtual ReferenceCounter
 {
 private:
     Text *letzterFehler;
     KSGClient::KartenServerClient *kartenClient;
-	int karteId;
+    int karteId;
     Critical cs;
-	int ref;
 
     static KartenLeser *instance;
     // Konstruktor
@@ -26,27 +25,24 @@ public:
     static KartenLeser *getInstance();
     static void cleanUp();
 
-	// Destruktor
-	~KartenLeser();
-	// nicht constant
-	void setKarteId( int karteId );
+    // Destruktor
+    ~KartenLeser();
+    // nicht constant
+    void setKarteId( int karteId );
     void lock();
     void unlock();
-	// constant
-	Bild *getKartenTitelBild( Schrift *zSchrift );
-	Bild *getKartenVorschauBild();
-	Bild *getLadeBild();
-	bool getKartenBeschreibung();
-	int getSpielId() const;
-	int getKarteId() const;
-	Text *getSpielName() const;
-	Text *getSpielPfad() const;
-	Text *getKarteName() const;
-	Text *getKartePfad() const;
-	char *getLetzterFehler() const;
-	// Reference Counting
-	KartenLeser *getThis();
-	KartenLeser *release();
+    // constant
+    Bild *getKartenTitelBild();
+    Bild *getKartenVorschauBild();
+    Bild *getLadeBild();
+    bool getKartenBeschreibung();
+    int getSpielId() const;
+    int getKarteId() const;
+    Text *getSpielName() const;
+    Text *getSpielPfad() const;
+    Text *getKarteName() const;
+    Text *getKartePfad() const;
+    char *getLetzterFehler() const;
 };
 
 #endif

+ 601 - 596
KSGClient/NachLogin/Account/AccountAnsehen.cpp

@@ -7,640 +7,645 @@
 
 // inhalt der AccountAnsehen Klasse aus AccountAnsehen.h
 // Konstruktor
-AccountAnsehen::AccountAnsehen( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
-	: Zeichnung(),
-  laden( (Animation2D*)ladeAnimation->dublizieren() ),
-  bildschirmGröße( hauptScreen->getBackBufferSize() ),
-  rahmen( new LRahmen() ),
-  aktivitätK( initKnopf( 145, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spieler Aktivität" ) ),
-  historieK( initKnopf( 665, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiel Historie" ) ),
-  spieleUndKartenK( initKnopf( 275, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiele / Karten" ) ),
-  spielPartnerK( initKnopf( 405, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spielpartner" ) ),
-  statistikK( initKnopf( 535, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spiel Statistik" ) ),
-  suchenK( initKnopf( 15, 10, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Spieler suchen" ) ),
-  suche( new AccountSuchen( zSchrift->getThis() ) ),
-  aktivität( new AccountAktivität( zSchrift ) ),
-  spieleUndKarten( new AccountSpieleUndKarten( zSchrift ) ),
-  partner( new AccountSpielPartner( zSchrift ) ),
-  statistik( new AccountStatistik( zSchrift ) ),
-  historie( new AccountHistorie( zSchrift ) ),
-  account( 0 ),
-  alpha( 0 ),
-  alpha2( 255 ),
-  sichtbar( 0 ),
-  jetzt( 0 ),
-  nachher( 0 ),
-  prozent1( 0 ),
-  prozent2( 0 ),
-  tickVal( 0 ),
-  animation( 0 ),
-  knopfX( 810 ),
-  rend( 0 )
+AccountAnsehen::AccountAnsehen( Fenster *zNachLoginFenster, int x )
+    : Zeichnung(),
+    laden( (Animation2D *)ladeAnimation->dublizieren() ),
+    bildschirmGröße( uiFactory.initParam.bildschirm->getBackBufferSize() ),
+    rahmen( new LRahmen() ),
+    aktivitätK( initKnopf( 145, 10, 120, 20, Knopf::Style::Sichtbar, "Spieler Aktivität" ) ),
+    historieK( initKnopf( 665, 10, 120, 20, Knopf::Style::Sichtbar, "Spiel Historie" ) ),
+    spieleUndKartenK( initKnopf( 275, 10, 120, 20, Knopf::Style::Sichtbar, "Spiele / Karten" ) ),
+    spielPartnerK( initKnopf( 405, 10, 120, 20, Knopf::Style::Sichtbar, "Spielpartner" ) ),
+    statistikK( initKnopf( 535, 10, 120, 20, Knopf::Style::Sichtbar, "Spiel Statistik" ) ),
+    suchenK( initKnopf( 15, 10, 120, 20, Knopf::Style::Sichtbar, "Spieler suchen" ) ),
+    suche( new AccountSuchen() ),
+    aktivität( new AccountAktivität() ),
+    spieleUndKarten( new AccountSpieleUndKarten() ),
+    partner( new AccountSpielPartner() ),
+    statistik( new AccountStatistik() ),
+    historie( new AccountHistorie() ),
+    account( 0 ),
+    alpha( 0 ),
+    alpha2( 255 ),
+    sichtbar( 0 ),
+    jetzt( 0 ),
+    nachher( 0 ),
+    prozent1( 0 ),
+    prozent2( 0 ),
+    tickVal( 0 ),
+    animation( 0 ),
+    knopfX( 810 ),
+    rend( 0 )
 {
-	laden->setSichtbar( 0 );
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setSize( 102, 32 );
-	begPos = Punkt( x, 67 );
-	begGröße = Punkt( 102, 32 );
-	pos = Punkt( x, 67 );
-	gr = Punkt( 102, 32 );
-	pos1 = begPos;
-	größe1 = begGröße;
-	größe2 = Punkt( 800, 500 );
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	laden->setPosition( 375, 225 );
-	zNachLoginFenster->addMember( getThis() );
+    laden->setSichtbar( 0 );
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setSize( 102, 32 );
+    begPos = Punkt( x, 67 );
+    begGröße = Punkt( 102, 32 );
+    pos = Punkt( x, 67 );
+    gr = Punkt( 102, 32 );
+    pos1 = begPos;
+    größe1 = begGröße;
+    größe2 = Punkt( 800, 500 );
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    laden->setPosition( 375, 225 );
+    getThis();
+    zNachLoginFenster->addMember( this );
 }
 
 // Destruktor
 AccountAnsehen::~AccountAnsehen()
 {
-	laden->release();
-	rahmen->release();
-	aktivitätK->release();
-	historieK->release();
-	spieleUndKartenK->release();
-	spielPartnerK->release();
-	statistikK->release();
-	suchenK->release();
-	suche->release();
-	aktivität->release();
-	spieleUndKarten->release();
-	partner->release();
-	statistik->release();
-	historie->release();
+    suche->warteAufThread( 10000 );
+    suche->ende();
+    aktivität->warteAufThread( 10000 );
+    aktivität->ende();
+    laden->release();
+    rahmen->release();
+    aktivitätK->release();
+    historieK->release();
+    spieleUndKartenK->release();
+    spielPartnerK->release();
+    statistikK->release();
+    suchenK->release();
+    suche->release();
+    aktivität->release();
+    spieleUndKarten->release();
+    partner->release();
+    statistik->release();
+    historie->release();
 }
 
 // nicht constant
 void AccountAnsehen::setSichtbar( bool sicht )
 {
-	begPos = pos;
-	begGröße = gr;
-	animation |= ( sicht ? 0x1 : 0x2 );
-	rend = 1;
+    begPos = pos;
+    begGröße = gr;
+    animation |= ( sicht ? 0x1 : 0x2 );
+    rend = 1;
 }
 
 bool AccountAnsehen::setSpielerDetails( int account, int nachher )
 {
-	if( laden->istSichtbar() )
-		return 0;
-	laden->setSichtbar( 1 );
-	if( nachher == 2 )
-		aktivität->ladeStatistik( account );
-	if( nachher == 3 )
-		spieleUndKarten->ladeStatistik( account );
-	if( nachher == 4 )
-		partner->ladeStatistik( account );
-	if( nachher == 5 )
-		statistik->ladeStatistik( account );
-	if( nachher == 6 )
-		historie->ladeStatistik( account );
-	this->nachher = nachher;
-	this->account = account;
-	return 1;
+    if( laden->istSichtbar() )
+        return 0;
+    laden->setSichtbar( 1 );
+    if( nachher == 2 )
+        aktivität->ladeStatistik( account );
+    if( nachher == 3 )
+        spieleUndKarten->ladeStatistik( account );
+    if( nachher == 4 )
+        partner->ladeStatistik( account );
+    if( nachher == 5 )
+        statistik->ladeStatistik( account );
+    if( nachher == 6 )
+        historie->ladeStatistik( account );
+    this->nachher = nachher;
+    this->account = account;
+    return 1;
 }
 
 bool AccountAnsehen::tick( double tickVal )
 {
-	if( !knopfX )
-	{
-		rend |= aktivitätK->tick( tickVal );
-		rend |= historieK->tick( tickVal );
-		rend |= spieleUndKartenK->tick( tickVal );
-		rend |= spielPartnerK->tick( tickVal );
-		rend |= statistikK->tick( tickVal );
-		rend |= suchenK->tick( tickVal );
-	}
-	rend |= laden->tick( tickVal );
-	rend |= suche->tick( tickVal );
-	rend |= aktivität->tick( tickVal );
-	rend |= spieleUndKarten->tick( tickVal );
-	rend |= partner->tick( tickVal );
-	rend |= statistik->tick( tickVal );
-	rend |= historie->tick( tickVal );
-	this->tickVal += tickVal;
-	int val = (int)( this->tickVal * 150 );
-	int val2 = (int)( this->tickVal * 500 );
-	this->tickVal -= val / 150.0;
-	if( val )
-	{
-		if( ( animation | 0x1 ) == animation ) // Einblenden
-		{
-			if( prozent1 != 100 )
-			{
-				prozent1 += val;
-				if( prozent1 >= 100 )
-				{
-					prozent1 = 100;
-					if( !jetzt && !nachher )
-						setSpielerDetails( loginClient->getAccountId(), 2 );
-				}
-				pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
-				gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
-			}
-			else if( alpha != 255 )
-			{
-				alpha += val * 2;
-				if( alpha >= 255 || ( animation | 0x2 ) == animation )
-				{
-					alpha = 255;
-					animation &= ~0x1;
-					sichtbar = 1;
-					prozent1 = 0;
-				}
-			}
-			rend = 1;
-		}
-		if( ( animation | 0x2 ) == animation ) // ausblenden
-		{
-			if( alpha != 0 )
-			{
-				alpha -= val * 2;
-				if( alpha < 0 )
-					alpha = 0;
-			}
-			else
-			{
-				prozent2 += val;
-				if( prozent2 > 100 )
-					prozent2 = 100;
-				pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
-				gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
-				if( prozent2 == 100 )
-				{
-					prozent2 = 0;
-					animation &= ~0x2;
-					sichtbar = 0;
-				}
-			}
-			rend = 1;
-		}
-		if( laden->istSichtbar() && alpha2 != 100 )
-		{
-			if( alpha2 - val <= 100 )
-				alpha2 = 100;
-			else
-				alpha2 -= val;
-			rend = 1;
-		}
-		if( !laden->istSichtbar() && alpha2 != 255 )
-		{
-			if( alpha2 + val >= 255 )
-				alpha2 = 255;
-			else
-				alpha2 += val;
-			rend = 1;
-		}
-	}
-	if( val2 )
-	{
-		if( jetzt > 1 && !laden->istSichtbar() && knopfX != 0 )
-		{
-			if( knopfX - val2 < 0 )
-				knopfX = 0;
-			else
-				knopfX -= val2;
-			rend = 1;
-		}
-		if( jetzt < 2 && !laden->istSichtbar() && knopfX != 810 )
-		{
-			if( knopfX + val2 > 810 )
-				knopfX = 810;
-			else
-				knopfX += val2;
-			rend = 1;
-		}
-	}
-	switch( nachher )
-	{
-	case 2:
-		if( aktivität->getStatus() == 2 )
-		{
-			switch( jetzt )
-			{
-			case 0:
-				aktivität->setSichtbar( 1, 0 );
-				break;
-			case 1:
-				suchenK->setAlphaFeldStrength( -5 );
-				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
-				suche->setSichtbar( 0 );
-				aktivität->setSichtbar( 1, 0 );
-				break;
-			case 3:
-				spieleUndKartenK->setAlphaFeldStrength( -5 );
-				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
-				spieleUndKarten->setSichtbar( 0, 1 );
-				aktivität->setSichtbar( 1, 1 );
-				break;
-			case 4:
-				spielPartnerK->setAlphaFeldStrength( -5 );
-				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
-				partner->setSichtbar( 0, 1 );
-				aktivität->setSichtbar( 1, 1 );
-				break;
-			case 5:
-				statistikK->setAlphaFeldStrength( -5 );
-				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
-				statistik->setSichtbar( 0, 1 );
-				aktivität->setSichtbar( 1, 1 );
-				break;
-			case 6:
-				historieK->setAlphaFeldStrength( -5 );
-				historieK->setAlphaFeldFarbe( 0x5500FF00 );
-				historie->setSichtbar( 0, 1 );
-				aktivität->setSichtbar( 1, 1 );
-				break;
-			}
-			aktivitätK->setAlphaFeldStrength( -2 );
-			aktivitätK->setAlphaFeldFarbe( 0x3000FF00 );
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		if( !aktivität->getStatus() )
-		{
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		break;
-	case 3:
-		if( spieleUndKarten->getStatus() == 2 )
-		{
-			switch( jetzt )
-			{
-			case 0:
-				spieleUndKarten->setSichtbar( 1, 0 );
-				break;
-			case 1:
-				suchenK->setAlphaFeldStrength( -5 );
-				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
-				suche->setSichtbar( 0 );
-				spieleUndKarten->setSichtbar( 1, 0 );
-				break;
-			case 2:
-				aktivitätK->setAlphaFeldStrength( -5 );
-				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
-				aktivität->setSichtbar( 0, 0 );
-				spieleUndKarten->setSichtbar( 1, 0 );
-				break;
-			case 4:
-				spielPartnerK->setAlphaFeldStrength( -5 );
-				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
-				partner->setSichtbar( 0, 1 );
-				spieleUndKarten->setSichtbar( 1, 1 );
-				break;
-			case 5:
-				statistikK->setAlphaFeldStrength( -5 );
-				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
-				statistik->setSichtbar( 0, 1 );
-				spieleUndKarten->setSichtbar( 1, 1 );
-				break;
-			case 6:
-				historieK->setAlphaFeldStrength( -5 );
-				historieK->setAlphaFeldFarbe( 0x5500FF00 );
-				historie->setSichtbar( 0, 1 );
-				spieleUndKarten->setSichtbar( 1, 1 );
-				break;
-			}
-			spieleUndKartenK->setAlphaFeldStrength( -2 );
-			spieleUndKartenK->setAlphaFeldFarbe( 0x3000FF00 );
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		if( !spieleUndKarten->getStatus() )
-		{
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		break;
-	case 4:
-		if( partner->getStatus() == 2 )
-		{
-			switch( jetzt )
-			{
-			case 0:
-				partner->setSichtbar( 1, 0 );
-				break;
-			case 1:
-				suchenK->setAlphaFeldStrength( -5 );
-				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
-				suche->setSichtbar( 0 );
-				partner->setSichtbar( 1, 0 );
-				break;
-			case 2:
-				aktivitätK->setAlphaFeldStrength( -5 );
-				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
-				aktivität->setSichtbar( 0, 0 );
-				partner->setSichtbar( 1, 0 );
-				break;
-			case 3:
-				spieleUndKartenK->setAlphaFeldStrength( -5 );
-				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
-				spieleUndKarten->setSichtbar( 0, 0 );
-				partner->setSichtbar( 1, 0 );
-				break;
-			case 5:
-				statistikK->setAlphaFeldStrength( -5 );
-				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
-				statistik->setSichtbar( 0, 1 );
-				partner->setSichtbar( 1, 1 );
-				break;
-			case 6:
-				historieK->setAlphaFeldStrength( -5 );
-				historieK->setAlphaFeldFarbe( 0x5500FF00 );
-				historie->setSichtbar( 0, 1 );
-				partner->setSichtbar( 1, 1 );
-				break;
-			}
-			spielPartnerK->setAlphaFeldStrength( -2 );
-			spielPartnerK->setAlphaFeldFarbe( 0x3000FF00 );
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		if( !partner->getStatus() )
-		{
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		break;
-	case 5:
-		if( statistik->getStatus() == 2 )
-		{
-			switch( jetzt )
-			{
-			case 0:
-				statistik->setSichtbar( 1, 0 );
-				break;
-			case 1:
-				suchenK->setAlphaFeldStrength( -5 );
-				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
-				suche->setSichtbar( 0 );
-				statistik->setSichtbar( 1, 0 );
-				break;
-			case 2:
-				aktivitätK->setAlphaFeldStrength( -5 );
-				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
-				aktivität->setSichtbar( 0, 0 );
-				statistik->setSichtbar( 1, 0 );
-				break;
-			case 3:
-				spieleUndKartenK->setAlphaFeldStrength( -5 );
-				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
-				spieleUndKarten->setSichtbar( 0, 0 );
-				statistik->setSichtbar( 1, 0 );
-				break;
-			case 4:
-				spielPartnerK->setAlphaFeldStrength( -5 );
-				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
-				partner->setSichtbar( 0, 0 );
-				statistik->setSichtbar( 1, 0 );
-				break;
-			case 6:
-				historieK->setAlphaFeldStrength( -5 );
-				historieK->setAlphaFeldFarbe( 0x5500FF00 );
-				historie->setSichtbar( 0, 1 );
-				statistik->setSichtbar( 1, 1 );
-				break;
-			}
-			statistikK->setAlphaFeldStrength( -2 );
-			statistikK->setAlphaFeldFarbe( 0x3000FF00 );
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		if( !statistik->getStatus() )
-		{
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		break;
-	case 6:
-		if( historie->getStatus() == 2 )
-		{
-			switch( jetzt )
-			{
-			case 0:
-				historie->setSichtbar( 1, 0 );
-				break;
-			case 1:
-				suchenK->setAlphaFeldStrength( -5 );
-				suchenK->setAlphaFeldFarbe( 0x5500FF00 );
-				suche->setSichtbar( 0 );
-				historie->setSichtbar( 1, 0 );
-				break;
-			case 2:
-				aktivitätK->setAlphaFeldStrength( -5 );
-				aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
-				aktivität->setSichtbar( 0, 0 );
-				historie->setSichtbar( 1, 0 );
-				break;
-			case 3:
-				spieleUndKartenK->setAlphaFeldStrength( -5 );
-				spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
-				spieleUndKarten->setSichtbar( 0, 0 );
-				historie->setSichtbar( 1, 0 );
-				break;
-			case 4:
-				spielPartnerK->setAlphaFeldStrength( -5 );
-				spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
-				partner->setSichtbar( 0, 0 );
-				historie->setSichtbar( 1, 0 );
-				break;
-			case 5:
-				statistikK->setAlphaFeldStrength( -5 );
-				statistikK->setAlphaFeldFarbe( 0x5500FF00 );
-				statistik->setSichtbar( 0, 0 );
-				historie->setSichtbar( 1, 0 );
-				break;
-			}
-			historieK->setAlphaFeldStrength( -2 );
-			historieK->setAlphaFeldFarbe( 0x3000FF00 );
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		if( !historie->getStatus() )
-		{
-			laden->setSichtbar( 0 );
-			jetzt = nachher;
-			nachher = 0;
-		}
-		break;
-	}
-	int tmp = suche->getAuswahlAccountId();
-	if( tmp )
-		setSpielerDetails( tmp, 2 );
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( !knopfX )
+    {
+        rend |= aktivitätK->tick( tickVal );
+        rend |= historieK->tick( tickVal );
+        rend |= spieleUndKartenK->tick( tickVal );
+        rend |= spielPartnerK->tick( tickVal );
+        rend |= statistikK->tick( tickVal );
+        rend |= suchenK->tick( tickVal );
+    }
+    rend |= laden->tick( tickVal );
+    rend |= suche->tick( tickVal );
+    rend |= aktivität->tick( tickVal );
+    rend |= spieleUndKarten->tick( tickVal );
+    rend |= partner->tick( tickVal );
+    rend |= statistik->tick( tickVal );
+    rend |= historie->tick( tickVal );
+    this->tickVal += tickVal;
+    int val = (int)( this->tickVal * 150 );
+    int val2 = (int)( this->tickVal * 500 );
+    this->tickVal -= val / 150.0;
+    if( val )
+    {
+        if( ( animation | 0x1 ) == animation ) // Einblenden
+        {
+            if( prozent1 != 100 )
+            {
+                prozent1 += val;
+                if( prozent1 >= 100 )
+                {
+                    prozent1 = 100;
+                    if( !jetzt && !nachher )
+                        setSpielerDetails( loginClient->getAccountId(), 2 );
+                }
+                pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
+                gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
+            }
+            else if( alpha != 255 )
+            {
+                alpha += val * 2;
+                if( alpha >= 255 || ( animation | 0x2 ) == animation )
+                {
+                    alpha = 255;
+                    animation &= ~0x1;
+                    sichtbar = 1;
+                    prozent1 = 0;
+                }
+            }
+            rend = 1;
+        }
+        if( ( animation | 0x2 ) == animation ) // ausblenden
+        {
+            if( alpha != 0 )
+            {
+                alpha -= val * 2;
+                if( alpha < 0 )
+                    alpha = 0;
+            }
+            else
+            {
+                prozent2 += val;
+                if( prozent2 > 100 )
+                    prozent2 = 100;
+                pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
+                gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
+                if( prozent2 == 100 )
+                {
+                    prozent2 = 0;
+                    animation &= ~0x2;
+                    sichtbar = 0;
+                }
+            }
+            rend = 1;
+        }
+        if( laden->istSichtbar() && alpha2 != 100 )
+        {
+            if( alpha2 - val <= 100 )
+                alpha2 = 100;
+            else
+                alpha2 -= val;
+            rend = 1;
+        }
+        if( !laden->istSichtbar() && alpha2 != 255 )
+        {
+            if( alpha2 + val >= 255 )
+                alpha2 = 255;
+            else
+                alpha2 += val;
+            rend = 1;
+        }
+    }
+    if( val2 )
+    {
+        if( jetzt > 1 && !laden->istSichtbar() && knopfX != 0 )
+        {
+            if( knopfX - val2 < 0 )
+                knopfX = 0;
+            else
+                knopfX -= val2;
+            rend = 1;
+        }
+        if( jetzt < 2 && !laden->istSichtbar() && knopfX != 810 )
+        {
+            if( knopfX + val2 > 810 )
+                knopfX = 810;
+            else
+                knopfX += val2;
+            rend = 1;
+        }
+    }
+    switch( nachher )
+    {
+    case 2:
+        if( aktivität->getStatus() == 2 )
+        {
+            switch( jetzt )
+            {
+            case 0:
+                aktivität->setSichtbar( 1, 0 );
+                break;
+            case 1:
+                suchenK->setAlphaFeldStrength( -5 );
+                suchenK->setAlphaFeldFarbe( 0x5500FF00 );
+                suche->setSichtbar( 0 );
+                aktivität->setSichtbar( 1, 0 );
+                break;
+            case 3:
+                spieleUndKartenK->setAlphaFeldStrength( -5 );
+                spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
+                spieleUndKarten->setSichtbar( 0, 1 );
+                aktivität->setSichtbar( 1, 1 );
+                break;
+            case 4:
+                spielPartnerK->setAlphaFeldStrength( -5 );
+                spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
+                partner->setSichtbar( 0, 1 );
+                aktivität->setSichtbar( 1, 1 );
+                break;
+            case 5:
+                statistikK->setAlphaFeldStrength( -5 );
+                statistikK->setAlphaFeldFarbe( 0x5500FF00 );
+                statistik->setSichtbar( 0, 1 );
+                aktivität->setSichtbar( 1, 1 );
+                break;
+            case 6:
+                historieK->setAlphaFeldStrength( -5 );
+                historieK->setAlphaFeldFarbe( 0x5500FF00 );
+                historie->setSichtbar( 0, 1 );
+                aktivität->setSichtbar( 1, 1 );
+                break;
+            }
+            aktivitätK->setAlphaFeldStrength( -2 );
+            aktivitätK->setAlphaFeldFarbe( 0x3000FF00 );
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        if( !aktivität->getStatus() )
+        {
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        break;
+    case 3:
+        if( spieleUndKarten->getStatus() == 2 )
+        {
+            switch( jetzt )
+            {
+            case 0:
+                spieleUndKarten->setSichtbar( 1, 0 );
+                break;
+            case 1:
+                suchenK->setAlphaFeldStrength( -5 );
+                suchenK->setAlphaFeldFarbe( 0x5500FF00 );
+                suche->setSichtbar( 0 );
+                spieleUndKarten->setSichtbar( 1, 0 );
+                break;
+            case 2:
+                aktivitätK->setAlphaFeldStrength( -5 );
+                aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
+                aktivität->setSichtbar( 0, 0 );
+                spieleUndKarten->setSichtbar( 1, 0 );
+                break;
+            case 4:
+                spielPartnerK->setAlphaFeldStrength( -5 );
+                spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
+                partner->setSichtbar( 0, 1 );
+                spieleUndKarten->setSichtbar( 1, 1 );
+                break;
+            case 5:
+                statistikK->setAlphaFeldStrength( -5 );
+                statistikK->setAlphaFeldFarbe( 0x5500FF00 );
+                statistik->setSichtbar( 0, 1 );
+                spieleUndKarten->setSichtbar( 1, 1 );
+                break;
+            case 6:
+                historieK->setAlphaFeldStrength( -5 );
+                historieK->setAlphaFeldFarbe( 0x5500FF00 );
+                historie->setSichtbar( 0, 1 );
+                spieleUndKarten->setSichtbar( 1, 1 );
+                break;
+            }
+            spieleUndKartenK->setAlphaFeldStrength( -2 );
+            spieleUndKartenK->setAlphaFeldFarbe( 0x3000FF00 );
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        if( !spieleUndKarten->getStatus() )
+        {
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        break;
+    case 4:
+        if( partner->getStatus() == 2 )
+        {
+            switch( jetzt )
+            {
+            case 0:
+                partner->setSichtbar( 1, 0 );
+                break;
+            case 1:
+                suchenK->setAlphaFeldStrength( -5 );
+                suchenK->setAlphaFeldFarbe( 0x5500FF00 );
+                suche->setSichtbar( 0 );
+                partner->setSichtbar( 1, 0 );
+                break;
+            case 2:
+                aktivitätK->setAlphaFeldStrength( -5 );
+                aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
+                aktivität->setSichtbar( 0, 0 );
+                partner->setSichtbar( 1, 0 );
+                break;
+            case 3:
+                spieleUndKartenK->setAlphaFeldStrength( -5 );
+                spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
+                spieleUndKarten->setSichtbar( 0, 0 );
+                partner->setSichtbar( 1, 0 );
+                break;
+            case 5:
+                statistikK->setAlphaFeldStrength( -5 );
+                statistikK->setAlphaFeldFarbe( 0x5500FF00 );
+                statistik->setSichtbar( 0, 1 );
+                partner->setSichtbar( 1, 1 );
+                break;
+            case 6:
+                historieK->setAlphaFeldStrength( -5 );
+                historieK->setAlphaFeldFarbe( 0x5500FF00 );
+                historie->setSichtbar( 0, 1 );
+                partner->setSichtbar( 1, 1 );
+                break;
+            }
+            spielPartnerK->setAlphaFeldStrength( -2 );
+            spielPartnerK->setAlphaFeldFarbe( 0x3000FF00 );
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        if( !partner->getStatus() )
+        {
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        break;
+    case 5:
+        if( statistik->getStatus() == 2 )
+        {
+            switch( jetzt )
+            {
+            case 0:
+                statistik->setSichtbar( 1, 0 );
+                break;
+            case 1:
+                suchenK->setAlphaFeldStrength( -5 );
+                suchenK->setAlphaFeldFarbe( 0x5500FF00 );
+                suche->setSichtbar( 0 );
+                statistik->setSichtbar( 1, 0 );
+                break;
+            case 2:
+                aktivitätK->setAlphaFeldStrength( -5 );
+                aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
+                aktivität->setSichtbar( 0, 0 );
+                statistik->setSichtbar( 1, 0 );
+                break;
+            case 3:
+                spieleUndKartenK->setAlphaFeldStrength( -5 );
+                spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
+                spieleUndKarten->setSichtbar( 0, 0 );
+                statistik->setSichtbar( 1, 0 );
+                break;
+            case 4:
+                spielPartnerK->setAlphaFeldStrength( -5 );
+                spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
+                partner->setSichtbar( 0, 0 );
+                statistik->setSichtbar( 1, 0 );
+                break;
+            case 6:
+                historieK->setAlphaFeldStrength( -5 );
+                historieK->setAlphaFeldFarbe( 0x5500FF00 );
+                historie->setSichtbar( 0, 1 );
+                statistik->setSichtbar( 1, 1 );
+                break;
+            }
+            statistikK->setAlphaFeldStrength( -2 );
+            statistikK->setAlphaFeldFarbe( 0x3000FF00 );
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        if( !statistik->getStatus() )
+        {
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        break;
+    case 6:
+        if( historie->getStatus() == 2 )
+        {
+            switch( jetzt )
+            {
+            case 0:
+                historie->setSichtbar( 1, 0 );
+                break;
+            case 1:
+                suchenK->setAlphaFeldStrength( -5 );
+                suchenK->setAlphaFeldFarbe( 0x5500FF00 );
+                suche->setSichtbar( 0 );
+                historie->setSichtbar( 1, 0 );
+                break;
+            case 2:
+                aktivitätK->setAlphaFeldStrength( -5 );
+                aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
+                aktivität->setSichtbar( 0, 0 );
+                historie->setSichtbar( 1, 0 );
+                break;
+            case 3:
+                spieleUndKartenK->setAlphaFeldStrength( -5 );
+                spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
+                spieleUndKarten->setSichtbar( 0, 0 );
+                historie->setSichtbar( 1, 0 );
+                break;
+            case 4:
+                spielPartnerK->setAlphaFeldStrength( -5 );
+                spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
+                partner->setSichtbar( 0, 0 );
+                historie->setSichtbar( 1, 0 );
+                break;
+            case 5:
+                statistikK->setAlphaFeldStrength( -5 );
+                statistikK->setAlphaFeldFarbe( 0x5500FF00 );
+                statistik->setSichtbar( 0, 0 );
+                historie->setSichtbar( 1, 0 );
+                break;
+            }
+            historieK->setAlphaFeldStrength( -2 );
+            historieK->setAlphaFeldFarbe( 0x3000FF00 );
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        if( !historie->getStatus() )
+        {
+            laden->setSichtbar( 0 );
+            jetzt = nachher;
+            nachher = 0;
+        }
+        break;
+    }
+    int tmp = suche->getAuswahlAccountId();
+    if( tmp )
+        setSpielerDetails( tmp, 2 );
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountAnsehen::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !sichtbar || animation || laden->istSichtbar() )
-		return;
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	if( jetzt > 1 )
-	{
-		int ak = 0;
-		bool tmp = me.verarbeitet;
-		suchenK->doPublicMausEreignis( me );
-		ak = me.verarbeitet ? 1 : 0;
-		aktivitätK->doPublicMausEreignis( me );
-		ak = me.verarbeitet && !ak ? 2 : ak;
-		spieleUndKartenK->doPublicMausEreignis( me );
-		ak = me.verarbeitet && !ak ? 3 : ak;
-		spielPartnerK->doPublicMausEreignis( me );
-		ak = me.verarbeitet && !ak ? 4 : ak;
-		statistikK->doPublicMausEreignis( me );
-		ak = me.verarbeitet && !ak ? 5 : ak;
-		historieK->doPublicMausEreignis( me );
-		ak = me.verarbeitet && !ak ? 6 : ak;
-		if( tmp )
-			ak = 0;
-		if( me.id == ME_RLinks )
-		{
-			switch( ak )
-			{
-			case 1: // Suchen Klick
-				if( jetzt == 1 )
-					break;
-				switch( jetzt )
-				{
-				case 2:
-					aktivitätK->setAlphaFeldStrength( -5 );
-					aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
-					aktivität->setSichtbar( 0, 1 );
-					break;
-				case 3:
-					spieleUndKartenK->setAlphaFeldStrength( -5 );
-					spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
-					spieleUndKarten->setSichtbar( 0, 1 );
-					break;
-				case 4:
-					spielPartnerK->setAlphaFeldStrength( -5 );
-					spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
-					partner->setSichtbar( 0, 1 );
-					break;
-				case 5:
-					statistikK->setAlphaFeldStrength( -5 );
-					statistikK->setAlphaFeldFarbe( 0x5500FF00 );
-					statistik->setSichtbar( 0, 1 );
-					break;
-				case 6:
-					historieK->setAlphaFeldStrength( -5 );
-					historieK->setAlphaFeldFarbe( 0x5500FF00 );
-					historie->setSichtbar( 0, 1 );
-					break;
-				}
-				suchenK->setAlphaFeldStrength( -2 );
-				suchenK->setAlphaFeldFarbe( 0x3000FF00 );
-				this->suche->setSichtbar( 1 );
-				jetzt = 1;
-				break;
-			case 2: // Aktivität Klick
-				setSpielerDetails( account, 2 );
-				break;
-			case 3: // SpieleUndKarten Klick
-				setSpielerDetails( account, 3 );
-				break;
-			case 4: // SpielPartner Klick
-				setSpielerDetails( account, 4 );
-				break;
-			case 5: // Statistik Klick
-				setSpielerDetails( account, 5 );
-				break;
-			case 6: // Historie Klick
-				setSpielerDetails( account, 6 );
-				break;
-			}
-		}
-	}
-	switch( jetzt )
-	{
-	case 1: // Suchen
-		suche->doPublicMausEreignis( me );
-		break;
-	case 3: // SpieleUndKarten
-		spieleUndKarten->doPublicMausEreignis( me );
-		break;
-	case 4: // SpielPartner
-		partner->doPublicMausEreignis( me );
-		break;
-	case 5: // Statistik
-		statistik->doPublicMausEreignis( me );
-		break;
-	case 6: // Historie
-		historie->doPublicMausEreignis( me );
-		break;
-	}
-	me.mx = mx;
-	me.my = my;
+    if( !sichtbar || animation || laden->istSichtbar() )
+        return;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    if( jetzt > 1 )
+    {
+        int ak = 0;
+        bool tmp = me.verarbeitet;
+        suchenK->doPublicMausEreignis( me );
+        ak = me.verarbeitet ? 1 : 0;
+        aktivitätK->doPublicMausEreignis( me );
+        ak = me.verarbeitet && !ak ? 2 : ak;
+        spieleUndKartenK->doPublicMausEreignis( me );
+        ak = me.verarbeitet && !ak ? 3 : ak;
+        spielPartnerK->doPublicMausEreignis( me );
+        ak = me.verarbeitet && !ak ? 4 : ak;
+        statistikK->doPublicMausEreignis( me );
+        ak = me.verarbeitet && !ak ? 5 : ak;
+        historieK->doPublicMausEreignis( me );
+        ak = me.verarbeitet && !ak ? 6 : ak;
+        if( tmp )
+            ak = 0;
+        if( me.id == ME_RLinks )
+        {
+            switch( ak )
+            {
+            case 1: // Suchen Klick
+                if( jetzt == 1 )
+                    break;
+                switch( jetzt )
+                {
+                case 2:
+                    aktivitätK->setAlphaFeldStrength( -5 );
+                    aktivitätK->setAlphaFeldFarbe( 0x5500FF00 );
+                    aktivität->setSichtbar( 0, 1 );
+                    break;
+                case 3:
+                    spieleUndKartenK->setAlphaFeldStrength( -5 );
+                    spieleUndKartenK->setAlphaFeldFarbe( 0x5500FF00 );
+                    spieleUndKarten->setSichtbar( 0, 1 );
+                    break;
+                case 4:
+                    spielPartnerK->setAlphaFeldStrength( -5 );
+                    spielPartnerK->setAlphaFeldFarbe( 0x5500FF00 );
+                    partner->setSichtbar( 0, 1 );
+                    break;
+                case 5:
+                    statistikK->setAlphaFeldStrength( -5 );
+                    statistikK->setAlphaFeldFarbe( 0x5500FF00 );
+                    statistik->setSichtbar( 0, 1 );
+                    break;
+                case 6:
+                    historieK->setAlphaFeldStrength( -5 );
+                    historieK->setAlphaFeldFarbe( 0x5500FF00 );
+                    historie->setSichtbar( 0, 1 );
+                    break;
+                }
+                suchenK->setAlphaFeldStrength( -2 );
+                suchenK->setAlphaFeldFarbe( 0x3000FF00 );
+                this->suche->setSichtbar( 1 );
+                jetzt = 1;
+                break;
+            case 2: // Aktivität Klick
+                setSpielerDetails( account, 2 );
+                break;
+            case 3: // SpieleUndKarten Klick
+                setSpielerDetails( account, 3 );
+                break;
+            case 4: // SpielPartner Klick
+                setSpielerDetails( account, 4 );
+                break;
+            case 5: // Statistik Klick
+                setSpielerDetails( account, 5 );
+                break;
+            case 6: // Historie Klick
+                setSpielerDetails( account, 6 );
+                break;
+            }
+        }
+    }
+    switch( jetzt )
+    {
+    case 1: // Suchen
+        suche->doPublicMausEreignis( me );
+        break;
+    case 3: // SpieleUndKarten
+        spieleUndKarten->doPublicMausEreignis( me );
+        break;
+    case 4: // SpielPartner
+        partner->doPublicMausEreignis( me );
+        break;
+    case 5: // Statistik
+        statistik->doPublicMausEreignis( me );
+        break;
+    case 6: // Historie
+        historie->doPublicMausEreignis( me );
+        break;
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
 void AccountAnsehen::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( !sichtbar || animation || laden->istSichtbar() )
-		return;
-	switch( jetzt )
-	{
-	case 1: // Suchen
-		suche->doTastaturEreignis( te );
-		break;
-	case 6: // Historie
-		historie->doTastaturEreignis( te );
-		break;
-	}
+    if( !sichtbar || animation || laden->istSichtbar() )
+        return;
+    switch( jetzt )
+    {
+    case 1: // Suchen
+        suche->doTastaturEreignis( te );
+        break;
+    case 6: // Historie
+        historie->doTastaturEreignis( te );
+        break;
+    }
 }
 
 void AccountAnsehen::render( Bild &zRObj )
 {
-	if( pos == pos1 )
-		return;
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	rahmen->setSize( gr );
-	rahmen->render( zRObj );
-	int rbr = rahmen->getRBreite();
-	zRObj.setAlpha( (unsigned char)alpha );
-	zRObj.setAlpha( (unsigned char)alpha2 );
-	zRObj.addScrollOffset( -knopfX, 0 );
-	aktivitätK->render(zRObj );
-	historieK->render( zRObj );
-	spieleUndKartenK->render( zRObj );
-	spielPartnerK->render( zRObj );
-	statistikK->render( zRObj );
-	suchenK->render( zRObj );
-	zRObj.addScrollOffset( knopfX, 0 );
-	suche->render( zRObj );
-	aktivität->render( zRObj );
-	spieleUndKarten->render( zRObj );
-	partner->render( zRObj );
-	statistik->render( zRObj );
-	historie->render( zRObj );
-	zRObj.releaseAlpha();
-	laden->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    if( pos == pos1 )
+        return;
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    rahmen->setSize( gr );
+    rahmen->render( zRObj );
+    int rbr = rahmen->getRBreite();
+    zRObj.setAlpha( (unsigned char)alpha );
+    zRObj.setAlpha( (unsigned char)alpha2 );
+    zRObj.addScrollOffset( -knopfX, 0 );
+    aktivitätK->render( zRObj );
+    historieK->render( zRObj );
+    spieleUndKartenK->render( zRObj );
+    spielPartnerK->render( zRObj );
+    statistikK->render( zRObj );
+    suchenK->render( zRObj );
+    zRObj.addScrollOffset( knopfX, 0 );
+    suche->render( zRObj );
+    aktivität->render( zRObj );
+    spieleUndKarten->render( zRObj );
+    partner->render( zRObj );
+    statistik->render( zRObj );
+    historie->render( zRObj );
+    zRObj.releaseAlpha();
+    laden->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool AccountAnsehen::istAnimiert() const
 {
-	return animation != 0;
+    return animation != 0;
 }
 
 bool AccountAnsehen::istSichtbar() const
 {
-	return sichtbar || prozent1 != 0;
+    return sichtbar || prozent1 != 0;
 }

+ 47 - 47
KSGClient/NachLogin/Account/AccountAnsehen.h

@@ -18,55 +18,55 @@ using namespace Framework;
 class AccountAnsehen : public Zeichnung
 {
 private:
-	Animation2D *laden;
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	Knopf *aktivitätK;
-	Knopf *historieK;
-	Knopf *spieleUndKartenK;
-	Knopf *spielPartnerK;
-	Knopf *statistikK;
-	Knopf *suchenK;
-	AccountSuchen *suche;
-	AccountAktivität *aktivität;
-	AccountSpieleUndKarten *spieleUndKarten;
-	AccountSpielPartner *partner;
-	AccountStatistik *statistik;
-	AccountHistorie *historie;
-	int account;
-	int alpha;
-	int alpha2;
-	bool sichtbar;
-	int jetzt;
-	int nachher;
-	int prozent1;
-	int prozent2;
-	double tickVal;
-	int animation;
-	int knopfX;
-	bool rend;
+    Animation2D *laden;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    Knopf *aktivitätK;
+    Knopf *historieK;
+    Knopf *spieleUndKartenK;
+    Knopf *spielPartnerK;
+    Knopf *statistikK;
+    Knopf *suchenK;
+    AccountSuchen *suche;
+    AccountAktivität *aktivität;
+    AccountSpieleUndKarten *spieleUndKarten;
+    AccountSpielPartner *partner;
+    AccountStatistik *statistik;
+    AccountHistorie *historie;
+    int account;
+    int alpha;
+    int alpha2;
+    bool sichtbar;
+    int jetzt;
+    int nachher;
+    int prozent1;
+    int prozent2;
+    double tickVal;
+    int animation;
+    int knopfX;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountAnsehen( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~AccountAnsehen();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	bool setSpielerDetails( int account, int nachher );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
+    // Konstruktor
+    AccountAnsehen( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~AccountAnsehen();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    bool setSpielerDetails( int account, int nachher );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 244 - 256
KSGClient/NachLogin/Account/Aktivität/AccountAktivität.cpp

@@ -4,300 +4,288 @@
 
 // Inhalt der AccountAktivität Klasse aus AccountAktivität.h
 // Konstruktor
-AccountAktivität::AccountAktivität( Schrift *zSchrift )
-	: Thread(),
-  aktivitätF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Aktivität von " ) ),
-  online( initLinienDiagramm( 10, 10, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ),
-  spiele( initLinienDiagramm( 10, 220, 760, 200, zSchrift, LDiag::Style::DatenRahmen, 0 ) ),
-  status( 0 ),
-  accId( 0 ),
-  animation( 0 ),
-  alpha( 255 ),
-  tickVal( 0 ),
-  rend( 0 )
+AccountAktivität::AccountAktivität()
+    : Thread(),
+    aktivitätF( initFenster( 810, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Aktivität von " ) ),
+    online( initLinienDiagramm( 10, 10, 760, 200, LDiag::Style::DatenRahmen, 0 ) ),
+    spiele( initLinienDiagramm( 10, 220, 760, 200, LDiag::Style::DatenRahmen, 0 ) ),
+    status( 0 ),
+    accId( 0 ),
+    animation( 0 ),
+    alpha( 255 ),
+    tickVal( 0 ),
+    rend( 0 )
 {
-	online->setHIntervallBreite( 36.8 );
-	spiele->setVIntervallHeight( 36.8 );
-	online->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
-	spiele->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
-	online->setRasterDicke( 1 );
-	spiele->setRasterDicke( 1 );
-	online->setRasterFarbe( 0xFF505050 );
-	spiele->setRasterFarbe( 0xFF505050 );
-	online->setHIntervallFarbe( 0xFFFFFFFF );
-	spiele->setHIntervallFarbe( 0xFFFFFFFF );
-	online->setHIntervallName( "Tage" );
-	spiele->setHIntervallName( "Tage" );
-	online->setVIntervallFarbe( 0xFFFFFFFF );
-	spiele->setVIntervallFarbe( 0xFFFFFFFF );
-	online->setVIntervallName( "Stunden" );
-	spiele->setVIntervallName( "Spiele" );
-	aktivitätF->addMember( online->getThis() );
-	aktivitätF->addMember( spiele->getThis() );
+    online->setHIntervallBreite( 36.8 );
+    spiele->setVIntervallHeight( 36.8 );
+    online->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
+    spiele->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
+    online->setRasterDicke( 1 );
+    spiele->setRasterDicke( 1 );
+    online->setRasterFarbe( 0xFF505050 );
+    spiele->setRasterFarbe( 0xFF505050 );
+    online->setHIntervallFarbe( 0xFFFFFFFF );
+    spiele->setHIntervallFarbe( 0xFFFFFFFF );
+    online->setHIntervallName( "Tage" );
+    spiele->setHIntervallName( "Tage" );
+    online->setVIntervallFarbe( 0xFFFFFFFF );
+    spiele->setVIntervallFarbe( 0xFFFFFFFF );
+    online->setVIntervallName( "Stunden" );
+    spiele->setVIntervallName( "Spiele" );
+    aktivitätF->addMember( dynamic_cast<Zeichnung *>( online->getThis() ) );
+    aktivitätF->addMember( dynamic_cast<Zeichnung *>( spiele->getThis() ) );
 }
 
 // Destruktor
 AccountAktivität::~AccountAktivität()
 {
-	aktivitätF->release();
-	online->release();
-	spiele->release();
+    aktivitätF->release();
+    online->release();
+    spiele->release();
 }
 
 // nicht constant
 void AccountAktivität::reset()
 {
-	int wAnz = online->zDiagDaten()->werte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		online->removeWert( 0 );
-	wAnz = spiele->zDiagDaten()->werte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		spiele->removeWert( 0 );
-	wAnz = online->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		online->removeHIntervallText( online->zDiagDaten()->hIntervallWerte->get( 0 ) );
-	wAnz = spiele->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		spiele->removeHIntervallText( spiele->zDiagDaten()->hIntervallWerte->get( 0 ) );
-	wAnz = online->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		online->removeVIntervallText( online->zDiagDaten()->vIntervallWerte->get( 0 ) );
-	wAnz = spiele->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
-	for( int i = 0; i < wAnz; i++ )
-		spiele->removeVIntervallText( spiele->zDiagDaten()->vIntervallWerte->get( 0 ) );
+    int wAnz = online->zDiagDaten()->werte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        online->removeWert( 0 );
+    wAnz = spiele->zDiagDaten()->werte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        spiele->removeWert( 0 );
+    wAnz = online->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        online->removeHIntervallText( online->zDiagDaten()->hIntervallWerte->get( 0 ) );
+    wAnz = spiele->zDiagDaten()->hIntervallWerte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        spiele->removeHIntervallText( spiele->zDiagDaten()->hIntervallWerte->get( 0 ) );
+    wAnz = online->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        online->removeVIntervallText( online->zDiagDaten()->vIntervallWerte->get( 0 ) );
+    wAnz = spiele->zDiagDaten()->vIntervallWerte->getEintragAnzahl();
+    for( int i = 0; i < wAnz; i++ )
+        spiele->removeVIntervallText( spiele->zDiagDaten()->vIntervallWerte->get( 0 ) );
 }
 
 void AccountAktivität::ladeStatistik( int accId )
 {
-	if( this->accId == accId )
-		return;
-	this->status = 0;
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
-	if( ( animation | 0x1 ) == animation )
-	{
-		animation |= 0x4;
-		this->accId = accId;
-		this->status = 1;
-		return;
-	}
-	if( this->accId )
-		reset();
-	this->accId = accId;
-	start();
-	this->status = 1;
+    if( this->accId == accId )
+        return;
+    this->status = 0;
+    if( run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    if( ( animation | 0x1 ) == animation )
+    {
+        animation |= 0x4;
+        this->accId = accId;
+        this->status = 1;
+        return;
+    }
+    if( this->accId )
+        reset();
+    this->accId = accId;
+    start();
+    this->status = 1;
 }
 
 void AccountAktivität::thread()
 {
-	Text *name = infoClient->getSpielerName( accId );
-	if( name )
-	{
-		name->insert( 0, "Aktivität von " );
-		aktivitätF->setTitel( *name );
-		name->release();
-	}
+    Text *name = infoClient->getSpielerName( accId );
+    if( name )
+    {
+        name->insert( 0, "Aktivität von " );
+        aktivitätF->setTitel( *name );
+        name->release();
+    }
     Array< KSGClient::AccountActivityInfo > activity;
-	if( infoClient->getSpielerAktivität( accId, &activity ) )
-	{
-		int anz = activity.getEintragAnzahl();
-		double maxO = 0;
-		int maxS = 0;
-		for( int i = 0; i < anz; i++ )
-		{
+    if( infoClient->getSpielerAktivität( accId, &activity ) )
+    {
+        int anz = activity.getEintragAnzahl();
+        double maxO = 0;
+        int maxS = 0;
+        for( int i = 0; i < anz; i++ )
+        {
             KSGClient::AccountActivityInfo info = activity.get( i );
-			if( info.stOnline > maxO )
-				maxO = info.stOnline;
-			if( info.stGespielt > maxO )
-				maxO = info.stGespielt;
-			if( info.anzSpiele > maxS )
-				maxS = info.anzSpiele;
-			if( info.anzGewonnen > maxS )
-				maxS = info.anzGewonnen;
-		}
-		maxO += ( maxO / 100 ) * 10;
-		maxS++;
-		online->addVIntervallText( 0, "0" );
-		online->addVIntervallText( (int)maxO + 1, Text() += (int)( maxO + 1 ) );
-		spiele->addVIntervallText( 0, "0" );
-		spiele->addVIntervallText( (int)maxS + 1, Text() += (int)( maxS + 1 ) );
-		online->addHIntervallText( 0, activity.get( 0 ).datum );
-		online->addHIntervallText( anz - 1, activity.get( anz - 1 ).datum );
-		spiele->addHIntervallText( 0, activity.get( 0 ).datum );
-		spiele->addHIntervallText( anz - 1, activity.get( anz - 1 ).datum );
-		DiagWert *w = new DiagWert();
-		w->farbe = 0xFF00FFFF;
-		w->hintergrund = 0xFF205050;
-		w->name->setText( "Zeit Online" );
-		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
-		online->addWert( w );
-		w = new DiagWert();
-		w->farbe = 0xFF00FF00;
-		w->hintergrund = 0xFF205020;
-		w->name->setText( "Zeit im Spiel" );
-		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
-		online->addWert( w );
-		w = new DiagWert();
-		w->farbe = 0xFF00FFFF;
-		w->hintergrund = 0xFF205050;
-		w->name->setText( "Spiele am Tag" );
-		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
-		spiele->addWert( w );
-		w = new DiagWert();
-		w->farbe = 0xFF00FF00;
-		w->hintergrund = 0xFF205020;
-		w->name->setText( "Gewonnene Spiele" );
-		w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
-		spiele->addWert( w );
-		for( int i = 0; i < anz; i++ )
-		{
+            if( info.stOnline > maxO )
+                maxO = info.stOnline;
+            if( info.stGespielt > maxO )
+                maxO = info.stGespielt;
+            if( info.anzSpiele > maxS )
+                maxS = info.anzSpiele;
+            if( info.anzGewonnen > maxS )
+                maxS = info.anzGewonnen;
+        }
+        maxO += ( maxO / 100 ) * 10;
+        maxS++;
+        online->addVIntervallText( 0, "0" );
+        online->addVIntervallText( (int)maxO + 1, Text() += (int)( maxO + 1 ) );
+        spiele->addVIntervallText( 0, "0" );
+        spiele->addVIntervallText( (int)maxS + 1, Text() += (int)( maxS + 1 ) );
+        online->addHIntervallText( 0, activity.get( 0 ).datum );
+        online->addHIntervallText( anz - 1, activity.get( anz - 1 ).datum );
+        spiele->addHIntervallText( 0, activity.get( 0 ).datum );
+        spiele->addHIntervallText( anz - 1, activity.get( anz - 1 ).datum );
+        DiagWert *w = new DiagWert();
+        w->farbe = 0xFF00FFFF;
+        w->hintergrund = 0xFF205050;
+        w->name->setText( "Zeit Online" );
+        w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
+        online->addWert( w );
+        w = new DiagWert();
+        w->farbe = 0xFF00FF00;
+        w->hintergrund = 0xFF205020;
+        w->name->setText( "Zeit im Spiel" );
+        w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
+        online->addWert( w );
+        w = new DiagWert();
+        w->farbe = 0xFF00FFFF;
+        w->hintergrund = 0xFF205050;
+        w->name->setText( "Spiele am Tag" );
+        w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
+        spiele->addWert( w );
+        w = new DiagWert();
+        w->farbe = 0xFF00FF00;
+        w->hintergrund = 0xFF205020;
+        w->name->setText( "Gewonnene Spiele" );
+        w->style = DiagWert::Style::Sichtbar | DiagWert::Style::Name | DiagWert::Style::Hintergrund;
+        spiele->addWert( w );
+        for( int i = 0; i < anz; i++ )
+        {
             KSGClient::AccountActivityInfo info = activity.get( i );
-			online->addPunkt( 0, i, info.stOnline );
-			online->addPunkt( 1, i, info.stGespielt );
-			spiele->addPunkt( 0, i, info.anzSpiele );
-			spiele->addPunkt( 1, i, info.anzGewonnen );
-		}
-	}
-	else
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Aktivität des Spielers konnte nicht ermittelt werden." ), new Text( "Ok" ) );
-	animation &= ~0x4;
-	status = 2;
-	run = 0;
+            online->addPunkt( 0, i, info.stOnline );
+            online->addPunkt( 1, i, info.stGespielt );
+            spiele->addPunkt( 0, i, info.anzSpiele );
+            spiele->addPunkt( 1, i, info.anzGewonnen );
+        }
+    }
+    else
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Aktivität des Spielers konnte nicht ermittelt werden." ), new Text( "Ok" ) );
+    animation &= ~0x4;
+    status = 2;
 }
 
 void AccountAktivität::setSichtbar( bool sichtbar, bool nachRechts )
 {
-	if( sichtbar )
-	{
-		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
-		{
-			if( nachRechts )
-				aktivitätF->setPosition( -810, 40 );
-			else
-				aktivitätF->setPosition( 810, 40 );
-		}
-		animation |= 0x1;
-	}
-	else
-		animation &= ~0x1;
-	if( nachRechts )
-		animation |= 0x2;
-	else
-		animation &= ~0x2;
+    if( sichtbar )
+    {
+        if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
+        {
+            if( nachRechts )
+                aktivitätF->setPosition( -810, 40 );
+            else
+                aktivitätF->setPosition( 810, 40 );
+        }
+        animation |= 0x1;
+    }
+    else
+        animation &= ~0x1;
+    if( nachRechts )
+        animation |= 0x2;
+    else
+        animation &= ~0x2;
 }
 
 bool AccountAktivität::tick( double zeit )
 {
-	rend |= aktivitätF->tick( zeit );
-	tickVal += zeit;
-	int valA = (int)( tickVal * 150 );
-	int valB = (int)( tickVal * 500 );
-	tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( ( animation | 0x4 ) == animation && alpha )
-		{
-			if( alpha - valA <= 0 )
-				alpha = 0;
-			else
-				alpha -= valA;
-			rend = 1;
-			if( !alpha )
-			{
-				reset();
-				start();
-			}
-		}
-		if( ( animation | 0x4 ) != animation && alpha != 255 )
-		{
-			if( alpha + valA >= 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( ( animation | 0x1 ) == animation )
-		{ // Sichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( aktivitätF->getX() != 10 )
-				{
-					if( aktivitätF->getX() + valB > 10 )
-						aktivitätF->setPosition( 10, aktivitätF->getY() );
-					else
-						aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( aktivitätF->getX() != 10 )
-				{
-					if( aktivitätF->getX() - valB < 10 )
-						aktivitätF->setPosition( 10, aktivitätF->getY() );
-					else
-						aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
-					rend = 1;
-				}
-			}
-		}
-		else
-		{ // Unsichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( aktivitätF->getX() != 810 )
-				{
-					if( aktivitätF->getX() + valB > 810 )
-						aktivitätF->setPosition( 810, aktivitätF->getY() );
-					else
-						aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( aktivitätF->getX() != -810 )
-				{
-					if( aktivitätF->getX() - valB < -810 )
-						aktivitätF->setPosition( -810, aktivitätF->getY() );
-					else
-						aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
-					rend = 1;
-				}
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= aktivitätF->tick( zeit );
+    tickVal += zeit;
+    int valA = (int)( tickVal * 150 );
+    int valB = (int)( tickVal * 500 );
+    tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( ( animation | 0x4 ) == animation && alpha )
+        {
+            if( alpha - valA <= 0 )
+                alpha = 0;
+            else
+                alpha -= valA;
+            rend = 1;
+            if( !alpha )
+            {
+                reset();
+                start();
+            }
+        }
+        if( ( animation | 0x4 ) != animation && alpha != 255 )
+        {
+            if( alpha + valA >= 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( ( animation | 0x1 ) == animation )
+        { // Sichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( aktivitätF->getX() != 10 )
+                {
+                    if( aktivitätF->getX() + valB > 10 )
+                        aktivitätF->setPosition( 10, aktivitätF->getY() );
+                    else
+                        aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( aktivitätF->getX() != 10 )
+                {
+                    if( aktivitätF->getX() - valB < 10 )
+                        aktivitätF->setPosition( 10, aktivitätF->getY() );
+                    else
+                        aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+        else
+        { // Unsichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( aktivitätF->getX() != 810 )
+                {
+                    if( aktivitätF->getX() + valB > 810 )
+                        aktivitätF->setPosition( 810, aktivitätF->getY() );
+                    else
+                        aktivitätF->setPosition( aktivitätF->getX() + valB, aktivitätF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( aktivitätF->getX() != -810 )
+                {
+                    if( aktivitätF->getX() - valB < -810 )
+                        aktivitätF->setPosition( -810, aktivitätF->getY() );
+                    else
+                        aktivitätF->setPosition( aktivitätF->getX() - valB, aktivitätF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountAktivität::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	aktivitätF->render( zRObj );
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( alpha );
+    aktivitätF->render( zRObj );
+    zRObj.releaseAlpha();
 }
 
 // constant
 int AccountAktivität::getStatus() const
 {
     return status;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *AccountAktivität::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 1000 );
-        ende();
-    }
-    return Thread::release();
 }

+ 24 - 26
KSGClient/NachLogin/Account/Aktivität/AccountAktivität.h

@@ -6,37 +6,35 @@
 #include <Fenster.h>
 #include <Thread.h>
 
-using namespace Framework; 
+using namespace Framework;
 
 class AccountAktivität : public Thread
 {
 private:
-	Fenster *aktivitätF;
-	LDiag *online;
-	LDiag *spiele;
-	int status;
-	int accId;
-	int animation;
-	unsigned char alpha;
-	double tickVal;
-	bool rend;
-	
+    Fenster *aktivitätF;
+    LDiag *online;
+    LDiag *spiele;
+    int status;
+    int accId;
+    int animation;
+    unsigned char alpha;
+    double tickVal;
+    bool rend;
+
 public:
-	// Konstruktor
-	AccountAktivität( Schrift *zSchrift );
-	// Destruktor
-	~AccountAktivität();
-	// nicht constant
-	void reset();
-	void ladeStatistik( int accId );
-	virtual void thread();
-	void setSichtbar( bool sichtbar, bool nachRechts );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	int getStatus() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    AccountAktivität();
+    // Destruktor
+    ~AccountAktivität();
+    // nicht constant
+    void reset();
+    void ladeStatistik( int accId );
+    virtual void thread();
+    void setSichtbar( bool sichtbar, bool nachRechts );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    int getStatus() const;
 };
 
 #endif

+ 1024 - 1107
KSGClient/NachLogin/Account/Historie/AccountHistorie.cpp

@@ -9,132 +9,129 @@
 #include <Punkt.h>
 #include <Globals.h>
 
-typedef AccountHistorieStatistikV* ( *AHSSDLLStart )( void );
-typedef AufzeichnungV* ( *AHSADLLStart )( void );
+typedef AccountHistorieStatistikV *( *AHSSDLLStart )( void );
+typedef AufzeichnungV *( *AHSADLLStart )( void );
 
 // Inahlt der AHSpielStatistik Klasse aus AccountHistorie.h
 // Konstruktor
-AHSpielStatistik::AHSpielStatistik( Schrift *schrift )
-	: Thread(),
-	  schrift( schrift )
-{
-	statistikF = initFenster( 10, 40, 780, 450, schrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Spiel Ergebnis" );
-	laden = (Animation2D*)ladeAnimation->dublizieren();
-	laden->setSichtbar( 0 );
-	laden->setPosition( 380, 245 );
-	dllName = new Text( "" );
-	dllHandle = 0;
-	alpha = 0;
-	sichtbar = 0;
-	statistik = 0;
-	tickVal = 0;
+AHSpielStatistik::AHSpielStatistik()
+    : Thread()
+{
+    statistikF = initFenster( 10, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Spiel Ergebnis" );
+    laden = (Animation2D *)ladeAnimation->dublizieren();
+    laden->setSichtbar( 0 );
+    laden->setPosition( 380, 245 );
+    dllName = new Text( "" );
+    dllHandle = 0;
+    alpha = 0;
+    sichtbar = 0;
+    statistik = 0;
+    tickVal = 0;
 }
 
 // Destruktor
 AHSpielStatistik::~AHSpielStatistik()
 {
-	statistikF->release();
-	if( dllHandle )
-		reset();
-	dllName->release();
-	schrift->release();
-	laden->release();
+    statistikF->release();
+    if( dllHandle )
+        reset();
+    dllName->release();
+    laden->release();
 }
 
 // nicht constant
 void AHSpielStatistik::reset()
 {
-	if( run )
-		warteAufThread( INFINITE );
-	if( dllHandle )
-	{
-		if( statistik )
-			statistik = statistik->release();
-		Framework::getDLLRegister()->releaseDLL( *dllName );
-		dllHandle = 0;
-	}
+    if( run )
+        warteAufThread( INFINITE );
+    if( dllHandle )
+    {
+        if( statistik )
+            statistik = (AccountHistorieStatistikV *)statistik->release();
+        Framework::getDLLRegister()->releaseDLL( *dllName );
+        dllHandle = 0;
+    }
 }
 
 bool AHSpielStatistik::ladeDaten( int spielId, int karteId )
 {
-	if( dllHandle )
-		reset();
-	KartenLeser *reader = KartenLeser::getInstance();
+    if( dllHandle )
+        reset();
+    KartenLeser *reader = KartenLeser::getInstance();
     reader->lock();
-	reader->setKarteId( karteId );
-	Text *pfad = reader->getSpielPfad();
-	if( !pfad )
-	{
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+    reader->setKarteId( karteId );
+    Text *pfad = reader->getSpielPfad();
+    if( !pfad )
+    {
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
         reader->unlock();
-		reader->release();
-		return 0;
-	}
-	pfad->append( "bin/" );
-	Text *spielArtName = reader->getSpielName();
-	if( !spielArtName )
-	{
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->release();
+        return 0;
+    }
+    pfad->append( "bin/" );
+    Text *spielArtName = reader->getSpielName();
+    if( !spielArtName )
+    {
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
         reader->unlock();
-		reader->release();
-		pfad->release();
-		return 0;
-	}
-	pfad->append( spielArtName->getText() );
-	pfad->append( ".dll" );
+        reader->release();
+        pfad->release();
+        return 0;
+    }
+    pfad->append( spielArtName->getText() );
+    pfad->append( ".dll" );
     reader->unlock();
-	reader->release();
-	dllName->setText( "Spiele/" );
-	dllName->append( spielArtName->getText() );
-	dllName->append( ".dll" );
-	spielArtName->release();
-	dllHandle = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
-	if( !dllHandle )
-	{
-		Text *msg = new Text( "Die DLL Datei '" );
-		msg->append( pfad->getText() );
-		msg->append( "' konnte nicht geladen werden." );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
-		pfad->release();
-		return 0;
-	}
-	AHSSDLLStart startFunk = (AHSSDLLStart)GetProcAddress( dllHandle, "GetAccountHistorieStatistik" );
-	if( !startFunk )
-	{
-		if( dllHandle )
-		{
+    reader->release();
+    dllName->setText( "Spiele/" );
+    dllName->append( spielArtName->getText() );
+    dllName->append( ".dll" );
+    spielArtName->release();
+    dllHandle = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
+    if( !dllHandle )
+    {
+        Text *msg = new Text( "Die DLL Datei '" );
+        msg->append( pfad->getText() );
+        msg->append( "' konnte nicht geladen werden." );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
+        pfad->release();
+        return 0;
+    }
+    AHSSDLLStart startFunk = (AHSSDLLStart)GetProcAddress( dllHandle, "GetAccountHistorieStatistik" );
+    if( !startFunk )
+    {
+        if( dllHandle )
+        {
             Framework::getDLLRegister()->releaseDLL( *dllName );
-			dllHandle = 0;
-		}
-		Text *msg = new Text( "Die Funktion 'GetAccountHistorieStatistik' konnte in der DLL Datei '" );
-		msg->append( pfad->getText() );
-		msg->append( "' nicht gefunden werden." );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
-		pfad->release();
-		return 0;
-	}
-	pfad->release();
-	statistik = startFunk();
-	if( !statistik )
-	{
-		if( dllHandle )
-		{
+            dllHandle = 0;
+        }
+        Text *msg = new Text( "Die Funktion 'GetAccountHistorieStatistik' konnte in der DLL Datei '" );
+        msg->append( pfad->getText() );
+        msg->append( "' nicht gefunden werden." );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
+        pfad->release();
+        return 0;
+    }
+    pfad->release();
+    statistik = startFunk();
+    if( !statistik )
+    {
+        if( dllHandle )
+        {
             Framework::getDLLRegister()->releaseDLL( *dllName );
-			dllHandle = 0;
-		}
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Für diese Spielart ist keine genauere Ansicht der Spiel Ergebnisse verfügbar." ), new Text( "Ok" ) );
-		return 0;
-	}
-	this->spielId = spielId;
-	statistik->setSchrift( schrift->getThis() );
-	statistik->setBildschirm( hauptScreen );
-	start();
-	return 1;
+            dllHandle = 0;
+        }
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Für diese Spielart ist keine genauere Ansicht der Spiel Ergebnisse verfügbar." ), new Text( "Ok" ) );
+        return 0;
+    }
+    this->spielId = spielId;
+    statistik->setUIFactory( uiFactory );
+    start();
+    return 1;
 }
 
 void AHSpielStatistik::thread()
 {
-	laden->setSichtbar( 1 );
+    laden->setSichtbar( 1 );
     KSGClient::HistorieServerClient *historieClient = infoClient->createHistorieServerClient( spielId );
     if( !historieClient )
         nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( infoClient->getLetzterFehler() ), new Text( "Ok" ) );
@@ -159,230 +156,219 @@ void AHSpielStatistik::thread()
 
 void AHSpielStatistik::setPosition( int x, int y )
 {
-	statistikF->setPosition( x, y );
+    statistikF->setPosition( x, y );
 }
 
 void AHSpielStatistik::setSichtbar( bool sichtbar )
 {
-	if( !statistik )
-		return;
-	if( !run )
-		statistik->setSichtbar( sichtbar );
-	this->sichtbar = sichtbar;
-	if( sichtbar && !alpha )
-		alpha = 1;
+    if( !statistik )
+        return;
+    if( !run )
+        statistik->setSichtbar( sichtbar );
+    this->sichtbar = sichtbar;
+    if( sichtbar && !alpha )
+        alpha = 1;
 }
 
 void AHSpielStatistik::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !statistik || alpha != 255 )
-		return;
-	me.mx -= 1 + statistikF->getX();
-	me.my -= 20 + statistikF->getY();
-	statistik->doPublicMausEreignis( me );
-	if( statistik->wurdeGeschlossen() )
-		setSichtbar( 0 );
-	me.mx += 1 + statistikF->getX();
-	me.my += 20 + statistikF->getY();
+    if( !statistik || alpha != 255 )
+        return;
+    me.mx -= 1 + statistikF->getX();
+    me.my -= 20 + statistikF->getY();
+    statistik->doPublicMausEreignis( me );
+    if( statistik->wurdeGeschlossen() )
+        setSichtbar( 0 );
+    me.mx += 1 + statistikF->getX();
+    me.my += 20 + statistikF->getY();
 }
 
 void AHSpielStatistik::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( !statistik || alpha != 255 )
-		return;
-	statistik->doTastaturEreignis( te );
+    if( !statistik || alpha != 255 )
+        return;
+    statistik->doTastaturEreignis( te );
 }
 
 bool AHSpielStatistik::tick( double tickVal )
 {
-	if( !statistik || !alpha )
-		return 0;
-	bool ret = statistik->tick( tickVal );
-	ret |= laden->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	this->tickVal -= val;
-	if( val )
-	{
-		if( sichtbar && alpha != 255 )
-		{
-			if( alpha + val > 255 )
-				alpha = 255;
-			else
-				alpha += (unsigned char)val;
-			ret = 1;
-		}
-		if( !sichtbar && alpha )
-		{
-			if( alpha - val < 0 )
-				alpha = 0;
-			else
-				alpha -= (unsigned char)val;
-			if( !alpha && statistik->istNochSichtbar() )
-				alpha = 1;
-			ret = 1;
-		}
-	}
-	return ret;
+    if( !statistik || !alpha )
+        return 0;
+    bool ret = statistik->tick( tickVal );
+    ret |= laden->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    this->tickVal -= val;
+    if( val )
+    {
+        if( sichtbar && alpha != 255 )
+        {
+            if( alpha + val > 255 )
+                alpha = 255;
+            else
+                alpha += (unsigned char)val;
+            ret = 1;
+        }
+        if( !sichtbar && alpha )
+        {
+            if( alpha - val < 0 )
+                alpha = 0;
+            else
+                alpha -= (unsigned char)val;
+            if( !alpha && statistik->istNochSichtbar() )
+                alpha = 1;
+            ret = 1;
+        }
+    }
+    return ret;
 }
 
 void AHSpielStatistik::render( Bild &zRObj )
 {
-	if( !statistik || !alpha )
-		return;
-	zRObj.setAlpha( alpha );
-	statistikF->render( zRObj );
-	if( !zRObj.setDrawOptions( statistikF->getX() + 1, statistikF->getY() + 21, statistikF->getBreite() - 2, statistikF->getHeight() - 22 ) )
-	{
-		zRObj.releaseAlpha();
-		return;
-	}
-	statistik->render( zRObj );
-	zRObj.releaseDrawOptions();
-	laden->render( zRObj );
-	zRObj.releaseAlpha();
+    if( !statistik || !alpha )
+        return;
+    zRObj.setAlpha( alpha );
+    statistikF->render( zRObj );
+    if( !zRObj.setDrawOptions( statistikF->getX() + 1, statistikF->getY() + 21, statistikF->getBreite() - 2, statistikF->getHeight() - 22 ) )
+    {
+        zRObj.releaseAlpha();
+        return;
+    }
+    statistik->render( zRObj );
+    zRObj.releaseDrawOptions();
+    laden->render( zRObj );
+    zRObj.releaseAlpha();
 }
 
 // constant
 bool AHSpielStatistik::istNochSichtbar() const
 {
-	if( alpha )
-		return 1;
-	return statistik ? statistik->istNochSichtbar() : 0;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *AHSpielStatistik::release()
-{
-    if( ref == 2 && run )
-        warteAufThread( INFINITE );
-    return Thread::release();
+    if( alpha )
+        return 1;
+    return statistik ? statistik->istNochSichtbar() : 0;
 }
 
 
 // Inahlt der AHSpielVideo Klasse aus AccountHistorie.h
 // Konstruktor
-AHSpielVideo::AHSpielVideo( Schrift *schrift )
-	: Thread(),
-	schrift( schrift )
-{
-	videoF = initFenster( 10, 40, 780, 450, schrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Spiel Aufzeichnung" );
-	laden = (Animation2D*)ladeAnimation->dublizieren();
-	laden->setSichtbar( 0 );
-	laden->setPosition( 380, 245 );
-	dllName = new Text( "" );
-	dllHandle = 0;
-	alpha = 0;
-	sichtbar = 0;
-	video = 0;
-	tickVal = 0;
+AHSpielVideo::AHSpielVideo()
+    : Thread()
+{
+    videoF = initFenster( 10, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen, "Spiel Aufzeichnung" );
+    laden = (Animation2D *)ladeAnimation->dublizieren();
+    laden->setSichtbar( 0 );
+    laden->setPosition( 380, 245 );
+    dllName = new Text( "" );
+    dllHandle = 0;
+    alpha = 0;
+    sichtbar = 0;
+    video = 0;
+    tickVal = 0;
 }
 
 // Destruktor
 AHSpielVideo::~AHSpielVideo()
 {
-	videoF->release();
-	if( dllHandle )
-		reset();
-	dllName->release();
-	schrift->release();
-	laden->release();
+    videoF->release();
+    if( dllHandle )
+        reset();
+    dllName->release();
+    laden->release();
 }
 
 // nicht constant
 void AHSpielVideo::reset()
 {
-	if( run )
-		warteAufThread( INFINITE );
-	if( dllHandle )
-	{
-		if( video )
-			video = video->release();
+    if( run )
+        warteAufThread( INFINITE );
+    if( dllHandle )
+    {
+        if( video )
+            video = (AufzeichnungV *)video->release();
         Framework::getDLLRegister()->releaseDLL( *dllName );
-		dllHandle = 0;
-	}
+        dllHandle = 0;
+    }
 }
 
 bool AHSpielVideo::ladeDaten( int spielId, int karteId )
 {
-	if( dllHandle )
-		reset();
-	KartenLeser *reader = KartenLeser::getInstance();
+    if( dllHandle )
+        reset();
+    KartenLeser *reader = KartenLeser::getInstance();
     reader->lock();
-	reader->setKarteId( karteId );
-	Text *pfad = reader->getSpielPfad();
-	if( !pfad )
-	{
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+    reader->setKarteId( karteId );
+    Text *pfad = reader->getSpielPfad();
+    if( !pfad )
+    {
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
         reader->unlock();
-		reader->release();
-		return 0;
-	}
-	pfad->append( "bin/" );
-	Text *spielArtName = reader->getSpielName();
-	if( !spielArtName )
-	{
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
+        reader->release();
+        return 0;
+    }
+    pfad->append( "bin/" );
+    Text *spielArtName = reader->getSpielName();
+    if( !spielArtName )
+    {
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( reader->getLetzterFehler() ), new Text( "Ok" ) );
         reader->unlock();
-		reader->release();
-		pfad->release();
-		return 0;
-	}
-	pfad->append( spielArtName->getText() );
-	pfad->append( ".dll" );
+        reader->release();
+        pfad->release();
+        return 0;
+    }
+    pfad->append( spielArtName->getText() );
+    pfad->append( ".dll" );
     reader->unlock();
-	reader->release();
-	dllName->setText( "Spiele/" );
-	dllName->append( spielArtName->getText() );
-	dllName->append( ".dll" );
-	spielArtName->release();
-	dllHandle = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
-	if( !dllHandle )
-	{
-		Text *msg = new Text( "Die DLL Datei '" );
-		msg->append( pfad->getText() );
-		msg->append( "' konnte nicht geladen werden." );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
-		pfad->release();
-		return 0;
-	}
-	AHSADLLStart startFunk = (AHSADLLStart)GetProcAddress( dllHandle, "GetAufzeichnung" );
-	if( !startFunk )
-	{
-		if( dllHandle )
-		{
+    reader->release();
+    dllName->setText( "Spiele/" );
+    dllName->append( spielArtName->getText() );
+    dllName->append( ".dll" );
+    spielArtName->release();
+    dllHandle = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
+    if( !dllHandle )
+    {
+        Text *msg = new Text( "Die DLL Datei '" );
+        msg->append( pfad->getText() );
+        msg->append( "' konnte nicht geladen werden." );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
+        pfad->release();
+        return 0;
+    }
+    AHSADLLStart startFunk = (AHSADLLStart)GetProcAddress( dllHandle, "GetAufzeichnung" );
+    if( !startFunk )
+    {
+        if( dllHandle )
+        {
             Framework::getDLLRegister()->releaseDLL( *dllName );
-			dllHandle = 0;
-		}
-		Text *msg = new Text( "Die Funktion 'GetAufzeichnung' konnte in der DLL Datei '" );
-		msg->append( pfad->getText() );
-		msg->append( "' nicht gefunden werden." );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
-		pfad->release();
-		return 0;
-	}
-	pfad->release();
-	video = startFunk();
-	if( !video )
-	{
-		if( dllHandle )
-		{
+            dllHandle = 0;
+        }
+        Text *msg = new Text( "Die Funktion 'GetAufzeichnung' konnte in der DLL Datei '" );
+        msg->append( pfad->getText() );
+        msg->append( "' nicht gefunden werden." );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg, new Text( "Ok" ) );
+        pfad->release();
+        return 0;
+    }
+    pfad->release();
+    video = startFunk();
+    if( !video )
+    {
+        if( dllHandle )
+        {
             Framework::getDLLRegister()->releaseDLL( *dllName );
-			dllHandle = 0;
-		}
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Für diese Spielart ist keine Aufzeichnung verfügbar." ), new Text( "Ok" ) );
-		return 0;
-	}
-	this->spielId = spielId;
-	video->setSchrift( schrift->getThis() );
-	video->setBildschirm( hauptScreen );
-	start();
-	return 1;
+            dllHandle = 0;
+        }
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Für diese Spielart ist keine Aufzeichnung verfügbar." ), new Text( "Ok" ) );
+        return 0;
+    }
+    this->spielId = spielId;
+    video->setUIFactory( uiFactory );
+    start();
+    return 1;
 }
 
 void AHSpielVideo::thread()
 {
-	laden->setSichtbar( 1 );
+    laden->setSichtbar( 1 );
     KSGClient::HistorieServerClient *historieClient = infoClient->createHistorieServerClient( spielId );
     if( !historieClient )
         nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Daten für dieses Spiel können zur Zeit nicht abgerufen werden." ), new Text( "Ok" ) );
@@ -393,1093 +379,1024 @@ void AHSpielVideo::thread()
         historieClient->release();
     }
     video->ladeSpiel( spielId );
-	laden->setSichtbar( 0 );
-	if( sichtbar )
-	{
-		nachLogin->setSpielAufzeichnung( video->getThis() );
-		aktion = 7; // Aufzeichnung betreten
-	}
-	run = 0;
+    laden->setSichtbar( 0 );
+    if( sichtbar )
+    {
+        nachLogin->setSpielAufzeichnung( dynamic_cast<AufzeichnungV *>( video->getThis() ) );
+        aktion = 7; // Aufzeichnung betreten
+    }
+    run = 0;
 }
 
 void AHSpielVideo::setSichtbar( bool sichtbar )
 {
-	if( !video )
-		return;
-	if( sichtbar && !run )
-	{
-		nachLogin->setSpielAufzeichnung( video->getThis() );
-		aktion = 7; // Aufzeichnung betreten
-	}
-	this->sichtbar = sichtbar;
-	if( sichtbar && !alpha )
-		alpha = 1;
+    if( !video )
+        return;
+    if( sichtbar && !run )
+    {
+        nachLogin->setSpielAufzeichnung( dynamic_cast<AufzeichnungV *>( video->getThis() ) );
+        aktion = 7; // Aufzeichnung betreten
+    }
+    this->sichtbar = sichtbar;
+    if( sichtbar && !alpha )
+        alpha = 1;
 }
 
 bool AHSpielVideo::tick( double tickVal )
 {
-	if( !video || !alpha )
-		return 0;
-	if( video->hatVerlassen( 0 ) && sichtbar )
-		setSichtbar( 0 );
-	bool ret = laden->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	this->tickVal -= val;
-	if( val )
-	{
-		if( sichtbar && alpha != 255 )
-		{
-			if( alpha + val > 255 )
-				alpha = 255;
-			else
-				alpha += (unsigned char)val;
-			ret = 1;
-		}
-		if( !sichtbar && alpha )
-		{
-			if( alpha - val < 0 )
-				alpha = 0;
-			else
-				alpha -= (unsigned char)val;
-			ret = 1;
-		}
-	}
-	return ret;
+    if( !video || !alpha )
+        return 0;
+    if( video->hatVerlassen( 0 ) && sichtbar )
+        setSichtbar( 0 );
+    bool ret = laden->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    this->tickVal -= val;
+    if( val )
+    {
+        if( sichtbar && alpha != 255 )
+        {
+            if( alpha + val > 255 )
+                alpha = 255;
+            else
+                alpha += (unsigned char)val;
+            ret = 1;
+        }
+        if( !sichtbar && alpha )
+        {
+            if( alpha - val < 0 )
+                alpha = 0;
+            else
+                alpha -= (unsigned char)val;
+            ret = 1;
+        }
+    }
+    return ret;
 }
 
 void AHSpielVideo::render( Bild &zRObj )
 {
-	if( !video || !alpha )
-		return;
-	if( !zRObj.setDrawOptions( 0, 0, videoF->getBreite() + 10, videoF->getHeight() + 40 ) )
-		return;
-	zRObj.setAlpha( alpha );
-	videoF->render( zRObj );
-	laden->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    if( !video || !alpha )
+        return;
+    if( !zRObj.setDrawOptions( 0, 0, videoF->getBreite() + 10, videoF->getHeight() + 40 ) )
+        return;
+    zRObj.setAlpha( alpha );
+    videoF->render( zRObj );
+    laden->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool AHSpielVideo::istNochSichtbar() const
 {
-	return alpha != 0;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *AHSpielVideo::release()
-{
-    if( ref == 2 && run )
-        warteAufThread( INFINITE );
-    return Thread::release();
+    return alpha != 0;
 }
 
 
 // Inhalt der AHSLETeamListeSpieler Klasse aus AccountHistorie.h
 // Konstruktor
-AHSLETeamListeSpieler::AHSLETeamListeSpieler( Schrift *zSchrift, char *name, int punkte, char *status, int farbe, int br )
-	: nameTF( initTextFeld( 5, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) ),
-  punkteTF( initTextFeld( 110, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Punkte: " ) += punkte ) ),
-  statusTF( initTextFeld( 215, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, status ) ),
-  ram( new LRahmen() ),
-  ref( 1 )
-{
-    TextRenderer tr( zSchrift->getThis() );
+AHSLETeamListeSpieler::AHSLETeamListeSpieler( char *name, int punkte, char *status, int farbe, int br )
+    : ReferenceCounter(),
+    nameTF( initTextFeld( 5, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, name ) ),
+    punkteTF( initTextFeld( 110, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Punkte: " ) += punkte ) ),
+    statusTF( initTextFeld( 215, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, status ) ),
+    ram( new LRahmen() )
+{
+    TextRenderer tr( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     tr.setSchriftSize( 12 );
-	nameTF->setSize( tr.getTextBreite( nameTF->zText()->getText() ) + 5, 20 );
-	punkteTF->setSize( tr.getTextBreite( punkteTF->zText()->getText() ) + 5, 20 );
-	statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
-	if( nameTF->getBreite() > 100 )
-		punkteTF->setPosition( 10 + nameTF->getBreite(), 0 );
-	if( punkteTF->getX() + punkteTF->getBreite() > 210 )
-		statusTF->setPosition( punkteTF->getX() + punkteTF->getBreite() + 5, 0 );
-	ram->setFarbe( farbe );
-	ram->setSize( br, 20 );
-	ram->setRamenBreite( 1 );
+    nameTF->setSize( tr.getTextBreite( nameTF->zText()->getText() ) + 5, 20 );
+    punkteTF->setSize( tr.getTextBreite( punkteTF->zText()->getText() ) + 5, 20 );
+    statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
+    if( nameTF->getBreite() > 100 )
+        punkteTF->setPosition( 10 + nameTF->getBreite(), 0 );
+    if( punkteTF->getX() + punkteTF->getBreite() > 210 )
+        statusTF->setPosition( punkteTF->getX() + punkteTF->getBreite() + 5, 0 );
+    ram->setFarbe( farbe );
+    ram->setSize( br, 20 );
+    ram->setRamenBreite( 1 );
 }
 
 // Destruktor
 AHSLETeamListeSpieler::~AHSLETeamListeSpieler()
 {
-	nameTF->release();
-	punkteTF->release();
-	statusTF->release();
-	ram->release();
+    nameTF->release();
+    punkteTF->release();
+    statusTF->release();
+    ram->release();
 }
 
 // nicht constant
 void AHSLETeamListeSpieler::render( int yOff, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( 2, yOff, ram->getBreite(), ram->getHeight() ) )
-		return;
-	nameTF->render( zRObj );
-	punkteTF->render( zRObj );
-	statusTF->render( zRObj );
-	ram->render( zRObj );
-	zRObj.releaseDrawOptions();
-}
-
-// cnstant
-
-// Reference Counting
-AHSLETeamListeSpieler *AHSLETeamListeSpieler::getThis()
-{
-	ref++;
-	return this;
-}
-
-AHSLETeamListeSpieler *AHSLETeamListeSpieler::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    if( !zRObj.setDrawOptions( 2, yOff, ram->getBreite(), ram->getHeight() ) )
+        return;
+    nameTF->render( zRObj );
+    punkteTF->render( zRObj );
+    statusTF->render( zRObj );
+    ram->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 
 // Inhalt der AHSLETeamListeTeam Klasse aus AccountHistorie.h
 // Konstruktor
-AHSLETeamListeTeam::AHSLETeamListeTeam( Schrift *zSchrift, char *name, int sAnz, char *status, int farbe, int br )
-	: nameTF( initTextFeld( 5, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, name ) ),
-  sAnzahlTF( initTextFeld( 110, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Spieleranzahl: " ) += sAnz ) ),
-  statusTF( initTextFeld( 215, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, status ) ),
-  ram( new LRahmen() ),
-  members( new RCArray< AHSLETeamListeSpieler >() ),
-  ref( 1 )
-{
-    TextRenderer tr( zSchrift->getThis() );
+AHSLETeamListeTeam::AHSLETeamListeTeam( char *name, int sAnz, char *status, int farbe, int br )
+    : ReferenceCounter(),
+    nameTF( initTextFeld( 5, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, name ) ),
+    sAnzahlTF( initTextFeld( 110, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Spieleranzahl: " ) += sAnz ) ),
+    statusTF( initTextFeld( 215, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, status ) ),
+    ram( new LRahmen() ),
+    members( new RCArray< AHSLETeamListeSpieler >() )
+{
+    TextRenderer tr( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     tr.setSchriftSize( 12 );
-	nameTF->setSize( tr.getTextBreite( nameTF->zText()->getText() ) + 5, 20 );
-	sAnzahlTF->setSize( tr.getTextBreite( sAnzahlTF->zText()->getText() ) + 5, 20 );
-	statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
-	if( nameTF->getBreite() > 100 )
-		sAnzahlTF->setPosition( 10 + nameTF->getBreite(), 0 );
-	if( sAnzahlTF->getX() + sAnzahlTF->getBreite() > 210 )
-		statusTF->setPosition( sAnzahlTF->getX() + sAnzahlTF->getBreite() + 5, 0 );
-	ram->setFarbe( farbe );
-	ram->setSize( br, 20 );
-	ram->setRamenBreite( 1 );
+    nameTF->setSize( tr.getTextBreite( nameTF->zText()->getText() ) + 5, 20 );
+    sAnzahlTF->setSize( tr.getTextBreite( sAnzahlTF->zText()->getText() ) + 5, 20 );
+    statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
+    if( nameTF->getBreite() > 100 )
+        sAnzahlTF->setPosition( 10 + nameTF->getBreite(), 0 );
+    if( sAnzahlTF->getX() + sAnzahlTF->getBreite() > 210 )
+        statusTF->setPosition( sAnzahlTF->getX() + sAnzahlTF->getBreite() + 5, 0 );
+    ram->setFarbe( farbe );
+    ram->setSize( br, 20 );
+    ram->setRamenBreite( 1 );
 }
 
 // Destruktor
 AHSLETeamListeTeam::~AHSLETeamListeTeam()
 {
-	nameTF->release();
-	sAnzahlTF->release();
-	statusTF->release();
-	ram->release();
-	members->release();
+    nameTF->release();
+    sAnzahlTF->release();
+    statusTF->release();
+    ram->release();
+    members->release();
 }
 
 // nicht constant
 void AHSLETeamListeTeam::addSpieler( AHSLETeamListeSpieler *s )
 {
-	members->add( s );
-	int maxHö = 20;
-	int anz = members->getEintragAnzahl();
-	if( anz )
-		maxHö += 4 + 20 * anz;
-	ram->setSize( ram->getBreite(), maxHö );
+    members->add( s );
+    int maxHö = 20;
+    int anz = members->getEintragAnzahl();
+    if( anz )
+        maxHö += 4 + 20 * anz;
+    ram->setSize( ram->getBreite(), maxHö );
 }
 
 void AHSLETeamListeTeam::render( int xOff, int yOff, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( xOff, yOff, ram->getBreite(), ram->getHeight() ) )
-		return;
-	nameTF->render( zRObj );
-	sAnzahlTF->render( zRObj );
-	statusTF->render( zRObj );
-	ram->render( zRObj );
-	yOff = 22;
-	int anz = members->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		members->z( i )->render( yOff, zRObj );
-		yOff += 20;
-	}
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( xOff, yOff, ram->getBreite(), ram->getHeight() ) )
+        return;
+    nameTF->render( zRObj );
+    sAnzahlTF->render( zRObj );
+    statusTF->render( zRObj );
+    ram->render( zRObj );
+    yOff = 22;
+    int anz = members->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        members->z( i )->render( yOff, zRObj );
+        yOff += 20;
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int AHSLETeamListeTeam::getHeight() const
 {
-	return ram->getHeight();
-}
-
-// Reference Counting
-AHSLETeamListeTeam *AHSLETeamListeTeam::getThis()
-{
-	ref++;
-	return this;
-}
-
-AHSLETeamListeTeam *AHSLETeamListeTeam::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ram->getHeight();
 }
 
 
 // Inhalt der AHSLETeamListe Klasse aus AccountHistorie.h
 // Konstruktor
 AHSLETeamListe::AHSLETeamListe( int xPos )
-	: members( new RCArray< AHSLETeamListeTeam >() ),
-  xPos( xPos ),
-  ref( 1 )
-{
-}
+    : ReferenceCounter(),
+    members( new RCArray< AHSLETeamListeTeam >() ),
+    xPos( xPos )
+{}
 
 // Destruktor
 AHSLETeamListe::~AHSLETeamListe()
 {
-	members->release();
+    members->release();
 }
 
 // nicht constant
 void AHSLETeamListe::addTeam( AHSLETeamListeTeam *t )
 {
-	members->add( t );
+    members->add( t );
 }
 
 void AHSLETeamListe::render( Bild &zRObj )
 {
-	int y = 25;
-	int anz = members->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		members->z( i )->render( xPos, y, zRObj );
-		y += members->z( i )->getHeight();
-	}
+    int y = 25;
+    int anz = members->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        members->z( i )->render( xPos, y, zRObj );
+        y += members->z( i )->getHeight();
+    }
 }
 
 // constant
 int AHSLETeamListe::getHeight() const
 {
-	int anz = members->getEintragAnzahl();
-	int hö = 0;
-	for( int i = 0; i < anz; i++ )
-		hö += members->z( i )->getHeight();
-	return hö;
+    int anz = members->getEintragAnzahl();
+    int hö = 0;
+    for( int i = 0; i < anz; i++ )
+        hö += members->z( i )->getHeight();
+    return hö;
 }
 
 int AHSLETeamListe::getBreite() const
 {
-	return 730 - xPos;
-}
-
-// Reference Counting
-AHSLETeamListe *AHSLETeamListe::getThis()
-{
-	ref++;
-	return this;
-}
-
-AHSLETeamListe *AHSLETeamListe::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return 730 - xPos;
 }
 
 
 // Inhalt der AHSpielListeEintrag Klasse aus AccountHistorie.h
 // Konstruktor
-AHSpielListeEintrag::AHSpielListeEintrag( int id, int karteId, Schrift *zSchrift, char *spiel, char *karte, char *datum, char *status,
-										  char *dauer, char *spielStatus, char *gewinner, int sAnzahl )
-: spielTF( initTextFeld( 5, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Spiel: " ) += spiel ) ),
-  karteTF( initTextFeld( 110, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Karte: " ) += karte ) ),
-  datumTF( initTextFeld( 215, 0, 180, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Datum: " ) += datum ) ),
-  statusTF( initTextFeld( 400, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Status: " ) += status ) ),
-  spiel( new Text( spiel ) ),
-  karte( new Text( karte ) ),
-  datum( new Text( datum ) ),
-  status( new Text( status ) ),
-  detailsK( initKnopf( 715, 0, 20, 20, 0, 0, "" ) ),
-  dauerTF( initTextFeld( 5, 25, 100, 20, zSchrift, TextFeld::Style::Text, Text( "Dauer: " ) += dauer ) ),
-  spielStatusTF( initTextFeld( 5, 45, 100, 20, zSchrift, TextFeld::Style::Text, Text( "Status: " ) += spielStatus ) ),
-  gewinnerTF( initTextFeld( 5, 65, 100, 20, zSchrift, TextFeld::Style::Text, Text( "Gewinner: " ) += gewinner ) ),
-  sAnzahlTF( initTextFeld( 5, 85, 100, 20, zSchrift, TextFeld::Style::Text, Text( "Spieleranzahl: " ) += sAnzahl ) ),
-  statistikK( initKnopf( 5, 105, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Statistik" ) ),
-  videoK( initKnopf( 5, 130, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Aufzeichnung" ) ),
-  liste( 0 ),
-  ram( new LRahmen() ),
-  ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
-  einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
-  id( id ),
-  karteId( karteId ),
-  tickVal( 0 ),
-  aktion( 0 ),
-  maxHö( 155 ),
-  ref( 1 )
-{
-	detailsK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	detailsK->setHintergrundBildZ( ausklappen->getThis() );
-	initToolTip( detailsK, "Details anzeigen.", zSchrift, hauptScreen );
-    TextRenderer tr( zSchrift->getThis() );
+AHSpielListeEintrag::AHSpielListeEintrag( int id, int karteId, char *spiel, char *karte, char *datum, char *status,
+                                          char *dauer, char *spielStatus, char *gewinner, int sAnzahl )
+    : ReferenceCounter(),
+    spielTF( initTextFeld( 5, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Spiel: " ) += spiel ) ),
+    karteTF( initTextFeld( 110, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Karte: " ) += karte ) ),
+    datumTF( initTextFeld( 215, 0, 180, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Datum: " ) += datum ) ),
+    statusTF( initTextFeld( 400, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, Text( "Status: " ) += status ) ),
+    spiel( new Text( spiel ) ),
+    karte( new Text( karte ) ),
+    datum( new Text( datum ) ),
+    status( new Text( status ) ),
+    detailsK( initKnopf( 715, 0, 20, 20, 0, "" ) ),
+    dauerTF( initTextFeld( 5, 25, 100, 20, TextFeld::Style::Text, Text( "Dauer: " ) += dauer ) ),
+    spielStatusTF( initTextFeld( 5, 45, 100, 20, TextFeld::Style::Text, Text( "Status: " ) += spielStatus ) ),
+    gewinnerTF( initTextFeld( 5, 65, 100, 20, TextFeld::Style::Text, Text( "Gewinner: " ) += gewinner ) ),
+    sAnzahlTF( initTextFeld( 5, 85, 100, 20, TextFeld::Style::Text, Text( "Spieleranzahl: " ) += sAnzahl ) ),
+    statistikK( initKnopf( 5, 105, 100, 20, Knopf::Style::Sichtbar, "Statistik" ) ),
+    videoK( initKnopf( 5, 130, 100, 20, Knopf::Style::Sichtbar, "Aufzeichnung" ) ),
+    liste( 0 ),
+    ram( new LRahmen() ),
+    ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
+    einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
+    id( id ),
+    karteId( karteId ),
+    tickVal( 0 ),
+    aktion( 0 ),
+    maxHö( 155 )
+{
+    detailsK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    detailsK->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+    initToolTip( detailsK, "Details anzeigen." );
+    TextRenderer tr( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     tr.setSchriftSize( 12 );
-	spielTF->setSize( tr.getTextBreite( spielTF->zText()->getText() ) + 5, 20 );
-	karteTF->setSize( tr.getTextBreite( karteTF->zText()->getText() ) + 5, 20 );
-	datumTF->setSize( tr.getTextBreite( datumTF->zText()->getText() ) + 5, 20 );
-	statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
-	dauerTF->setSize( tr.getTextBreite( dauerTF->zText()->getText() ), 20 );
-	spielStatusTF->setSize( tr.getTextBreite( spielStatusTF->zText()->getText() ), 20 );
-	gewinnerTF->setSize( tr.getTextBreite( gewinnerTF->zText()->getText() ), 20 );
-	sAnzahlTF->setSize( tr.getTextBreite( sAnzahlTF->zText()->getText() ), 20 );
-	if( spielTF->getBreite() > 100 )
-		karteTF->setPosition( 10 + spielTF->getBreite(), 0 );
-	if( karteTF->getX() + karteTF->getBreite() > 210 )
-		datumTF->setPosition( karteTF->getX() + karteTF->getBreite() + 5, 0 );
-	if( datumTF->getX() + datumTF->getBreite() > 395 )
-		statusTF->setPosition( datumTF->getX() + datumTF->getBreite() + 5, 0 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setSize( 735, 20 );
-	ram->setRamenBreite( 1 );
-	int br = dauerTF->getBreite();
-	br = br > spielStatusTF->getBreite() ? br : spielStatusTF->getBreite();
-	br = br > gewinnerTF->getBreite() ? br : gewinnerTF->getBreite();
-	br = br > sAnzahlTF->getBreite() ? br : sAnzahlTF->getBreite();
-	statistikK->setSize( br, statistikK->getHeight() );
-	videoK->setSize( br, videoK->getHeight() );
-	liste = new AHSLETeamListe( br + 10 );
+    spielTF->setSize( tr.getTextBreite( spielTF->zText()->getText() ) + 5, 20 );
+    karteTF->setSize( tr.getTextBreite( karteTF->zText()->getText() ) + 5, 20 );
+    datumTF->setSize( tr.getTextBreite( datumTF->zText()->getText() ) + 5, 20 );
+    statusTF->setSize( tr.getTextBreite( statusTF->zText()->getText() ) + 5, 20 );
+    dauerTF->setSize( tr.getTextBreite( dauerTF->zText()->getText() ), 20 );
+    spielStatusTF->setSize( tr.getTextBreite( spielStatusTF->zText()->getText() ), 20 );
+    gewinnerTF->setSize( tr.getTextBreite( gewinnerTF->zText()->getText() ), 20 );
+    sAnzahlTF->setSize( tr.getTextBreite( sAnzahlTF->zText()->getText() ), 20 );
+    if( spielTF->getBreite() > 100 )
+        karteTF->setPosition( 10 + spielTF->getBreite(), 0 );
+    if( karteTF->getX() + karteTF->getBreite() > 210 )
+        datumTF->setPosition( karteTF->getX() + karteTF->getBreite() + 5, 0 );
+    if( datumTF->getX() + datumTF->getBreite() > 395 )
+        statusTF->setPosition( datumTF->getX() + datumTF->getBreite() + 5, 0 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setSize( 735, 20 );
+    ram->setRamenBreite( 1 );
+    int br = dauerTF->getBreite();
+    br = br > spielStatusTF->getBreite() ? br : spielStatusTF->getBreite();
+    br = br > gewinnerTF->getBreite() ? br : gewinnerTF->getBreite();
+    br = br > sAnzahlTF->getBreite() ? br : sAnzahlTF->getBreite();
+    statistikK->setSize( br, statistikK->getHeight() );
+    videoK->setSize( br, videoK->getHeight() );
+    liste = new AHSLETeamListe( br + 10 );
 }
 
 // Destruktor
 AHSpielListeEintrag::~AHSpielListeEintrag()
 {
-	spielTF->release();
-	karteTF->release();
-	datumTF->release();
-	statusTF->release();
-	spiel->release();
-	karte->release();
-	datum->release();
-	status->release();
-	detailsK->release();
-	dauerTF->release();
-	spielStatusTF->release();
-	gewinnerTF->release();
-	sAnzahlTF->release();
-	statistikK->release();
-	videoK->release();
-	liste->release();
-	ram->release();
-	einklappen->release();
-	ausklappen->release();
+    spielTF->release();
+    karteTF->release();
+    datumTF->release();
+    statusTF->release();
+    spiel->release();
+    karte->release();
+    datum->release();
+    status->release();
+    detailsK->release();
+    dauerTF->release();
+    spielStatusTF->release();
+    gewinnerTF->release();
+    sAnzahlTF->release();
+    statistikK->release();
+    videoK->release();
+    liste->release();
+    ram->release();
+    einklappen->release();
+    ausklappen->release();
 }
 
 // nicht constant
 void AHSpielListeEintrag::addTeam( AHSLETeamListeTeam *t )
 {
-	liste->addTeam( t );
-	maxHö = liste->getHeight();
-	maxHö = 155 > maxHö + 30 ? 155 : maxHö + 30;
+    liste->addTeam( t );
+    maxHö = liste->getHeight();
+    maxHö = 155 > maxHö + 30 ? 155 : maxHö + 30;
 }
 
 bool AHSpielListeEintrag::tick( double tickVal )
 {
-	bool ret = detailsK->tick( tickVal );
-	ret |= statistikK->tick( tickVal );
-	ret |= videoK->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	this->tickVal -= val;
-	if( val )
-	{
-		if( detailsK->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
-		{
-			if( ram->getHeight() - val < 20 )
-				ram->setSize( ram->getBreite(), 20 );
-			else
-				ram->setSize( ram->getBreite(), ram->getHeight() - val );
-			ret = 1;
-		}
-		if( detailsK->zHintergrundBild() == einklappen )
-		{
-			if( ram->getHeight() > maxHö )
-			{
-				if( ram->getHeight() - val < maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() - val );
-				ret = 1;
-			}
-			if( ram->getHeight() < maxHö )
-			{
-				if( ram->getHeight() + val > maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() + val );
-				ret = 1;
-			}
-		}
-	}
-	return ret;
+    bool ret = detailsK->tick( tickVal );
+    ret |= statistikK->tick( tickVal );
+    ret |= videoK->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    this->tickVal -= val;
+    if( val )
+    {
+        if( detailsK->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
+        {
+            if( ram->getHeight() - val < 20 )
+                ram->setSize( ram->getBreite(), 20 );
+            else
+                ram->setSize( ram->getBreite(), ram->getHeight() - val );
+            ret = 1;
+        }
+        if( detailsK->zHintergrundBild() == einklappen )
+        {
+            if( ram->getHeight() > maxHö )
+            {
+                if( ram->getHeight() - val < maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() - val );
+                ret = 1;
+            }
+            if( ram->getHeight() < maxHö )
+            {
+                if( ram->getHeight() + val > maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() + val );
+                ret = 1;
+            }
+        }
+    }
+    return ret;
 }
 
 void AHSpielListeEintrag::doPublicMausEreignis( MausEreignis &me )
 {
-	bool meVera = 0;
-	bool meVeraTmp = 0;
-	if( me.mx < 0 || me.my < 0 || me.mx >= ram->getBreite() || me.my >= ram->getHeight() )
-	{
-		meVeraTmp = me.verarbeitet;
-		me.verarbeitet = 1;
-		meVera = 1;
-	}
-	int vera = me.verarbeitet;
-	detailsK->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-	{
-		if( detailsK->zHintergrundBild() == einklappen )
-			detailsK->setHintergrundBildZ( ausklappen->getThis() );
-		else
-			detailsK->setHintergrundBildZ( einklappen->getThis() );
-	}
-	vera = me.verarbeitet;
-	statistikK->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 1;
-	vera = me.verarbeitet;
-	videoK->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-		aktion = 2;
-	if( meVera )
-		me.verarbeitet = meVeraTmp;
+    bool meVera = 0;
+    bool meVeraTmp = 0;
+    if( me.mx < 0 || me.my < 0 || me.mx >= ram->getBreite() || me.my >= ram->getHeight() )
+    {
+        meVeraTmp = me.verarbeitet;
+        me.verarbeitet = 1;
+        meVera = 1;
+    }
+    int vera = me.verarbeitet;
+    detailsK->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
+    {
+        if( detailsK->zHintergrundBild() == einklappen )
+            detailsK->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+        else
+            detailsK->setHintergrundBildZ( dynamic_cast<Bild *>( einklappen->getThis() ) );
+    }
+    vera = me.verarbeitet;
+    statistikK->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 1;
+    vera = me.verarbeitet;
+    videoK->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
+        aktion = 2;
+    if( meVera )
+        me.verarbeitet = meVeraTmp;
 }
 
 void AHSpielListeEintrag::render( int yOff, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( 5, yOff, ram->getBreite(), ram->getHeight() ) )
-		return;
-	ram->render( zRObj );
-	if( ram->getHeight() > 20 )
-		zRObj.drawLinieH( 1, 20, ram->getBreite() - 2, ram->getFarbe() );
-	if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 2, ram->getHeight() - 2 ) )
-	{
-		zRObj.releaseDrawOptions();
-		return;
-	}
-	spielTF->render( zRObj );
-	karteTF->render( zRObj );
-	datumTF->render( zRObj );
-	statusTF->render( zRObj );
-	detailsK->render( zRObj );
-	dauerTF->render( zRObj );
-	spielStatusTF->render( zRObj );
-	gewinnerTF->render( zRObj );
-	sAnzahlTF->render( zRObj );
-	statistikK->render( zRObj );
-	videoK->render( zRObj );
-	liste->render( zRObj );
-	zRObj.releaseDrawOptions();
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( 5, yOff, ram->getBreite(), ram->getHeight() ) )
+        return;
+    ram->render( zRObj );
+    if( ram->getHeight() > 20 )
+        zRObj.drawLinieH( 1, 20, ram->getBreite() - 2, ram->getFarbe() );
+    if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 2, ram->getHeight() - 2 ) )
+    {
+        zRObj.releaseDrawOptions();
+        return;
+    }
+    spielTF->render( zRObj );
+    karteTF->render( zRObj );
+    datumTF->render( zRObj );
+    statusTF->render( zRObj );
+    detailsK->render( zRObj );
+    dauerTF->render( zRObj );
+    spielStatusTF->render( zRObj );
+    gewinnerTF->render( zRObj );
+    sAnzahlTF->render( zRObj );
+    statistikK->render( zRObj );
+    videoK->render( zRObj );
+    liste->render( zRObj );
+    zRObj.releaseDrawOptions();
+    zRObj.releaseDrawOptions();
 }
 
 int AHSpielListeEintrag::getAktion()
 {
-	int ret = aktion;
-	aktion = 0;
-	return ret;
+    int ret = aktion;
+    aktion = 0;
+    return ret;
 }
 
 // constant
 int AHSpielListeEintrag::getKarteId() const
 {
-	return karteId;
+    return karteId;
 }
 
 int AHSpielListeEintrag::getHeight() const
 {
-	return ram->getHeight();
+    return ram->getHeight();
 }
 
 int AHSpielListeEintrag::getId() const
 {
-	return id;
+    return id;
 }
 
 int AHSpielListeEintrag::getListeBreite() const
 {
-	return liste->getBreite();
+    return liste->getBreite();
 }
 
 Text *AHSpielListeEintrag::zSpiel() const
 {
-	return spiel;
+    return spiel;
 }
 
 Text *AHSpielListeEintrag::zKarte() const
 {
-	return karte;
+    return karte;
 }
 
 Text *AHSpielListeEintrag::zDatum() const
 {
-	return datum;
+    return datum;
 }
 
 Text *AHSpielListeEintrag::zStatus() const
 {
-	return status;
-}
-
-// Reference Counting
-AHSpielListeEintrag *AHSpielListeEintrag::getThis()
-{
-	ref++;
-	return this;
-}
-
-AHSpielListeEintrag *AHSpielListeEintrag::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return status;
 }
 
 
 // Inhalt der AHSpielListe Klasse aus AccountHistorie.h
 // Konstruktor
 AHSpielListe::AHSpielListe()
-	: Zeichnung(),
-  ram( new LRahmen() ),
-  scroll( new VScrollBar() ),
-  members( new RCArray< AHSpielListeEintrag >() ),
-  sortSpalte( new Text( "Spiel" ) ),
-  sortAbsteigend( 0 )
+    : Zeichnung(),
+    ram( new LRahmen() ),
+    scroll( new VScrollBar() ),
+    members( new RCArray< AHSpielListeEintrag >() ),
+    sortSpalte( new Text( "Spiel" ) ),
+    sortAbsteigend( 0 )
 {
-	pos = Punkt( 10, 40 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setRamenBreite( 1 );
-	ram->setSize( 760, 380 );
-	scroll->update( 0, 380 );
+    pos = Punkt( 10, 40 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setRamenBreite( 1 );
+    ram->setSize( 760, 380 );
+    scroll->update( 0, 380 );
 }
 
 // Destruktor
 AHSpielListe::~AHSpielListe()
 {
-	ram->release();
-	scroll->release();
-	members->release();
-	sortSpalte->release();
+    ram->release();
+    scroll->release();
+    members->release();
+    sortSpalte->release();
 }
 
 // privat
 int AHSpielListe::getReihenfolge( int *arr )
 {
-	lockZeichnung();
-	int anz = members->getEintragAnzahl();
-	if( !anz )
-	{
-		unlockZeichnung();
-		return 0;
-	}
-	int ret = 0;
-	bool *fertig = new bool[ anz ];
-	ZeroMemory( fertig, anz );
-	for( int i = 0; i < anz; i++ )
-	{
-		int index = -1;
-		Text minMaxT;
-		Zeit minMaxZ;
-		for( int j = 0; j < anz; j++ )
-		{
-			AHSpielListeEintrag *tmp = members->z( j );
-			if( sortSpalte->istGleich( "Spiel" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zSpiel() > minMaxT ) || ( !sortAbsteigend && *tmp->zSpiel() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zSpiel()->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Karte" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zKarte() > minMaxT ) || ( !sortAbsteigend && *tmp->zKarte() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zKarte()->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Datum" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && minMaxZ.istKleiner( "y-m-d h:i", tmp->zDatum()->getText() ) ) ||
-				( !sortAbsteigend && minMaxZ.istLater( "y-m-d h:i", tmp->zDatum()->getText() ) ) ) )
-			{
-				minMaxZ.setZeit( "y-m-d h:i", tmp->zDatum()->getText() );
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zStatus()->getText();
-				index = j;
-			}
-		}
-		if( index < 0 )
-			break;
-		fertig[ index ] = 1;
-		arr[ ret ] = index;
-		ret++;
-	}
-	delete[] fertig;
-	unlockZeichnung();
-	return ret;
+    lockZeichnung();
+    int anz = members->getEintragAnzahl();
+    if( !anz )
+    {
+        unlockZeichnung();
+        return 0;
+    }
+    int ret = 0;
+    bool *fertig = new bool[ anz ];
+    ZeroMemory( fertig, anz );
+    for( int i = 0; i < anz; i++ )
+    {
+        int index = -1;
+        Text minMaxT;
+        Zeit minMaxZ;
+        for( int j = 0; j < anz; j++ )
+        {
+            AHSpielListeEintrag *tmp = members->z( j );
+            if( sortSpalte->istGleich( "Spiel" ) && !fertig[ j ] && ( index < 0 ||
+                                                                      ( sortAbsteigend && *tmp->zSpiel() > minMaxT ) || ( !sortAbsteigend && *tmp->zSpiel() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zSpiel()->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Karte" ) && !fertig[ j ] && ( index < 0 ||
+                                                                           ( sortAbsteigend && *tmp->zKarte() > minMaxT ) || ( !sortAbsteigend && *tmp->zKarte() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zKarte()->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Datum" ) && !fertig[ j ] && ( index < 0 ||
+                                                                           ( sortAbsteigend && minMaxZ.istKleiner( "y-m-d h:i", tmp->zDatum()->getText() ) ) ||
+                                                                           ( !sortAbsteigend && minMaxZ.istLater( "y-m-d h:i", tmp->zDatum()->getText() ) ) ) )
+            {
+                minMaxZ.setZeit( "y-m-d h:i", tmp->zDatum()->getText() );
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zStatus()->getText();
+                index = j;
+            }
+        }
+        if( index < 0 )
+            break;
+        fertig[ index ] = 1;
+        arr[ ret ] = index;
+        ret++;
+    }
+    delete[] fertig;
+    unlockZeichnung();
+    return ret;
 }
 
 // nicht constant
 void AHSpielListe::setSortSpalte( char *sp )
 {
-	lockZeichnung();
-	sortSpalte->setText( sp );
-	unlockZeichnung();
+    lockZeichnung();
+    sortSpalte->setText( sp );
+    unlockZeichnung();
 }
 
 void AHSpielListe::setSortRichtung( bool absteigend )
 {
-	sortAbsteigend = absteigend;
+    sortAbsteigend = absteigend;
 }
 
 void AHSpielListe::reset()
 {
-	lockZeichnung();
-	members->leeren();
-	unlockZeichnung();
+    lockZeichnung();
+    members->leeren();
+    unlockZeichnung();
 }
 
 void AHSpielListe::addSpiel( AHSpielListeEintrag *s )
 {
-	lockZeichnung();
-	members->add( s );
-	unlockZeichnung();
+    lockZeichnung();
+    members->add( s );
+    unlockZeichnung();
 }
 
 bool AHSpielListe::tick( double tickVal )
 {
-	bool ret = scroll->getRend();
-	lockZeichnung();
-	int anz = members->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		ret |= members->z( i )->tick( tickVal );
-	unlockZeichnung();
-	return ret;
+    bool ret = scroll->getRend();
+    lockZeichnung();
+    int anz = members->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        ret |= members->z( i )->tick( tickVal );
+    unlockZeichnung();
+    return ret;
 }
 
 void AHSpielListe::doPublicMausEreignis( MausEreignis &me )
 {
-	bool vera = 0;
-	if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
-	{
-		vera = 1;
-		me.verarbeitet = 1;
-	}
-	int mx = me.mx, my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
-	me.mx -= 5;
-	me.my -= 5 - scroll->getScroll();
-	lockZeichnung();
-	int anz = members->getEintragAnzahl();
-	int *rf = new int[ anz ];
-	int rfAnz = getReihenfolge( rf );
-	for( int i = 0; i < rfAnz; i++ )
-	{
-		members->z( rf[ i ] )->doPublicMausEreignis( me );
-		me.my -= members->z( rf[ i ] )->getHeight() + 5;
-	}
-	delete[] rf;
-	unlockZeichnung();
-	me.mx = mx, me.my = my;
-	if( vera )
-		me.verarbeitet = 0;
+    bool vera = 0;
+    if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
+    {
+        vera = 1;
+        me.verarbeitet = 1;
+    }
+    int mx = me.mx, my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
+    me.mx -= 5;
+    me.my -= 5 - scroll->getScroll();
+    lockZeichnung();
+    int anz = members->getEintragAnzahl();
+    int *rf = new int[ anz ];
+    int rfAnz = getReihenfolge( rf );
+    for( int i = 0; i < rfAnz; i++ )
+    {
+        members->z( rf[ i ] )->doPublicMausEreignis( me );
+        me.my -= members->z( rf[ i ] )->getHeight() + 5;
+    }
+    delete[] rf;
+    unlockZeichnung();
+    me.mx = mx, me.my = my;
+    if( vera )
+        me.verarbeitet = 0;
 }
 
 void AHSpielListe::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
-		return;
-	ram->render( zRObj );
-	scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
-	if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
-	{
-		zRObj.releaseDrawOptions();
-		return;
-	}
-	int anzHö = 5;
-	lockZeichnung();
-	int anz = members->getEintragAnzahl();
-	int *rf = new int[ anz ];
-	int rfAnz = getReihenfolge( rf );
-	for( int i = 0; i < rfAnz; i++ )
-	{
-		members->z( rf[ i ] )->render( anzHö - scroll->getScroll(), zRObj );
-		anzHö += members->z( rf[ i ] )->getHeight() + 5;
-	}
-	delete[] rf;
-	unlockZeichnung();
-	scroll->update( anzHö, ram->getHeight() - 2 );
-	zRObj.releaseDrawOptions();
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
+        return;
+    ram->render( zRObj );
+    scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
+    if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
+    {
+        zRObj.releaseDrawOptions();
+        return;
+    }
+    int anzHö = 5;
+    lockZeichnung();
+    int anz = members->getEintragAnzahl();
+    int *rf = new int[ anz ];
+    int rfAnz = getReihenfolge( rf );
+    for( int i = 0; i < rfAnz; i++ )
+    {
+        members->z( rf[ i ] )->render( anzHö - scroll->getScroll(), zRObj );
+        anzHö += members->z( rf[ i ] )->getHeight() + 5;
+    }
+    delete[] rf;
+    unlockZeichnung();
+    scroll->update( anzHö, ram->getHeight() - 2 );
+    zRObj.releaseDrawOptions();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int AHSpielListe::getAktion( int *spielId, int *karteId ) const
 {
-	int anz = members->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		int ak = members->z( i )->getAktion();
-		if( ak )
-		{
-			*spielId = members->z( i )->getId();
-			*karteId = members->z( i )->getKarteId();
-			return ak;
-		}
-	}
-	return 0;
+    int anz = members->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        int ak = members->z( i )->getAktion();
+        if( ak )
+        {
+            *spielId = members->z( i )->getId();
+            *karteId = members->z( i )->getKarteId();
+            return ak;
+        }
+    }
+    return 0;
 }
 
 
 // Inhalt der AccountHistorie Klasse aus AccountHistorie.h
 // Konstruktor
-AccountHistorie::AccountHistorie( Schrift *zSchrift )
-	: Thread(),
-  schrift( zSchrift->getThis() ),
-  historieF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Historie von " ) ),
-  sortSpalte( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Spiel", "Karte", "Datum", "Status" } ) ),
-  sortRichtung( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-  liste( new AHSpielListe() ),
-  statistik( new AHSpielStatistik( zSchrift->getThis() ) ),
-  video( new AHSpielVideo( zSchrift->getThis() ) ),
-  status( 0 ),
-  accId( 0 ),
-  animation( 0 ),
-  alpha( 255 ),
-  alpha2( 255 ),
-  alpha3( 255 ),
-  tickVal( 0 ),
-  rend( 0 )
-{
-	initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift, hauptScreen );
-	initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll.", zSchrift, hauptScreen );
-	historieF->addMember( liste->getThis() );
-	historieF->addMember( sortSpalte->getThis() );
-	historieF->addMember( sortRichtung->getThis() );
-	historieF->setMausEreignis( _ret1ME );
+AccountHistorie::AccountHistorie()
+    : Thread(),
+    historieF( initFenster( 810, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Historie von " ) ),
+    sortSpalte( initAuswahlBox( 10, 10, 150, 20, ABSTYLE, { "Spiel", "Karte", "Datum", "Status" } ) ),
+    sortRichtung( initAuswahlBox( 170, 10, 150, 20, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    liste( new AHSpielListe() ),
+    statistik( new AHSpielStatistik() ),
+    video( new AHSpielVideo() ),
+    status( 0 ),
+    accId( 0 ),
+    animation( 0 ),
+    alpha( 255 ),
+    alpha2( 255 ),
+    alpha3( 255 ),
+    tickVal( 0 ),
+    rend( 0 )
+{
+    initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll." );
+    initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll." );
+    historieF->addMember( dynamic_cast<Zeichnung *>( liste->getThis() ) );
+    historieF->addMember( dynamic_cast<Zeichnung *>( sortSpalte->getThis() ) );
+    historieF->addMember( dynamic_cast<Zeichnung *>( sortRichtung->getThis() ) );
+    historieF->setMausEreignis( _ret1ME );
 }
 
 // Destruktor
 AccountHistorie::~AccountHistorie()
 {
-	schrift->release();
-	historieF->release();
-	sortSpalte->release();
-	sortRichtung->release();
-	statistik->release();
-	liste->release();
-	video->release();
+    statistik->warteAufThread( 10000 );
+    statistik->ende();
+    video->warteAufThread( 10000 );
+    video->ende();
+    historieF->release();
+    sortSpalte->release();
+    sortRichtung->release();
+    statistik->release();
+    liste->release();
+    video->release();
 }
 
 // nicht constant
 void AccountHistorie::reset()
 {
-	liste->reset();
-	statistik->reset();
-	video->reset();
+    liste->reset();
+    statistik->reset();
+    video->reset();
 }
 
 void AccountHistorie::ladeStatistik( int accId )
 {
-	if( this->accId == accId )
-		return;
-	this->status = 0;
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
-	if( ( animation | 0x1 ) == animation )
-	{
-		animation |= 0x4;
-		this->accId = accId;
-		this->status = 1;
-		return;
-	}
-	if( this->accId )
-		reset();
-	this->accId = accId;
-	start();
-	this->status = 1;
+    if( this->accId == accId )
+        return;
+    this->status = 0;
+    if( run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    if( ( animation | 0x1 ) == animation )
+    {
+        animation |= 0x4;
+        this->accId = accId;
+        this->status = 1;
+        return;
+    }
+    if( this->accId )
+        reset();
+    this->accId = accId;
+    start();
+    this->status = 1;
 }
 
 void AccountHistorie::thread()
 {
-	Text *name = infoClient->getSpielerName( accId );
-	if( name )
-	{
-		name->insert( 0, "Historie von " );
-		historieF->setTitel( *name );
-		name->release();
-	}
-	Array< KSGClient::SpielHistorieDaten > *daten = infoClient->getSpielHistorieDaten( accId );
-	int anz = daten->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		KSGClient::SpielHistorieDaten spiel = daten->get( i );
-		AHSpielListeEintrag *spielE = new AHSpielListeEintrag( spiel.id, spiel.karteId, schrift, spiel.spiel, spiel.karte,
-															   spiel.datum, spiel.status, spiel.dauer,
-															   spiel.spielStatus, spiel.gewinner, spiel.sAnzahl );
-		int tAnz = spiel.teams.getEintragAnzahl();
-		for( int j = 0; j < tAnz; j++ )
-		{
-			KSGClient::SpielHistorieTeamDaten team = spiel.teams.get( j );
-			AHSLETeamListeTeam *teamE = new AHSLETeamListeTeam( schrift, team.name, team.sAnzahl, team.status,
-																team.farbe, spielE->getListeBreite() );
-			int sAnz = team.spieler.getEintragAnzahl();
-			for( int k = 0; k < sAnz; k++ )
-			{
-				KSGClient::SpielHistorieSpielerDaten spieler = team.spieler.get( k );
-				AHSLETeamListeSpieler *spielerE = new AHSLETeamListeSpieler( schrift, spieler.name, spieler.punkte, spieler.status,
-																			 spieler.farbe, spielE->getListeBreite() - 4 );
-				teamE->addSpieler( spielerE );
-			}
-			spielE->addTeam( teamE );
-		}
-		liste->addSpiel( spielE );
-	}
-	daten->release();
-	animation &= ~0x4;
-	status = 2;
-	run = 0;
+    Text *name = infoClient->getSpielerName( accId );
+    if( name )
+    {
+        name->insert( 0, "Historie von " );
+        historieF->setTitel( *name );
+        name->release();
+    }
+    Array< KSGClient::SpielHistorieDaten > *daten = infoClient->getSpielHistorieDaten( accId );
+    int anz = daten->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        KSGClient::SpielHistorieDaten spiel = daten->get( i );
+        AHSpielListeEintrag *spielE = new AHSpielListeEintrag( spiel.id, spiel.karteId, spiel.spiel, spiel.karte,
+                                                               spiel.datum, spiel.status, spiel.dauer,
+                                                               spiel.spielStatus, spiel.gewinner, spiel.sAnzahl );
+        int tAnz = spiel.teams.getEintragAnzahl();
+        for( int j = 0; j < tAnz; j++ )
+        {
+            KSGClient::SpielHistorieTeamDaten team = spiel.teams.get( j );
+            AHSLETeamListeTeam *teamE = new AHSLETeamListeTeam( team.name, team.sAnzahl, team.status,
+                                                                team.farbe, spielE->getListeBreite() );
+            int sAnz = team.spieler.getEintragAnzahl();
+            for( int k = 0; k < sAnz; k++ )
+            {
+                KSGClient::SpielHistorieSpielerDaten spieler = team.spieler.get( k );
+                AHSLETeamListeSpieler *spielerE = new AHSLETeamListeSpieler( spieler.name, spieler.punkte, spieler.status,
+                                                                             spieler.farbe, spielE->getListeBreite() - 4 );
+                teamE->addSpieler( spielerE );
+            }
+            spielE->addTeam( teamE );
+        }
+        liste->addSpiel( spielE );
+    }
+    daten->release();
+    animation &= ~0x4;
+    status = 2;
+    run = 0;
 }
 
 void AccountHistorie::setSichtbar( bool sichtbar, bool nachRechts )
 {
-	if( sichtbar )
-	{
-		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
-		{
-			if( nachRechts )
-				historieF->setPosition( -810, 40 );
-			else
-				historieF->setPosition( 810, 40 );
-		}
-		animation |= 0x1;
-	}
-	else
-		animation &= ~0x1;
-	if( nachRechts )
-		animation |= 0x2;
-	else
-		animation &= ~0x2;
+    if( sichtbar )
+    {
+        if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
+        {
+            if( nachRechts )
+                historieF->setPosition( -810, 40 );
+            else
+                historieF->setPosition( 810, 40 );
+        }
+        animation |= 0x1;
+    }
+    else
+        animation &= ~0x1;
+    if( nachRechts )
+        animation |= 0x2;
+    else
+        animation &= ~0x2;
 }
 
 bool AccountHistorie::tick( double zeit )
 {
-	if( !statistik->istNochSichtbar() && !video->istNochSichtbar() )
-		rend |= historieF->tick( zeit );
-	rend |= statistik->tick( zeit );
-	rend |= video->tick( zeit );
-	tickVal += zeit;
-	int valA = (int)( tickVal * 150 );
-	int valB = (int)( tickVal * 500 );
-	tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( ( animation | 0x8 ) == animation && alpha2 )
-		{
-			if( alpha2 - valA <= 0 )
-			{
-				alpha2 = 0;
-				statistik->setSichtbar( 1 );
-			}
-			else
-				alpha2 -= valA;
-			rend = 1;
-		}
-		if( ( animation | 0x8 ) != animation && alpha2 != 255 )
-		{
-			if( alpha2 + valA >= 255 )
-				alpha2 = 255;
-			else
-				alpha2 += valA;
-			rend = 1;
-		}
-		if( ( animation | 0x10 ) == animation && alpha3 )
-		{
-			if( alpha3 - valA <= 0 )
-			{
-				alpha3 = 0;
-				video->setSichtbar( 1 );
-			}
-			else
-				alpha3 -= valA;
-			rend = 1;
-		}
-		if( ( animation | 0x10 ) != animation && alpha3 != 255 )
-		{
-			if( alpha3 + valA >= 255 )
-				alpha3 = 255;
-			else
-				alpha3 += valA;
-			rend = 1;
-		}
-		if( ( animation | 0x4 ) == animation && alpha )
-		{
-			if( alpha - valA <= 0 )
-				alpha = 0;
-			else
-				alpha -= valA;
-			rend = 1;
-			if( !alpha )
-			{
-				reset();
-				start();
-			}
-		}
-		if( ( animation | 0x4 ) != animation && alpha != 255 )
-		{
-			if( alpha + valA >= 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( ( animation | 0x1 ) == animation )
-		{ // Sichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( historieF->getX() != 10 )
-				{
-					if( historieF->getX() + valB > 10 )
-						historieF->setPosition( 10, historieF->getY() );
-					else
-						historieF->setPosition( historieF->getX() + valB, historieF->getY() );
-					statistik->setPosition( historieF->getX(), historieF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( historieF->getX() != 10 )
-				{
-					if( historieF->getX() - valB < 10 )
-						historieF->setPosition( 10, historieF->getY() );
-					else
-						historieF->setPosition( historieF->getX() - valB, historieF->getY() );
-					statistik->setPosition( historieF->getX(), historieF->getY() );
-					rend = 1;
-				}
-			}
-		}
-		else
-		{ // Unsichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( historieF->getX() != 810 )
-				{
-					if( historieF->getX() + valB > 810 )
-						historieF->setPosition( 810, historieF->getY() );
-					else
-						historieF->setPosition( historieF->getX() + valB, historieF->getY() );
-					statistik->setPosition( historieF->getX(), historieF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( historieF->getX() != -810 )
-				{
-					if( historieF->getX() - valB < -810 )
-						historieF->setPosition( -810, historieF->getY() );
-					else
-						historieF->setPosition( historieF->getX() - valB, historieF->getY() );
-					statistik->setPosition( historieF->getX(), historieF->getY() );
-					rend = 1;
-				}
-			}
-		}
-	}
-	if( !alpha2 && !statistik->istNochSichtbar() )
-	{
-		animation &= ~0x8;
-		statistik->reset();
-	}
-	if( !alpha3 && !video->istNochSichtbar() )
-	{
-		animation &= ~0x10;
-		video->reset();
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( !statistik->istNochSichtbar() && !video->istNochSichtbar() )
+        rend |= historieF->tick( zeit );
+    rend |= statistik->tick( zeit );
+    rend |= video->tick( zeit );
+    tickVal += zeit;
+    int valA = (int)( tickVal * 150 );
+    int valB = (int)( tickVal * 500 );
+    tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( ( animation | 0x8 ) == animation && alpha2 )
+        {
+            if( alpha2 - valA <= 0 )
+            {
+                alpha2 = 0;
+                statistik->setSichtbar( 1 );
+            }
+            else
+                alpha2 -= valA;
+            rend = 1;
+        }
+        if( ( animation | 0x8 ) != animation && alpha2 != 255 )
+        {
+            if( alpha2 + valA >= 255 )
+                alpha2 = 255;
+            else
+                alpha2 += valA;
+            rend = 1;
+        }
+        if( ( animation | 0x10 ) == animation && alpha3 )
+        {
+            if( alpha3 - valA <= 0 )
+            {
+                alpha3 = 0;
+                video->setSichtbar( 1 );
+            }
+            else
+                alpha3 -= valA;
+            rend = 1;
+        }
+        if( ( animation | 0x10 ) != animation && alpha3 != 255 )
+        {
+            if( alpha3 + valA >= 255 )
+                alpha3 = 255;
+            else
+                alpha3 += valA;
+            rend = 1;
+        }
+        if( ( animation | 0x4 ) == animation && alpha )
+        {
+            if( alpha - valA <= 0 )
+                alpha = 0;
+            else
+                alpha -= valA;
+            rend = 1;
+            if( !alpha )
+            {
+                reset();
+                start();
+            }
+        }
+        if( ( animation | 0x4 ) != animation && alpha != 255 )
+        {
+            if( alpha + valA >= 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( ( animation | 0x1 ) == animation )
+        { // Sichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( historieF->getX() != 10 )
+                {
+                    if( historieF->getX() + valB > 10 )
+                        historieF->setPosition( 10, historieF->getY() );
+                    else
+                        historieF->setPosition( historieF->getX() + valB, historieF->getY() );
+                    statistik->setPosition( historieF->getX(), historieF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( historieF->getX() != 10 )
+                {
+                    if( historieF->getX() - valB < 10 )
+                        historieF->setPosition( 10, historieF->getY() );
+                    else
+                        historieF->setPosition( historieF->getX() - valB, historieF->getY() );
+                    statistik->setPosition( historieF->getX(), historieF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+        else
+        { // Unsichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( historieF->getX() != 810 )
+                {
+                    if( historieF->getX() + valB > 810 )
+                        historieF->setPosition( 810, historieF->getY() );
+                    else
+                        historieF->setPosition( historieF->getX() + valB, historieF->getY() );
+                    statistik->setPosition( historieF->getX(), historieF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( historieF->getX() != -810 )
+                {
+                    if( historieF->getX() - valB < -810 )
+                        historieF->setPosition( -810, historieF->getY() );
+                    else
+                        historieF->setPosition( historieF->getX() - valB, historieF->getY() );
+                    statistik->setPosition( historieF->getX(), historieF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+    }
+    if( !alpha2 && !statistik->istNochSichtbar() )
+    {
+        animation &= ~0x8;
+        statistik->reset();
+    }
+    if( !alpha3 && !video->istNochSichtbar() )
+    {
+        animation &= ~0x10;
+        video->reset();
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountHistorie::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !statistik->istNochSichtbar() && !video->istNochSichtbar() && alpha == 255 && alpha2 == 255 && alpha3 == 255 )
-	{
-		int sortSpalteS = sortSpalte->getAuswahl();
-		int sortRichtungS = sortRichtung->getAuswahl();
-		historieF->doPublicMausEreignis( me );
-		if( sortSpalte->getAuswahl() != sortSpalteS )
-		{
-			liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
-			sortSpalte->einklappen();
-		}
-		if( sortRichtung->getAuswahl() != sortRichtungS )
-		{
-			liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
-			sortRichtung->einklappen();
-		}
-		int spielId = 0;
-		int karteId = 0;
-		int ak = liste->getAktion( &spielId, &karteId );
-		if( ak == 1 )
-		{ // Statistik anzeigen
-			if( statistik->ladeDaten( spielId, karteId ) )
-				animation |= 0x8;
-		}
-		if( ak == 2 )
-		{ // Aufzeichnung abspielen
-			if( video->ladeDaten( spielId, karteId ) )
-				animation |= 0x10;
-		}
-	}
-	if( statistik->istNochSichtbar() )
-		statistik->doPublicMausEreignis( me );
+    if( !statistik->istNochSichtbar() && !video->istNochSichtbar() && alpha == 255 && alpha2 == 255 && alpha3 == 255 )
+    {
+        int sortSpalteS = sortSpalte->getAuswahl();
+        int sortRichtungS = sortRichtung->getAuswahl();
+        historieF->doPublicMausEreignis( me );
+        if( sortSpalte->getAuswahl() != sortSpalteS )
+        {
+            liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
+            sortSpalte->einklappen();
+        }
+        if( sortRichtung->getAuswahl() != sortRichtungS )
+        {
+            liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
+            sortRichtung->einklappen();
+        }
+        int spielId = 0;
+        int karteId = 0;
+        int ak = liste->getAktion( &spielId, &karteId );
+        if( ak == 1 )
+        { // Statistik anzeigen
+            if( statistik->ladeDaten( spielId, karteId ) )
+                animation |= 0x8;
+        }
+        if( ak == 2 )
+        { // Aufzeichnung abspielen
+            if( video->ladeDaten( spielId, karteId ) )
+                animation |= 0x10;
+        }
+    }
+    if( statistik->istNochSichtbar() )
+        statistik->doPublicMausEreignis( me );
 }
 
 void AccountHistorie::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( statistik->istNochSichtbar() )
-		statistik->doTastaturEreignis( te );
+    if( statistik->istNochSichtbar() )
+        statistik->doTastaturEreignis( te );
 }
 
 void AccountHistorie::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	if( alpha2 && alpha3 )
-	{
-		zRObj.setAlpha( alpha2 );
-		zRObj.setAlpha( alpha3 );
-		historieF->render( zRObj );
-		zRObj.releaseAlpha();
-		zRObj.releaseAlpha();
-	}
-	if( statistik->istNochSichtbar() )
-		statistik->render( zRObj );
-	if( video->istNochSichtbar() )
-		video->render( zRObj );
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( alpha );
+    if( alpha2 && alpha3 )
+    {
+        zRObj.setAlpha( alpha2 );
+        zRObj.setAlpha( alpha3 );
+        historieF->render( zRObj );
+        zRObj.releaseAlpha();
+        zRObj.releaseAlpha();
+    }
+    if( statistik->istNochSichtbar() )
+        statistik->render( zRObj );
+    if( video->istNochSichtbar() )
+        video->render( zRObj );
+    zRObj.releaseAlpha();
 }
 
 // constant
 int AccountHistorie::getStatus() const
 {
-	return status;
+    return status;
 }

+ 181 - 206
KSGClient/NachLogin/Account/Historie/AccountHistorie.h

@@ -17,260 +17,235 @@ using namespace Framework;
 class AHSpielStatistik : public Thread
 {
 private:
-	Fenster *statistikF;
-	Animation2D *laden;
-	Schrift *schrift;
-	Text *dllName;
-	HINSTANCE dllHandle;
-	AccountHistorieStatistikV *statistik;
-	double tickVal;
-	unsigned char alpha;
-	bool sichtbar;
-	int spielId;
+    Fenster *statistikF;
+    Animation2D *laden;
+    Text *dllName;
+    HINSTANCE dllHandle;
+    AccountHistorieStatistikV *statistik;
+    double tickVal;
+    unsigned char alpha;
+    bool sichtbar;
+    int spielId;
 
 public:
-	// Konstruktor
-	AHSpielStatistik( Schrift *schrift );
-	// Destruktor
-	~AHSpielStatistik();
-	// nicht constant
-	void reset();
-	bool ladeDaten( int spielId, int spielArtId );
-	void thread();
-	void setPosition( int x, int y );
-	void setSichtbar( bool sichtbar );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	bool istNochSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    AHSpielStatistik();
+    // Destruktor
+    ~AHSpielStatistik();
+    // nicht constant
+    void reset();
+    bool ladeDaten( int spielId, int spielArtId );
+    void thread();
+    void setPosition( int x, int y );
+    void setSichtbar( bool sichtbar );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    bool istNochSichtbar() const;
 };
 
 class AHSpielVideo : public Thread
 {
 private:
-	Fenster *videoF;
-	Animation2D *laden;
-	Schrift *schrift;
-	Text *dllName;
-	HINSTANCE dllHandle;
-	AufzeichnungV *video;
-	double tickVal;
-	unsigned char alpha;
-	bool sichtbar;
-	int spielId;
+    Fenster *videoF;
+    Animation2D *laden;
+    Text *dllName;
+    HINSTANCE dllHandle;
+    AufzeichnungV *video;
+    double tickVal;
+    unsigned char alpha;
+    bool sichtbar;
+    int spielId;
 
 public:
-	// Konstruktor
-	AHSpielVideo( Schrift *schrift );
-	// Destruktor
-	~AHSpielVideo();
-	// nicht constant
-	void reset();
-	bool ladeDaten( int spielId, int spielArtId );
-	void thread();
-	void setSichtbar( bool sichtbar );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	bool istNochSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    AHSpielVideo();
+    // Destruktor
+    ~AHSpielVideo();
+    // nicht constant
+    void reset();
+    bool ladeDaten( int spielId, int spielArtId );
+    void thread();
+    void setSichtbar( bool sichtbar );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    bool istNochSichtbar() const;
 };
 
-class AHSLETeamListeSpieler
+class AHSLETeamListeSpieler : public virtual ReferenceCounter
 {
 private:
-	TextFeld *nameTF;
-	TextFeld *punkteTF;
-	TextFeld *statusTF;
-	LRahmen *ram;
-	int ref;
+    TextFeld *nameTF;
+    TextFeld *punkteTF;
+    TextFeld *statusTF;
+    LRahmen *ram;
 
 public:
-	// Konstruktor
-	AHSLETeamListeSpieler( Schrift *zSchrift, char *name, int punkte, char *status, int farbe, int br );
-	// Destruktor
-	~AHSLETeamListeSpieler();
-	// nicht constant
-	void render( int yOff, Bild &zRObj );
-	// cnstant
-
-	// Reference Counting
-	AHSLETeamListeSpieler *getThis();
-	AHSLETeamListeSpieler *release();
+    // Konstruktor
+    AHSLETeamListeSpieler( char *name, int punkte, char *status, int farbe, int br );
+    // Destruktor
+    ~AHSLETeamListeSpieler();
+    // nicht constant
+    void render( int yOff, Bild &zRObj );
 };
 
-class AHSLETeamListeTeam
+class AHSLETeamListeTeam : public virtual ReferenceCounter
 {
 private:
-	TextFeld *nameTF;
-	TextFeld *sAnzahlTF;
-	TextFeld *statusTF;
-	LRahmen *ram;
-	RCArray< AHSLETeamListeSpieler > *members;
-	int ref;
+    TextFeld *nameTF;
+    TextFeld *sAnzahlTF;
+    TextFeld *statusTF;
+    LRahmen *ram;
+    RCArray< AHSLETeamListeSpieler > *members;
 
 public:
-	// Konstruktor
-	AHSLETeamListeTeam( Schrift *zSchrift, char *name, int sAnz, char *status, int farbe, int br );
-	// Destruktor
-	~AHSLETeamListeTeam();
-	// nicht constant
-	void addSpieler( AHSLETeamListeSpieler *s );
-	void render( int xOff, int yOff, Bild &zRObj );
-	// constant
-	int getHeight() const;
-	// Reference Counting
-	AHSLETeamListeTeam *getThis();
-	AHSLETeamListeTeam *release();
+    // Konstruktor
+    AHSLETeamListeTeam( char *name, int sAnz, char *status, int farbe, int br );
+    // Destruktor
+    ~AHSLETeamListeTeam();
+    // nicht constant
+    void addSpieler( AHSLETeamListeSpieler *s );
+    void render( int xOff, int yOff, Bild &zRObj );
+    // constant
+    int getHeight() const;
 };
 
-class AHSLETeamListe
+class AHSLETeamListe : public virtual ReferenceCounter
 {
 private:
-	RCArray< AHSLETeamListeTeam > *members;
-	int xPos;
-	int ref;
+    RCArray< AHSLETeamListeTeam > *members;
+    int xPos;
 
 public:
-	// Konstruktor
-	AHSLETeamListe( int xPos );
-	// Destruktor
-	~AHSLETeamListe();
-	// nicht constant
-	void addTeam( AHSLETeamListeTeam  *t );
-	void render( Bild &zRObj );
-	// constant
-	int getHeight() const;
-	int getBreite() const;
-	// Reference Counting
-	AHSLETeamListe *getThis();
-	AHSLETeamListe *release();
+    // Konstruktor
+    AHSLETeamListe( int xPos );
+    // Destruktor
+    ~AHSLETeamListe();
+    // nicht constant
+    void addTeam( AHSLETeamListeTeam *t );
+    void render( Bild &zRObj );
+    // constant
+    int getHeight() const;
+    int getBreite() const;
 };
 
-class AHSpielListeEintrag
+class AHSpielListeEintrag : public virtual ReferenceCounter
 {
 private:
-	TextFeld *spielTF;
-	TextFeld *karteTF;
-	TextFeld *datumTF;
-	TextFeld *statusTF;
-	Text *spiel;
-	Text *karte;
-	Text *datum;
-	Text *status;
-	Knopf *detailsK;
-	TextFeld *dauerTF;
-	TextFeld *spielStatusTF;
-	TextFeld *gewinnerTF;
-	TextFeld *sAnzahlTF;
-	Knopf *statistikK;
-	Knopf *videoK;
-	AHSLETeamListe *liste;
-	LRahmen *ram;
-	Bild *einklappen;
-	Bild *ausklappen;
-	int karteId;
-	int id;
-	double tickVal;
-	int aktion;
-	int maxHö;
-	int ref;
+    TextFeld *spielTF;
+    TextFeld *karteTF;
+    TextFeld *datumTF;
+    TextFeld *statusTF;
+    Text *spiel;
+    Text *karte;
+    Text *datum;
+    Text *status;
+    Knopf *detailsK;
+    TextFeld *dauerTF;
+    TextFeld *spielStatusTF;
+    TextFeld *gewinnerTF;
+    TextFeld *sAnzahlTF;
+    Knopf *statistikK;
+    Knopf *videoK;
+    AHSLETeamListe *liste;
+    LRahmen *ram;
+    Bild *einklappen;
+    Bild *ausklappen;
+    int karteId;
+    int id;
+    double tickVal;
+    int aktion;
+    int maxHö;
 
 public:
-	// Konstruktor
-	AHSpielListeEintrag( int id, int karteId, Schrift *zSchrift, char *spiel, char *karte, char *datum, char *status, 
-						 char *dauer, char *spielStatus, char *gewinner, int sAnzahl );
-	// Destruktor
-	~AHSpielListeEintrag();
-	// nicht constant
-	void addTeam( AHSLETeamListeTeam *t );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int yOff, Bild &zRObj );
-	int getAktion();
-	// constant
-	int getKarteId() const;
-	int getHeight() const;
-	int getId() const;
-	int getListeBreite() const;
-	Text *zSpiel() const;
-	Text *zKarte() const;
-	Text *zDatum() const;
-	Text *zStatus() const;
-	// Reference Counting
-	AHSpielListeEintrag *getThis();
-	AHSpielListeEintrag *release();
+    // Konstruktor
+    AHSpielListeEintrag( int id, int karteId, char *spiel, char *karte, char *datum, char *status,
+                         char *dauer, char *spielStatus, char *gewinner, int sAnzahl );
+    // Destruktor
+    ~AHSpielListeEintrag();
+    // nicht constant
+    void addTeam( AHSLETeamListeTeam *t );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int yOff, Bild &zRObj );
+    int getAktion();
+    // constant
+    int getKarteId() const;
+    int getHeight() const;
+    int getId() const;
+    int getListeBreite() const;
+    Text *zSpiel() const;
+    Text *zKarte() const;
+    Text *zDatum() const;
+    Text *zStatus() const;
 };
 
 class AHSpielListe : public Zeichnung
 {
 private:
-	LRahmen *ram;
-	VScrollBar *scroll;
-	RCArray< AHSpielListeEintrag > *members;
-	Text *sortSpalte;
-	bool sortAbsteigend;
+    LRahmen *ram;
+    VScrollBar *scroll;
+    RCArray< AHSpielListeEintrag > *members;
+    Text *sortSpalte;
+    bool sortAbsteigend;
 
-	// privat
-	int getReihenfolge( int *arr );
+    // privat
+    int getReihenfolge( int *arr );
 
 public:
-	// Konstruktor
-	AHSpielListe();
-	// Destruktor
-	~AHSpielListe();
-	// nicht constant
-	void setSortSpalte( char *sp );
-	void setSortRichtung( bool absteigend );
-	void reset();
-	void addSpiel( AHSpielListeEintrag *s );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	int getAktion( int *spielId, int *karteId ) const;
+    // Konstruktor
+    AHSpielListe();
+    // Destruktor
+    ~AHSpielListe();
+    // nicht constant
+    void setSortSpalte( char *sp );
+    void setSortRichtung( bool absteigend );
+    void reset();
+    void addSpiel( AHSpielListeEintrag *s );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    int getAktion( int *spielId, int *karteId ) const;
 };
 
 class AccountHistorie : public Thread
 {
 private:
-	Schrift *schrift;
-	Fenster *historieF;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	AHSpielListe *liste;
-	AHSpielStatistik *statistik;
-	AHSpielVideo *video;
-	int status;
-	int accId;
-	int animation;
-	unsigned char alpha;
-	unsigned char alpha2;
-	unsigned char alpha3;
-	double tickVal;
-	bool rend;
+    Fenster *historieF;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    AHSpielListe *liste;
+    AHSpielStatistik *statistik;
+    AHSpielVideo *video;
+    int status;
+    int accId;
+    int animation;
+    unsigned char alpha;
+    unsigned char alpha2;
+    unsigned char alpha3;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountHistorie( Schrift *zSchrift );
-	// Destruktor
-	~AccountHistorie();
-	// nicht constant
-	void reset();
-	void ladeStatistik( int accId );
-	virtual void thread();
-	void setSichtbar( bool sichtbar, bool nachRechts );
-	bool tick( double zeit );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-	int getStatus() const;
+    // Konstruktor
+    AccountHistorie();
+    // Destruktor
+    ~AccountHistorie();
+    // nicht constant
+    void reset();
+    void ladeStatistik( int accId );
+    virtual void thread();
+    void setSichtbar( bool sichtbar, bool nachRechts );
+    bool tick( double zeit );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
+    // constant
+    int getStatus() const;
 };
 
 #endif

+ 879 - 896
KSGClient/NachLogin/Account/SpielPartner/AccountSpielPartner.cpp

@@ -10,757 +10,740 @@
 
 // Inhalt der AccountSPListeEintrag Klasse aus AccountSpielPartner.h
 // Konstruktor
-AccountSPListeEintrag::AccountSPListeEintrag( AccountSPListeEintragDaten *daten, Schrift *zSchrift )
-	: daten( daten ),
-  ram( new LRahmen() ),
-  members( new RCArray< AccountSPListeEintrag >() ),
-  name( initTextFeld( 5, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Name" ) ),
-  anzahl( initTextFeld( 110, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
-  prozent( initFBalken( 220, 0, 400, 20, zSchrift, FBalken::Style::normal ) ),
-  details( initKnopf( 580, 0, 20, 20, 0, 0, "" ) ),
-  ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
-  einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
-  sortSpalte( new Text( "Name" ) ),
-  sortAbsteigend( 0 ),
-  tickVal( 0 ),
-  rend( 0 ),
-  ref( 1 )
+AccountSPListeEintrag::AccountSPListeEintrag( AccountSPListeEintragDaten *daten )
+    : ReferenceCounter(),
+    daten( daten ),
+    ram( new LRahmen() ),
+    members( new RCArray< AccountSPListeEintrag >() ),
+    name( initTextFeld( 5, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Name" ) ),
+    anzahl( initTextFeld( 110, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
+    prozent( initFBalken( 220, 0, 400, 20, FBalken::Style::normal ) ),
+    details( initKnopf( 580, 0, 20, 20, 0, "" ) ),
+    ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
+    einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
+    sortSpalte( new Text( "Name" ) ),
+    sortAbsteigend( 0 ),
+    tickVal( 0 ),
+    rend( 0 )
 {
-	details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	details->setHintergrundBildZ( ausklappen->getThis() );
-	initToolTip( details, "Details anzeigen.", zSchrift, hauptScreen );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setRamenBreite( 1 );
-	ram->setSize( 0, 20 );
-	if( daten->name )
-		name->setText( daten->name->getText() );
-	anzahl->zText()->append( daten->anzahl );
-    TextRenderer rd( zSchrift->getThis() );
+    details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    details->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+    initToolTip( details, "Details anzeigen." );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setRamenBreite( 1 );
+    ram->setSize( 0, 20 );
+    if( daten->name )
+        name->setText( daten->name->getText() );
+    anzahl->zText()->append( daten->anzahl );
+    TextRenderer rd( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     rd.setSchriftSize( 12 );
-	name->setSize( rd.getTextBreite( name->zText()->getText() ) + 5, name->getHeight() );
-	anzahl->setPosition( ( name->getX() + name->getBreite() + 10 ) < 100 ? 100 : ( name->getX() + name->getBreite() + 10 ), anzahl->getY() );
-	anzahl->setSize( rd.getTextBreite( anzahl->zText()->getText() ) + 5, anzahl->getHeight() );
-	prozent->setPosition( ( anzahl->getX() + anzahl->getBreite() + 10 ) < 200 ? 200 : ( anzahl->getX() + anzahl->getBreite() + 10 ), prozent->getY() );
-	prozent->setAktionAnzahl( 100 );
-	prozent->aktionPlus( daten->prozent );
+    name->setSize( rd.getTextBreite( name->zText()->getText() ) + 5, name->getHeight() );
+    anzahl->setPosition( ( name->getX() + name->getBreite() + 10 ) < 100 ? 100 : ( name->getX() + name->getBreite() + 10 ), anzahl->getY() );
+    anzahl->setSize( rd.getTextBreite( anzahl->zText()->getText() ) + 5, anzahl->getHeight() );
+    prozent->setPosition( ( anzahl->getX() + anzahl->getBreite() + 10 ) < 200 ? 200 : ( anzahl->getX() + anzahl->getBreite() + 10 ), prozent->getY() );
+    prozent->setAktionAnzahl( 100 );
+    prozent->aktionPlus( daten->prozent );
 }
 
 // Destruktor
 AccountSPListeEintrag::~AccountSPListeEintrag()
 {
-	ram->release();
-	members->release();
-	name->release();
-	anzahl->release();
-	prozent->release();
-	details->release();
-	ausklappen->release();
-	einklappen->release();
-	sortSpalte->release();
-	daten->name->release();
-	delete daten;
+    ram->release();
+    members->release();
+    name->release();
+    anzahl->release();
+    prozent->release();
+    details->release();
+    ausklappen->release();
+    einklappen->release();
+    sortSpalte->release();
+    daten->name->release();
+    delete daten;
 }
 
 // privat
 int AccountSPListeEintrag::getReihenfolge( int *arr )
 {
-	int anz = members->getEintragAnzahl();
-	if( !anz || !HATSTYLE( ASPLEDStyle::Ausklappbar ) )
-		return 0;
-	int ret = 0;
-	bool *fertig = new bool[ anz ];
-	ZeroMemory( fertig, anz );
-	for( int i = 0; i < anz; i++ )
-	{
-		int index = -1;
-		int minMax = 0;
-		Text minMaxT;
-		for( int j = 0; j < anz; j++ )
-		{
-			AccountSPListeEintrag *tmp = members->z( j );
-			if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
-			{
-				minMaxT = tmp->zDaten()->name->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
-			{
-				minMax = tmp->zDaten()->anzahl;
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
-			{
-				minMax = tmp->zDaten()->prozent;
-				index = j;
-			}
-		}
-		if( index < 0 )
-			break;
-		fertig[ index ] = 1;
-		arr[ ret ] = index;
-		ret++;
-	}
-	delete[] fertig;
-	return ret;
+    int anz = members->getEintragAnzahl();
+    if( !anz || !HATSTYLE( ASPLEDStyle::Ausklappbar ) )
+        return 0;
+    int ret = 0;
+    bool *fertig = new bool[ anz ];
+    ZeroMemory( fertig, anz );
+    for( int i = 0; i < anz; i++ )
+    {
+        int index = -1;
+        int minMax = 0;
+        Text minMaxT;
+        for( int j = 0; j < anz; j++ )
+        {
+            AccountSPListeEintrag *tmp = members->z( j );
+            if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
+                                                                     ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
+            {
+                minMaxT = tmp->zDaten()->name->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
+            {
+                minMax = tmp->zDaten()->anzahl;
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
+                                                                             ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
+            {
+                minMax = tmp->zDaten()->prozent;
+                index = j;
+            }
+        }
+        if( index < 0 )
+            break;
+        fertig[ index ] = 1;
+        arr[ ret ] = index;
+        ret++;
+    }
+    delete[] fertig;
+    return ret;
 }
 
 // nicht constant
 void AccountSPListeEintrag::addMember( AccountSPListeEintrag *e )
 {
-	members->add( e );
-	rend = 1;
+    members->add( e );
+    rend = 1;
 }
 
 void AccountSPListeEintrag::setSortSpalte( char *sp )
 {
-	sortSpalte->setText( sp );
-	if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
-	{
-		int anz = members->getEintragAnzahl();
-		for( int i = 0; i < anz; i++ )
-			members->z( i )->setSortSpalte( sp );
-	}
-	rend = 1;
+    sortSpalte->setText( sp );
+    if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
+    {
+        int anz = members->getEintragAnzahl();
+        for( int i = 0; i < anz; i++ )
+            members->z( i )->setSortSpalte( sp );
+    }
+    rend = 1;
 }
 
 void AccountSPListeEintrag::setSortRichtung( bool absteigend )
 {
-	sortAbsteigend = absteigend;
-	if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
-	{
-		int anz = members->getEintragAnzahl();
-		for( int i = 0; i < anz; i++ )
-			members->z( i )->setSortRichtung( absteigend );
-	}
-	rend = 1;
+    sortAbsteigend = absteigend;
+    if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
+    {
+        int anz = members->getEintragAnzahl();
+        for( int i = 0; i < anz; i++ )
+            members->z( i )->setSortRichtung( absteigend );
+    }
+    rend = 1;
 }
 
 bool AccountSPListeEintrag::tick( double tickVal )
 {
-	rend |= details->tick( tickVal );
-	int anz = members->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		rend |= members->z( i )->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	this->tickVal -= val;
-	if( val )
-	{
-		if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
-		{
-			if( ram->getHeight() - val < 20 )
-				ram->setSize( ram->getBreite(), 20 );
-			else
-				ram->setSize( ram->getBreite(), ram->getHeight() - val );
-			rend = 1;
-		}
-		if( details->zHintergrundBild() == einklappen )
-		{
-			int maxHö = 20;
-			for( int i = 0; i < anz; i++ )
-				maxHö += 5 + members->z( i )->getHeight();
-			if( maxHö > 20 )
-				maxHö += 5;
-			if( ram->getHeight() > maxHö )
-			{
-				if( ram->getHeight() - val < maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() - val );
-				rend = 1;
-			}
-			if( ram->getHeight() < maxHö )
-			{
-				if( ram->getHeight() + val > maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() + val );
-				rend = 1;
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= details->tick( tickVal );
+    int anz = members->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        rend |= members->z( i )->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    this->tickVal -= val;
+    if( val )
+    {
+        if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
+        {
+            if( ram->getHeight() - val < 20 )
+                ram->setSize( ram->getBreite(), 20 );
+            else
+                ram->setSize( ram->getBreite(), ram->getHeight() - val );
+            rend = 1;
+        }
+        if( details->zHintergrundBild() == einklappen )
+        {
+            int maxHö = 20;
+            for( int i = 0; i < anz; i++ )
+                maxHö += 5 + members->z( i )->getHeight();
+            if( maxHö > 20 )
+                maxHö += 5;
+            if( ram->getHeight() > maxHö )
+            {
+                if( ram->getHeight() - val < maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() - val );
+                rend = 1;
+            }
+            if( ram->getHeight() < maxHö )
+            {
+                if( ram->getHeight() + val > maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() + val );
+                rend = 1;
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSPListeEintrag::doPublicMausEreignis( MausEreignis &me )
 {
-	int mx = me.mx;
-	int my = me.my;
-	bool vera = 0;
-	if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
-	{
-		vera = 1;
-		me.verarbeitet = 1;
-	}
-	if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
-	{
-		bool ok = me.verarbeitet;
-		details->doPublicMausEreignis( me );
-		if( !ok && me.verarbeitet && me.id == ME_RLinks )
-		{
-			if( details->zHintergrundBild() == ausklappen )
-			{
-				details->setHintergrundBildZ( einklappen->getThis() );
-				// TODO: details->zToolTip()->setText( "Karten verbergen." );
-			}
-			else
-			{
-				details->setHintergrundBildZ( ausklappen->getThis() );
-				// TODO: details->zToolTip()->setText( "Karten anzeigen." );
-			}
-		}
-	}
-	if( ram->getHeight() > 20 )
-	{
-		int anz = members->getEintragAnzahl();
-		int *rf = new int[ anz ];
-		int rfAnz = getReihenfolge( rf );
-		me.my -= 25;
-		for( int i = 0; i < rfAnz; i++ )
-		{
-			members->z( rf[ i ] )->doPublicMausEreignis( me );
-			me.my -= members->z( rf[ i ] )->getHeight() + 5;
-		}
-		delete[] rf;
-	}
-	me.mx = mx;
-	me.my = my;
-	if( vera )
-		me.verarbeitet = 0;
+    int mx = me.mx;
+    int my = me.my;
+    bool vera = 0;
+    if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
+    {
+        vera = 1;
+        me.verarbeitet = 1;
+    }
+    if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
+    {
+        bool ok = me.verarbeitet;
+        details->doPublicMausEreignis( me );
+        if( !ok && me.verarbeitet && me.id == ME_RLinks )
+        {
+            if( details->zHintergrundBild() == ausklappen )
+            {
+                details->setHintergrundBildZ( dynamic_cast<Bild *>( einklappen->getThis() ) );
+                // TODO: details->zToolTip()->setText( "Karten verbergen." );
+            }
+            else
+            {
+                details->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+                // TODO: details->zToolTip()->setText( "Karten anzeigen." );
+            }
+        }
+    }
+    if( ram->getHeight() > 20 )
+    {
+        int anz = members->getEintragAnzahl();
+        int *rf = new int[ anz ];
+        int rfAnz = getReihenfolge( rf );
+        me.my -= 25;
+        for( int i = 0; i < rfAnz; i++ )
+        {
+            members->z( rf[ i ] )->doPublicMausEreignis( me );
+            me.my -= members->z( rf[ i ] )->getHeight() + 5;
+        }
+        delete[] rf;
+    }
+    me.mx = mx;
+    me.my = my;
+    if( vera )
+        me.verarbeitet = 0;
 }
 
 void AccountSPListeEintrag::render( int xOff, int yOff, int breite, Bild &zRObj )
 {
-	ram->setSize( breite, ram->getHeight() );
-	details->setPosition( ram->getBreite() - 20, details->getY() );
-	if( !zRObj.setDrawOptions( xOff, yOff, breite, ram->getHeight() ) )
-		return;
-	name->render( zRObj );
-	anzahl->render( zRObj );
-	prozent->render( zRObj );
-	if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
-		details->render( zRObj );
-	ram->render( zRObj );
-	if( ram->getHeight() > 20 )
-	{
-		zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
-		int anz = members->getEintragAnzahl();
-		int *rf = new int[ anz ];
-		int rfAnz = getReihenfolge( rf );
-		yOff = 0;
-		for( int i = 0; i < rfAnz; i++ )
-		{
-			members->z( rf[ i ] )->render( 5, yOff + 25, breite - 10, zRObj );
-			yOff += 5 + members->z( rf[ i ] )->getHeight();
-		}
-		delete[] rf;
-	}
-	zRObj.releaseDrawOptions();
+    ram->setSize( breite, ram->getHeight() );
+    details->setPosition( ram->getBreite() - 20, details->getY() );
+    if( !zRObj.setDrawOptions( xOff, yOff, breite, ram->getHeight() ) )
+        return;
+    name->render( zRObj );
+    anzahl->render( zRObj );
+    prozent->render( zRObj );
+    if( HATSTYLE( ASPLEDStyle::Ausklappbar ) )
+        details->render( zRObj );
+    ram->render( zRObj );
+    if( ram->getHeight() > 20 )
+    {
+        zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
+        int anz = members->getEintragAnzahl();
+        int *rf = new int[ anz ];
+        int rfAnz = getReihenfolge( rf );
+        yOff = 0;
+        for( int i = 0; i < rfAnz; i++ )
+        {
+            members->z( rf[ i ] )->render( 5, yOff + 25, breite - 10, zRObj );
+            yOff += 5 + members->z( rf[ i ] )->getHeight();
+        }
+        delete[] rf;
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int AccountSPListeEintrag::getHeight() const
 {
-	return ram->getHeight();
+    return ram->getHeight();
 }
 
 AccountSPListeEintragDaten *AccountSPListeEintrag::zDaten() const
 {
-	return daten;
-}
-
-// Reference Counting
-AccountSPListeEintrag *AccountSPListeEintrag::getThis()
-{
-	ref++;
-	return this;
-}
-
-AccountSPListeEintrag *AccountSPListeEintrag::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return daten;
 }
 
 
 // Inhalt der AccountSPListe Klasse aus AccountSpielPartner.h
 // Konstruktor
-AccountSPListe::AccountSPListe( Schrift *zSchrift )
-	: Zeichnung(),
-  schrift( zSchrift->getThis() ),
-  ram( new LRahmen() ),
-  scroll( new VScrollBar() ),
-  skp( new RCArray< AccountSPListeEintrag >() ),
-  spk( new RCArray< AccountSPListeEintrag >() ),
-  psk( new RCArray< AccountSPListeEintrag >() ),
-  gruppierung( new Text( "Spieler/Spiel/Karte" ) ),
-  sortSpalte( new Text( "Name" ) ),
-  sortAbsteigend( 0 ),
-  rend( 0 )
+AccountSPListe::AccountSPListe()
+    : Zeichnung(),
+    ram( new LRahmen() ),
+    scroll( new VScrollBar() ),
+    skp( new RCArray< AccountSPListeEintrag >() ),
+    spk( new RCArray< AccountSPListeEintrag >() ),
+    psk( new RCArray< AccountSPListeEintrag >() ),
+    gruppierung( new Text( "Spieler/Spiel/Karte" ) ),
+    sortSpalte( new Text( "Name" ) ),
+    sortAbsteigend( 0 ),
+    rend( 0 )
 {
-	pos = Punkt( 10, 40 );
-	ram->setSize( 760, 380 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setRamenBreite( 1 );
+    pos = Punkt( 10, 40 );
+    ram->setSize( 760, 380 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setRamenBreite( 1 );
 }
 
 // Destruktor
 AccountSPListe::~AccountSPListe()
 {
-	schrift->release();
-	ram->release();
-	scroll->release();
-	skp->release();
-	spk->release();
-	psk->release();
-	gruppierung->release();
-	sortSpalte->release();
+    ram->release();
+    scroll->release();
+    skp->release();
+    spk->release();
+    psk->release();
+    gruppierung->release();
+    sortSpalte->release();
 }
 
 // privat
 int AccountSPListe::getReihenfolge( int *arr )
 {
-	RCArray< AccountSPListeEintrag > *members = 0;
-	if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
-		members = skp;
-	if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
-		members = spk;
-	if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
-		members = psk;
+    RCArray< AccountSPListeEintrag > *members = 0;
+    if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
+        members = skp;
+    if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
+        members = spk;
+    if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
+        members = psk;
     if( !members )
         return 0;
-	int anz = members->getEintragAnzahl();
-	if( !anz )
-		return 0;
-	int ret = 0;
-	bool *fertig = new bool[ anz ];
-	ZeroMemory( fertig, anz );
-	for( int i = 0; i < anz; i++ )
-	{
-		int index = -1;
-		int minMax = 0;
-		Text minMaxT;
-		for( int j = 0; j < anz; j++ )
-		{
-			AccountSPListeEintrag *tmp = members->z( j );
-			if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
-			{
-				minMaxT = tmp->zDaten()->name->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
-			{
-				minMax = tmp->zDaten()->anzahl;
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
-			{
-				minMax = tmp->zDaten()->prozent;
-				index = j;
-			}
-		}
-		if( index < 0 )
-			break;
-		fertig[ index ] = 1;
-		arr[ ret ] = index;
-		ret++;
-	}
-	delete[] fertig;
-	return ret;
+    int anz = members->getEintragAnzahl();
+    if( !anz )
+        return 0;
+    int ret = 0;
+    bool *fertig = new bool[ anz ];
+    ZeroMemory( fertig, anz );
+    for( int i = 0; i < anz; i++ )
+    {
+        int index = -1;
+        int minMax = 0;
+        Text minMaxT;
+        for( int j = 0; j < anz; j++ )
+        {
+            AccountSPListeEintrag *tmp = members->z( j );
+            if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
+                                                                     ( sortAbsteigend && *tmp->zDaten()->name > minMaxT ) || ( !sortAbsteigend && *tmp->zDaten()->name < minMaxT ) ) )
+            {
+                minMaxT = tmp->zDaten()->name->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && tmp->zDaten()->anzahl > minMax ) || ( !sortAbsteigend && tmp->zDaten()->anzahl < minMax ) ) )
+            {
+                minMax = tmp->zDaten()->anzahl;
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Prozent" ) && !fertig[ j ] && ( index < 0 ||
+                                                                             ( sortAbsteigend && tmp->zDaten()->prozent > minMax ) || ( !sortAbsteigend && tmp->zDaten()->prozent < minMax ) ) )
+            {
+                minMax = tmp->zDaten()->prozent;
+                index = j;
+            }
+        }
+        if( index < 0 )
+            break;
+        fertig[ index ] = 1;
+        arr[ ret ] = index;
+        ret++;
+    }
+    delete[] fertig;
+    return ret;
 }
 
 // nicht constant
 void AccountSPListe::reset()
 {
-	lockZeichnung();
-	skp->leeren();
-	spk->leeren();
-	psk->leeren();
-	unlockZeichnung();
+    lockZeichnung();
+    skp->leeren();
+    spk->leeren();
+    psk->leeren();
+    unlockZeichnung();
 }
 
 void AccountSPListe::ladeDaten( int accId )
 {
-	Array< int > *spieler = new Array< int >();
-	Array< int > *karten = new Array< int >();
-	Array< int > *anzahl = new Array< int >();
-	if( infoClient->getSpielPartnerListe( accId, spieler, karten, anzahl ) )
-	{
-		int anz = spieler->getEintragAnzahl();
-		int spielerAnzahl = 0;
-		int spielArtAnzahl = 0;
-		int anzahlGesammt = 0;
-		Array< int > *spielerUnique = new Array< int >();
-		Array< int > *spielArt = new Array< int >();
-		for( int i = 0; i < anz; i++ )
-		{ // Spiel Art Ids ermitteln
-			anzahlGesammt += anzahl->get( i );
-			if( spieler->hat( i ) && spielerUnique->getWertIndex( spieler->get( i ) ) < 0 )
-			{
-				spielerUnique->set( spieler->get( i ), spielerAnzahl );
-				spielerAnzahl++;
-			}
-			if( !spielArt->hat( i ) )
-			{
-				spielArtAnzahl++;
-				int id = infoClient->getSpielId( karten->get( i ) );
-				for( int j = i; j < anz; j++ )
-				{
-					if( karten->get( j ) == karten->get( i ) )
-						spielArt->set( id, j );
-				}
-			}
-		}
-		spielerUnique->release();
-		// Spiel/Karte/Spieler Tabelle initialisieren
-		Array< int > *spielArtVera = new Array< int >();
-		for( int i = 0; i < spielArtAnzahl; i++ )
-		{ // Spiel Arten Einträge
-			int id = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
-				{
-					id = spielArt->get( j );
-					spielArtVera->add( id );
-					break;
-				}
-			}
-			if( !id )
-				break;
-			AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
-			tmp->id = id;
-			tmp->name = infoClient->getSpielName( tmp->id );
-			tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
-			tmp->anzahl = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spielArt->get( j ) == tmp->id )
-					tmp->anzahl += anzahl->get( j );
-			}
-			tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
-			AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
-			skp->add( spielE );
-			Array< int > *kartenVera = new Array< int >();
-			for( int j = 0; j < anz; j++ )
-			{ // Karten Einträge
-				int id = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( spielArt->get( k ) == tmp->id )
-					{
-						if( kartenVera->getWertIndex( karten->get( k ) ) < 0 )
-						{
-							id = karten->get( k );
-							kartenVera->add( id );
-							break;
-						}
-					}
-				}
-				if( !id )
-					break;
-				AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
-				tmpk->id = id;
-				tmpk->name = infoClient->getKarteName( tmpk->id );
-				tmpk->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Karte;
-				tmpk->anzahl = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( karten->get( k ) == tmpk->id )
-						tmpk->anzahl += anzahl->get( k );
-				}
-				tmpk->prozent = tmpk->anzahl * 100 / tmp->anzahl;
-				AccountSPListeEintrag *karteE = new AccountSPListeEintrag( tmpk, schrift );
-				spielE->addMember( karteE );
-				Array< int > *spielerVera = new Array< int >();
-				for( int k = 0; k < anz; k++ )
-				{ // Spieler Einträge
-					int id = 0;
-					int gAnz = 0;
-					for( int l = 0; l < anz; l++ )
-					{
-						if( karten->get( l ) == tmpk->id )
-						{
-							if( spielerVera->getWertIndex( spieler->get( l ) ) < 0 )
-							{
-								id = spieler->get( l );
-								spielerVera->add( id );
-								gAnz = anzahl->get( l );
-								break;
-							}
-						}
-					}
-					if( !id )
-						break;
-					AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
-					tmps->id = id;
-					tmps->name = infoClient->getSpielerName( tmps->id );
-					tmps->style = ASPLEDStyle::Spieler;
-					tmps->anzahl = gAnz;
-					tmps->prozent = tmps->anzahl * 100 / tmpk->anzahl;
-					karteE->addMember( new AccountSPListeEintrag( tmps, schrift ) );
-				}
-				spielerVera->release();
-			}
-			kartenVera->release();
-		}
-		spielArtVera->leeren();
-		// Spiel/Spieler/Karte Tabelle initialisieren
-		for( int i = 0; i < spielArtAnzahl; i++ )
-		{ // Spiel Arten Einträge
-			int id = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
-				{
-					id = spielArt->get( j );
-					spielArtVera->add( id );
-					break;
-				}
-			}
-			if( !id )
-				break;
-			AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
-			tmp->id = id;
-			tmp->name = infoClient->getSpielName( tmp->id );
-			tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
-			tmp->anzahl = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spielArt->get( j ) == tmp->id )
-					tmp->anzahl += anzahl->get( j );
-			}
-			tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
-			AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp, schrift );
-			spk->add( spielE );
-			Array< int > *spielerVera = new Array< int >();
-			for( int j = 0; j < anz; j++ )
-			{ // Spieler Einträge
-				int id = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( spielArt->get( k ) == tmp->id )
-					{
-						if( spielerVera->getWertIndex( spieler->get( k ) ) < 0 )
-						{
-							id = spieler->get( k );
-							spielerVera->add( id );
-							break;
-						}
-					}
-				}
-				if( !id )
-					break;
-				AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
-				tmps->id = id;
-				tmps->name = infoClient->getSpielerName( tmps->id );
-				tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Spieler;
-				tmps->anzahl = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( spieler->get( k ) == tmps->id && spielArt->get( k ) == tmp->id )
-						tmps->anzahl += anzahl->get( k );
-				}
-				tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
-				AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmps, schrift );
-				spielE->addMember( spielerE );
-				Array< int > *karteVera = new Array< int >();
-				for( int k = 0; k < anz; k++ )
-				{ // Karten Einträge
-					int id = 0;
-					int gAnz = 0;
-					for( int l = 0; l < anz; l++ )
-					{
-						if( spieler->get( l ) == tmps->id && spielArt->get( l ) == tmp->id )
-						{
-							if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
-							{
-								id = karten->get( l );
-								karteVera->add( id );
-								gAnz = anzahl->get( l );
-								break;
-							}
-						}
-					}
-					if( !id )
-						break;
-					AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
-					tmpk->id = id;
-					tmpk->name = infoClient->getKarteName( tmpk->id );
-					tmpk->style = ASPLEDStyle::Karte;
-					tmpk->anzahl = gAnz;
-					tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
-					spielerE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
-				}
-				karteVera->release();
-			}
-			spielerVera->release();
-		}
-		spielArtVera->release();
-		// Spieler/Spiel/Karte Tabelle initialisieren
-		Array< int > *spielerVera = new Array< int >();
-		for( int i = 0; i < spielerAnzahl; i++ )
-		{ // Spieler Einträge
-			int id = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spielerVera->getWertIndex( spieler->get( j ) ) < 0 )
-				{
-					id = spieler->get( j );
-					spielerVera->add( id );
-					break;
-				}
-			}
-			if( !id )
-				break;
-			AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
-			tmp->id = id;
-			tmp->name = infoClient->getSpielerName( tmp->id );
-			tmp->style = ASPLEDStyle::Spieler | ASPLEDStyle::Ausklappbar;
-			tmp->anzahl = 0;
-			for( int j = 0; j < anz; j++ )
-			{
-				if( spieler->get( j ) == tmp->id )
-					tmp->anzahl += anzahl->get( j );
-			}
-			tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
-			AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmp, schrift );
-			psk->add( spielerE );
-			Array< int > *spielVera = new Array< int >();
-			for( int j = 0; j < anz; j++ )
-			{ // Spiel Einträge
-				int id = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( spieler->get( k ) == tmp->id )
-					{
-						if( spielVera->getWertIndex( spielArt->get( k ) ) < 0 )
-						{
-							id = spielArt->get( k );
-							spielVera->add( id );
-							break;
-						}
-					}
-				}
-				if( !id )
-					break;
-				AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
-				tmps->id = id;
-				tmps->name = infoClient->getSpielName( tmps->id );
-				tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::SpielArt;
-				tmps->anzahl = 0;
-				for( int k = 0; k < anz; k++ )
-				{
-					if( spieler->get( k ) == tmp->id && spielArt->get( k ) == tmps->id )
-						tmps->anzahl += anzahl->get( k );
-				}
-				tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
-				AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmps, schrift );
-				spielerE->addMember( spielE );
-				Array< int > *karteVera = new Array< int >();
-				for( int k = 0; k < anz; k++ )
-				{ // Karte Einträge
-					int id = 0;
-					int gAnz = 0;
-					for( int l = 0; l < anz; l++ )
-					{
-						if( spieler->get( l ) == tmp->id && spielArt->get( l ) == tmps->id )
-						{
-							if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
-							{
-								id = karten->get( l );
-								karteVera->add( id );
-								gAnz = anzahl->get( l );
-								break;
-							}
-						}
-					}
-					if( !id )
-						break;
-					AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
-					tmpk->id = id;
-					tmpk->name = infoClient->getKarteName( tmpk->id );
-					tmpk->style = ASPLEDStyle::Karte;
-					tmpk->anzahl = gAnz;
-					tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
-					spielE->addMember( new AccountSPListeEintrag( tmpk, schrift ) );
-				}
-				karteVera->release();
-			}
-			spielVera->release();
-		}
-		spielerVera->release();
-		spielArt->release();
-	}
-	else
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spielpartner dieses Spielers konnten nicht ermittelt werden." ), new Text( "Ok" ) );
-	spieler->release();
-	karten->release();
-	anzahl->release();
+    Array< int > *spieler = new Array< int >();
+    Array< int > *karten = new Array< int >();
+    Array< int > *anzahl = new Array< int >();
+    if( infoClient->getSpielPartnerListe( accId, spieler, karten, anzahl ) )
+    {
+        int anz = spieler->getEintragAnzahl();
+        int spielerAnzahl = 0;
+        int spielArtAnzahl = 0;
+        int anzahlGesammt = 0;
+        Array< int > *spielerUnique = new Array< int >();
+        Array< int > *spielArt = new Array< int >();
+        for( int i = 0; i < anz; i++ )
+        { // Spiel Art Ids ermitteln
+            anzahlGesammt += anzahl->get( i );
+            if( spieler->hat( i ) && spielerUnique->getWertIndex( spieler->get( i ) ) < 0 )
+            {
+                spielerUnique->set( spieler->get( i ), spielerAnzahl );
+                spielerAnzahl++;
+            }
+            if( !spielArt->hat( i ) )
+            {
+                spielArtAnzahl++;
+                int id = infoClient->getSpielId( karten->get( i ) );
+                for( int j = i; j < anz; j++ )
+                {
+                    if( karten->get( j ) == karten->get( i ) )
+                        spielArt->set( id, j );
+                }
+            }
+        }
+        spielerUnique->release();
+        // Spiel/Karte/Spieler Tabelle initialisieren
+        Array< int > *spielArtVera = new Array< int >();
+        for( int i = 0; i < spielArtAnzahl; i++ )
+        { // Spiel Arten Einträge
+            int id = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
+                {
+                    id = spielArt->get( j );
+                    spielArtVera->add( id );
+                    break;
+                }
+            }
+            if( !id )
+                break;
+            AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
+            tmp->id = id;
+            tmp->name = infoClient->getSpielName( tmp->id );
+            tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
+            tmp->anzahl = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spielArt->get( j ) == tmp->id )
+                    tmp->anzahl += anzahl->get( j );
+            }
+            tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
+            AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp );
+            skp->add( spielE );
+            Array< int > *kartenVera = new Array< int >();
+            for( int j = 0; j < anz; j++ )
+            { // Karten Einträge
+                int id = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( spielArt->get( k ) == tmp->id )
+                    {
+                        if( kartenVera->getWertIndex( karten->get( k ) ) < 0 )
+                        {
+                            id = karten->get( k );
+                            kartenVera->add( id );
+                            break;
+                        }
+                    }
+                }
+                if( !id )
+                    break;
+                AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
+                tmpk->id = id;
+                tmpk->name = infoClient->getKarteName( tmpk->id );
+                tmpk->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Karte;
+                tmpk->anzahl = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( karten->get( k ) == tmpk->id )
+                        tmpk->anzahl += anzahl->get( k );
+                }
+                tmpk->prozent = tmpk->anzahl * 100 / tmp->anzahl;
+                AccountSPListeEintrag *karteE = new AccountSPListeEintrag( tmpk );
+                spielE->addMember( karteE );
+                Array< int > *spielerVera = new Array< int >();
+                for( int k = 0; k < anz; k++ )
+                { // Spieler Einträge
+                    int id = 0;
+                    int gAnz = 0;
+                    for( int l = 0; l < anz; l++ )
+                    {
+                        if( karten->get( l ) == tmpk->id )
+                        {
+                            if( spielerVera->getWertIndex( spieler->get( l ) ) < 0 )
+                            {
+                                id = spieler->get( l );
+                                spielerVera->add( id );
+                                gAnz = anzahl->get( l );
+                                break;
+                            }
+                        }
+                    }
+                    if( !id )
+                        break;
+                    AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
+                    tmps->id = id;
+                    tmps->name = infoClient->getSpielerName( tmps->id );
+                    tmps->style = ASPLEDStyle::Spieler;
+                    tmps->anzahl = gAnz;
+                    tmps->prozent = tmps->anzahl * 100 / tmpk->anzahl;
+                    karteE->addMember( new AccountSPListeEintrag( tmps ) );
+                }
+                spielerVera->release();
+            }
+            kartenVera->release();
+        }
+        spielArtVera->leeren();
+        // Spiel/Spieler/Karte Tabelle initialisieren
+        for( int i = 0; i < spielArtAnzahl; i++ )
+        { // Spiel Arten Einträge
+            int id = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spielArtVera->getWertIndex( spielArt->get( j ) ) < 0 )
+                {
+                    id = spielArt->get( j );
+                    spielArtVera->add( id );
+                    break;
+                }
+            }
+            if( !id )
+                break;
+            AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
+            tmp->id = id;
+            tmp->name = infoClient->getSpielName( tmp->id );
+            tmp->style = ASPLEDStyle::SpielArt | ASPLEDStyle::Ausklappbar;
+            tmp->anzahl = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spielArt->get( j ) == tmp->id )
+                    tmp->anzahl += anzahl->get( j );
+            }
+            tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
+            AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmp );
+            spk->add( spielE );
+            Array< int > *spielerVera = new Array< int >();
+            for( int j = 0; j < anz; j++ )
+            { // Spieler Einträge
+                int id = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( spielArt->get( k ) == tmp->id )
+                    {
+                        if( spielerVera->getWertIndex( spieler->get( k ) ) < 0 )
+                        {
+                            id = spieler->get( k );
+                            spielerVera->add( id );
+                            break;
+                        }
+                    }
+                }
+                if( !id )
+                    break;
+                AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
+                tmps->id = id;
+                tmps->name = infoClient->getSpielerName( tmps->id );
+                tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::Spieler;
+                tmps->anzahl = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( spieler->get( k ) == tmps->id && spielArt->get( k ) == tmp->id )
+                        tmps->anzahl += anzahl->get( k );
+                }
+                tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
+                AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmps );
+                spielE->addMember( spielerE );
+                Array< int > *karteVera = new Array< int >();
+                for( int k = 0; k < anz; k++ )
+                { // Karten Einträge
+                    int id = 0;
+                    int gAnz = 0;
+                    for( int l = 0; l < anz; l++ )
+                    {
+                        if( spieler->get( l ) == tmps->id && spielArt->get( l ) == tmp->id )
+                        {
+                            if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
+                            {
+                                id = karten->get( l );
+                                karteVera->add( id );
+                                gAnz = anzahl->get( l );
+                                break;
+                            }
+                        }
+                    }
+                    if( !id )
+                        break;
+                    AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
+                    tmpk->id = id;
+                    tmpk->name = infoClient->getKarteName( tmpk->id );
+                    tmpk->style = ASPLEDStyle::Karte;
+                    tmpk->anzahl = gAnz;
+                    tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
+                    spielerE->addMember( new AccountSPListeEintrag( tmpk ) );
+                }
+                karteVera->release();
+            }
+            spielerVera->release();
+        }
+        spielArtVera->release();
+        // Spieler/Spiel/Karte Tabelle initialisieren
+        Array< int > *spielerVera = new Array< int >();
+        for( int i = 0; i < spielerAnzahl; i++ )
+        { // Spieler Einträge
+            int id = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spielerVera->getWertIndex( spieler->get( j ) ) < 0 )
+                {
+                    id = spieler->get( j );
+                    spielerVera->add( id );
+                    break;
+                }
+            }
+            if( !id )
+                break;
+            AccountSPListeEintragDaten *tmp = new AccountSPListeEintragDaten();
+            tmp->id = id;
+            tmp->name = infoClient->getSpielerName( tmp->id );
+            tmp->style = ASPLEDStyle::Spieler | ASPLEDStyle::Ausklappbar;
+            tmp->anzahl = 0;
+            for( int j = 0; j < anz; j++ )
+            {
+                if( spieler->get( j ) == tmp->id )
+                    tmp->anzahl += anzahl->get( j );
+            }
+            tmp->prozent = tmp->anzahl * 100 / anzahlGesammt;
+            AccountSPListeEintrag *spielerE = new AccountSPListeEintrag( tmp );
+            psk->add( spielerE );
+            Array< int > *spielVera = new Array< int >();
+            for( int j = 0; j < anz; j++ )
+            { // Spiel Einträge
+                int id = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( spieler->get( k ) == tmp->id )
+                    {
+                        if( spielVera->getWertIndex( spielArt->get( k ) ) < 0 )
+                        {
+                            id = spielArt->get( k );
+                            spielVera->add( id );
+                            break;
+                        }
+                    }
+                }
+                if( !id )
+                    break;
+                AccountSPListeEintragDaten *tmps = new AccountSPListeEintragDaten();
+                tmps->id = id;
+                tmps->name = infoClient->getSpielName( tmps->id );
+                tmps->style = ASPLEDStyle::Ausklappbar | ASPLEDStyle::SpielArt;
+                tmps->anzahl = 0;
+                for( int k = 0; k < anz; k++ )
+                {
+                    if( spieler->get( k ) == tmp->id && spielArt->get( k ) == tmps->id )
+                        tmps->anzahl += anzahl->get( k );
+                }
+                tmps->prozent = tmps->anzahl * 100 / tmp->anzahl;
+                AccountSPListeEintrag *spielE = new AccountSPListeEintrag( tmps );
+                spielerE->addMember( spielE );
+                Array< int > *karteVera = new Array< int >();
+                for( int k = 0; k < anz; k++ )
+                { // Karte Einträge
+                    int id = 0;
+                    int gAnz = 0;
+                    for( int l = 0; l < anz; l++ )
+                    {
+                        if( spieler->get( l ) == tmp->id && spielArt->get( l ) == tmps->id )
+                        {
+                            if( karteVera->getWertIndex( karten->get( l ) ) < 0 )
+                            {
+                                id = karten->get( l );
+                                karteVera->add( id );
+                                gAnz = anzahl->get( l );
+                                break;
+                            }
+                        }
+                    }
+                    if( !id )
+                        break;
+                    AccountSPListeEintragDaten *tmpk = new AccountSPListeEintragDaten();
+                    tmpk->id = id;
+                    tmpk->name = infoClient->getKarteName( tmpk->id );
+                    tmpk->style = ASPLEDStyle::Karte;
+                    tmpk->anzahl = gAnz;
+                    tmpk->prozent = tmpk->anzahl * 100 / tmps->anzahl;
+                    spielE->addMember( new AccountSPListeEintrag( tmpk ) );
+                }
+                karteVera->release();
+            }
+            spielVera->release();
+        }
+        spielerVera->release();
+        spielArt->release();
+    }
+    else
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spielpartner dieses Spielers konnten nicht ermittelt werden." ), new Text( "Ok" ) );
+    spieler->release();
+    karten->release();
+    anzahl->release();
 }
 
 void AccountSPListe::setGruppierung( char *gp )
 {
-	lockZeichnung();
-	gruppierung->setText( gp );
-	rend = 1;
-	unlockZeichnung();
+    lockZeichnung();
+    gruppierung->setText( gp );
+    rend = 1;
+    unlockZeichnung();
 }
 
 void AccountSPListe::setSortSpalte( char *sp )
 {
-	lockZeichnung();
-	sortSpalte->setText( sp );
-	int anz = skp->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		skp->z( i )->setSortSpalte( sp );
-	anz = spk->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		spk->z( i )->setSortSpalte( sp );
-	anz = psk->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		psk->z( i )->setSortSpalte( sp );
-	rend = 1;
-	unlockZeichnung();
+    lockZeichnung();
+    sortSpalte->setText( sp );
+    int anz = skp->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        skp->z( i )->setSortSpalte( sp );
+    anz = spk->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        spk->z( i )->setSortSpalte( sp );
+    anz = psk->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        psk->z( i )->setSortSpalte( sp );
+    rend = 1;
+    unlockZeichnung();
 }
 
 void AccountSPListe::setSortRichtung( bool absteigend )
 {
-	lockZeichnung();
-	sortAbsteigend = absteigend;
-	int anz = skp->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		skp->z( i )->setSortRichtung( absteigend );
-	anz = spk->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		spk->z( i )->setSortRichtung( absteigend );
-	anz = psk->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		psk->z( i )->setSortRichtung( absteigend );
-	rend = 1;
-	unlockZeichnung();
+    lockZeichnung();
+    sortAbsteigend = absteigend;
+    int anz = skp->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        skp->z( i )->setSortRichtung( absteigend );
+    anz = spk->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        spk->z( i )->setSortRichtung( absteigend );
+    anz = psk->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        psk->z( i )->setSortRichtung( absteigend );
+    rend = 1;
+    unlockZeichnung();
 }
 
 bool AccountSPListe::tick( double tickVal )
 {
-	lockZeichnung();
-	RCArray< AccountSPListeEintrag > *members = 0;
-	if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
-		members = skp;
-	if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
-		members = spk;
-	if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
-		members = psk;
+    lockZeichnung();
+    RCArray< AccountSPListeEintrag > *members = 0;
+    if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
+        members = skp;
+    if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
+        members = spk;
+    if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
+        members = psk;
     if( members )
     {
         int anz = members->getEintragAnzahl();
@@ -770,35 +753,35 @@ bool AccountSPListe::tick( double tickVal )
             rend |= members->z( rf[ i ] )->tick( tickVal );
         delete[] rf;
     }
-	unlockZeichnung();
-	rend |= scroll->getRend();
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    unlockZeichnung();
+    rend |= scroll->getRend();
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSPListe::doPublicMausEreignis( MausEreignis &me )
 {
-	bool vera = 0;
-	if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
-	{
-		vera = 1;
-		me.verarbeitet = 1;
-	}
-	int mx = me.mx, my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
-	me.mx -= 10;
-	me.my -= 10 - scroll->getScroll();
-	lockZeichnung();
-	RCArray< AccountSPListeEintrag > *members = 0;
-	if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
-		members = skp;
-	if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
-		members = spk;
-	if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
-		members = psk;
+    bool vera = 0;
+    if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
+    {
+        vera = 1;
+        me.verarbeitet = 1;
+    }
+    int mx = me.mx, my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
+    me.mx -= 10;
+    me.my -= 10 - scroll->getScroll();
+    lockZeichnung();
+    RCArray< AccountSPListeEintrag > *members = 0;
+    if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
+        members = skp;
+    if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
+        members = spk;
+    if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
+        members = psk;
     if( members )
     {
         int anz = members->getEintragAnzahl();
@@ -811,32 +794,32 @@ void AccountSPListe::doPublicMausEreignis( MausEreignis &me )
         }
         delete[] rf;
     }
-	unlockZeichnung();
-	me.mx = mx, me.my = my;
-	if( vera )
-		me.verarbeitet = 0;
+    unlockZeichnung();
+    me.mx = mx, me.my = my;
+    if( vera )
+        me.verarbeitet = 0;
 }
 
 void AccountSPListe::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
-		return;
-	ram->render( zRObj );
-	scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
-	if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
-	{
-		zRObj.releaseDrawOptions();
-		return;
-	}
-	int anzHö = 10;
-	lockZeichnung();
-	RCArray< AccountSPListeEintrag > *members = 0;
-	if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
-		members = skp;
-	if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
-		members = spk;
-	if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
-		members = psk;
+    if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
+        return;
+    ram->render( zRObj );
+    scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
+    if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
+    {
+        zRObj.releaseDrawOptions();
+        return;
+    }
+    int anzHö = 10;
+    lockZeichnung();
+    RCArray< AccountSPListeEintrag > *members = 0;
+    if( gruppierung->istGleich( "Spiel/Karte/Spieler" ) )
+        members = skp;
+    if( gruppierung->istGleich( "Spiel/Spieler/Karte" ) )
+        members = spk;
+    if( gruppierung->istGleich( "Spieler/Spiel/Karte" ) )
+        members = psk;
     if( members )
     {
         int anz = members->getEintragAnzahl();
@@ -849,236 +832,236 @@ void AccountSPListe::render( Bild &zRObj )
         }
         delete[] rf;
     }
-	unlockZeichnung();
-	scroll->update( anzHö, ram->getHeight() - 2 );
-	zRObj.releaseDrawOptions();
-	zRObj.releaseDrawOptions();
+    unlockZeichnung();
+    scroll->update( anzHö, ram->getHeight() - 2 );
+    zRObj.releaseDrawOptions();
+    zRObj.releaseDrawOptions();
 }
 
 
 // Inhalt der AccountSpielPartner Klasse aus AccountSpielPartner.h
 // Konstruktor
-AccountSpielPartner::AccountSpielPartner( Schrift *zSchrift )
-	: Thread(),
-  spielPartnerF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spielpartner von " ) ),
-  gruppAusw( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Spieler/Spiel/Karte", "Spiel/Karte/Spieler", "Spiel/Spieler/Karte" } ) ),
-  sortSpalte( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Prozent" } ) ),
-  sortRichtung( initAuswahlBox( 330, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-  liste( new AccountSPListe( zSchrift ) ),
-  status( 0 ),
-  accId( 0 ),
-  animation( 0 ),
-  alpha( 255 ),
-  tickVal( 0 ),
-  rend( 0 )
+AccountSpielPartner::AccountSpielPartner()
+    : Thread(),
+    spielPartnerF( initFenster( 810, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spielpartner von " ) ),
+    gruppAusw( initAuswahlBox( 10, 10, 150, 20, ABSTYLE, { "Spieler/Spiel/Karte", "Spiel/Karte/Spieler", "Spiel/Spieler/Karte" } ) ),
+    sortSpalte( initAuswahlBox( 170, 10, 150, 20, ABSTYLE, { "Name", "Spiele", "Prozent" } ) ),
+    sortRichtung( initAuswahlBox( 330, 10, 150, 20, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    liste( new AccountSPListe() ),
+    status( 0 ),
+    accId( 0 ),
+    animation( 0 ),
+    alpha( 255 ),
+    tickVal( 0 ),
+    rend( 0 )
 {
-	initToolTip( gruppAusw, "Wähle Gruppierung aus, nach der die Daten angezeigt werden sollen.", zSchrift, hauptScreen );
-	initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift, hauptScreen );
-	initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll.", zSchrift, hauptScreen );
-	spielPartnerF->addMember( liste->getThis() );
-	spielPartnerF->addMember( gruppAusw->getThis() );
-	spielPartnerF->addMember( sortSpalte->getThis() );
-	spielPartnerF->addMember( sortRichtung->getThis() );
-	spielPartnerF->setMausEreignis( _ret1ME );
+    initToolTip( gruppAusw, "Wähle Gruppierung aus, nach der die Daten angezeigt werden sollen." );
+    initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll." );
+    initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll." );
+    spielPartnerF->addMember( dynamic_cast<Zeichnung *>( liste->getThis() ) );
+    spielPartnerF->addMember( dynamic_cast<Zeichnung *>( gruppAusw->getThis() ) );
+    spielPartnerF->addMember( dynamic_cast<Zeichnung *>( sortSpalte->getThis() ) );
+    spielPartnerF->addMember( dynamic_cast<Zeichnung *>( sortRichtung->getThis() ) );
+    spielPartnerF->setMausEreignis( _ret1ME );
 }
 
 // Destruktor
 AccountSpielPartner::~AccountSpielPartner()
 {
-	spielPartnerF->release();
-	gruppAusw->release();
-	sortSpalte->release();
-	sortRichtung->release();
-	liste->release();
+    spielPartnerF->release();
+    gruppAusw->release();
+    sortSpalte->release();
+    sortRichtung->release();
+    liste->release();
 }
 
 // nicht constant
 void AccountSpielPartner::reset()
 {
-	liste->reset();
+    liste->reset();
 }
 
 void AccountSpielPartner::ladeStatistik( int accId )
 {
-	if( this->accId == accId )
-		return;
-	this->status = 0;
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
-	if( ( animation | 0x1 ) == animation )
-	{
-		animation |= 0x4;
-		this->accId = accId;
-		this->status = 1;
-		return;
-	}
-	if( this->accId )
-		reset();
-	this->accId = accId;
-	start();
-	this->status = 1;
+    if( this->accId == accId )
+        return;
+    this->status = 0;
+    if( run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    if( ( animation | 0x1 ) == animation )
+    {
+        animation |= 0x4;
+        this->accId = accId;
+        this->status = 1;
+        return;
+    }
+    if( this->accId )
+        reset();
+    this->accId = accId;
+    start();
+    this->status = 1;
 }
 
 void AccountSpielPartner::thread()
 {
-	Text *name = infoClient->getSpielerName( accId );
-	if( name )
-	{
-		name->insert( 0, "Spielpartner von " );
-		spielPartnerF->setTitel( *name );
-		name->release();
-	}
-	liste->ladeDaten( accId );
-	animation &= ~0x4;
-	status = 2;
-	run = 0;
+    Text *name = infoClient->getSpielerName( accId );
+    if( name )
+    {
+        name->insert( 0, "Spielpartner von " );
+        spielPartnerF->setTitel( *name );
+        name->release();
+    }
+    liste->ladeDaten( accId );
+    animation &= ~0x4;
+    status = 2;
+    run = 0;
 }
 
 void AccountSpielPartner::setSichtbar( bool sichtbar, bool nachRechts )
 {
-	if( sichtbar )
-	{
-		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
-		{
-			if( nachRechts )
-				spielPartnerF->setPosition( -810, 40 );
-			else
-				spielPartnerF->setPosition( 810, 40 );
-		}
-		animation |= 0x1;
-	}
-	else
-		animation &= ~0x1;
-	if( nachRechts )
-		animation |= 0x2;
-	else
-		animation &= ~0x2;
+    if( sichtbar )
+    {
+        if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
+        {
+            if( nachRechts )
+                spielPartnerF->setPosition( -810, 40 );
+            else
+                spielPartnerF->setPosition( 810, 40 );
+        }
+        animation |= 0x1;
+    }
+    else
+        animation &= ~0x1;
+    if( nachRechts )
+        animation |= 0x2;
+    else
+        animation &= ~0x2;
 }
 
 bool AccountSpielPartner::tick( double zeit )
 {
-	rend |= spielPartnerF->tick( zeit );
-	tickVal += zeit;
-	int valA = (int)( tickVal * 150 );
-	int valB = (int)( tickVal * 500 );
-	tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( ( animation | 0x4 ) == animation && alpha )
-		{
-			if( alpha - valA <= 0 )
-				alpha = 0;
-			else
-				alpha -= valA;
-			rend = 1;
-			if( !alpha )
-			{
-				reset();
-				start();
-			}
-		}
-		if( ( animation | 0x4 ) != animation && alpha != 255 )
-		{
-			if( alpha + valA >= 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( ( animation | 0x1 ) == animation )
-		{ // Sichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( spielPartnerF->getX() != 10 )
-				{
-					if( spielPartnerF->getX() + valB > 10 )
-						spielPartnerF->setPosition( 10, spielPartnerF->getY() );
-					else
-						spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( spielPartnerF->getX() != 10 )
-				{
-					if( spielPartnerF->getX() - valB < 10 )
-						spielPartnerF->setPosition( 10, spielPartnerF->getY() );
-					else
-						spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
-					rend = 1;
-				}
-			}
-		}
-		else
-		{ // Unsichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( spielPartnerF->getX() != 810 )
-				{
-					if( spielPartnerF->getX() + valB > 810 )
-						spielPartnerF->setPosition( 810, spielPartnerF->getY() );
-					else
-						spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( spielPartnerF->getX() != -810 )
-				{
-					if( spielPartnerF->getX() - valB < -810 )
-						spielPartnerF->setPosition( -810, spielPartnerF->getY() );
-					else
-						spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
-					rend = 1;
-				}
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= spielPartnerF->tick( zeit );
+    tickVal += zeit;
+    int valA = (int)( tickVal * 150 );
+    int valB = (int)( tickVal * 500 );
+    tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( ( animation | 0x4 ) == animation && alpha )
+        {
+            if( alpha - valA <= 0 )
+                alpha = 0;
+            else
+                alpha -= valA;
+            rend = 1;
+            if( !alpha )
+            {
+                reset();
+                start();
+            }
+        }
+        if( ( animation | 0x4 ) != animation && alpha != 255 )
+        {
+            if( alpha + valA >= 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( ( animation | 0x1 ) == animation )
+        { // Sichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( spielPartnerF->getX() != 10 )
+                {
+                    if( spielPartnerF->getX() + valB > 10 )
+                        spielPartnerF->setPosition( 10, spielPartnerF->getY() );
+                    else
+                        spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( spielPartnerF->getX() != 10 )
+                {
+                    if( spielPartnerF->getX() - valB < 10 )
+                        spielPartnerF->setPosition( 10, spielPartnerF->getY() );
+                    else
+                        spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+        else
+        { // Unsichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( spielPartnerF->getX() != 810 )
+                {
+                    if( spielPartnerF->getX() + valB > 810 )
+                        spielPartnerF->setPosition( 810, spielPartnerF->getY() );
+                    else
+                        spielPartnerF->setPosition( spielPartnerF->getX() + valB, spielPartnerF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( spielPartnerF->getX() != -810 )
+                {
+                    if( spielPartnerF->getX() - valB < -810 )
+                        spielPartnerF->setPosition( -810, spielPartnerF->getY() );
+                    else
+                        spielPartnerF->setPosition( spielPartnerF->getX() - valB, spielPartnerF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSpielPartner::doPublicMausEreignis( MausEreignis &me )
 {
-	int gruppAuswS = gruppAusw->getAuswahl();
-	int sortSpalteS = sortSpalte->getAuswahl();
-	int sortRichtungS = sortRichtung->getAuswahl();
-	spielPartnerF->doPublicMausEreignis( me );
-	if( gruppAusw->getAuswahl() != gruppAuswS )
-	{
-		liste->setGruppierung( gruppAusw->zEintrag( gruppAusw->getAuswahl() )->zText()->getText() );
-		gruppAusw->einklappen();
-	}
-	if( sortSpalte->getAuswahl() != sortSpalteS )
-	{
-		liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
-		sortSpalte->einklappen();
-	}
-	if( sortRichtung->getAuswahl() != sortRichtungS )
-	{
-		liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
-		sortRichtung->einklappen();
-	}
+    int gruppAuswS = gruppAusw->getAuswahl();
+    int sortSpalteS = sortSpalte->getAuswahl();
+    int sortRichtungS = sortRichtung->getAuswahl();
+    spielPartnerF->doPublicMausEreignis( me );
+    if( gruppAusw->getAuswahl() != gruppAuswS )
+    {
+        liste->setGruppierung( gruppAusw->zEintrag( gruppAusw->getAuswahl() )->zText()->getText() );
+        gruppAusw->einklappen();
+    }
+    if( sortSpalte->getAuswahl() != sortSpalteS )
+    {
+        liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
+        sortSpalte->einklappen();
+    }
+    if( sortRichtung->getAuswahl() != sortRichtungS )
+    {
+        liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
+        sortRichtung->einklappen();
+    }
 }
 
 void AccountSpielPartner::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	spielPartnerF->render( zRObj );
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( alpha );
+    spielPartnerF->render( zRObj );
+    zRObj.releaseAlpha();
 }
 
 // constant
 int AccountSpielPartner::getStatus() const
 {
-	return status;
+    return status;
 }

+ 88 - 93
KSGClient/NachLogin/Account/SpielPartner/AccountSpielPartner.h

@@ -12,125 +12,120 @@ using namespace Framework;
 
 namespace ASPLEDStyle
 {
-	const int SpielArt = 1;
-	const int Karte = 2;
-	const int Spieler = 4;
-	const int Ausklappbar = 8;
+    const int SpielArt = 1;
+    const int Karte = 2;
+    const int Spieler = 4;
+    const int Ausklappbar = 8;
 }
 
 struct AccountSPListeEintragDaten
 {
-	int style;
-	int id;
-	Text *name;
-	int anzahl;
-	int prozent;
+    int style;
+    int id;
+    Text *name;
+    int anzahl;
+    int prozent;
 };
 
-class AccountSPListeEintrag
+class AccountSPListeEintrag : public virtual ReferenceCounter
 {
 private:
-	LRahmen *ram;
-	RCArray< AccountSPListeEintrag > *members;
-	TextFeld *name;
-	TextFeld *anzahl;
-	FBalken *prozent;
-	Knopf *details;
-	Bild *ausklappen;
-	Bild *einklappen;
-	AccountSPListeEintragDaten *daten;
-	Text *sortSpalte;
-	bool sortAbsteigend;
-	double tickVal;
-	bool rend;
-	int ref;
+    LRahmen *ram;
+    RCArray< AccountSPListeEintrag > *members;
+    TextFeld *name;
+    TextFeld *anzahl;
+    FBalken *prozent;
+    Knopf *details;
+    Bild *ausklappen;
+    Bild *einklappen;
+    AccountSPListeEintragDaten *daten;
+    Text *sortSpalte;
+    bool sortAbsteigend;
+    double tickVal;
+    bool rend;
 
-	// privat
-	int getReihenfolge( int *arr );
+    // privat
+    int getReihenfolge( int *arr );
 
 public:
-	// Konstruktor
-	AccountSPListeEintrag( AccountSPListeEintragDaten *daten, Schrift *zSchrift );
-	// Destruktor
-	~AccountSPListeEintrag();
-	// nicht constant
-	void addMember( AccountSPListeEintrag *e );
-	void setSortSpalte( char *sp );
-	void setSortRichtung( bool absteigend );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int xOff, int yOff, int breite, Bild &zRObj );
-	// constant
-	int getHeight() const;
-	AccountSPListeEintragDaten *zDaten() const;
-	// Reference Counting
-	AccountSPListeEintrag *getThis();
-	AccountSPListeEintrag *release();
+    // Konstruktor
+    AccountSPListeEintrag( AccountSPListeEintragDaten *daten );
+    // Destruktor
+    ~AccountSPListeEintrag();
+    // nicht constant
+    void addMember( AccountSPListeEintrag *e );
+    void setSortSpalte( char *sp );
+    void setSortRichtung( bool absteigend );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int xOff, int yOff, int breite, Bild &zRObj );
+    // constant
+    int getHeight() const;
+    AccountSPListeEintragDaten *zDaten() const;
 };
 
 class AccountSPListe : public Zeichnung
 {
 private:
-	Schrift *schrift;
-	LRahmen *ram;
-	VScrollBar *scroll;
-	RCArray< AccountSPListeEintrag > *skp;
-	RCArray< AccountSPListeEintrag > *spk;
-	RCArray< AccountSPListeEintrag > *psk;
-	Text *gruppierung;
-	Text *sortSpalte;
-	bool sortAbsteigend;
-	bool rend;
+    LRahmen *ram;
+    VScrollBar *scroll;
+    RCArray< AccountSPListeEintrag > *skp;
+    RCArray< AccountSPListeEintrag > *spk;
+    RCArray< AccountSPListeEintrag > *psk;
+    Text *gruppierung;
+    Text *sortSpalte;
+    bool sortAbsteigend;
+    bool rend;
 
-	// privat
-	int getReihenfolge( int *arr );
+    // privat
+    int getReihenfolge( int *arr );
 
 public:
-	// Konstruktor
-	AccountSPListe( Schrift *zSchrift );
-	// Destruktor
-	~AccountSPListe();
-	// nicht constant
-	void reset();
-	void ladeDaten( int accId );
-	void setGruppierung( char *gp );
-	void setSortSpalte( char *sp );
-	void setSortRichtung( bool absteigend );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
+    // Konstruktor
+    AccountSPListe();
+    // Destruktor
+    ~AccountSPListe();
+    // nicht constant
+    void reset();
+    void ladeDaten( int accId );
+    void setGruppierung( char *gp );
+    void setSortSpalte( char *sp );
+    void setSortRichtung( bool absteigend );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
 };
 
 class AccountSpielPartner : public Thread
 {
 private:
-	Fenster *spielPartnerF;
-	AuswahlBox *gruppAusw;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	AccountSPListe *liste;
-	int status;
-	int accId;
-	int animation;
-	unsigned char alpha;
-	double tickVal;
-	bool rend;
+    Fenster *spielPartnerF;
+    AuswahlBox *gruppAusw;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    AccountSPListe *liste;
+    int status;
+    int accId;
+    int animation;
+    unsigned char alpha;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountSpielPartner( Schrift *zSchrift );
-	// Destruktor
-	~AccountSpielPartner();
-	// nicht constant
-	void reset();
-	void ladeStatistik( int accId );
-	virtual void thread();
-	void setSichtbar( bool sichtbar, bool nachRechts );
-	bool tick( double zeit );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getStatus() const;
+    // Konstruktor
+    AccountSpielPartner();
+    // Destruktor
+    ~AccountSpielPartner();
+    // nicht constant
+    void reset();
+    void ladeStatistik( int accId );
+    virtual void thread();
+    void setSichtbar( bool sichtbar, bool nachRechts );
+    bool tick( double zeit );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getStatus() const;
 };
 
 #endif;

+ 632 - 663
KSGClient/NachLogin/Account/Spiele_Karten/AccountSpieleUndKarten.cpp

@@ -5,551 +5,522 @@
 #include <DateiSystem.h>
 #include <Punkt.h>
 #include <ToolTip.h>
+#include <AuswahlBox.h>
 
 // Inhalt der AccountSUKListeKarte Klasse aus AccountSpieleUndKarten.h
 // Konstruktor
-AccountSUKListeKarte::AccountSUKListeKarte( Schrift *zSchrift, int id, int account )
-: ram( new LRahmen() ),
-  name( initTextFeld( 5, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Karte: " ) ),
-  spiele( initTextFeld( 165, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
-  gewonnen( initTextFeld( 325, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " ) ),
-  status( initTextFeld( 485, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Status: " ) ),
-  st( new Text() ),
-  karteId( id ),
-  rend( 0 ),
-  ref( 1 )
-{
-	na = infoClient->getKarteName( id );
-	if( na )
-		name->zText()->append( na->getText() );
-	sp = infoClient->getAccountKarteSpiele( account, id );
-	spiele->zText()->append( sp );
-	gw = infoClient->getAccountKarteSpieleGewonnen( account, id );
-	gewonnen->zText()->append( gw );
-	if( infoClient->hatAccountKarte( account, id ) )
-		st->setText( "Im Besitz" );
-	else
-		st->setText( "Nicht im Besitz" );
-	status->zText()->append( st->getText() );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setSize( 715, 20 );
-	ram->setRamenBreite( 1 );
+AccountSUKListeKarte::AccountSUKListeKarte( int id, int account )
+    : ReferenceCounter(),
+    ram( new LRahmen() ),
+    name( initTextFeld( 5, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Karte: " ) ),
+    spiele( initTextFeld( 165, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
+    gewonnen( initTextFeld( 325, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " ) ),
+    status( initTextFeld( 485, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Status: " ) ),
+    st( new Text() ),
+    karteId( id ),
+    rend( 0 )
+{
+    na = infoClient->getKarteName( id );
+    if( na )
+        name->zText()->append( na->getText() );
+    sp = infoClient->getAccountKarteSpiele( account, id );
+    spiele->zText()->append( sp );
+    gw = infoClient->getAccountKarteSpieleGewonnen( account, id );
+    gewonnen->zText()->append( gw );
+    if( infoClient->hatAccountKarte( account, id ) )
+        st->setText( "Im Besitz" );
+    else
+        st->setText( "Nicht im Besitz" );
+    status->zText()->append( st->getText() );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setSize( 715, 20 );
+    ram->setRamenBreite( 1 );
 }
 
 // Destruktor
 AccountSUKListeKarte::~AccountSUKListeKarte()
 {
-	ram->release();
-	name->release();
-	spiele->release();
-	gewonnen->release();
-	status->release();
-	if( na )
-		na->release();
-	st->release();
+    ram->release();
+    name->release();
+    spiele->release();
+    gewonnen->release();
+    status->release();
+    if( na )
+        na->release();
+    st->release();
 }
 
 // nicht constant
 void AccountSUKListeKarte::render( int yOff, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( 5, yOff, ram->getBreite(), ram->getHeight() ) )
-		return;
-	name->render( zRObj );
-	spiele->render( zRObj );
-	gewonnen->render( zRObj );
-	status->render( zRObj );
-	ram->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( 5, yOff, ram->getBreite(), ram->getHeight() ) )
+        return;
+    name->render( zRObj );
+    spiele->render( zRObj );
+    gewonnen->render( zRObj );
+    status->render( zRObj );
+    ram->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 Text *AccountSUKListeKarte::zName() const
 {
-	return na;
+    return na;
 }
 
 int AccountSUKListeKarte::getSpiele() const
 {
-	return sp;
+    return sp;
 }
 
 int AccountSUKListeKarte::getGewonnen() const
 {
-	return gw;
+    return gw;
 }
 
 Text *AccountSUKListeKarte::zStatus() const
 {
-	return st;
-}
-
-// Reference Counting
-AccountSUKListeKarte *AccountSUKListeKarte::getThis()
-{
-	ref++;
-	return this;
-}
-
-AccountSUKListeKarte *AccountSUKListeKarte::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return st;
 }
 
 
 // Inhalt der AccountSUKListeSpiel Klasse aus AccountSpieleUndKarten.h
 // Konstruktor
-AccountSUKListeSpiel::AccountSUKListeSpiel( Schrift *zSchrift, int id, int account )
-: ram( new LRahmen() ),
-  nameTF( initTextFeld( 5, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Name: " ) ),
-  spieleTF( initTextFeld( 165, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
-  gewonnenTF( initTextFeld( 325, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " ) ),
-  punkteTF( initTextFeld( 435, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Punkte: " ) ),
-  statusTF( initTextFeld( 545, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Status: " ) ),
-  details( initKnopf( 705, 0, 20, 20, 0, 0, "" ) ),
-  karten( new RCArray< AccountSUKListeKarte >() ),
-  einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
-  ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
-  status( new Text() ),
-  statusFilter( new Text( "Alle" ) ),
-  sortSpalte( new Text( "Name" ) ),
-  sortAbsteigend( 0 ),
-  spielId( id ),
-  tickVal( 0 ),
-  rend( 0 ),
-  ref( 1 )
-{
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setRamenBreite( 1 );
-	ram->setSize( 725, 20 );
-	details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	details->setHintergrundBildZ( ausklappen->getThis() );
-	initToolTip( details, "Karten anzeigen.", zSchrift, hauptScreen );
-	name = infoClient->getSpielName( id );
-	if( name )
-		nameTF->zText()->append( name->getText() );
-	Array< int > *stat = new Array< int >();
-	if( infoClient->getSpielStatistik( account, id, stat ) )
-	{
-		spiele = stat->get( 0 );
-		gewonnen = stat->get( 1 );
-		punkte = stat->get( 3 );
-	}
-	stat->release();
-	spieleTF->zText()->append( spiele );
-	gewonnenTF->zText()->append( gewonnen );
-	punkteTF->zText()->append( punkte );
-	if( infoClient->hatAccountSpiel( account, id ) )
-		status->setText( "Im Besitz" );
-	else
-		status->setText( "Nicht im Besitz" );
-	statusTF->zText()->append( status->getText() );
-	Array< int > *maps = infoClient->getAccountKarteGespieltListe( account, id );
-	if( maps )
-	{
-		int anz = maps->getEintragAnzahl();
-		for( int i = 0; i < anz; i++ )
-			karten->set( new AccountSUKListeKarte( zSchrift, maps->get( i ), account ), i );
-		maps->release();
-	}
+AccountSUKListeSpiel::AccountSUKListeSpiel( int id, int account )
+    : ReferenceCounter(),
+    ram( new LRahmen() ),
+    nameTF( initTextFeld( 5, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Name: " ) ),
+    spieleTF( initTextFeld( 165, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " ) ),
+    gewonnenTF( initTextFeld( 325, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " ) ),
+    punkteTF( initTextFeld( 435, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Punkte: " ) ),
+    statusTF( initTextFeld( 545, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Status: " ) ),
+    details( initKnopf( 705, 0, 20, 20, 0, "" ) ),
+    karten( new RCArray< AccountSUKListeKarte >() ),
+    einklappen( bilder->get( "data/client/bilder/account.ltdb/einklappen.png" ) ),
+    ausklappen( bilder->get( "data/client/bilder/account.ltdb/ausklappen.png" ) ),
+    status( new Text() ),
+    statusFilter( new Text( "Alle" ) ),
+    sortSpalte( new Text( "Name" ) ),
+    sortAbsteigend( 0 ),
+    spielId( id ),
+    tickVal( 0 ),
+    rend( 0 )
+{
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setRamenBreite( 1 );
+    ram->setSize( 725, 20 );
+    details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    details->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+    initToolTip( details, "Karten anzeigen." );
+    name = infoClient->getSpielName( id );
+    if( name )
+        nameTF->zText()->append( name->getText() );
+    Array< int > *stat = new Array< int >();
+    if( infoClient->getSpielStatistik( account, id, stat ) )
+    {
+        spiele = stat->get( 0 );
+        gewonnen = stat->get( 1 );
+        punkte = stat->get( 3 );
+    }
+    stat->release();
+    spieleTF->zText()->append( spiele );
+    gewonnenTF->zText()->append( gewonnen );
+    punkteTF->zText()->append( punkte );
+    if( infoClient->hatAccountSpiel( account, id ) )
+        status->setText( "Im Besitz" );
+    else
+        status->setText( "Nicht im Besitz" );
+    statusTF->zText()->append( status->getText() );
+    Array< int > *maps = infoClient->getAccountKarteGespieltListe( account, id );
+    if( maps )
+    {
+        int anz = maps->getEintragAnzahl();
+        for( int i = 0; i < anz; i++ )
+            karten->set( new AccountSUKListeKarte( maps->get( i ), account ), i );
+        maps->release();
+    }
 }
 
 // Destruktor
 AccountSUKListeSpiel::~AccountSUKListeSpiel()
 {
-	ram->release();
-	nameTF->release();
-	spieleTF->release();
-	gewonnenTF->release();
-	punkteTF->release();
-	statusTF->release();
-	details->release();
-	karten->release();
-	einklappen->release();
-	ausklappen->release();
-	if( name )
-		name->release();
-	status->release();
-	statusFilter->release();
-	sortSpalte->release();
+    ram->release();
+    nameTF->release();
+    spieleTF->release();
+    gewonnenTF->release();
+    punkteTF->release();
+    statusTF->release();
+    details->release();
+    karten->release();
+    einklappen->release();
+    ausklappen->release();
+    if( name )
+        name->release();
+    status->release();
+    statusFilter->release();
+    sortSpalte->release();
 }
 
 // privat
 int AccountSUKListeSpiel::getReihenfolge( int *arr )
 {
-	int anz = karten->getEintragAnzahl();
-	if( !anz )
-		return 0;
-	int ret = 0;
-	bool *fertig = new bool[ anz ];
-	ZeroMemory( fertig, anz );
-	for( int i = 0; i < anz; i++ )
-	{
-		int index = -1;
-		int minMax = 0;
-		Text minMaxT;
-		for( int j = 0; j < anz; j++ )
-		{
-			AccountSUKListeKarte *tmp = karten->z( j );
-			if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
-				continue;
-			if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zName() > minMaxT ) || ( !sortAbsteigend && *tmp->zName() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zName()->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->getSpiele() > minMax ) || ( !sortAbsteigend && tmp->getSpiele() < minMax ) ) )
-			{
-				minMax = tmp->getSpiele();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Gewonnen" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->getGewonnen() > minMax ) || ( !sortAbsteigend && tmp->getGewonnen() < minMax ) ) )
-			{
-				minMax = tmp->getGewonnen();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zStatus()->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Punkte" ) && !fertig[ j ] )
-			{
-				index = j;
-				break;
-			}
-		}
-		if( index < 0 )
-			break;
-		fertig[ index ] = 1;
-		arr[ ret ] = index;
-		ret++;
-	}
-	delete[] fertig;
-	return ret;
+    int anz = karten->getEintragAnzahl();
+    if( !anz )
+        return 0;
+    int ret = 0;
+    bool *fertig = new bool[ anz ];
+    ZeroMemory( fertig, anz );
+    for( int i = 0; i < anz; i++ )
+    {
+        int index = -1;
+        int minMax = 0;
+        Text minMaxT;
+        for( int j = 0; j < anz; j++ )
+        {
+            AccountSUKListeKarte *tmp = karten->z( j );
+            if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
+                continue;
+            if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
+                                                                     ( sortAbsteigend && *tmp->zName() > minMaxT ) || ( !sortAbsteigend && *tmp->zName() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zName()->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && tmp->getSpiele() > minMax ) || ( !sortAbsteigend && tmp->getSpiele() < minMax ) ) )
+            {
+                minMax = tmp->getSpiele();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Gewonnen" ) && !fertig[ j ] && ( index < 0 ||
+                                                                              ( sortAbsteigend && tmp->getGewonnen() > minMax ) || ( !sortAbsteigend && tmp->getGewonnen() < minMax ) ) )
+            {
+                minMax = tmp->getGewonnen();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zStatus()->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Punkte" ) && !fertig[ j ] )
+            {
+                index = j;
+                break;
+            }
+        }
+        if( index < 0 )
+            break;
+        fertig[ index ] = 1;
+        arr[ ret ] = index;
+        ret++;
+    }
+    delete[] fertig;
+    return ret;
 }
 
 // nicht constant
 void AccountSUKListeSpiel::setStatusAusw( char *status )
 {
-	statusFilter->setText( status );
-	rend = 1;
+    statusFilter->setText( status );
+    rend = 1;
 }
 
 void AccountSUKListeSpiel::setSortSpalte( char *spalte )
 {
-	sortSpalte->setText( spalte );
-	rend = 1;
+    sortSpalte->setText( spalte );
+    rend = 1;
 }
 
 void AccountSUKListeSpiel::setSortRichtung( bool absteigend )
 {
-	sortAbsteigend = absteigend;
-	rend = 1;
+    sortAbsteigend = absteigend;
+    rend = 1;
 }
 
 bool AccountSUKListeSpiel::tick( double tickVal )
 {
-	rend |= details->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	this->tickVal -= val;
-	if( val )
-	{
-		if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
-		{
-			if( ram->getHeight() - val < 20 )
-				ram->setSize( ram->getBreite(), 20 );
-			else
-				ram->setSize( ram->getBreite(), ram->getHeight() - val );
-			rend = 1;
-		}
-		if( details->zHintergrundBild() == einklappen )
-		{
-			int maxHö = 20;
-			int anz = karten->getEintragAnzahl();
-			for( int i = 0; i < anz; i++ )
-			{
-				AccountSUKListeKarte *tmp = karten->z( i );
-				if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
-					continue;
-				maxHö += 25;
-			}
-			if( maxHö > 20 )
-				maxHö += 5;
-			if( ram->getHeight() > maxHö )
-			{
-				if( ram->getHeight() - val < maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() - val );
-				rend = 1;
-			}
-			if( ram->getHeight() < maxHö )
-			{
-				if( ram->getHeight() + val > maxHö )
-					ram->setSize( ram->getBreite(), maxHö );
-				else
-					ram->setSize( ram->getBreite(), ram->getHeight() + val );
-				rend = 1;
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= details->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    this->tickVal -= val;
+    if( val )
+    {
+        if( details->zHintergrundBild() == ausklappen && ram->getHeight() != 20 )
+        {
+            if( ram->getHeight() - val < 20 )
+                ram->setSize( ram->getBreite(), 20 );
+            else
+                ram->setSize( ram->getBreite(), ram->getHeight() - val );
+            rend = 1;
+        }
+        if( details->zHintergrundBild() == einklappen )
+        {
+            int maxHö = 20;
+            int anz = karten->getEintragAnzahl();
+            for( int i = 0; i < anz; i++ )
+            {
+                AccountSUKListeKarte *tmp = karten->z( i );
+                if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
+                    continue;
+                maxHö += 25;
+            }
+            if( maxHö > 20 )
+                maxHö += 5;
+            if( ram->getHeight() > maxHö )
+            {
+                if( ram->getHeight() - val < maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() - val );
+                rend = 1;
+            }
+            if( ram->getHeight() < maxHö )
+            {
+                if( ram->getHeight() + val > maxHö )
+                    ram->setSize( ram->getBreite(), maxHö );
+                else
+                    ram->setSize( ram->getBreite(), ram->getHeight() + val );
+                rend = 1;
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSUKListeSpiel::doPublicMausEreignis( MausEreignis &me )
 {
-	bool vera = me.verarbeitet;
-	details->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-	{
-		if( details->zHintergrundBild() == ausklappen )
-		{
-			details->setHintergrundBildZ( einklappen->getThis() );
-			// TODO: details->zToolTip()->setText( "Karten verbergen." );
-		}
-		else
-		{
-			details->setHintergrundBildZ( ausklappen->getThis() );
-			// TODO: details->zToolTip()->setText( "Karten anzeigen." );
-		}
-	}
+    bool vera = me.verarbeitet;
+    details->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
+    {
+        if( details->zHintergrundBild() == ausklappen )
+        {
+            details->setHintergrundBildZ( dynamic_cast<Bild *>( einklappen->getThis() ) );
+            // TODO: details->zToolTip()->setText( "Karten verbergen." );
+        }
+        else
+        {
+            details->setHintergrundBildZ( dynamic_cast<Bild *>( ausklappen->getThis() ) );
+            // TODO: details->zToolTip()->setText( "Karten anzeigen." );
+        }
+    }
 }
 
 void AccountSUKListeSpiel::render( int yOff, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( 10, yOff, ram->getBreite(), ram->getHeight() ) )
-		return;
-	nameTF->render( zRObj );
-	spieleTF->render( zRObj );
-	gewonnenTF->render( zRObj );
-	punkteTF->render( zRObj );
-	statusTF->render( zRObj );
-	details->render( zRObj );
-	ram->render( zRObj );
-	if( ram->getHeight() > 20 )
-	{
-		zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
-		if( !zRObj.setDrawOptions( 1, 25, ram->getBreite() - 2, ram->getHeight() - 2 ) )
-		{
-			zRObj.releaseDrawOptions();
-			return;
-		}
-		int anz = karten->getEintragAnzahl();
-		int *arr = new int[ anz ];
-		anz = getReihenfolge( arr );
-		yOff = 0;
-		for( int i = 0; i < anz; i++ )
-		{
-			karten->z( arr[ i ] )->render( yOff, zRObj );
-			yOff += 25;
-		}
-		delete[]arr;
-		zRObj.releaseDrawOptions();
-	}
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( 10, yOff, ram->getBreite(), ram->getHeight() ) )
+        return;
+    nameTF->render( zRObj );
+    spieleTF->render( zRObj );
+    gewonnenTF->render( zRObj );
+    punkteTF->render( zRObj );
+    statusTF->render( zRObj );
+    details->render( zRObj );
+    ram->render( zRObj );
+    if( ram->getHeight() > 20 )
+    {
+        zRObj.drawLinieH( 0, 20, ram->getBreite(), ram->getFarbe() );
+        if( !zRObj.setDrawOptions( 1, 25, ram->getBreite() - 2, ram->getHeight() - 2 ) )
+        {
+            zRObj.releaseDrawOptions();
+            return;
+        }
+        int anz = karten->getEintragAnzahl();
+        int *arr = new int[ anz ];
+        anz = getReihenfolge( arr );
+        yOff = 0;
+        for( int i = 0; i < anz; i++ )
+        {
+            karten->z( arr[ i ] )->render( yOff, zRObj );
+            yOff += 25;
+        }
+        delete[]arr;
+        zRObj.releaseDrawOptions();
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int AccountSUKListeSpiel::getHeight() const
 {
-	return ram->getHeight();
+    return ram->getHeight();
 }
 
 Text *AccountSUKListeSpiel::zName() const
 {
-	return name;
+    return name;
 }
 
 int AccountSUKListeSpiel::getSpiele() const
 {
-	return spiele;
+    return spiele;
 }
 
 int AccountSUKListeSpiel::getGewonnen() const
 {
-	return gewonnen;
+    return gewonnen;
 }
 
 int AccountSUKListeSpiel::getPunkte() const
 {
-	return punkte;
+    return punkte;
 }
 
 Text *AccountSUKListeSpiel::zStatus() const
 {
-	return status;
-}
-
-// Reference Counting
-AccountSUKListeSpiel *AccountSUKListeSpiel::getThis()
-{
-	ref++;
-	return this;
-}
-
-AccountSUKListeSpiel *AccountSUKListeSpiel::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return status;
 }
 
 
 // Inhalt der AccountSUKListe Klasse aus AccountSpieleUndKarten.h
 // Konstruktor
 AccountSUKListe::AccountSUKListe()
-: Zeichnung(),
-  ram( new LRahmen() ),
-  scroll( new VScrollBar() ),
-  spiele( new RCArray< AccountSUKListeSpiel >() ),
-  status( new Text() ),
-  statusFilter( new Text( "Alle" ) ),
-  sortSpalte( new Text( "Name" ) ),
-  sortAbsteigend( 0 ),
-  rend( 0 )
-{
-	pos = Punkt( 10, 40 );
-	ram->setSize( 760, 380 );
-	ram->setFarbe( 0xFFFFFFFF );
-	ram->setRamenBreite( 1 );
+    : Zeichnung(),
+    ram( new LRahmen() ),
+    scroll( new VScrollBar() ),
+    spiele( new RCArray< AccountSUKListeSpiel >() ),
+    status( new Text() ),
+    statusFilter( new Text( "Alle" ) ),
+    sortSpalte( new Text( "Name" ) ),
+    sortAbsteigend( 0 ),
+    rend( 0 )
+{
+    pos = Punkt( 10, 40 );
+    ram->setSize( 760, 380 );
+    ram->setFarbe( 0xFFFFFFFF );
+    ram->setRamenBreite( 1 );
 }
 
 // Destruktor
 AccountSUKListe::~AccountSUKListe()
 {
-	ram->release();
-	scroll->release();
-	spiele->release();
-	status->release();
-	statusFilter->release();
-	sortSpalte->release();
+    ram->release();
+    scroll->release();
+    spiele->release();
+    status->release();
+    statusFilter->release();
+    sortSpalte->release();
 }
 
 // privat
 int AccountSUKListe::getReihenfolge( int *arr )
 {
-	int anz = spiele->getEintragAnzahl();
-	if( !anz )
-		return 0;
-	int ret = 0;
-	bool *fertig = new bool[ anz ];
-	ZeroMemory( fertig, anz );
-	for( int i = 0; i < anz; i++ )
-	{
-		int index = -1;
-		int minMax = 0;
-		Text minMaxT;
-		for( int j = 0; j < anz; j++ )
-		{
-			AccountSUKListeSpiel *tmp = spiele->z( j );
-			if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
-				continue;
-			if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zName() > minMaxT ) || ( !sortAbsteigend && *tmp->zName() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zName()->getText();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->getSpiele() > minMax ) || ( !sortAbsteigend && tmp->getSpiele() < minMax ) ) )
-			{
-				minMax = tmp->getSpiele();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Gewonnen" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->getGewonnen() > minMax ) || ( !sortAbsteigend && tmp->getGewonnen() < minMax ) ) )
-			{
-				minMax = tmp->getGewonnen();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Punkte" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && tmp->getPunkte() > minMax ) || ( !sortAbsteigend && tmp->getPunkte() < minMax ) ) )
-			{
-				minMax = tmp->getPunkte();
-				index = j;
-			}
-			else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
-				( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
-			{
-				minMaxT = tmp->zStatus()->getText();
-				index = j;
-			}
-		}
-		if( index < 0 )
-			break;
-		fertig[ index ] = 1;
-		arr[ ret ] = index;
-		ret++;
-	}
-	delete[] fertig;
-	return ret;
+    int anz = spiele->getEintragAnzahl();
+    if( !anz )
+        return 0;
+    int ret = 0;
+    bool *fertig = new bool[ anz ];
+    ZeroMemory( fertig, anz );
+    for( int i = 0; i < anz; i++ )
+    {
+        int index = -1;
+        int minMax = 0;
+        Text minMaxT;
+        for( int j = 0; j < anz; j++ )
+        {
+            AccountSUKListeSpiel *tmp = spiele->z( j );
+            if( !statusFilter->istGleich( "Alle" ) && !tmp->zStatus()->istGleich( statusFilter->getText() ) )
+                continue;
+            if( sortSpalte->istGleich( "Name" ) && !fertig[ j ] && ( index < 0 ||
+                                                                     ( sortAbsteigend && *tmp->zName() > minMaxT ) || ( !sortAbsteigend && *tmp->zName() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zName()->getText();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Spiele" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && tmp->getSpiele() > minMax ) || ( !sortAbsteigend && tmp->getSpiele() < minMax ) ) )
+            {
+                minMax = tmp->getSpiele();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Gewonnen" ) && !fertig[ j ] && ( index < 0 ||
+                                                                              ( sortAbsteigend && tmp->getGewonnen() > minMax ) || ( !sortAbsteigend && tmp->getGewonnen() < minMax ) ) )
+            {
+                minMax = tmp->getGewonnen();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Punkte" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && tmp->getPunkte() > minMax ) || ( !sortAbsteigend && tmp->getPunkte() < minMax ) ) )
+            {
+                minMax = tmp->getPunkte();
+                index = j;
+            }
+            else if( sortSpalte->istGleich( "Status" ) && !fertig[ j ] && ( index < 0 ||
+                                                                            ( sortAbsteigend && *tmp->zStatus() > minMaxT ) || ( !sortAbsteigend && *tmp->zStatus() < minMaxT ) ) )
+            {
+                minMaxT = tmp->zStatus()->getText();
+                index = j;
+            }
+        }
+        if( index < 0 )
+            break;
+        fertig[ index ] = 1;
+        arr[ ret ] = index;
+        ret++;
+    }
+    delete[] fertig;
+    return ret;
 }
 
 // nicht constant
 void AccountSUKListe::reset()
 {
-	lockZeichnung();
-	spiele->leeren();
-	unlockZeichnung();
+    lockZeichnung();
+    spiele->leeren();
+    unlockZeichnung();
 }
 
 void AccountSUKListe::addSpiel( AccountSUKListeSpiel *spiel )
 {
-	lockZeichnung();
-	spiel->setSortRichtung( sortAbsteigend );
-	spiel->setSortSpalte( sortSpalte->getText() );
-	spiel->setStatusAusw( statusFilter->getText() );
-	spiele->add( spiel );
-	unlockZeichnung();
+    lockZeichnung();
+    spiel->setSortRichtung( sortAbsteigend );
+    spiel->setSortSpalte( sortSpalte->getText() );
+    spiel->setStatusAusw( statusFilter->getText() );
+    spiele->add( spiel );
+    unlockZeichnung();
 }
 
 void AccountSUKListe::setStatusAusw( char *status )
 {
-	lockZeichnung();
-	this->statusFilter->setText( status );
-	int anz = spiele->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		spiele->z( i )->setStatusAusw( status );
-	unlockZeichnung();
-	rend = 1;
+    lockZeichnung();
+    this->statusFilter->setText( status );
+    int anz = spiele->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        spiele->z( i )->setStatusAusw( status );
+    unlockZeichnung();
+    rend = 1;
 }
 
 void AccountSUKListe::setSortSpalte( char *spalte )
 {
-	lockZeichnung();
-	this->sortSpalte->setText( spalte );
-	int anz = spiele->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		spiele->z( i )->setSortSpalte( spalte );
-	unlockZeichnung();
-	rend = 1;
+    lockZeichnung();
+    this->sortSpalte->setText( spalte );
+    int anz = spiele->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        spiele->z( i )->setSortSpalte( spalte );
+    unlockZeichnung();
+    rend = 1;
 }
 
 void AccountSUKListe::setSortRichtung( bool absteigend )
 {
-	lockZeichnung();
-	sortAbsteigend = absteigend;
-	int anz = spiele->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-		spiele->z( i )->setSortRichtung( absteigend );
-	unlockZeichnung();
-	rend = 1;
+    lockZeichnung();
+    sortAbsteigend = absteigend;
+    int anz = spiele->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+        spiele->z( i )->setSortRichtung( absteigend );
+    unlockZeichnung();
+    rend = 1;
 }
 
 bool AccountSUKListe::tick( double tickVal )
 {
-	lockZeichnung();
+    lockZeichnung();
     int anz = spiele->getEintragAnzahl();
     if( anz > 0 )
     {
@@ -559,311 +530,309 @@ bool AccountSUKListe::tick( double tickVal )
             rend |= spiele->z( rf[ i ] )->tick( tickVal );
         delete[] rf;
     }
-	unlockZeichnung();
-	rend |= scroll->getRend();
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    unlockZeichnung();
+    rend |= scroll->getRend();
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSUKListe::doPublicMausEreignis( MausEreignis &me )
 {
-	bool vera = 0;
-	if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
-	{
-		vera = 1;
-		me.verarbeitet = 1;
-	}
-	int mx = me.mx, my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
-	me.mx -= 10;
-	me.my -= 10 - scroll->getScroll();
-	lockZeichnung();
-	int anz = spiele->getEintragAnzahl();
-	int *rf = new int[ anz ];
-	int rfAnz = getReihenfolge( rf );
-	for( int i = 0; i < rfAnz; i++ )
-	{
-		spiele->z( rf[ i ] )->doPublicMausEreignis( me );
-		me.my -= spiele->z( rf[ i ] )->getHeight() + 10;
-	}
-	delete[] rf;
-	unlockZeichnung();
-	me.mx = mx, me.my = my;
-	if( vera )
-		me.verarbeitet = 0;
+    bool vera = 0;
+    if( me.mx - pos.x <= 0 || me.mx - pos.x >= ram->getBreite() || me.my - pos.y <= 0 || me.my - pos.y >= ram->getHeight() )
+    {
+        vera = 1;
+        me.verarbeitet = 1;
+    }
+    int mx = me.mx, my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    scroll->doMausMessage( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, me );
+    me.mx -= 10;
+    me.my -= 10 - scroll->getScroll();
+    lockZeichnung();
+    int anz = spiele->getEintragAnzahl();
+    int *rf = new int[ anz ];
+    int rfAnz = getReihenfolge( rf );
+    for( int i = 0; i < rfAnz; i++ )
+    {
+        spiele->z( rf[ i ] )->doPublicMausEreignis( me );
+        me.my -= spiele->z( rf[ i ] )->getHeight() + 10;
+    }
+    delete[] rf;
+    unlockZeichnung();
+    me.mx = mx, me.my = my;
+    if( vera )
+        me.verarbeitet = 0;
 }
 
 void AccountSUKListe::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getBreite() ) )
-		return;
-	ram->render( zRObj );
-	scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
-	if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
-	{
-		zRObj.releaseDrawOptions();
-		return;
-	}
-	int y = -scroll->getScroll();
-	int anzHö = 10;
-	lockZeichnung();
-	int anz = spiele->getEintragAnzahl();
-	int *rf = new int[ anz ];
-	int rfAnz = getReihenfolge( rf );
-	for( int i = 0; i < rfAnz; i++ )
-	{
-		spiele->z( rf[ i ] )->render( anzHö, zRObj );
-		anzHö += spiele->z( rf[ i ] )->getHeight() + 10;
-	}
-	delete[] rf;
-	unlockZeichnung();
-	scroll->update( anzHö, ram->getHeight() - 2 );
-	zRObj.releaseDrawOptions();
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getBreite() ) )
+        return;
+    ram->render( zRObj );
+    scroll->render( ram->getBreite() - 16, 1, 15, ram->getHeight() - 2, zRObj );
+    if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 15, ram->getHeight() - 2 ) )
+    {
+        zRObj.releaseDrawOptions();
+        return;
+    }
+    int y = -scroll->getScroll();
+    int anzHö = 10;
+    lockZeichnung();
+    int anz = spiele->getEintragAnzahl();
+    int *rf = new int[ anz ];
+    int rfAnz = getReihenfolge( rf );
+    for( int i = 0; i < rfAnz; i++ )
+    {
+        spiele->z( rf[ i ] )->render( anzHö, zRObj );
+        anzHö += spiele->z( rf[ i ] )->getHeight() + 10;
+    }
+    delete[] rf;
+    unlockZeichnung();
+    scroll->update( anzHö, ram->getHeight() - 2 );
+    zRObj.releaseDrawOptions();
+    zRObj.releaseDrawOptions();
 }
 
 #define ABSTYLE AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::Hintergrund | AuswahlBox::Style::VScroll
 
 // Inhalt der AccountSpieleUndKarten Klasse aus AccountSpieleUndKarten.h
 // Konstruktor
-AccountSpieleUndKarten::AccountSpieleUndKarten( Schrift *zSchrift )
-: Thread(),
-  schrift( zSchrift->getThis() ),
-  spieleUndKartenF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spiele und Karten von " ) ),
-  statusAusw( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Alle", "Im Besitz", "Nicht im Besitz" } ) ),
-  sortSpalte( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Gewonnen", "Punkte", "Status" } ) ),
-  sortRichtung( initAuswahlBox( 330, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-  liste( new AccountSUKListe() ),
-  status( 0 ),
-  accId( 0 ),
-  animation( 0 ),
-  alpha( 255 ),
-  tickVal( 0 ),
-  rend( 0 )
-{
-	initToolTip( statusAusw, "Wähle den Status der anzuzeigenden Spiele und Karten aus.", zSchrift, hauptScreen );
-	initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift, hauptScreen );
-	initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll.", zSchrift, hauptScreen );
-	spieleUndKartenF->addMember( liste->getThis() );
-	spieleUndKartenF->addMember( statusAusw->getThis() );
-	spieleUndKartenF->addMember( sortSpalte->getThis() );
-	spieleUndKartenF->addMember( sortRichtung->getThis() );
-	spieleUndKartenF->setMausEreignis( _ret1ME );
+AccountSpieleUndKarten::AccountSpieleUndKarten()
+    : Thread(),
+    spieleUndKartenF( initFenster( 810, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Spiele und Karten von " ) ),
+    statusAusw( initAuswahlBox( 10, 10, 150, 20, ABSTYLE, { "Alle", "Im Besitz", "Nicht im Besitz" } ) ),
+    sortSpalte( initAuswahlBox( 170, 10, 150, 20, ABSTYLE, { "Name", "Spiele", "Gewonnen", "Punkte", "Status" } ) ),
+    sortRichtung( initAuswahlBox( 330, 10, 150, 20, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    liste( new AccountSUKListe() ),
+    status( 0 ),
+    accId( 0 ),
+    animation( 0 ),
+    alpha( 255 ),
+    tickVal( 0 ),
+    rend( 0 )
+{
+    initToolTip( statusAusw, "Wähle den Status der anzuzeigenden Spiele und Karten aus." );
+    initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll." );
+    initToolTip( sortRichtung, "Wähle aus, Ob Aufwärts oder Abwärts sortiert werden soll." );
+    spieleUndKartenF->addMember( dynamic_cast<Zeichnung *>( liste->getThis() ) );
+    spieleUndKartenF->addMember( dynamic_cast<Zeichnung *>( statusAusw->getThis() ) );
+    spieleUndKartenF->addMember( dynamic_cast<Zeichnung *>( sortSpalte->getThis() ) );
+    spieleUndKartenF->addMember( dynamic_cast<Zeichnung *>( sortRichtung->getThis() ) );
+    spieleUndKartenF->setMausEreignis( _ret1ME );
 }
 
 // Destruktor
 AccountSpieleUndKarten::~AccountSpieleUndKarten()
 {
-	schrift->release();
-	spieleUndKartenF->release();
-	statusAusw->release();
-	sortSpalte->release();
-	sortRichtung->release();
-	liste->release();
+    spieleUndKartenF->release();
+    statusAusw->release();
+    sortSpalte->release();
+    sortRichtung->release();
+    liste->release();
 }
 
 // nicht constant
 void AccountSpieleUndKarten::reset()
 {
-	liste->reset();
+    liste->reset();
 }
 
 void AccountSpieleUndKarten::ladeStatistik( int accId )
 {
-	if( this->accId == accId )
-		return;
-	this->status = 0;
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
-	if( ( animation | 0x1 ) == animation )
-	{
-		animation |= 0x4;
-		this->accId = accId;
-		this->status = 1;
-		return;
-	}
-	if( this->accId )
-		reset();
-	this->accId = accId;
-	start();
-	this->status = 1;
+    if( this->accId == accId )
+        return;
+    this->status = 0;
+    if( run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    if( ( animation | 0x1 ) == animation )
+    {
+        animation |= 0x4;
+        this->accId = accId;
+        this->status = 1;
+        return;
+    }
+    if( this->accId )
+        reset();
+    this->accId = accId;
+    start();
+    this->status = 1;
 }
 
 void AccountSpieleUndKarten::thread()
 {
-	Text *name = infoClient->getSpielerName( accId );
-	if( name )
-	{
-		name->insert( 0, "Spiele und Karten von " );
-		spieleUndKartenF->setTitel( *name );
-		name->release();
-	}
-	Array< int > *spiele = infoClient->getAccountSpielGespieltListe( accId );
-	if( spiele )
-	{
-		int anz = spiele->getEintragAnzahl();
-		for( int i = 0; i < anz; i++ )
-		{
-			AccountSUKListeSpiel *s = new AccountSUKListeSpiel( schrift, spiele->get( i ), accId );
-			liste->addSpiel( s );
-		}
-		spiele->release();
-	}
-	else
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Fehler beim laden der Daten." ), new Text( "Ok" ) );
-	animation &= ~0x4;
-	status = 2;
-	run = 0;
+    Text *name = infoClient->getSpielerName( accId );
+    if( name )
+    {
+        name->insert( 0, "Spiele und Karten von " );
+        spieleUndKartenF->setTitel( *name );
+        name->release();
+    }
+    Array< int > *spiele = infoClient->getAccountSpielGespieltListe( accId );
+    if( spiele )
+    {
+        int anz = spiele->getEintragAnzahl();
+        for( int i = 0; i < anz; i++ )
+        {
+            AccountSUKListeSpiel *s = new AccountSUKListeSpiel( spiele->get( i ), accId );
+            liste->addSpiel( s );
+        }
+        spiele->release();
+    }
+    else
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Fehler beim laden der Daten." ), new Text( "Ok" ) );
+    animation &= ~0x4;
+    status = 2;
+    run = 0;
 }
 
 void AccountSpieleUndKarten::setSichtbar( bool sichtbar, bool nachRechts )
 {
-	if( sichtbar )
-	{
-		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
-		{
-			if( nachRechts )
-				spieleUndKartenF->setPosition( -810, 40 );
-			else
-				spieleUndKartenF->setPosition( 810, 40 );
-		}
-		animation |= 0x1;
-	}
-	else
-		animation &= ~0x1;
-	if( nachRechts )
-		animation |= 0x2;
-	else
-		animation &= ~0x2;
+    if( sichtbar )
+    {
+        if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
+        {
+            if( nachRechts )
+                spieleUndKartenF->setPosition( -810, 40 );
+            else
+                spieleUndKartenF->setPosition( 810, 40 );
+        }
+        animation |= 0x1;
+    }
+    else
+        animation &= ~0x1;
+    if( nachRechts )
+        animation |= 0x2;
+    else
+        animation &= ~0x2;
 }
 
 bool AccountSpieleUndKarten::tick( double zeit )
 {
-	rend |= spieleUndKartenF->tick( zeit );
-	tickVal += zeit;
-	int valA = (int)( tickVal * 150 );
-	int valB = (int)( tickVal * 500 );
-	tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( ( animation | 0x4 ) == animation && alpha )
-		{
-			if( alpha - valA <= 0 )
-				alpha = 0;
-			else
-				alpha -= valA;
-			rend = 1;
-			if( !alpha )
-			{
-				reset();
-				start();
-			}
-		}
-		if( ( animation | 0x4 ) != animation && alpha != 255 )
-		{
-			if( alpha + valA >= 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( ( animation | 0x1 ) == animation )
-		{ // Sichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( spieleUndKartenF->getX() != 10 )
-				{
-					if( spieleUndKartenF->getX() + valB > 10 )
-						spieleUndKartenF->setPosition( 10, spieleUndKartenF->getY() );
-					else
-						spieleUndKartenF->setPosition( spieleUndKartenF->getX() + valB, spieleUndKartenF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( spieleUndKartenF->getX() != 10 )
-				{
-					if( spieleUndKartenF->getX() - valB < 10 )
-						spieleUndKartenF->setPosition( 10, spieleUndKartenF->getY() );
-					else
-						spieleUndKartenF->setPosition( spieleUndKartenF->getX() - valB, spieleUndKartenF->getY() );
-					rend = 1;
-				}
-			}
-		}
-		else
-		{ // Unsichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( spieleUndKartenF->getX() != 810 )
-				{
-					if( spieleUndKartenF->getX() + valB > 810 )
-						spieleUndKartenF->setPosition( 810, spieleUndKartenF->getY() );
-					else
-						spieleUndKartenF->setPosition( spieleUndKartenF->getX() + valB, spieleUndKartenF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( spieleUndKartenF->getX() != -810 )
-				{
-					if( spieleUndKartenF->getX() - valB < -810 )
-						spieleUndKartenF->setPosition( -810, spieleUndKartenF->getY() );
-					else
-						spieleUndKartenF->setPosition( spieleUndKartenF->getX() - valB, spieleUndKartenF->getY() );
-					rend = 1;
-				}
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= spieleUndKartenF->tick( zeit );
+    tickVal += zeit;
+    int valA = (int)( tickVal * 150 );
+    int valB = (int)( tickVal * 500 );
+    tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( ( animation | 0x4 ) == animation && alpha )
+        {
+            if( alpha - valA <= 0 )
+                alpha = 0;
+            else
+                alpha -= valA;
+            rend = 1;
+            if( !alpha )
+            {
+                reset();
+                start();
+            }
+        }
+        if( ( animation | 0x4 ) != animation && alpha != 255 )
+        {
+            if( alpha + valA >= 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( ( animation | 0x1 ) == animation )
+        { // Sichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( spieleUndKartenF->getX() != 10 )
+                {
+                    if( spieleUndKartenF->getX() + valB > 10 )
+                        spieleUndKartenF->setPosition( 10, spieleUndKartenF->getY() );
+                    else
+                        spieleUndKartenF->setPosition( spieleUndKartenF->getX() + valB, spieleUndKartenF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( spieleUndKartenF->getX() != 10 )
+                {
+                    if( spieleUndKartenF->getX() - valB < 10 )
+                        spieleUndKartenF->setPosition( 10, spieleUndKartenF->getY() );
+                    else
+                        spieleUndKartenF->setPosition( spieleUndKartenF->getX() - valB, spieleUndKartenF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+        else
+        { // Unsichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( spieleUndKartenF->getX() != 810 )
+                {
+                    if( spieleUndKartenF->getX() + valB > 810 )
+                        spieleUndKartenF->setPosition( 810, spieleUndKartenF->getY() );
+                    else
+                        spieleUndKartenF->setPosition( spieleUndKartenF->getX() + valB, spieleUndKartenF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( spieleUndKartenF->getX() != -810 )
+                {
+                    if( spieleUndKartenF->getX() - valB < -810 )
+                        spieleUndKartenF->setPosition( -810, spieleUndKartenF->getY() );
+                    else
+                        spieleUndKartenF->setPosition( spieleUndKartenF->getX() - valB, spieleUndKartenF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSpieleUndKarten::doPublicMausEreignis( MausEreignis &me )
 {
-	int statusAuswS = statusAusw->getAuswahl();
-	int sortSpalteS = sortSpalte->getAuswahl();
-	int sortRichtungS = sortRichtung->getAuswahl();
-	spieleUndKartenF->doPublicMausEreignis( me );
-	if( statusAusw->getAuswahl() != statusAuswS )
-	{
-		liste->setStatusAusw( statusAusw->zEintrag( statusAusw->getAuswahl() )->zText()->getText() );
-		statusAusw->einklappen();
-	}
-	if( sortSpalte->getAuswahl() != sortSpalteS )
-	{
-		liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
-		sortSpalte->einklappen();
-	}
-	if( sortRichtung->getAuswahl() != sortRichtungS )
-	{
-		liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
-		sortRichtung->einklappen();
-	}
+    int statusAuswS = statusAusw->getAuswahl();
+    int sortSpalteS = sortSpalte->getAuswahl();
+    int sortRichtungS = sortRichtung->getAuswahl();
+    spieleUndKartenF->doPublicMausEreignis( me );
+    if( statusAusw->getAuswahl() != statusAuswS )
+    {
+        liste->setStatusAusw( statusAusw->zEintrag( statusAusw->getAuswahl() )->zText()->getText() );
+        statusAusw->einklappen();
+    }
+    if( sortSpalte->getAuswahl() != sortSpalteS )
+    {
+        liste->setSortSpalte( sortSpalte->zEintrag( sortSpalte->getAuswahl() )->zText()->getText() );
+        sortSpalte->einklappen();
+    }
+    if( sortRichtung->getAuswahl() != sortRichtungS )
+    {
+        liste->setSortRichtung( sortRichtung->getAuswahl() != 0 );
+        sortRichtung->einklappen();
+    }
 }
 
 void AccountSpieleUndKarten::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	spieleUndKartenF->render( zRObj );
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( alpha );
+    spieleUndKartenF->render( zRObj );
+    zRObj.releaseAlpha();
 }
 
 // constant
 int AccountSpieleUndKarten::getStatus() const
 {
-	return status;
+    return status;
 }

+ 113 - 122
KSGClient/NachLogin/Account/Spiele_Karten/AccountSpieleUndKarten.h

@@ -9,154 +9,145 @@
 
 using namespace Framework;
 
-class AccountSUKListeKarte
+class AccountSUKListeKarte : public virtual ReferenceCounter
 {
 private:
-	LRahmen *ram;
-	TextFeld *name;
-	TextFeld *spiele;
-	TextFeld *gewonnen;
-	TextFeld *status;
-	Text *na;
-	int sp;
-	int gw;
-	Text *st;
-	int karteId;
-	bool rend;
-	int ref;
+    LRahmen *ram;
+    TextFeld *name;
+    TextFeld *spiele;
+    TextFeld *gewonnen;
+    TextFeld *status;
+    Text *na;
+    int sp;
+    int gw;
+    Text *st;
+    int karteId;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountSUKListeKarte( Schrift *zSchrift, int id, int account );
-	// Destruktor
-	~AccountSUKListeKarte();
-	// nicht constant
-	void render( int yOff, Bild &zRObj );
-	// constant
-	Text *zName() const;
-	int getSpiele() const;
-	int getGewonnen() const;
-	Text *zStatus() const;
-	// Reference Counting
-	AccountSUKListeKarte *getThis();
-	AccountSUKListeKarte *release();
+    // Konstruktor
+    AccountSUKListeKarte( int id, int account );
+    // Destruktor
+    ~AccountSUKListeKarte();
+    // nicht constant
+    void render( int yOff, Bild &zRObj );
+    // constant
+    Text *zName() const;
+    int getSpiele() const;
+    int getGewonnen() const;
+    Text *zStatus() const;
 };
 
-class AccountSUKListeSpiel
+class AccountSUKListeSpiel : public virtual ReferenceCounter
 {
 private:
-	LRahmen *ram;
-	TextFeld *nameTF;
-	TextFeld *spieleTF;
-	TextFeld *gewonnenTF;
-	TextFeld *punkteTF;
-	TextFeld *statusTF;
-	Knopf *details;
-	RCArray< AccountSUKListeKarte > *karten;
-	Bild *einklappen;
-	Bild *ausklappen;
-	Text *name;
-	int spiele;
-	int gewonnen;
-	int punkte;
-	Text *status;
-	Text *statusFilter;
-	Text *sortSpalte;
-	bool sortAbsteigend;
-	int spielId;
-	double tickVal;
-	bool rend;
-	int ref;
+    LRahmen *ram;
+    TextFeld *nameTF;
+    TextFeld *spieleTF;
+    TextFeld *gewonnenTF;
+    TextFeld *punkteTF;
+    TextFeld *statusTF;
+    Knopf *details;
+    RCArray< AccountSUKListeKarte > *karten;
+    Bild *einklappen;
+    Bild *ausklappen;
+    Text *name;
+    int spiele;
+    int gewonnen;
+    int punkte;
+    Text *status;
+    Text *statusFilter;
+    Text *sortSpalte;
+    bool sortAbsteigend;
+    int spielId;
+    double tickVal;
+    bool rend;
 
-	// privat
-	int getReihenfolge( int *arr );
+    // privat
+    int getReihenfolge( int *arr );
 
 public:
-	// Konstruktor
-	AccountSUKListeSpiel( Schrift *zSchrift, int id, int account );
-	// Destruktor
-	~AccountSUKListeSpiel();
-	// nicht constant
-	void setStatusAusw( char *status );
-	void setSortSpalte( char *spalte );
-	void setSortRichtung( bool absteigend );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int yOff, Bild &zRObj );
-	// constant
-	int getHeight() const;
-	Text *zName() const;
-	int getSpiele() const;
-	int getGewonnen() const;
-	int getPunkte() const;
-	Text *zStatus() const;
-	// Reference Counting
-	AccountSUKListeSpiel *getThis();
-	AccountSUKListeSpiel *release();
+    // Konstruktor
+    AccountSUKListeSpiel( int id, int account );
+    // Destruktor
+    ~AccountSUKListeSpiel();
+    // nicht constant
+    void setStatusAusw( char *status );
+    void setSortSpalte( char *spalte );
+    void setSortRichtung( bool absteigend );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int yOff, Bild &zRObj );
+    // constant
+    int getHeight() const;
+    Text *zName() const;
+    int getSpiele() const;
+    int getGewonnen() const;
+    int getPunkte() const;
+    Text *zStatus() const;
 };
 
 class AccountSUKListe : public Zeichnung
 {
 private:
-	LRahmen *ram;
-	VScrollBar *scroll;
-	RCArray< AccountSUKListeSpiel > *spiele;
-	Text *status;
-	Text *statusFilter;
-	Text *sortSpalte;
-	bool sortAbsteigend;
-	bool rend;
+    LRahmen *ram;
+    VScrollBar *scroll;
+    RCArray< AccountSUKListeSpiel > *spiele;
+    Text *status;
+    Text *statusFilter;
+    Text *sortSpalte;
+    bool sortAbsteigend;
+    bool rend;
 
-	// privat
-	int getReihenfolge( int *arr );
+    // privat
+    int getReihenfolge( int *arr );
 
 public:
-	// Konstruktor
-	AccountSUKListe();
-	// Destruktor
-	~AccountSUKListe();
-	// nicht constant
-	void reset();
-	void addSpiel( AccountSUKListeSpiel *spiel );
-	void setStatusAusw( char *status );
-	void setSortSpalte( char *spalte );
-	void setSortRichtung( bool absteigend );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
+    // Konstruktor
+    AccountSUKListe();
+    // Destruktor
+    ~AccountSUKListe();
+    // nicht constant
+    void reset();
+    void addSpiel( AccountSUKListeSpiel *spiel );
+    void setStatusAusw( char *status );
+    void setSortSpalte( char *spalte );
+    void setSortRichtung( bool absteigend );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
 };
 
 class AccountSpieleUndKarten : public Thread
 {
 private:
-	Schrift *schrift;
-	Fenster *spieleUndKartenF;
-	AuswahlBox *statusAusw;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	AccountSUKListe *liste;
-	int status;
-	int accId;
-	int animation;
-	unsigned char alpha;
-	double tickVal;
-	bool rend;
+    Fenster *spieleUndKartenF;
+    AuswahlBox *statusAusw;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    AccountSUKListe *liste;
+    int status;
+    int accId;
+    int animation;
+    unsigned char alpha;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountSpieleUndKarten( Schrift *zSchrift );
-	// Destruktor
-	~AccountSpieleUndKarten();
-	// nicht constant
-	void reset();
-	void ladeStatistik( int accId );
-	virtual void thread();
-	void setSichtbar( bool sichtbar, bool nachRechts );
-	bool tick( double zeit );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getStatus() const;
+    // Konstruktor
+    AccountSpieleUndKarten();
+    // Destruktor
+    ~AccountSpieleUndKarten();
+    // nicht constant
+    void reset();
+    void ladeStatistik( int accId );
+    virtual void thread();
+    void setSichtbar( bool sichtbar, bool nachRechts );
+    bool tick( double zeit );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getStatus() const;
 };
 
 #endif

+ 292 - 294
KSGClient/NachLogin/Account/Statistik/AccountStatistik.cpp

@@ -5,356 +5,354 @@
 
 // Inhalt der AccountStatistik Klasse aus AccountStatistik.h
 // Konstruktor
-AccountStatistik::AccountStatistik( Schrift *zSchrift )
-: Thread(),
-  schrift( zSchrift->getThis() ),
-  statistikF( initFenster( 810, 40, 780, 450, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Statistik von " ) ),
-  sortSpalte( initAuswahlBox( 10, 10, 150, 20, zSchrift, ABSTYLE, { "Name", "Spiele", "Gewonnen", "Verloren", "Punkte", "BW0", "BW1", "BW2", "BW3", "BW4", "BW5" } ) ),
-  sortRichtung( initAuswahlBox( 170, 10, 150, 20, zSchrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-  zurück( initKnopf( 590, 10, 20, 20, 0, 0, "" ) ),
-  vor( initKnopf( 750, 10, 20, 20, 0, 0, "" ) ),
-  seiteTF( initTextFeld( 620, 10, 120, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Seite 0 von 0" ) ),
-  tabelle( initObjTabelle( 10, 40, 760, 400, zSchrift, OTSTYLE, { { "Name", 108, 0, 0 }, { "Spiele", 70, 0, 0 }, { "Gewonnen", 70, 0, 0 },
-  { "Verloren", 70, 0, 0 }, { "Punkte", 70, 0, 0 }, { "BW0", 60, 0, 0 }, { "BW1", 60, 0, 0 }, { "BW2", 60, 0, 0 }, { "BW3", 60, 0, 0 },
-  { "BW4", 60, 0, 0 }, { "BW5", 60, 0, 0 } }, 20 ) ),
-  laden( (Animation2D*)ladeAnimation->dublizieren() ),
-  seite( 0 ),
-  maxSeite( 0 ),
-  status( 0 ),
-  accId( 0 ),
-  animation( 0 ),
-  alpha( 255 ),
-  tickVal( 0 ),
-  rend( 0 )
+AccountStatistik::AccountStatistik()
+    : Thread(),
+    statistikF( initFenster( 810, 40, 780, 450, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Rahmen | Fenster::Style::Erlaubt, "Statistik von " ) ),
+    sortSpalte( initAuswahlBox( 10, 10, 150, 20, ABSTYLE, { "Name", "Spiele", "Gewonnen", "Verloren", "Punkte", "BW0", "BW1", "BW2", "BW3", "BW4", "BW5" } ) ),
+    sortRichtung( initAuswahlBox( 170, 10, 150, 20, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    zurück( initKnopf( 590, 10, 20, 20, 0, "" ) ),
+    vor( initKnopf( 750, 10, 20, 20, 0, "" ) ),
+    seiteTF( initTextFeld( 620, 10, 120, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Seite 0 von 0" ) ),
+    tabelle( initObjTabelle( 10, 40, 760, 400, OTSTYLE, { { "Name", 108, 0, 0 }, { "Spiele", 70, 0, 0 }, { "Gewonnen", 70, 0, 0 },
+    { "Verloren", 70, 0, 0 }, { "Punkte", 70, 0, 0 }, { "BW0", 60, 0, 0 }, { "BW1", 60, 0, 0 }, { "BW2", 60, 0, 0 }, { "BW3", 60, 0, 0 },
+    { "BW4", 60, 0, 0 }, { "BW5", 60, 0, 0 } }, 20 ) ),
+    laden( (Animation2D *)ladeAnimation->dublizieren() ),
+    seite( 0 ),
+    maxSeite( 0 ),
+    status( 0 ),
+    accId( 0 ),
+    animation( 0 ),
+    alpha( 255 ),
+    tickVal( 0 ),
+    rend( 0 )
 {
-	initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", zSchrift, hauptScreen );
-	initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll.", zSchrift, hauptScreen );
-	Bild *zurückB = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
-	Bild *weiterB = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
-	laden->setSichtbar( 0 );
-	laden->setPosition( 365, 200 );
-	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	zurück->setHintergrundBildZ( zurückB );
-	initToolTip( zurück, "Eine Seite zurück blättern.", zSchrift, hauptScreen );
-	vor->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	vor->setHintergrundBildZ( weiterB );
-	initToolTip( vor, "Eine Seite weiter blättern.", zSchrift, hauptScreen );
-	statistikF->addMember( tabelle->getThis() );
-	statistikF->addMember( zurück->getThis() );
-	statistikF->addMember( seiteTF->getThis() );
-	statistikF->addMember( vor->getThis() );
-	statistikF->addMember( sortSpalte->getThis() );
-	statistikF->addMember( sortRichtung->getThis() );
-	statistikF->setMausEreignis( _ret1ME );
-	vor->setMausEreignis( accountStatistikVorME );
-	zurück->setMausEreignis( accountStatistikZurückME );
+    initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll." );
+    initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll." );
+    Bild *zurückB = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
+    Bild *weiterB = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
+    laden->setSichtbar( 0 );
+    laden->setPosition( 365, 200 );
+    zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    zurück->setHintergrundBildZ( zurückB );
+    initToolTip( zurück, "Eine Seite zurück blättern." );
+    vor->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    vor->setHintergrundBildZ( weiterB );
+    initToolTip( vor, "Eine Seite weiter blättern." );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( tabelle->getThis() ) );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( zurück->getThis() ) );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( seiteTF->getThis() ) );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( vor->getThis() ) );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( sortSpalte->getThis() ) );
+    statistikF->addMember( dynamic_cast<Zeichnung *>( sortRichtung->getThis() ) );
+    statistikF->setMausEreignis( _ret1ME );
+    vor->setMausEreignis( accountStatistikVorME );
+    zurück->setMausEreignis( accountStatistikZurückME );
 }
 
 // Destruktor
 AccountStatistik::~AccountStatistik()
 {
-	reset( 1 );
-	statistikF->release();
-	sortSpalte->release();
-	sortRichtung->release();
-	zurück->release();
-	vor->release();
-	seiteTF->release();
-	tabelle->release();
-	laden->release();
-	schrift->release();
+    reset( 1 );
+    statistikF->release();
+    sortSpalte->release();
+    sortRichtung->release();
+    zurück->release();
+    vor->release();
+    seiteTF->release();
+    tabelle->release();
+    laden->release();
 }
 
 // nicht constant
 void AccountStatistik::reset( bool überschrift )
 {
-	statistikF->lockZeichnung();
-	int zAnz = tabelle->getZeilenAnzahl();
-	for( int i = !überschrift; i < zAnz; i++ )
-		tabelle->removeZeile( !überschrift );
-	statistikF->unlockZeichnung();
+    statistikF->lockZeichnung();
+    int zAnz = tabelle->getZeilenAnzahl();
+    for( int i = !überschrift; i < zAnz; i++ )
+        tabelle->removeZeile( !überschrift );
+    statistikF->unlockZeichnung();
 }
 
 void AccountStatistik::ladeStatistik( int accId )
 {
-	if( this->accId == accId )
-		return;
-	this->status = 0;
-	if( run )
-	{
-		warteAufThread( 1000 );
-		ende();
-	}
-	if( ( animation | 0x1 ) == animation )
-	{
-		animation |= 0x4;
-		this->accId = accId;
-		this->status = 1;
-		return;
-	}
-	this->accId = accId;
-	start();
-	this->status = 1;
+    if( this->accId == accId )
+        return;
+    this->status = 0;
+    if( run )
+    {
+        warteAufThread( 1000 );
+        ende();
+    }
+    if( ( animation | 0x1 ) == animation )
+    {
+        animation |= 0x4;
+        this->accId = accId;
+        this->status = 1;
+        return;
+    }
+    this->accId = accId;
+    start();
+    this->status = 1;
 }
 
 void AccountStatistik::thread()
 {
-	laden->setSichtbar( 1 );
-	reset();
-	Text *name = infoClient->getSpielerName( accId );
-	if( name )
-	{
-		name->insert( 0, "Statistik von " );
-		statistikF->setTitel( *name );
-		name->release();
-	}
-	RCArray< Array< int > > *values = new RCArray< Array< int > >();
-	RCArray< Text > *namen = new RCArray< Text >();
-	if( infoClient->getStatistikListe( accId, &seite, &maxSeite, sortSpalte->getAuswahl(), sortRichtung->getAuswahl(), values, namen ) )
-	{
-		statistikF->lockZeichnung();
-		seiteTF->setText( "Seite " );
-		seiteTF->zText()->append( seite );
-		seiteTF->zText()->append( " von " );
-		seiteTF->zText()->append( maxSeite );
-		statistikF->unlockZeichnung();
-		zurück->setStyle( Knopf::Style::Erlaubt, seite > 1 );
-		vor->setStyle( Knopf::Style::Erlaubt, seite < maxSeite );
-		int zAnz = values->getEintragAnzahl();
-		if( zAnz )
-		{
-			int sAnz = values->z( 0 )->getEintragAnzahl();
-			for( int i = 0; i < zAnz; i++ )
-			{
-				if( sAnz )
-				{
-					tabelle->addZeile( Text() += values->z( i )->get( 0 ) );
-					Text *name = namen->z( i );
-					if( name )
-					{
-						TextFeld *tf = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::Center, *name );
-						tabelle->setZeichnungZ( 0, i + 1, tf );
-					}
-				}
-				for( int j = 1; j < sAnz; j++ )
-				{
-					if( j < 1 )
-					{
-						TextFeld *tf = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-						tf->zText()->append( values->z( i )->get( j ) );
-						tabelle->setZeichnungZ( j, i + 1, tf );
-					}
-					if( j > 1 )
-					{
-						TextFeld *tf = initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-						tf->zText()->append( values->z( i )->get( j ) );
-						tabelle->setZeichnungZ( j - 1, i + 1, tf );
-					}
-				}
-			}
-		}
-	}
-	else
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Statistiken dieses Spielers konnten nicht abgerufen werden." ), new Text( "Ok" ) );
-	values->release();
-	namen->release();
-	laden->setSichtbar( 0 );
-	animation &= ~0x4;
-	status = 2;
-	run = 0;
+    laden->setSichtbar( 1 );
+    reset();
+    Text *name = infoClient->getSpielerName( accId );
+    if( name )
+    {
+        name->insert( 0, "Statistik von " );
+        statistikF->setTitel( *name );
+        name->release();
+    }
+    RCArray< Array< int > > *values = new RCArray< Array< int > >();
+    RCArray< Text > *namen = new RCArray< Text >();
+    if( infoClient->getStatistikListe( accId, &seite, &maxSeite, sortSpalte->getAuswahl(), sortRichtung->getAuswahl(), values, namen ) )
+    {
+        statistikF->lockZeichnung();
+        seiteTF->setText( "Seite " );
+        seiteTF->zText()->append( seite );
+        seiteTF->zText()->append( " von " );
+        seiteTF->zText()->append( maxSeite );
+        statistikF->unlockZeichnung();
+        zurück->setStyle( Knopf::Style::Erlaubt, seite > 1 );
+        vor->setStyle( Knopf::Style::Erlaubt, seite < maxSeite );
+        int zAnz = values->getEintragAnzahl();
+        if( zAnz )
+        {
+            int sAnz = values->z( 0 )->getEintragAnzahl();
+            for( int i = 0; i < zAnz; i++ )
+            {
+                if( sAnz )
+                {
+                    tabelle->addZeile( Text() += values->z( i )->get( 0 ) );
+                    Text *name = namen->z( i );
+                    if( name )
+                    {
+                        TextFeld *tf = initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::Center, *name );
+                        tabelle->setZeichnungZ( 0, i + 1, tf );
+                    }
+                }
+                for( int j = 1; j < sAnz; j++ )
+                {
+                    if( j < 1 )
+                    {
+                        TextFeld *tf = initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+                        tf->zText()->append( values->z( i )->get( j ) );
+                        tabelle->setZeichnungZ( j, i + 1, tf );
+                    }
+                    if( j > 1 )
+                    {
+                        TextFeld *tf = initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+                        tf->zText()->append( values->z( i )->get( j ) );
+                        tabelle->setZeichnungZ( j - 1, i + 1, tf );
+                    }
+                }
+            }
+        }
+    }
+    else
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Statistiken dieses Spielers konnten nicht abgerufen werden." ), new Text( "Ok" ) );
+    values->release();
+    namen->release();
+    laden->setSichtbar( 0 );
+    animation &= ~0x4;
+    status = 2;
+    run = 0;
 }
 
 void AccountStatistik::setSichtbar( bool sichtbar, bool nachRechts )
 {
-	if( sichtbar )
-	{
-		if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
-		{
-			if( nachRechts )
-				statistikF->setPosition( -810, 40 );
-			else
-				statistikF->setPosition( 810, 40 );
-		}
-		animation |= 0x1;
-	}
-	else
-		animation &= ~0x1;
-	if( nachRechts )
-		animation |= 0x2;
-	else
-		animation &= ~0x2;
+    if( sichtbar )
+    {
+        if( ( animation | 0x1 ) != animation || ( ( nachRechts && ( animation | 0x2 ) != animation ) || !nachRechts && ( animation | 0x2 ) == animation ) )
+        {
+            if( nachRechts )
+                statistikF->setPosition( -810, 40 );
+            else
+                statistikF->setPosition( 810, 40 );
+        }
+        animation |= 0x1;
+    }
+    else
+        animation &= ~0x1;
+    if( nachRechts )
+        animation |= 0x2;
+    else
+        animation &= ~0x2;
 }
 
 bool AccountStatistik::vorME( MausEreignis &me )
 {
-	if( me.id == ME_RLinks )
-	{
-		seite++;
-		start();
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        seite++;
+        start();
+    }
+    return 1;
 }
 
 bool AccountStatistik::zurückME( MausEreignis &me )
 {
-	if( me.id == ME_RLinks )
-	{
-		seite--;
-		start();
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        seite--;
+        start();
+    }
+    return 1;
 }
 
 bool AccountStatistik::tick( double zeit )
 {
-	statistikF->lockZeichnung();
-	rend |= statistikF->tick( zeit );
-	statistikF->unlockZeichnung();
-	rend |= laden->tick( zeit );
-	tickVal += zeit;
-	int valA = (int)( tickVal * 150 );
-	int valB = (int)( tickVal * 500 );
-	tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( ( animation | 0x4 ) == animation && alpha )
-		{
-			if( alpha - valA <= 0 )
-				alpha = 0;
-			else
-				alpha -= valA;
-			rend = 1;
-			if( !alpha )
-			{
-				reset();
-				start();
-			}
-		}
-		if( ( animation | 0x4 ) != animation && alpha != 255 )
-		{
-			if( alpha + valA >= 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( ( animation | 0x1 ) == animation )
-		{ // Sichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( statistikF->getX() != 10 )
-				{
-					if( statistikF->getX() + valB > 10 )
-						statistikF->setPosition( 10, statistikF->getY() );
-					else
-						statistikF->setPosition( statistikF->getX() + valB, statistikF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( statistikF->getX() != 10 )
-				{
-					if( statistikF->getX() - valB < 10 )
-						statistikF->setPosition( 10, statistikF->getY() );
-					else
-						statistikF->setPosition( statistikF->getX() - valB, statistikF->getY() );
-					rend = 1;
-				}
-			}
-		}
-		else
-		{ // Unsichtbar
-			if( ( animation | 0x2 ) == animation )
-			{ // Nach Rechts
-				if( statistikF->getX() != 810 )
-				{
-					if( statistikF->getX() + valB > 810 )
-						statistikF->setPosition( 810, statistikF->getY() );
-					else
-						statistikF->setPosition( statistikF->getX() + valB, statistikF->getY() );
-					rend = 1;
-				}
-			}
-			else
-			{ // Nach Links
-				if( statistikF->getX() != -810 )
-				{
-					if( statistikF->getX() - valB < -810 )
-						statistikF->setPosition( -810, statistikF->getY() );
-					else
-						statistikF->setPosition( statistikF->getX() - valB, statistikF->getY() );
-					rend = 1;
-				}
-			}
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    statistikF->lockZeichnung();
+    rend |= statistikF->tick( zeit );
+    statistikF->unlockZeichnung();
+    rend |= laden->tick( zeit );
+    tickVal += zeit;
+    int valA = (int)( tickVal * 150 );
+    int valB = (int)( tickVal * 500 );
+    tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( ( animation | 0x4 ) == animation && alpha )
+        {
+            if( alpha - valA <= 0 )
+                alpha = 0;
+            else
+                alpha -= valA;
+            rend = 1;
+            if( !alpha )
+            {
+                reset();
+                start();
+            }
+        }
+        if( ( animation | 0x4 ) != animation && alpha != 255 )
+        {
+            if( alpha + valA >= 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( ( animation | 0x1 ) == animation )
+        { // Sichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( statistikF->getX() != 10 )
+                {
+                    if( statistikF->getX() + valB > 10 )
+                        statistikF->setPosition( 10, statistikF->getY() );
+                    else
+                        statistikF->setPosition( statistikF->getX() + valB, statistikF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( statistikF->getX() != 10 )
+                {
+                    if( statistikF->getX() - valB < 10 )
+                        statistikF->setPosition( 10, statistikF->getY() );
+                    else
+                        statistikF->setPosition( statistikF->getX() - valB, statistikF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+        else
+        { // Unsichtbar
+            if( ( animation | 0x2 ) == animation )
+            { // Nach Rechts
+                if( statistikF->getX() != 810 )
+                {
+                    if( statistikF->getX() + valB > 810 )
+                        statistikF->setPosition( 810, statistikF->getY() );
+                    else
+                        statistikF->setPosition( statistikF->getX() + valB, statistikF->getY() );
+                    rend = 1;
+                }
+            }
+            else
+            { // Nach Links
+                if( statistikF->getX() != -810 )
+                {
+                    if( statistikF->getX() - valB < -810 )
+                        statistikF->setPosition( -810, statistikF->getY() );
+                    else
+                        statistikF->setPosition( statistikF->getX() - valB, statistikF->getY() );
+                    rend = 1;
+                }
+            }
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountStatistik::doPublicMausEreignis( MausEreignis &me )
 {
-	if( run )
-		return;
-	bool starten = 0;
-	int sortSpalteS = sortSpalte->getAuswahl();
-	int sortRichtungS = sortRichtung->getAuswahl();
-	statistikF->lockZeichnung();
-	statistikF->doPublicMausEreignis( me );
-	statistikF->unlockZeichnung();
-	if( sortSpalte->getAuswahl() != sortSpalteS )
-	{
-		sortSpalte->einklappen();
-		starten = 1;
-	}
-	if( sortRichtung->getAuswahl() != sortRichtungS )
-	{
-		sortRichtung->einklappen();
-		starten = 1;
-	}
-	if( starten )
-		start();
+    if( run )
+        return;
+    bool starten = 0;
+    int sortSpalteS = sortSpalte->getAuswahl();
+    int sortRichtungS = sortRichtung->getAuswahl();
+    statistikF->lockZeichnung();
+    statistikF->doPublicMausEreignis( me );
+    statistikF->unlockZeichnung();
+    if( sortSpalte->getAuswahl() != sortSpalteS )
+    {
+        sortSpalte->einklappen();
+        starten = 1;
+    }
+    if( sortRichtung->getAuswahl() != sortRichtungS )
+    {
+        sortRichtung->einklappen();
+        starten = 1;
+    }
+    if( starten )
+        start();
 }
 
 void AccountStatistik::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	statistikF->lockZeichnung();
-	statistikF->render( zRObj );
-	statistikF->unlockZeichnung();
-	if( !zRObj.setDrawOptions( statistikF->getPosition(), statistikF->getSize() ) )
-	{
-		zRObj.releaseAlpha();
-		return;
-	}
-	laden->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    zRObj.setAlpha( alpha );
+    statistikF->lockZeichnung();
+    statistikF->render( zRObj );
+    statistikF->unlockZeichnung();
+    if( !zRObj.setDrawOptions( statistikF->getPosition(), statistikF->getSize() ) )
+    {
+        zRObj.releaseAlpha();
+        return;
+    }
+    laden->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int AccountStatistik::getStatus() const
 {
-	return status;
+    return status;
 }
 
 
 // Ereignisse
 bool accountStatistikVorME( void *p, void *o, MausEreignis me )
 {
-	if( p )
-		return ( (AccountStatistik*)p )->vorME( me );
-	return 1;
+    if( p )
+        return ( (AccountStatistik *)p )->vorME( me );
+    return 1;
 }
 
 bool accountStatistikZurückME( void *p, void *o, MausEreignis me )
 {
-	if( p )
-		return ( (AccountStatistik*)p )->zurückME( me );
-	return 1;
+    if( p )
+        return ( (AccountStatistik *)p )->zurückME( me );
+    return 1;
 }

+ 32 - 33
KSGClient/NachLogin/Account/Statistik/AccountStatistik.h

@@ -12,41 +12,40 @@ using namespace Framework;
 class AccountStatistik : public Thread
 {
 private:
-	Schrift *schrift;
-	Fenster *statistikF;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	Knopf *zurück;
-	Knopf *vor;
-	TextFeld *seiteTF;
-	ObjTabelle *tabelle;
-	Animation2D *laden;
-	int seite;
-	int maxSeite;
-	int status;
-	int accId;
-	int animation;
-	unsigned char alpha;
-	double tickVal;
-	bool rend;
+    Fenster *statistikF;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    Knopf *zurück;
+    Knopf *vor;
+    TextFeld *seiteTF;
+    ObjTabelle *tabelle;
+    Animation2D *laden;
+    int seite;
+    int maxSeite;
+    int status;
+    int accId;
+    int animation;
+    unsigned char alpha;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	AccountStatistik( Schrift *zSchrift );
-	// Destruktor
-	~AccountStatistik();
-	// nicht constant
-	void reset( bool überschrift = 0 );
-	void ladeStatistik( int accId );
-	virtual void thread();
-	void setSichtbar( bool sichtbar, bool nachRechts );
-	bool vorME( MausEreignis &me );
-	bool zurückME( MausEreignis &me );
-	bool tick( double zeit );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	int getStatus() const;
+    // Konstruktor
+    AccountStatistik();
+    // Destruktor
+    ~AccountStatistik();
+    // nicht constant
+    void reset( bool überschrift = 0 );
+    void ladeStatistik( int accId );
+    virtual void thread();
+    void setSichtbar( bool sichtbar, bool nachRechts );
+    bool vorME( MausEreignis &me );
+    bool zurückME( MausEreignis &me );
+    bool tick( double zeit );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    int getStatus() const;
 };
 
 // Ereignisse

+ 231 - 245
KSGClient/NachLogin/Account/Suchen/AccountSuchen.cpp

@@ -6,59 +6,57 @@
 
 // Inhalt der AccountSuchen Klasse aud AccountSuchen.h
 // Konstruktor
-AccountSuchen::AccountSuchen( Schrift *schrift )
-	: Thread(),
-  schrift( schrift ),
-  pos( 810, 0 ),
-  gr( 800, 500 ),
-  laden( (Animation2D*)ladeAnimation->dublizieren() ),
-  accountName( initTextFeld( 10, 10, 200, 20, schrift, TextFeld::Style::TextFeld, "Spieler Suchen" ) ),
-  suchen( initKnopf( 220, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Suchen" ) ),
-  sortSpalte( initAuswahlBox( 330, 10, 150, 20, schrift, ABSTYLE, { "Name", "Zuletzt Online", "Letztes Spiel", "Letzte Karte", "Spielart Punkte" } ) ),
-  sortRichtung( initAuswahlBox( 490, 10, 120, 20, schrift, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
-  zurück( initKnopf( 620, 10, 20, 20, 0, 0, "" ) ),
-  seite( initTextFeld( 645, 10, 120, 20, schrift, TextFeld::Style::Text | TextFeld::Style::Center, "Seite 0 von 0" ) ),
-  vor( initKnopf( 770, 10, 20, 20, 0, 0, "" ) ),
-  liste( initObjTabelle( 10, 40, 780, 450, schrift, OTSTYLE, { { "Name", 158, 0, 0 }, { "Zuletzt Online", 150, 0, 0 }, { "Letztes Spiel", 145, 0, 0 }, { "Letzte Karte", 150, 0, 0 }, { "Spielart Punkte", 150, 0, 0 } }, 30 ) ),
-  auswahl( 0 ),
-  tickVal( 0 ),
-  sichtbar( 0 ),
-  jetztSeite( 0 ),
-  maxSeite( 0 ),
-  alpha( 255 ),
-  rend( 0 )
+AccountSuchen::AccountSuchen()
+    : Thread(),
+    pos( 810, 0 ),
+    gr( 800, 500 ),
+    laden( (Animation2D *)ladeAnimation->dublizieren() ),
+    accountName( initTextFeld( 10, 10, 200, 20, TextFeld::Style::TextFeld, "Spieler Suchen" ) ),
+    suchen( initKnopf( 220, 10, 100, 20, Knopf::Style::Sichtbar, "Suchen" ) ),
+    sortSpalte( initAuswahlBox( 330, 10, 150, 20, ABSTYLE, { "Name", "Zuletzt Online", "Letztes Spiel", "Letzte Karte", "Spielart Punkte" } ) ),
+    sortRichtung( initAuswahlBox( 490, 10, 120, 20, ABSTYLE, { "Aufwärts", "Abwärts" } ) ),
+    zurück( initKnopf( 620, 10, 20, 20, 0, "" ) ),
+    seite( initTextFeld( 645, 10, 120, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Seite 0 von 0" ) ),
+    vor( initKnopf( 770, 10, 20, 20, 0, "" ) ),
+    liste( initObjTabelle( 10, 40, 780, 450, OTSTYLE, { { "Name", 158, 0, 0 }, { "Zuletzt Online", 150, 0, 0 }, { "Letztes Spiel", 145, 0, 0 }, { "Letzte Karte", 150, 0, 0 }, { "Spielart Punkte", 150, 0, 0 } }, 30 ) ),
+    auswahl( 0 ),
+    tickVal( 0 ),
+    sichtbar( 0 ),
+    jetztSeite( 0 ),
+    maxSeite( 0 ),
+    alpha( 255 ),
+    rend( 0 )
 {
-	initToolTip( accountName, "Gebe den Namen eines Spielers ein.", schrift, hauptScreen );
-	initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll.", schrift, hauptScreen );
-	initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll.", schrift, hauptScreen );
-	Bild *zurückB = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
-	Bild *weiterB = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
-	laden->setSichtbar( 0 );
-	laden->setPosition( 375, 225 );
-	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	zurück->setHintergrundBildZ( zurückB );
-	initToolTip( zurück, "Eine Seite zurück blättern.", schrift, hauptScreen );
-	vor->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	vor->setHintergrundBildZ( weiterB );
-	initToolTip( vor, "Eine Seite weiter blättern.", schrift, hauptScreen );
-	liste->addSpalte( "Weiter" );
-	liste->setSpaltenBreite( "Weiter", 20 );
+    initToolTip( accountName, "Gebe den Namen eines Spielers ein." );
+    initToolTip( sortSpalte, "Wähle aus, nach welcher Spalte die\nTabelle sortiert werden soll." );
+    initToolTip( sortRichtung, "Wähle aus, ob Aufwärts oder Abwärts\nsortiert werden soll." );
+    Bild *zurückB = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
+    Bild *weiterB = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
+    laden->setSichtbar( 0 );
+    laden->setPosition( 375, 225 );
+    zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    zurück->setHintergrundBildZ( zurückB );
+    initToolTip( zurück, "Eine Seite zurück blättern." );
+    vor->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    vor->setHintergrundBildZ( weiterB );
+    initToolTip( vor, "Eine Seite weiter blättern." );
+    liste->addSpalte( "Weiter" );
+    liste->setSpaltenBreite( "Weiter", 20 );
 }
 
 // Destruktor
 AccountSuchen::~AccountSuchen()
 {
-	schrift->release();
-	laden->release();
-	accountName->release();
-	suchen->release();
-	sortSpalte->release();
-	sortRichtung->release();
-	zurück->release();
-	seite->release();
-	vor->release();
-	tabelleLehren( 1 );
-	liste->release();
+    laden->release();
+    accountName->release();
+    suchen->release();
+    sortSpalte->release();
+    sortRichtung->release();
+    zurück->release();
+    seite->release();
+    vor->release();
+    tabelleLehren( 1 );
+    liste->release();
 }
 
 // privat
@@ -74,241 +72,229 @@ void AccountSuchen::unlock()
 
 void AccountSuchen::tabelleLehren( bool überschrift )
 {
-	lock();
-	int zAnz = liste->getZeilenAnzahl();
-	for( int i = !überschrift; i < zAnz; i++ )
-		liste->removeZeile( !überschrift );
-	unlock();
+    lock();
+    int zAnz = liste->getZeilenAnzahl();
+    for( int i = !überschrift; i < zAnz; i++ )
+        liste->removeZeile( !überschrift );
+    unlock();
 }
 
 // nicht constant
 void AccountSuchen::setSichtbar( bool sichtbar )
 {
-	this->sichtbar = sichtbar;
+    this->sichtbar = sichtbar;
 }
 
 void AccountSuchen::thread()
 {
-	laden->setSichtbar( 1 );
-	tabelleLehren( 0 );
-	Array< KSGClient::AccountInfo > info;
-	int anz = infoClient->getSpielerListe( accountName->zText()->getText(), &jetztSeite, &maxSeite, sortSpalte->getAuswahl(),
-										   sortRichtung->getAuswahl(), &info );
-	zurück->setStyle( Knopf::Style::Erlaubt, jetztSeite > 1 );
-	vor->setStyle( Knopf::Style::Erlaubt, jetztSeite < maxSeite );
-	lock();
-	seite->setText( "Seite " );
-	seite->zText()->append( jetztSeite );
-	seite->zText()->append( " von " );
-	seite->zText()->append( maxSeite );
-	unlock();
-	for( int i = 0; i < anz; i++ )
-	{
+    laden->setSichtbar( 1 );
+    tabelleLehren( 0 );
+    Array< KSGClient::AccountInfo > info;
+    int anz = infoClient->getSpielerListe( accountName->zText()->getText(), &jetztSeite, &maxSeite, sortSpalte->getAuswahl(),
+                                           sortRichtung->getAuswahl(), &info );
+    zurück->setStyle( Knopf::Style::Erlaubt, jetztSeite > 1 );
+    vor->setStyle( Knopf::Style::Erlaubt, jetztSeite < maxSeite );
+    lock();
+    seite->setText( "Seite " );
+    seite->zText()->append( jetztSeite );
+    seite->zText()->append( " von " );
+    seite->zText()->append( maxSeite );
+    unlock();
+    for( int i = 0; i < anz; i++ )
+    {
         KSGClient::AccountInfo inf = info.get( i );
-		liste->addZeile( i + 1, Text() += inf.id );
-		liste->setZeilenHeight( i + 1, 20 );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Name" ), i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.name ) );
-		if( inf.zuletztOnline.hat( '.' ) )
-			inf.zuletztOnline.setText( inf.zuletztOnline.getTeilText( 0, inf.zuletztOnline.positionVon( '.' ) ) );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Zuletzt Online" ), i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.zuletztOnline ) );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Letztes Spiel" ), i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.letztesSpiel ) );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Letzte Karte" ), i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.letzteKarte ) );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Spielart Punkte" ), i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.punkte ) );
-		Knopf *details = initKnopf( 0, 0, 20, 20, 0, 0, "" );
-		details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer | Knopf::Style::Erlaubt );
-		details->setMausEreignisParameter( this );
-		details->setMausEreignis( accountSuchenDetailsKlick );
-		details->setHintergrundBildZ( vor->getHintergrundBild() );
-		liste->setZeichnungZ( liste->getSpaltenNummer( "Weiter" ), i + 1, details );
-	}
-	laden->setSichtbar( 0 );
-	run = 0;
+        liste->addZeile( i + 1, Text() += inf.id );
+        liste->setZeilenHeight( i + 1, 20 );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Name" ), i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.name ) );
+        if( inf.zuletztOnline.hat( '.' ) )
+            inf.zuletztOnline.setText( inf.zuletztOnline.getTeilText( 0, inf.zuletztOnline.positionVon( '.' ) ) );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Zuletzt Online" ), i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.zuletztOnline ) );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Letztes Spiel" ), i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.letztesSpiel ) );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Letzte Karte" ), i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.letzteKarte ) );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Spielart Punkte" ), i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, inf.punkte ) );
+        Knopf *details = initKnopf( 0, 0, 20, 20, 0, "" );
+        details->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer | Knopf::Style::Erlaubt );
+        details->setMausEreignisParameter( this );
+        details->setMausEreignis( accountSuchenDetailsKlick );
+        details->setHintergrundBildZ( vor->getHintergrundBild() );
+        liste->setZeichnungZ( liste->getSpaltenNummer( "Weiter" ), i + 1, details );
+    }
+    laden->setSichtbar( 0 );
+    run = 0;
 }
 
 bool AccountSuchen::detailsKlick( Knopf *zKnopf, MausEreignis &me )
 {
-	if( me.id != ME_RLinks )
-		return 1;
-	int zAnz = liste->getZeilenAnzahl();
-	for( int i = 1; i < zAnz; i++ )
-	{
-		if( liste->zZeichnung( liste->getSpaltenNummer( "Weiter" ), i ) == zKnopf )
-		{
-			auswahl = *liste->zZeilenName( i );
-			break;
-		}
-	}
-	return 1;
+    if( me.id != ME_RLinks )
+        return 1;
+    int zAnz = liste->getZeilenAnzahl();
+    for( int i = 1; i < zAnz; i++ )
+    {
+        if( liste->zZeichnung( liste->getSpaltenNummer( "Weiter" ), i ) == zKnopf )
+        {
+            auswahl = *liste->zZeilenName( i );
+            break;
+        }
+    }
+    return 1;
 }
 
 void AccountSuchen::doPublicMausEreignis( MausEreignis &me )
 {
-	if( run )
-		return;
-	bool starten = 0;
-	lock();
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	int ausw = sortSpalte->getAuswahl();
-	sortSpalte->doPublicMausEreignis( me );
-	if( ausw != sortSpalte->getAuswahl() )
-	{
-		sortSpalte->einklappen();
-		starten = 1;
-	}
-	ausw = sortRichtung->getAuswahl();
-	sortRichtung->doPublicMausEreignis( me );
-	if( ausw != sortRichtung->getAuswahl() )
-	{
-		sortRichtung->einklappen();
-		starten = 1;
-	}
-	accountName->doPublicMausEreignis( me );
-	bool vera = me.verarbeitet;
-	suchen->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet && me.id == ME_RLinks )
-	{
-		jetztSeite = 1;
-		starten = 1;
-	}
-	vera = me.verarbeitet;
-	zurück->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		seite--;
-		starten = 1;
-	}
-	vera = me.verarbeitet;
-	vor->doPublicMausEreignis( me );
-	if( !vera && me.verarbeitet )
-	{
-		seite++;
-		starten = 1;
-	}
-	liste->doPublicMausEreignis( me );
-	me.mx += pos.x;
-	me.my += pos.y;
-	unlock();
-	if( starten )
-		start();
+    if( run )
+        return;
+    bool starten = 0;
+    lock();
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    int ausw = sortSpalte->getAuswahl();
+    sortSpalte->doPublicMausEreignis( me );
+    if( ausw != sortSpalte->getAuswahl() )
+    {
+        sortSpalte->einklappen();
+        starten = 1;
+    }
+    ausw = sortRichtung->getAuswahl();
+    sortRichtung->doPublicMausEreignis( me );
+    if( ausw != sortRichtung->getAuswahl() )
+    {
+        sortRichtung->einklappen();
+        starten = 1;
+    }
+    accountName->doPublicMausEreignis( me );
+    bool vera = me.verarbeitet;
+    suchen->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
+    {
+        jetztSeite = 1;
+        starten = 1;
+    }
+    vera = me.verarbeitet;
+    zurück->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        seite--;
+        starten = 1;
+    }
+    vera = me.verarbeitet;
+    vor->doPublicMausEreignis( me );
+    if( !vera && me.verarbeitet )
+    {
+        seite++;
+        starten = 1;
+    }
+    liste->doPublicMausEreignis( me );
+    me.mx += pos.x;
+    me.my += pos.y;
+    unlock();
+    if( starten )
+        start();
 }
 
 void AccountSuchen::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( run )
-		return;
-	lock();
-	bool vera = te.verarbeitet;
-	accountName->doTastaturEreignis( te );
-	if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
-	{
-		jetztSeite = 1;
-		start();
-	}
-	unlock();
+    if( run )
+        return;
+    lock();
+    bool vera = te.verarbeitet;
+    accountName->doTastaturEreignis( te );
+    if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
+    {
+        jetztSeite = 1;
+        start();
+    }
+    unlock();
 }
 
 bool AccountSuchen::tick( double tickVal )
 {
-	lock();
-	rend |= laden->tick( tickVal );
-	rend |= accountName->tick( tickVal );
-	rend |= suchen->tick( tickVal );
-	rend |= sortSpalte->tick( tickVal );
-	rend |= sortRichtung->tick( tickVal );
-	rend |= zurück->tick( tickVal );
-	rend |= seite->tick( tickVal );
-	rend |= vor->tick( tickVal );
-	rend |= liste->tick( tickVal );
-	this->tickVal += tickVal;
-	int valA = (int)( this->tickVal * 150 );
-	int valB = (int)( this->tickVal * 500 );
-	this->tickVal -= valA / 150.0;
-	if( valA )
-	{
-		if( laden->istSichtbar() && alpha != 100 )
-		{
-			if( alpha - valA < 100 )
-				alpha = 100;
-			else
-				alpha -= valA;
-			rend = 1;
-		}
-		if( !laden->istSichtbar() && alpha != 255 )
-		{
-			if( alpha + valA > 255 )
-				alpha = 255;
-			else
-				alpha += valA;
-			rend = 1;
-		}
-	}
-	if( valB )
-	{
-		if( sichtbar && pos.x != 0 )
-		{
-			if( pos.x + valB > 0 )
-				pos.x = 0;
-			else
-				pos.x += valB;
-			rend = 1;
-		}
-		else if( !sichtbar && pos.x != -810 )
-		{
-			if( pos.x - valB < -810 )
-				pos.x = -810;
-			else
-				pos.x -= valB;
-			rend = 1;
-		}
-	}
-	unlock();
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    lock();
+    rend |= laden->tick( tickVal );
+    rend |= accountName->tick( tickVal );
+    rend |= suchen->tick( tickVal );
+    rend |= sortSpalte->tick( tickVal );
+    rend |= sortRichtung->tick( tickVal );
+    rend |= zurück->tick( tickVal );
+    rend |= seite->tick( tickVal );
+    rend |= vor->tick( tickVal );
+    rend |= liste->tick( tickVal );
+    this->tickVal += tickVal;
+    int valA = (int)( this->tickVal * 150 );
+    int valB = (int)( this->tickVal * 500 );
+    this->tickVal -= valA / 150.0;
+    if( valA )
+    {
+        if( laden->istSichtbar() && alpha != 100 )
+        {
+            if( alpha - valA < 100 )
+                alpha = 100;
+            else
+                alpha -= valA;
+            rend = 1;
+        }
+        if( !laden->istSichtbar() && alpha != 255 )
+        {
+            if( alpha + valA > 255 )
+                alpha = 255;
+            else
+                alpha += valA;
+            rend = 1;
+        }
+    }
+    if( valB )
+    {
+        if( sichtbar && pos.x != 0 )
+        {
+            if( pos.x + valB > 0 )
+                pos.x = 0;
+            else
+                pos.x += valB;
+            rend = 1;
+        }
+        else if( !sichtbar && pos.x != -810 )
+        {
+            if( pos.x - valB < -810 )
+                pos.x = -810;
+            else
+                pos.x -= valB;
+            rend = 1;
+        }
+    }
+    unlock();
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void AccountSuchen::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	lock();
-	laden->render( zRObj );
-	accountName->render( zRObj );
-	suchen->render( zRObj );
-	zurück->render( zRObj );
-	seite->render( zRObj );
-	vor->render( zRObj );
-	liste->render( zRObj );
-	sortSpalte->render( zRObj );
-	sortRichtung->render( zRObj );
-	unlock();
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    lock();
+    laden->render( zRObj );
+    accountName->render( zRObj );
+    suchen->render( zRObj );
+    zurück->render( zRObj );
+    seite->render( zRObj );
+    vor->render( zRObj );
+    liste->render( zRObj );
+    sortSpalte->render( zRObj );
+    sortRichtung->render( zRObj );
+    unlock();
+    zRObj.releaseDrawOptions();
 }
 
 int AccountSuchen::getAuswahlAccountId()
 {
-	int ret = auswahl;
-	auswahl = 0;
-	return ret;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *AccountSuchen::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 1000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
+    int ret = auswahl;
+    auswahl = 0;
+    return ret;
 }
 
 // Nachrichten
 bool accountSuchenDetailsKlick( void *p, void *obj, MausEreignis me )
 {
-	if( p )
-		return ( (AccountSuchen*)p )->detailsKlick( (Knopf*)obj, me );
-	return 1;
+    if( p )
+        return ( (AccountSuchen *)p )->detailsKlick( (Knopf *)obj, me );
+    return 1;
 }

+ 36 - 39
KSGClient/NachLogin/Account/Suchen/AccountSuchen.h

@@ -12,47 +12,44 @@ using namespace Framework;
 class AccountSuchen : public Thread
 {
 private:
-	Schrift *schrift;
-	Punkt pos;
-	Punkt gr;
-	Animation2D *laden;
-	TextFeld *accountName;
-	Knopf *suchen;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	Knopf *zurück;
-	TextFeld *seite;
-	Knopf *vor;
-	ObjTabelle *liste;
-	Critical cs;
-	int auswahl;
-	double tickVal;
-	bool sichtbar;
-	int jetztSeite;
-	int maxSeite;
-	unsigned char alpha;
-	bool rend;
-	// privat
-	void lock();
-	void unlock();
-	void tabelleLehren( bool überschrift );
+    Punkt pos;
+    Punkt gr;
+    Animation2D *laden;
+    TextFeld *accountName;
+    Knopf *suchen;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    Knopf *zurück;
+    TextFeld *seite;
+    Knopf *vor;
+    ObjTabelle *liste;
+    Critical cs;
+    int auswahl;
+    double tickVal;
+    bool sichtbar;
+    int jetztSeite;
+    int maxSeite;
+    unsigned char alpha;
+    bool rend;
+    // privat
+    void lock();
+    void unlock();
+    void tabelleLehren( bool überschrift );
 
 public:
-	// Konstruktor
-	AccountSuchen( Schrift *schrift );
-	// Destruktor
-	~AccountSuchen();
-	// nicht constant
-	void setSichtbar( bool sichtbar );
-	void thread();
-	bool detailsKlick( Knopf *zKnopf, MausEreignis &me );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	int getAuswahlAccountId();
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    AccountSuchen();
+    // Destruktor
+    ~AccountSuchen();
+    // nicht constant
+    void setSichtbar( bool sichtbar );
+    void thread();
+    bool detailsKlick( Knopf *zKnopf, MausEreignis &me );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    int getAuswahlAccountId();
 };
 
 // Nachrichten

+ 74 - 138
KSGClient/NachLogin/Chat/ChatLeiste.cpp

@@ -14,7 +14,8 @@ typedef GSL::GSLDateiV *( *GetGSLDatei )( );
 
 // Inhalt der Chat Klasse aus ChatLeiste.h
 // Konstruktor
-Chat::Chat( Schrift *zSchrift )
+Chat::Chat()
+    : ReferenceCounter()
 {
     Bild *minimierenBild = bilder->get( "data/client/bilder/chat.ltdb/minimieren.png" );
     Bild *closeBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
@@ -22,21 +23,21 @@ Chat::Chat( Schrift *zSchrift )
     rahmen->setAlpha( 1 );
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
-    verlauf = initTextFeld( 7, 7, 184, 210, zSchrift, TextFeld::Style::TextGebiet, "" );
+    verlauf = initTextFeld( 7, 7, 184, 210, TextFeld::Style::TextGebiet, "" );
     verlauf->removeStyle( TextFeld::Style::Erlaubt );
     verlauf->updateVScroll();
-    nachricht = initTextFeld( 1, 220, 198, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( nachricht, "Nachricht senden.", zSchrift, hauptScreen );
-    name = initTextFeld( 1, 250, 198, 29, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "" );
-    minimieren = initKnopf( 159, 255, 20, 20, 0, 0, "" );
+    nachricht = initTextFeld( 1, 220, 198, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( nachricht, "Nachricht senden." );
+    name = initTextFeld( 1, 250, 198, 29, TextFeld::Style::Text | TextFeld::Style::VCenter, "" );
+    minimieren = initKnopf( 159, 255, 20, 20, 0, "" );
     minimieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     minimieren->setHintergrundBildZ( minimierenBild );
-    initToolTip( minimieren, "Fenster einklappen.", zSchrift, hauptScreen );
-    close = initKnopf( 179, 255, 20, 20, 0, 0, "" );
+    initToolTip( minimieren, "Fenster einklappen." );
+    close = initKnopf( 179, 255, 20, 20, 0, "" );
     close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     close->setHintergrundBildZ( closeBild );
-    initToolTip( close, "Fenster schließen.", zSchrift, hauptScreen );
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    initToolTip( close, "Fenster schließen." );
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     admin = 0;
     tickVal = 0;
     sichtbar = 1;
@@ -62,7 +63,6 @@ Chat::Chat( Schrift *zSchrift )
         if( !msgSound )
             Framework::getDLLRegister()->releaseDLL( "GSL.dll" );
     }
-    ref = 1;
 }
 
 // Destruktor
@@ -104,11 +104,11 @@ void Chat::addNachricht( char *txt )
         msgSound->setVolume( (int)( ( sound / 100.0 ) * 0xFFFF ), (int)( ( sound / 100.0 ) * 0xFFFF ) );
         msgSound->playSound();
     }
-    Text * n = new Text( txt );
+    Text *n = new Text( txt );
     verlauf->zTextRenderer()->textFormatieren( n, verlauf->getBreite() - 20 );
     if( n->getText()[ n->getLength() - 1 ] != '\n' )
         n->append( "\n" );
-    verlauf->zText()->append( n->getThis() );
+    verlauf->zText()->append( dynamic_cast<Text *>( n->getThis() ) );
     verlauf->setSchriftFarbe( verlauf->zText()->getLength() - n->getLength(), verlauf->zText()->getLength(), 0xFFFFFFFF );
     n->release();
     if( animation != 4 )
@@ -139,17 +139,17 @@ bool Chat::tick( double tickVal )
     return 0;
 }
 
-void Chat::doPublicMausEreignis( MausEreignis & me )
+void Chat::doPublicMausEreignis( MausEreignis &me )
 {
     // virtual
 }
 
-void Chat::doTastaturEreignis( TastaturEreignis & te )
+void Chat::doTastaturEreignis( TastaturEreignis &te )
 {
     // virtual
 }
 
-void Chat::render( int x, Bild & zRObj )
+void Chat::render( int x, Bild &zRObj )
 {
     // virtual
 }
@@ -157,7 +157,7 @@ void Chat::render( int x, Bild & zRObj )
 // constant
 TextFeld *Chat::getName() const
 {
-    return (TextFeld *)name->getThis();
+    return dynamic_cast<TextFeld *>( name->getThis() );
 }
 
 TextFeld *Chat::zName() const
@@ -187,23 +187,10 @@ bool Chat::istSichtbar() const
     return sichtbar;
 }
 
-// Reference Counting
-void *Chat::getThis()
-{
-    // virtual
-    return 0;
-}
-
-void *Chat::release()
-{
-    // virtual
-    return 0;
-}
-
 // Inhalt der ChatFenster Klasse aus ChatLeiste.h
 // Konstruktor
-ChatFenster::ChatFenster( Schrift * zSchrift, int accountId )
-    : Chat( zSchrift )
+ChatFenster::ChatFenster( int accountId )
+    : Chat()
 {
     this->accountId = accountId;
     name->setTextZ( infoClient->getSpielerName( accountId ) );
@@ -302,7 +289,7 @@ bool ChatFenster::tick( double tickVal )
     return ret;
 }
 
-void ChatFenster::doPublicMausEreignis( MausEreignis & me )
+void ChatFenster::doPublicMausEreignis( MausEreignis &me )
 {
     bool tmp = me.verarbeitet;
     if( me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation )
@@ -322,7 +309,7 @@ void ChatFenster::doPublicMausEreignis( MausEreignis & me )
     }
     if( !aktion && !sichtbar && !vera )
     {
-        if( me.mx < breite &&me.mx > 0 && me.my > 250 && me.my < 280 )
+        if( me.mx < breite && me.mx > 0 && me.my > 250 && me.my < 280 )
             aktion = 3;
     }
     switch( aktion )
@@ -342,7 +329,7 @@ void ChatFenster::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void ChatFenster::doTastaturEreignis( TastaturEreignis & te )
+void ChatFenster::doTastaturEreignis( TastaturEreignis &te )
 {
     bool tmp = te.verarbeitet;
     if( animation )
@@ -381,7 +368,7 @@ void ChatFenster::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void ChatFenster::render( int xPos, Bild & zRObj )
+void ChatFenster::render( int xPos, Bild &zRObj )
 {
     int x = xPos;
     int y = 280 - höhe;
@@ -407,34 +394,19 @@ int ChatFenster::getAccountId() const
     return accountId;
 }
 
-// Reference Counting
-void *ChatFenster::getThis()
-{
-    ref++;
-    return this;
-}
-
-void *ChatFenster::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der ChatroomFenster Klasse aus ChatLeiste.h
 // Konstruktor
-ChatroomFenster::ChatroomFenster( Schrift * zSchrift, int chatroomId )
-    : Chat( zSchrift )
+ChatroomFenster::ChatroomFenster( int chatroomId )
+    : Chat()
 {
     Bild *maximierenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
     this->chatroomId = chatroomId;
-    spielerName = initTextFeld( 200, 5, 120, 0, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( spielerName, "Name des Spielers der eingeladen werden soll.", zSchrift, hauptScreen );
-    einladen = initKnopf( 325, 5, 20, 0, 0, 0, "" );
+    spielerName = initTextFeld( 200, 5, 120, 0, TextFeld::Style::TextFeld, "" );
+    initToolTip( spielerName, "Name des Spielers der eingeladen werden soll." );
+    einladen = initKnopf( 325, 5, 20, 0, 0, "" );
     einladen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     einladen->setHintergrundBildZ( maximierenBild );
-    initToolTip( einladen, "Spieler ins Chatroom einladen.", zSchrift, hauptScreen );
+    initToolTip( einladen, "Spieler ins Chatroom einladen." );
     spieler = new ObjTabelle();
     spieler->setMausEreignis( _ret1ME );
     spieler->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::VScroll | ObjTabelle::Style::Raster );
@@ -449,7 +421,6 @@ ChatroomFenster::ChatroomFenster( Schrift * zSchrift, int chatroomId )
     spieler->setSpaltenBreite( 0, 110 );
     spieler->setSpaltenBreite( 1, 20 );
     spieler->setSpaltenBreite( 2, 0 );
-    schrift = zSchrift->getThis();
     name->setTextZ( infoClient->getChatroomName( chatroomId ) );
     close->setPosition( close->getX() + 150, close->getY() );
     minimieren->setPosition( minimieren->getX() + 150, minimieren->getY() );
@@ -463,9 +434,8 @@ ChatroomFenster::ChatroomFenster( Schrift * zSchrift, int chatroomId )
 ChatroomFenster::~ChatroomFenster()
 {
     chatClient->chatroomVerlassen( chatroomId );
-    schrift = schrift->release();
-    neueSpieler = neueSpieler->release();
-    alteSpieler = alteSpieler->release();
+    neueSpieler->release();
+    alteSpieler->release();
     spieler = (ObjTabelle *)spieler->release();
     spielerName = (TextFeld *)spielerName->release();
     einladen = (Knopf *)einladen->release();
@@ -478,31 +448,31 @@ void ChatroomFenster::addSpieler( int accountId )
     zeile->append( accountId );
     if( spieler->getZeilenNummer( zeile->getText() ) >= 0 )
         return;
-    Bild * einladenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
-    Bild * closeBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
+    Bild *einladenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
+    Bild *closeBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
     spieler->addZeile( zeile->getText() );
     spieler->setZeilenHeight( zeile->getText(), 0 );
-    Text * name = infoClient->getSpielerName( accountId );
-    TextFeld * sName = initTextFeld( 0, 0, 110, 20, schrift, TextFeld::Style::Sichtbar | TextFeld::Style::Text | TextFeld::Style::Center, name->getText() );
-    name = name->release();
+    Text *name = infoClient->getSpielerName( accountId );
+    TextFeld *sName = initTextFeld( 0, 0, 110, 20, TextFeld::Style::Sichtbar | TextFeld::Style::Text | TextFeld::Style::Center, name->getText() );
+    name->release();
     spieler->setZeichnungZ( "Name", zeile->getText(), sName );
-    Knopf * freund = initKnopf( 0, 0, 20, 20, 0, 0, "" );
+    Knopf *freund = initKnopf( 0, 0, 20, 20, 0, "" );
     freund->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     freund->setHintergrundBildZ( einladenBild );
     freund->setMausEreignisParameter( this );
     freund->setMausEreignis( chatroomFensterFreundME );
-    initToolTip( freund, "Freundeseinladung an den Spieler schicken.", schrift, hauptScreen );
+    initToolTip( freund, "Freundeseinladung an den Spieler schicken." );
     spieler->setZeichnungZ( "Freund", zeile->getText(), freund );
-    Knopf * entfernen = initKnopf( 0, 0, 0, 20, 0, 0, "" );
+    Knopf *entfernen = initKnopf( 0, 0, 0, 20, 0, "" );
     entfernen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     entfernen->setHintergrundBildZ( closeBild );
     entfernen->setMausEreignisParameter( this );
     entfernen->setMausEreignis( chatroomFensterEntfernenME );
-    initToolTip( entfernen, "Spieler aus Chatroom entfernen.", schrift, hauptScreen );
+    initToolTip( entfernen, "Spieler aus Chatroom entfernen." );
     spieler->setZeichnungZ( "Kick", zeile->getText(), entfernen );
     neueSpieler->add( accountId, neueSpielerAnzahl );
     neueSpielerAnzahl++;
-    zeile = zeile->release();
+    zeile->release();
     rend = 1;
 }
 
@@ -629,7 +599,7 @@ bool ChatroomFenster::tick( double tickVal )
         zeile->setText( "" );
         rend = 1;
     }
-    zeile = zeile->release();
+    zeile->release();
     if( admin )
     {
         if( spielerName->getHeight() != 20 )
@@ -664,7 +634,7 @@ bool ChatroomFenster::tick( double tickVal )
     return ret;
 }
 
-void ChatroomFenster::doPublicMausEreignis( MausEreignis & me )
+void ChatroomFenster::doPublicMausEreignis( MausEreignis &me )
 {
     bool tmp = me.verarbeitet;
     if( me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation )
@@ -689,7 +659,7 @@ void ChatroomFenster::doPublicMausEreignis( MausEreignis & me )
     }
     if( !aktion && !sichtbar && !vera )
     {
-        if( me.mx < breite &&me.mx > 0 && me.my > 250 && me.my < 280 )
+        if( me.mx < breite && me.mx > 0 && me.my > 250 && me.my < 280 )
             aktion = 3;
     }
     switch( aktion )
@@ -733,7 +703,7 @@ void ChatroomFenster::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void ChatroomFenster::doTastaturEreignis( TastaturEreignis & te )
+void ChatroomFenster::doTastaturEreignis( TastaturEreignis &te )
 {
     bool tmp = te.verarbeitet;
     if( animation )
@@ -790,7 +760,7 @@ void ChatroomFenster::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void ChatroomFenster::render( int xPos, Bild & zRObj )
+void ChatroomFenster::render( int xPos, Bild &zRObj )
 {
     int x = xPos;
     int y = 280 - höhe;
@@ -816,7 +786,7 @@ void ChatroomFenster::render( int xPos, Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-bool ChatroomFenster::druckFreund( void *obj, MausEreignis & me )
+bool ChatroomFenster::druckFreund( void *obj, MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -835,7 +805,7 @@ bool ChatroomFenster::druckFreund( void *obj, MausEreignis & me )
     return 1;
 }
 
-bool ChatroomFenster::druckEntfernen( void *obj, MausEreignis & me )
+bool ChatroomFenster::druckEntfernen( void *obj, MausEreignis &me )
 {
     if( me.id == ME_RLinks && admin )
     {
@@ -860,30 +830,14 @@ int ChatroomFenster::getChatroomId() const
     return chatroomId;
 }
 
-// Reference Counting
-void *ChatroomFenster::getThis()
-{
-    ref++;
-    return this;
-}
-
-void *ChatroomFenster::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der ChatLeisteObj Klasse aus ChatLeiste.h
 // Konstruktor
-ChatLeisteObj::ChatLeisteObj( Schrift * zSchrift )
+ChatLeisteObj::ChatLeisteObj()
     : Zeichnung()
 {
-    schrift = zSchrift->getThis();
     chats = new RCArray< Chat >();
     hsb = new HScrollBar();
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     anzahl = 0;
     nowME = -1;
 }
@@ -891,9 +845,8 @@ ChatLeisteObj::ChatLeisteObj( Schrift * zSchrift )
 // Destruktor
 ChatLeisteObj::~ChatLeisteObj()
 {
-    chats = chats->release();
+    chats->release();
     hsb = (HScrollBar *)hsb->release();
-    schrift = schrift->release();
 }
 
 // nicht constant
@@ -961,7 +914,7 @@ void ChatLeisteObj::addChat( int accountId, int chatroomId )
         }
         if( !gefunden )
         {
-            ChatFenster *neu = new ChatFenster( schrift, accountId );
+            ChatFenster *neu = new ChatFenster( accountId );
             chats->add( neu, anzahl );
             anzahl++;
             rend = 1;
@@ -981,7 +934,7 @@ void ChatLeisteObj::addChat( int accountId, int chatroomId )
         }
         if( !gefunden )
         {
-            ChatroomFenster *neu = new ChatroomFenster( schrift, chatroomId );
+            ChatroomFenster *neu = new ChatroomFenster( chatroomId );
             chats->add( neu, anzahl );
             anzahl++;
             rend = 1;
@@ -1015,7 +968,7 @@ void ChatLeisteObj::removeChat( int accountId, int chatroomId )
     unlockZeichnung();
 }
 
-void ChatLeisteObj::removeChat( Chat * zChat )
+void ChatLeisteObj::removeChat( Chat *zChat )
 {
     lockZeichnung();
     for( int i = 0; i < anzahl; i++ )
@@ -1100,13 +1053,13 @@ bool ChatLeisteObj::tick( double tickVal )
     return ret;
 }
 
-void ChatLeisteObj::doTastaturEreignis( TastaturEreignis & te )
+void ChatLeisteObj::doTastaturEreignis( TastaturEreignis &te )
 {
     for( int i = 0; i < anzahl; i++ )
         chats->z( i )->doTastaturEreignis( te );
 }
 
-void ChatLeisteObj::doPublicMausEreignis( MausEreignis & me )
+void ChatLeisteObj::doPublicMausEreignis( MausEreignis &me )
 {
     int mx = me.mx;
     int my = me.my;
@@ -1128,7 +1081,7 @@ void ChatLeisteObj::doPublicMausEreignis( MausEreignis & me )
     me.insideParent = insideParent;
 }
 
-void ChatLeisteObj::render( Bild & zRObj )
+void ChatLeisteObj::render( Bild &zRObj )
 {
     int x = pos.x;
     int y = pos.y;
@@ -1153,26 +1106,26 @@ void ChatLeisteObj::render( Bild & zRObj )
 
 // Inhalt der ChatLeiste Klasse aus ChatLeiste.h
 // Konstruktor
-ChatLeiste::ChatLeiste( Schrift * zSchrift, Fenster * zNachLoginFenster )
+ChatLeiste::ChatLeiste( Fenster *zNachLoginFenster )
+    : ReferenceCounter()
 {
     minimierenBild = bilder->get( "data/client/bilder/chat.ltdb/minimieren.png" );
     maximierenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
-    bildschirmGröße = hauptScreen->getBackBufferSize();
-    fenster = initFenster( 20 - bildschirmGröße.x, bildschirmGröße.y - 50, bildschirmGröße.x, 50, 0, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::Rahmen, "" );
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    fenster = initFenster( 20 - bildschirmGröße.x, bildschirmGröße.y - 50, bildschirmGröße.x, 50, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::Rahmen, "" );
     fenster->setKBgFarbe( 0xFF000000 );
-    minMax = initKnopf( bildschirmGröße.x - 21, 1, 20, 20, 0, 0, "" );
+    minMax = initKnopf( bildschirmGröße.x - 21, 1, 20, 20, 0, "" );
     minMax->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-    minMax->setHintergrundBildZ( minimierenBild->getThis() );
+    minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
     minMax->setMausEreignisParameter( this );
     minMax->setMausEreignis( chatLeisteMinMaxME );
-    initToolTip( minMax, "Chat Leiste minimieren.", zSchrift, hauptScreen );
-    fenster->addMember( minMax->getThis() );
-    chatLeiste = new ChatLeisteObj( zSchrift );
-    fenster->addMember( chatLeiste->getThis() );
-    zNachLoginFenster->addMember( fenster->getThis() );
+    initToolTip( minMax, "Chat Leiste minimieren." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( minMax->getThis() ) );
+    chatLeiste = new ChatLeisteObj();
+    fenster->addMember( dynamic_cast<Zeichnung *>( chatLeiste->getThis() ) );
+    zNachLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
     tickVal = 0;
     animation = 1;
-    ref = 1;
     rend = 0;
     chatClient->chatNachrichtAnfrage();
 }
@@ -1180,8 +1133,8 @@ ChatLeiste::ChatLeiste( Schrift * zSchrift, Fenster * zNachLoginFenster )
 // Destruktor
 ChatLeiste::~ChatLeiste()
 {
-    minimierenBild = minimierenBild->release();
-    maximierenBild = maximierenBild->release();
+    minimierenBild->release();
+    maximierenBild->release();
     fenster = (Fenster *)fenster->release();
     minMax = (Knopf *)minMax->release();
     chatLeiste = (ChatLeisteObj *)chatLeiste->release();
@@ -1208,7 +1161,7 @@ void ChatLeiste::removeChat( int accountId, int chatroomId )
     chatLeiste->removeChat( accountId, chatroomId );
 }
 
-void ChatLeiste::removeChat( Chat * zChat )
+void ChatLeiste::removeChat( Chat *zChat )
 {
     chatLeiste->removeChat( zChat );
 }
@@ -1274,7 +1227,7 @@ bool ChatLeiste::tick( double tickVal )
     return ret;
 }
 
-bool ChatLeiste::druckMinMax( MausEreignis & me )
+bool ChatLeiste::druckMinMax( MausEreignis &me )
 {
     if( animation )
         return 1;
@@ -1283,36 +1236,19 @@ bool ChatLeiste::druckMinMax( MausEreignis & me )
         if( minMax->zHintergrundBild() == minimierenBild )
         {
             animation = 2;
-            minMax->setHintergrundBildZ( maximierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Chat Leiste maximieren." );
         }
         else
         {
             animation = 1;
-            minMax->setHintergrundBildZ( minimierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Chat Leiste minimieren." );
         }
     }
     return 1;
 }
 
-// constant
-
-// Reference Counting
-ChatLeiste *ChatLeiste::getThis()
-{
-    ref++;
-    return this;
-}
-
-ChatLeiste *ChatLeiste::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Nachrichten
 bool chatLeisteMinMaxME( void *p, void *obj, MausEreignis me )
 {

+ 122 - 140
KSGClient/NachLogin/Chat/ChatLeiste.h

@@ -14,177 +14,159 @@
 using namespace Framework;
 using namespace Network;
 
-class Chat
+class Chat : public virtual ReferenceCounter
 {
 protected:
-	LRahmen *rahmen;
-	TextFeld *verlauf;
-	TextFeld *nachricht;
-	TextFeld *name;
-	Knopf *minimieren;
-	Knopf *close;
-	Punkt bildschirmGröße;
-	GSL::GSLSoundV *msgSound;
-	bool admin;
-	double tickVal;
-	bool sichtbar;
-	int animation;
-	int breite;
-	int höhe;
-	bool rend;
-	int ref;
+    LRahmen *rahmen;
+    TextFeld *verlauf;
+    TextFeld *nachricht;
+    TextFeld *name;
+    Knopf *minimieren;
+    Knopf *close;
+    Punkt bildschirmGröße;
+    GSL::GSLSoundV *msgSound;
+    bool admin;
+    double tickVal;
+    bool sichtbar;
+    int animation;
+    int breite;
+    int höhe;
+    bool rend;
 
 public:
-	// Konstruktor
-	Chat( Schrift *zSchrift );
-	// Destruktor
-	~Chat();
-	// nicht constant
-	void setSichtbar( bool sichtbar );
-	void entfernen();
-	void addNachricht( char *txt );
-	void setAdmin();
-	virtual void addSpieler( int accountId );
-	virtual void removeSpieler( int accountId );
-	virtual bool tick( double tickVal );
-	virtual void doPublicMausEreignis( MausEreignis &me );
-	virtual void doTastaturEreignis( TastaturEreignis &te );
-	virtual void render( int x, Bild &zRObj );
-	// constant
-	TextFeld *getName() const;
-	TextFeld *zName() const;
-	virtual int getAccountId() const;
-	virtual int getChatroomId() const;
-	int getBreite() const;
-	bool istSichtbar() const;
-	// Reference Counting
-	virtual void *getThis();
-	virtual void *release();
+    // Konstruktor
+    Chat();
+    // Destruktor
+    ~Chat();
+    // nicht constant
+    void setSichtbar( bool sichtbar );
+    void entfernen();
+    void addNachricht( char *txt );
+    void setAdmin();
+    virtual void addSpieler( int accountId );
+    virtual void removeSpieler( int accountId );
+    virtual bool tick( double tickVal );
+    virtual void doPublicMausEreignis( MausEreignis &me );
+    virtual void doTastaturEreignis( TastaturEreignis &te );
+    virtual void render( int x, Bild &zRObj );
+    // constant
+    TextFeld *getName() const;
+    TextFeld *zName() const;
+    virtual int getAccountId() const;
+    virtual int getChatroomId() const;
+    int getBreite() const;
+    bool istSichtbar() const;
 };
 
 class ChatFenster : public Chat
 {
 private:
-	int accountId;
+    int accountId;
 
 public:
-	// Konstruktor
-	ChatFenster( Schrift *zSchrift, int accountId );
-	// Destruktor
-	~ChatFenster();
-	// nicht constant
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void render( int x, Bild &zRObj ) override;
-	// constant
-	int getAccountId() const override;
-	// Reference Counting
-	void *getThis() override;
-	void *release() override;
+    // Konstruktor
+    ChatFenster( int accountId );
+    // Destruktor
+    ~ChatFenster();
+    // nicht constant
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void render( int x, Bild &zRObj ) override;
+    // constant
+    int getAccountId() const override;
 };
 
 class ChatroomFenster : public Chat
 {
 private:
-	int chatroomId;
-	ObjTabelle *spieler;
-	Schrift *schrift;
-	Array< int > *neueSpieler;
-	int neueSpielerAnzahl;
-	Array< int > *alteSpieler;
-	int alteSpielerAnzahl;
-	TextFeld *spielerName;
-	Knopf *einladen;
+    int chatroomId;
+    ObjTabelle *spieler;
+    Array< int > *neueSpieler;
+    int neueSpielerAnzahl;
+    Array< int > *alteSpieler;
+    int alteSpielerAnzahl;
+    TextFeld *spielerName;
+    Knopf *einladen;
 
 public:
-	// Konstruktor
-	ChatroomFenster( Schrift *zSchrift, int chatroomId );
-	// Destruktor
-	~ChatroomFenster();
-	// nicht constant
-	void addSpieler( int accountId ) override;
-	void removeSpieler( int accountId ) override;
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void render( int x, Bild &zRObj ) override;
-	bool druckFreund( void *obj, MausEreignis &me );
-	bool druckEntfernen( void *obj, MausEreignis &me );
-	// constant
-	virtual int getChatroomId() const;
-	// Reference Counting
-	virtual void *getThis();
-	virtual void *release();
+    // Konstruktor
+    ChatroomFenster( int chatroomId );
+    // Destruktor
+    ~ChatroomFenster();
+    // nicht constant
+    void addSpieler( int accountId ) override;
+    void removeSpieler( int accountId ) override;
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void render( int x, Bild &zRObj ) override;
+    bool druckFreund( void *obj, MausEreignis &me );
+    bool druckEntfernen( void *obj, MausEreignis &me );
+    // constant
+    virtual int getChatroomId() const;
 };
 
 class ChatLeisteObj : public Zeichnung
 {
 private:
-	RCArray< Chat > *chats;
-	HScrollBar *hsb;
-	Schrift *schrift;
-	Punkt bildschirmGröße;
-	int anzahl;
-	int nowME;
+    RCArray< Chat > *chats;
+    HScrollBar *hsb;
+    Punkt bildschirmGröße;
+    int anzahl;
+    int nowME;
 
 public:
-	// Konstruktor
-	ChatLeisteObj( Schrift *zSchrift );
-	// Destruktor
-	~ChatLeisteObj();
-	// nicht constant
-	void chatNachricht( int vonAccount, char *txt );
-	void chatroomNachricht( int chatroomId, char *txt );
-	void addChat( int accountId, int chatroomId );
-	void removeChat( int accountId, int chatroomId );
-	void removeChat( Chat *zChat );
-	void removeAll();
-	void addSpieler( int chatroomId, int accountId );
-	void removeSpieler( int chatroomId, int accountId );
-	void setChatroomAdmin( int chatroomId );
-	bool tick( double tickVal ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
+    // Konstruktor
+    ChatLeisteObj();
+    // Destruktor
+    ~ChatLeisteObj();
+    // nicht constant
+    void chatNachricht( int vonAccount, char *txt );
+    void chatroomNachricht( int chatroomId, char *txt );
+    void addChat( int accountId, int chatroomId );
+    void removeChat( int accountId, int chatroomId );
+    void removeChat( Chat *zChat );
+    void removeAll();
+    void addSpieler( int chatroomId, int accountId );
+    void removeSpieler( int chatroomId, int accountId );
+    void setChatroomAdmin( int chatroomId );
+    bool tick( double tickVal ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
 };
 
-class ChatLeiste
+class ChatLeiste : public virtual ReferenceCounter
 {
 private:
-	Fenster *fenster;
-	Knopf *minMax;
-	ChatLeisteObj *chatLeiste;
-	Punkt bildschirmGröße;
-	Bild *minimierenBild;
-	Bild *maximierenBild;
-	double tickVal;
-	int animation;
-	bool rend;
-	int ref;
+    Fenster *fenster;
+    Knopf *minMax;
+    ChatLeisteObj *chatLeiste;
+    Punkt bildschirmGröße;
+    Bild *minimierenBild;
+    Bild *maximierenBild;
+    double tickVal;
+    int animation;
+    bool rend;
 
 public:
-	// Konstruktor
-	ChatLeiste( Schrift *zSchrift, Fenster *zNachLoginFenster );
-	// Destruktor
-	~ChatLeiste();
-	// nicht constant
-	void chatNachricht( int vonAccount, char *txt );
-	void chatroomNachricht( int chatroomId, int vonAccount, char *txt );
-	void addChat( int accountId, int chatroomId );
-	void removeChat( int accountId, int chatroomId );
-	void removeChat( Chat *zChat );
-	void removeAll();
-	void addSpieler( int chatroomId, int accountId );
-	void removeSpieler( int chatroomId, int accountId );
-	void setChatroomAdmin( int chatroomId );
-	bool tick( double tickVal );
-	bool druckMinMax( MausEreignis &me );
-	// constant
-
-	// Reference Counting
-	ChatLeiste *getThis();
-	ChatLeiste *release();
+    // Konstruktor
+    ChatLeiste( Fenster *zNachLoginFenster );
+    // Destruktor
+    ~ChatLeiste();
+    // nicht constant
+    void chatNachricht( int vonAccount, char *txt );
+    void chatroomNachricht( int chatroomId, int vonAccount, char *txt );
+    void addChat( int accountId, int chatroomId );
+    void removeChat( int accountId, int chatroomId );
+    void removeChat( Chat *zChat );
+    void removeAll();
+    void addSpieler( int chatroomId, int accountId );
+    void removeSpieler( int chatroomId, int accountId );
+    void setChatroomAdmin( int chatroomId );
+    bool tick( double tickVal );
+    bool druckMinMax( MausEreignis &me );
 };
 
 // Nachrichten

+ 86 - 101
KSGClient/NachLogin/Chat/FreundesListe.cpp

@@ -12,7 +12,7 @@
 
 // Inhalt der FreundData Klasse aus FreundesListe.h
 // Konstruktor
-FreundData::FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer, Schrift *zSchrift )
+FreundData::FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer )
     : Thread()
 {
     Bild *entfernenBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
@@ -22,42 +22,37 @@ FreundData::FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer
     this->accountId = accountId;
     this->rahmen = rahmen;
     this->auswahlBuffer = auswahlBuffer;
-    name = new TextFeld();
+    name = uiFactory.createTextFeld( uiFactory.initParam );
     name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    name->setSchriftZ( zSchrift->getThis() );
-    name->setSchriftFarbe( 0xFFFFFFFF );
-    name->setSchriftSize( 12 );
     name->setText( "" );
     name->setSize( 200, 20 );
     name->setPosition( 25, 1 );
-    status = new TextFeld();
+    status = uiFactory.createTextFeld( uiFactory.initParam );
     status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-    status->setSchriftZ( zSchrift->getThis() );
     status->setSchriftFarbe( 0xFFFF0000 );
-    status->setSchriftSize( 12 );
     status->setText( "offline" );
     status->setSize( 200, 20 );
     status->setPosition( 25, 24 );
-    entfernen = initKnopf( 228, 49, 20, 20, 0, 0, "" );
+    entfernen = initKnopf( 228, 49, 20, 20, 0, "" );
     entfernen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     entfernen->setHintergrundBildZ( entfernenBild );
     entfernen->setHintergrundFarbe( 0 );
-    initToolTip( entfernen, "Freund entfernen.", zSchrift, hauptScreen );
-    ansehen = initKnopf( 208, 49, 20, 20, 0, 0, "" );
+    initToolTip( entfernen, "Freund entfernen." );
+    ansehen = initKnopf( 208, 49, 20, 20, 0, "" );
     ansehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     ansehen->setHintergrundBildZ( ansehenBild );
     ansehen->setHintergrundFarbe( 0 );
-    initToolTip( ansehen, "Account ansehen.", zSchrift, hauptScreen );
-    nachricht = initKnopf( 188, 49, 20, 20, 0, 0, "" );
+    initToolTip( ansehen, "Account ansehen." );
+    nachricht = initKnopf( 188, 49, 20, 20, 0, "" );
     nachricht->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     nachricht->setHintergrundBildZ( nachrichtBild );
     nachricht->setHintergrundFarbe( 0 );
-    initToolTip( nachricht, "Nachricht senden.", zSchrift, hauptScreen );
-    einladen = initKnopf( 168, 49, 20, 20, 0, 0, "" );
+    initToolTip( nachricht, "Nachricht senden." );
+    einladen = initKnopf( 168, 49, 20, 20, 0, "" );
     einladen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     einladen->setHintergrundBildZ( einladenBild );
     einladen->setHintergrundFarbe( 0 );
-    initToolTip( einladen, "Spieler in Gruppe einladen.\nDies kann nur der Gruppen Administrator.", zSchrift, hauptScreen );
+    initToolTip( einladen, "Spieler in Gruppe einladen.\nDies kann nur der Gruppen Administrator." );
     online = 0;
     einladenSichtbar = 0;
     ausgewählt = 0;
@@ -146,7 +141,7 @@ void FreundData::zeigeEinladeKnopf( bool zeigen )
     rend = 1;
 }
 
-void FreundData::doPublicMausEreignis( MausEreignis & me )
+void FreundData::doPublicMausEreignis( MausEreignis &me )
 {
     if( animation != 3 )
     {
@@ -201,7 +196,7 @@ void FreundData::doPublicMausEreignis( MausEreignis & me )
                 nachricht->append( name->zText()->getText() );
                 nachricht->append( " wirklich beenden?" );
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Bist du dir Sicher?" ), nachricht, new Text( "ja" ),
-                                                              new Text( "abbrechen" ), [ id ]()
+                                                              new Text( "abbrechen" ), [id]()
                 {
                     chatClient->freundschaftBeenden( id );
                 } );
@@ -217,7 +212,7 @@ void FreundData::doPublicMausEreignis( MausEreignis & me )
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( mainClient->getLetzterFehler() ),
                                                                   new Text( "Ok" ), 0 );
                 }
-                if( anmeldungClient &&anmeldungClient->verbinde() )
+                if( anmeldungClient && anmeldungClient->verbinde() )
                 {
                     if( !anmeldungClient->gruppeSpielerEinladen( accountId, nachLogin->zSpielenFenster()->getGruppeId() ) )
                     {
@@ -322,7 +317,7 @@ bool FreundData::tick( double tickVal )
     return ret;
 }
 
-void FreundData::render( int yPos, Bild & zRObj )
+void FreundData::render( int yPos, Bild &zRObj )
 {
     int br = 250;
     if( !zRObj.setDrawOptions( 0, yPos, br, höhe ) )
@@ -394,11 +389,10 @@ int FreundData::getHeight() const
 
 // Inhalt der FreundesListeObj Klasse aus FreundesListe.h
 // Konstruktor
-FreundesListeObj::FreundesListeObj( Schrift * zSchrift )
+FreundesListeObj::FreundesListeObj()
     : Zeichnung()
 {
     members = new RCArray< FreundData >();
-    schrift = zSchrift->getThis();
     memberRahmen = new LRahmen();
     memberRahmen->setFarbe( 0xFFFFFFFF );
     memberRahmen->setRamenBreite( 1 );
@@ -407,7 +401,7 @@ FreundesListeObj::FreundesListeObj( Schrift * zSchrift )
     auswahlBuffer->setPosition( 1, 1 );
     vsb = new VScrollBar();
     vsb->setKlickScroll( 10 );
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     vsb->update( 0, bildschirmGröße.y - 200 );
     memberNummer = 0;
     einladenSichtbar = 0;
@@ -416,8 +410,7 @@ FreundesListeObj::FreundesListeObj( Schrift * zSchrift )
 // Destruktor
 FreundesListeObj::~FreundesListeObj()
 {
-    members = members->release();
-    schrift = schrift->release();
+    members->release();
     memberRahmen->release();
     auswahlBuffer = (AlphaFeld *)auswahlBuffer->release();
     vsb = (VScrollBar *)vsb->release();
@@ -426,7 +419,7 @@ FreundesListeObj::~FreundesListeObj()
 // nicht constant
 void FreundesListeObj::addMember( int accountId )
 {
-    FreundData *tmp = new FreundData( accountId, (LRahmen *)memberRahmen->getThis(), (AlphaFeld *)auswahlBuffer->getThis(), schrift );
+    FreundData *tmp = new FreundData( accountId, dynamic_cast<LRahmen *>( memberRahmen->getThis() ), dynamic_cast<AlphaFeld *>( auswahlBuffer->getThis() ) );
     members->add( tmp, memberNummer );
     memberNummer++;
     if( einladenSichtbar )
@@ -447,7 +440,7 @@ void FreundesListeObj::removeMember( int accountId )
     }
 }
 
-void FreundesListeObj::removeMember( FreundData * member )
+void FreundesListeObj::removeMember( FreundData *member )
 {
     for( int i = 0; i < memberNummer; i++ )
     {
@@ -532,7 +525,7 @@ bool FreundesListeObj::tick( double tickVal )
     return ret;
 }
 
-void FreundesListeObj::doPublicMausEreignis( MausEreignis & me )
+void FreundesListeObj::doPublicMausEreignis( MausEreignis &me )
 {
     int my = me.my;
     me.my -= pos.y;
@@ -573,7 +566,7 @@ void FreundesListeObj::doPublicMausEreignis( MausEreignis & me )
     vsb->doMausMessage( 250, pos.y, 20, gr.y, me );
 }
 
-void FreundesListeObj::render( Bild & zrObj )
+void FreundesListeObj::render( Bild &zrObj )
 {
     if( !zrObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
         return;
@@ -603,14 +596,14 @@ bool FreundesListeObj::istFreund( int accId ) const
 
 // Inhalt der FreundesListe Klasse aus FreundesListe.h
 // Konstruktor
-FreundesListe::FreundesListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
+FreundesListe::FreundesListe( Fenster *zNachLoginFenster )
     : Thread()
 {
     minimierenBild = bilder->get( "data/client/bilder/chat.ltdb/minimieren.png" );
     maximierenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
     Bild *neuerFreundBild = bilder->get( "data/client/bilder/chat.ltdb/neuerfreund.png" );
 
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
 
     fenster = new Fenster();
     fenster->addStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::BodyHintergrund );
@@ -619,94 +612,94 @@ FreundesListe::FreundesListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
     fenster->setKBgFarbe( 0xFF000000 );
     fenster->setPosition( -250, 100 );
 
-    minMax = initKnopf( 249, 1, 20, 20, 0, 0, "" );
+    minMax = initKnopf( 249, 1, 20, 20, 0, "" );
     minMax->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-    minMax->setHintergrundBildZ( minimierenBild->getThis() );
+    minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
     minMax->setMausEreignisParameter( this );
     minMax->setMausEreignis( freundesListeMinMaxME );
-    initToolTip( minMax, "Freundes Leiste minimieren.", zSchrift, hauptScreen );
-    fenster->addMember( minMax->getThis() );
+    initToolTip( minMax, "Freundes Leiste minimieren." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( minMax->getThis() ) );
 
-    überschrift = initTextFeld( 0, 5, 250, 25, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Sichtbar, "Freunde" );
+    überschrift = initTextFeld( 0, 5, 250, 25, TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Sichtbar, "Freunde" );
     überschrift->setSchriftSize( 15 );
-    fenster->addMember( überschrift->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( überschrift->getThis() ) );
 
-    accountName = initTextFeld( 25, 40, 200, 20, zSchrift, TextFeld::Style::TextFeld | TextFeld::Style::Sichtbar, "" );
+    accountName = initTextFeld( 25, 40, 200, 20, TextFeld::Style::TextFeld | TextFeld::Style::Sichtbar, "" );
     accountName->setTastaturEreignisParameter( this );
     accountName->setTastaturEreignis( freundesListeNameTE );
-    initToolTip( accountName, "Mit diesem Namen bist du bei anderen Spielern sichtbar.", zSchrift, hauptScreen );
-    fenster->addMember( accountName->getThis() );
+    initToolTip( accountName, "Mit diesem Namen bist du bei anderen Spielern sichtbar." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( accountName->getThis() ) );
 
-    LTDBDatei * chatBilder = new LTDBDatei();
+    LTDBDatei *chatBilder = new LTDBDatei();
     chatBilder->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
     chatBilder->leseDaten( 0 );
-    Bild * neuerChatBild = chatBilder->laden( 0, new Text( "neuerchat.png" ) );
-    chatBilder = chatBilder->release();
+    Bild *neuerChatBild = chatBilder->laden( 0, new Text( "neuerchat.png" ) );
+    chatBilder->release();
 
-    neuerFreund = initKnopf( 5, 75, 20, 20, 0, 0, "" );
+    neuerFreund = initKnopf( 5, 75, 20, 20, 0, "" );
     neuerFreund->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
     neuerFreund->setHintergrundBildZ( neuerFreundBild );
     neuerFreund->setMausEreignisParameter( this );
     neuerFreund->setMausEreignis( freundesListeNeuerFreundME );
-    initToolTip( neuerFreund, "Freundesanfrage senden.", zSchrift, hauptScreen );
-    fenster->addMember( neuerFreund->getThis() );
+    initToolTip( neuerFreund, "Freundesanfrage senden." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuerFreund->getThis() ) );
 
-    neuerChat = initKnopf( 30, 75, 20, 20, 0, 0, "" );
+    neuerChat = initKnopf( 30, 75, 20, 20, 0, "" );
     neuerChat->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
     neuerChat->setHintergrundBildZ( neuerChatBild );
     neuerChat->setMausEreignisParameter( this );
     neuerChat->setMausEreignis( freundesListeNeuerChatME );
-    initToolTip( neuerChat, "Nachricht senden.", zSchrift, hauptScreen );
-    fenster->addMember( neuerChat->getThis() );
+    initToolTip( neuerChat, "Nachricht senden." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuerChat->getThis() ) );
 
-    neuerFreundFenster = initFenster( 0, 100, 270, 0, 0, Fenster::Style::Erlaubt | Fenster::Style::Rahmen, 0 );
-    neuerFreundSpielerName = initTextFeld( 5, 5, 235, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Spieler Name" );
+    neuerFreundFenster = initFenster( 0, 100, 270, 0, Fenster::Style::Erlaubt | Fenster::Style::Rahmen, 0 );
+    neuerFreundSpielerName = initTextFeld( 5, 5, 235, 20, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Spieler Name" );
     neuerFreundSpielerName->setTastaturEreignisParameter( this );
     neuerFreundSpielerName->setTastaturEreignis( freundesListeNeuerFreundSpielerNameTE );
-    initToolTip( neuerFreundSpielerName, "Name des Spielers an den eine Freundesanfrage gesendet werden soll.", zSchrift, hauptScreen );
-    neuerFreundFenster->addMember( neuerFreundSpielerName->getThis() );
-    neuerFreundFertig = initKnopf( 245, 5, 20, 20, 0, 0, "" );
+    initToolTip( neuerFreundSpielerName, "Name des Spielers an den eine Freundesanfrage gesendet werden soll." );
+    neuerFreundFenster->addMember( dynamic_cast<Zeichnung *>( neuerFreundSpielerName->getThis() ) );
+    neuerFreundFertig = initKnopf( 245, 5, 20, 20, 0, "" );
     neuerFreundFertig->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    neuerFreundFertig->setHintergrundBildZ( maximierenBild->getThis() );
+    neuerFreundFertig->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
     neuerFreundFertig->setMausEreignisParameter( this );
     neuerFreundFertig->setMausEreignis( freundesListeNeuerFreundFertigME );
-    initToolTip( neuerFreundFertig, "Diesem Spieler eine Freundesanfrage senden.", zSchrift, hauptScreen );
-    neuerFreundFenster->addMember( neuerFreundFertig->getThis() );
-    fenster->addMember( neuerFreundFenster->getThis() );
+    initToolTip( neuerFreundFertig, "Diesem Spieler eine Freundesanfrage senden." );
+    neuerFreundFenster->addMember( dynamic_cast<Zeichnung *>( neuerFreundFertig->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuerFreundFenster->getThis() ) );
 
-    neuerChatFenster = initFenster( 0, 100, 270, 0, 0, Fenster::Style::Erlaubt | Fenster::Style::Rahmen, 0 );
-    neuerChatName = initTextFeld( 5, 5, 235, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Spieler Name" );
+    neuerChatFenster = initFenster( 0, 100, 270, 0, Fenster::Style::Erlaubt | Fenster::Style::Rahmen, 0 );
+    neuerChatName = initTextFeld( 5, 5, 235, 20, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Spieler Name" );
     neuerChatName->setTastaturEreignisParameter( this );
     neuerChatName->setTastaturEreignis( freundesListeNeuerChatNameTE );
-    initToolTip( neuerChatName, "Name des Spielers an den eine Nachricht gesendet werden soll.", zSchrift, hauptScreen );
-    neuerChatFenster->addMember( neuerChatName->getThis() );
-    neuerChatFertig = initKnopf( 245, 5, 20, 20, 0, 0, "" );
+    initToolTip( neuerChatName, "Name des Spielers an den eine Nachricht gesendet werden soll." );
+    neuerChatFenster->addMember( dynamic_cast<Zeichnung *>( neuerChatName->getThis() ) );
+    neuerChatFertig = initKnopf( 245, 5, 20, 20, 0, "" );
     neuerChatFertig->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    neuerChatFertig->setHintergrundBildZ( maximierenBild->getThis() );
+    neuerChatFertig->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
     neuerChatFertig->setMausEreignisParameter( this );
     neuerChatFertig->setMausEreignis( freundesListeNeuerChatFertigME );
-    initToolTip( neuerChatFertig, "Diesem Spieler eine Nachricht senden.", zSchrift, hauptScreen );
-    neuerChatFenster->addMember( neuerChatFertig->getThis() );
-    neuesChatroomName = initTextFeld( 5, 30, 235, 20, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Chatroom Name" );
+    initToolTip( neuerChatFertig, "Diesem Spieler eine Nachricht senden." );
+    neuerChatFenster->addMember( dynamic_cast<Zeichnung *>( neuerChatFertig->getThis() ) );
+    neuesChatroomName = initTextFeld( 5, 30, 235, 20, TextFeld::Style::Sichtbar | TextFeld::Style::TextFeld, "Chatroom Name" );
     neuesChatroomName->setTastaturEreignisParameter( this );
     neuesChatroomName->setTastaturEreignis( freundesListeNeuesChatroomNameTE );
-    initToolTip( neuesChatroomName, "Name des Chatroom dem du beitreten möchtest.", zSchrift, hauptScreen );
-    neuerChatFenster->addMember( neuesChatroomName->getThis() );
-    neuesChatroomFertig = initKnopf( 245, 30, 20, 20, 0, 0, "" );
+    initToolTip( neuesChatroomName, "Name des Chatroom dem du beitreten möchtest." );
+    neuerChatFenster->addMember( dynamic_cast<Zeichnung *>( neuesChatroomName->getThis() ) );
+    neuesChatroomFertig = initKnopf( 245, 30, 20, 20, 0, "" );
     neuesChatroomFertig->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    neuesChatroomFertig->setHintergrundBildZ( maximierenBild->getThis() );
+    neuesChatroomFertig->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
     neuesChatroomFertig->setMausEreignisParameter( this );
     neuesChatroomFertig->setMausEreignis( freundesListeNeuesChatroomFertigME );
-    initToolTip( neuesChatroomFertig, "Chatroom erstellen oder beitreten.", zSchrift, hauptScreen );
-    neuerChatFenster->addMember( neuesChatroomFertig->getThis() );
-    fenster->addMember( neuerChatFenster->getThis() );
+    initToolTip( neuesChatroomFertig, "Chatroom erstellen oder beitreten." );
+    neuerChatFenster->addMember( dynamic_cast<Zeichnung *>( neuesChatroomFertig->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuerChatFenster->getThis() ) );
 
-    freundesListe = new FreundesListeObj( zSchrift );
+    freundesListe = new FreundesListeObj();
     freundesListe->setPosition( 0, 100 );
     freundesListe->setSize( 270, bildschirmGröße.y - 200 );
-    fenster->addMember( freundesListe->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( freundesListe->getThis() ) );
 
-    zNachLoginFenster->addMember( fenster->getThis() );
+    zNachLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
     animation = 1;
     tickVal = 0;
     neuerFreundSichtbar = 0;
@@ -720,8 +713,8 @@ FreundesListe::FreundesListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
 FreundesListe::~FreundesListe()
 {
     fenster = (Fenster *)fenster->release();
-    minimierenBild = minimierenBild->release();
-    maximierenBild = maximierenBild->release();
+    minimierenBild->release();
+    maximierenBild->release();
     minMax = (Knopf *)minMax->release();
     überschrift = (TextFeld *)überschrift->release();
     accountName = (TextFeld *)accountName->release();
@@ -749,7 +742,7 @@ void FreundesListe::removeMember( int accountId )
     freundesListe->removeMember( accountId );
 }
 
-void FreundesListe::removeMember( FreundData * member )
+void FreundesListe::removeMember( FreundData *member )
 {
     freundesListe->removeMember( member );
 }
@@ -792,7 +785,7 @@ void FreundesListe::thread()
             err = 0;
         }
     }
-    if( err &&nachLogin->zNachrichtenListe() )
+    if( err && nachLogin->zNachrichtenListe() )
     {
         nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                       new Text( "Dein Accountname konnte nicht ermittelt werden." ),
@@ -938,34 +931,34 @@ bool FreundesListe::tick( double tickVal )
     return ret;
 }
 
-bool FreundesListe::druckMinMax( MausEreignis & me )
+bool FreundesListe::druckMinMax( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
         if( minMax->zHintergrundBild() == minimierenBild )
         {
             animation = 2;
-            minMax->setHintergrundBildZ( maximierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Freundes Leiste maximieren." );
         }
         else
         {
             animation = 1;
-            minMax->setHintergrundBildZ( minimierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Freundes Leiste minimieren." );
         }
     }
     return 1;
 }
 
-bool FreundesListe::druckName( TastaturEreignis & te )
+bool FreundesListe::druckName( TastaturEreignis &te )
 {
     if( te.id == TE_Release && te.taste == T_Enter )
         chatClient->accountNameÄndern( accountName->zText()->getText() );
     return 1;
 }
 
-bool FreundesListe::druckNeuerFreund( MausEreignis & me )
+bool FreundesListe::druckNeuerFreund( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -975,7 +968,7 @@ bool FreundesListe::druckNeuerFreund( MausEreignis & me )
     return 1;
 }
 
-bool FreundesListe::druckNeuerChat( MausEreignis & me )
+bool FreundesListe::druckNeuerChat( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -985,7 +978,7 @@ bool FreundesListe::druckNeuerChat( MausEreignis & me )
     return 1;
 }
 
-bool FreundesListe::druckNeuerFreundSpielerName( TastaturEreignis & te )
+bool FreundesListe::druckNeuerFreundSpielerName( TastaturEreignis &te )
 {
     if( !neuerFreundSichtbar )
         return 0;
@@ -997,7 +990,7 @@ bool FreundesListe::druckNeuerFreundSpielerName( TastaturEreignis & te )
     return 1;
 }
 
-bool FreundesListe::druckNeuerFreundFertig( MausEreignis & me )
+bool FreundesListe::druckNeuerFreundFertig( MausEreignis &me )
 {
     if( !neuerFreundSichtbar )
         return 0;
@@ -1023,7 +1016,7 @@ bool FreundesListe::druckNeuerFreundFertig( MausEreignis & me )
     return 1;
 }
 
-bool FreundesListe::druckNeuerChatName( TastaturEreignis & te )
+bool FreundesListe::druckNeuerChatName( TastaturEreignis &te )
 {
     if( !neuerChatSichtbar )
         return 0;
@@ -1035,7 +1028,7 @@ bool FreundesListe::druckNeuerChatName( TastaturEreignis & te )
     return 1;
 }
 
-bool FreundesListe::druckNeuerChatFertig( MausEreignis & me )
+bool FreundesListe::druckNeuerChatFertig( MausEreignis &me )
 {
     if( !neuerChatSichtbar )
         return 0;
@@ -1057,7 +1050,7 @@ bool FreundesListe::druckNeuerChatFertig( MausEreignis & me )
     return 1;
 }
 
-bool FreundesListe::druckNeuesChatroomName( TastaturEreignis & te )
+bool FreundesListe::druckNeuesChatroomName( TastaturEreignis &te )
 {
     if( !neuerChatSichtbar )
         return 0;
@@ -1069,7 +1062,7 @@ bool FreundesListe::druckNeuesChatroomName( TastaturEreignis & te )
     return 1;
 }
 
-bool FreundesListe::druckNeuesChatroomFertig( MausEreignis & me )
+bool FreundesListe::druckNeuesChatroomFertig( MausEreignis &me )
 {
     if( !neuerChatSichtbar )
         return 0;
@@ -1100,14 +1093,6 @@ bool FreundesListe::druckNeuesChatroomFertig( MausEreignis & me )
     return 1;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *FreundesListe::release()
-{
-    if( ref == 2 && run )
-        ende();
-    return Thread::release();
-}
-
 // constant
 bool FreundesListe::istFreund( int accId ) const
 {

+ 117 - 120
KSGClient/NachLogin/Chat/FreundesListe.h

@@ -14,142 +14,139 @@ using namespace Framework;
 class FreundData : public Thread
 {
 private:
-	LRahmen *rahmen;
-	AlphaFeld *auswahlBuffer;
-	TextFeld *name;
-	TextFeld *status;
-	Knopf *entfernen;
-	Knopf *ansehen;
-	Knopf *nachricht;
-	Knopf *einladen;
-	int accountId;
-	bool einladenSichtbar;
-	bool online;
-	bool ausgewählt;
-	int höhe;
-	int animation;
-	unsigned char auswahlAlpha;
-	double tickVal;
-	bool rend;
+    LRahmen *rahmen;
+    AlphaFeld *auswahlBuffer;
+    TextFeld *name;
+    TextFeld *status;
+    Knopf *entfernen;
+    Knopf *ansehen;
+    Knopf *nachricht;
+    Knopf *einladen;
+    int accountId;
+    bool einladenSichtbar;
+    bool online;
+    bool ausgewählt;
+    int höhe;
+    int animation;
+    unsigned char auswahlAlpha;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer, Schrift *zSchrift );
-	// Destruktor
-	~FreundData();
-	// nicht constant
-	void thread();
-	void setName( char *txt );
-	void setStatus( char *txt );
-	void setOnline( bool online );
-	void setAusgewählt( bool ausw );
-	void remove();
-	void zeigeEinladeKnopf( bool zeigen );
-	void doPublicMausEreignis( MausEreignis &me );
-	bool tick( double tickVal );
-	void render( int yPos, Bild &zRObj );
-	// constant
-	bool istOnline() const;
-	bool istAusgewählt() const;
-	char *zName() const;
-	Text *getName() const;
-	char *zStatus() const;
-	Text *getStatus() const;
-	int getAccountId() const;
-	int getHeight() const;
+    // Konstruktor
+    FreundData( int accountId, LRahmen *rahmen, AlphaFeld *auswahlBuffer );
+    // Destruktor
+    ~FreundData();
+    // nicht constant
+    void thread();
+    void setName( char *txt );
+    void setStatus( char *txt );
+    void setOnline( bool online );
+    void setAusgewählt( bool ausw );
+    void remove();
+    void zeigeEinladeKnopf( bool zeigen );
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( int yPos, Bild &zRObj );
+    // constant
+    bool istOnline() const;
+    bool istAusgewählt() const;
+    char *zName() const;
+    Text *getName() const;
+    char *zStatus() const;
+    Text *getStatus() const;
+    int getAccountId() const;
+    int getHeight() const;
 };
 
 class FreundesListeObj : public Zeichnung
 {
 private:
-	RCArray< FreundData > *members;
-	LRahmen *memberRahmen;
-	AlphaFeld *auswahlBuffer;
-	Schrift *schrift;
-	VScrollBar *vsb;
-	Punkt bildschirmGröße;
-	bool einladenSichtbar;
-	int memberNummer;
+    RCArray< FreundData > *members;
+    LRahmen *memberRahmen;
+    AlphaFeld *auswahlBuffer;
+    VScrollBar *vsb;
+    Punkt bildschirmGröße;
+    bool einladenSichtbar;
+    int memberNummer;
 
 public:
-	// Konstruktor
-	FreundesListeObj( Schrift *zSchrift );
-	// Destruktor
-	~FreundesListeObj();
-	// nicht constant
-	void addMember( int accountId );
-	void removeMember( int accountId );
-	void removeMember( FreundData *member );
-	void removeAll();
-	void setName( int accountId, char *txt );
-	void setStatus( int accountId, char *txt );
-	void setOnline( int accountId, bool online );
-	void zeigeEinladeKnopf( bool zeigen );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istFreund( int accId ) const;
+    // Konstruktor
+    FreundesListeObj();
+    // Destruktor
+    ~FreundesListeObj();
+    // nicht constant
+    void addMember( int accountId );
+    void removeMember( int accountId );
+    void removeMember( FreundData *member );
+    void removeAll();
+    void setName( int accountId, char *txt );
+    void setStatus( int accountId, char *txt );
+    void setOnline( int accountId, bool online );
+    void zeigeEinladeKnopf( bool zeigen );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istFreund( int accId ) const;
 };
 
 class FreundesListe : public Thread
 {
 private:
-	Fenster *fenster;
-	TextFeld *überschrift;
-	TextFeld *accountName;
-	Knopf *minMax;
-	Knopf *neuerFreund;
-	Knopf *neuerChat;
-	FreundesListeObj *freundesListe;
-	Punkt bildschirmGröße;
-	Fenster *neuerFreundFenster;
-	TextFeld *neuerFreundSpielerName;
-	Knopf *neuerFreundFertig;
-	Fenster *neuerChatFenster;
-	TextFeld *neuerChatName;
-	Knopf *neuerChatFertig;
-	TextFeld *neuesChatroomName;
-	Knopf *neuesChatroomFertig;
-	Bild *minimierenBild;
-	Bild *maximierenBild;
-	int animation;
-	double tickVal;
-	bool neuerFreundSichtbar;
-	bool neuerChatSichtbar;
-	bool rend;
+    Fenster *fenster;
+    TextFeld *überschrift;
+    TextFeld *accountName;
+    Knopf *minMax;
+    Knopf *neuerFreund;
+    Knopf *neuerChat;
+    FreundesListeObj *freundesListe;
+    Punkt bildschirmGröße;
+    Fenster *neuerFreundFenster;
+    TextFeld *neuerFreundSpielerName;
+    Knopf *neuerFreundFertig;
+    Fenster *neuerChatFenster;
+    TextFeld *neuerChatName;
+    Knopf *neuerChatFertig;
+    TextFeld *neuesChatroomName;
+    Knopf *neuesChatroomFertig;
+    Bild *minimierenBild;
+    Bild *maximierenBild;
+    int animation;
+    double tickVal;
+    bool neuerFreundSichtbar;
+    bool neuerChatSichtbar;
+    bool rend;
 
 public:
-	// Konstruktor
-	FreundesListe( Schrift *zSchrift, Fenster *zNachLoginFenster );
-	// Destruktor
-	~FreundesListe();
-	// nicht constant
-	void addMember( int accountId );
-	void removeMember( int accountId );
-	void removeMember( FreundData *member );
-	void removeAll();
-	void setName( int accountId, char *txt );
-	void setStatus( int accountId, char *txt );
-	void setOnline( int accountId, bool online );
-	void setAnimation( int animation );
-	void thread();
-	void zeigeEinladeKnopf( bool zeigen );
-	bool tick( double tickVal );
-	bool druckMinMax( MausEreignis &me );
-	bool druckName( TastaturEreignis &te );
-	bool druckNeuerFreund( MausEreignis &me );
-	bool druckNeuerChat( MausEreignis &me );
-	bool druckNeuerFreundSpielerName( TastaturEreignis &te );
-	bool druckNeuerFreundFertig( MausEreignis &me );
-	bool druckNeuerChatName( TastaturEreignis &te );
-	bool druckNeuerChatFertig( MausEreignis &me );
-	bool druckNeuesChatroomName( TastaturEreignis &te );
-	bool druckNeuesChatroomFertig( MausEreignis &me );
-	// constant
-	bool istFreund( int accId ) const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    FreundesListe( Fenster *zNachLoginFenster );
+    // Destruktor
+    ~FreundesListe();
+    // nicht constant
+    void addMember( int accountId );
+    void removeMember( int accountId );
+    void removeMember( FreundData *member );
+    void removeAll();
+    void setName( int accountId, char *txt );
+    void setStatus( int accountId, char *txt );
+    void setOnline( int accountId, bool online );
+    void setAnimation( int animation );
+    void thread();
+    void zeigeEinladeKnopf( bool zeigen );
+    bool tick( double tickVal );
+    bool druckMinMax( MausEreignis &me );
+    bool druckName( TastaturEreignis &te );
+    bool druckNeuerFreund( MausEreignis &me );
+    bool druckNeuerChat( MausEreignis &me );
+    bool druckNeuerFreundSpielerName( TastaturEreignis &te );
+    bool druckNeuerFreundFertig( MausEreignis &me );
+    bool druckNeuerChatName( TastaturEreignis &te );
+    bool druckNeuerChatFertig( MausEreignis &me );
+    bool druckNeuesChatroomName( TastaturEreignis &te );
+    bool druckNeuesChatroomFertig( MausEreignis &me );
+    // constant
+    bool istFreund( int accId ) const;
 };
 
 // Nachrichten

+ 72 - 108
KSGClient/NachLogin/Chat/NachrichtenListe.cpp

@@ -15,20 +15,20 @@
 
 typedef GSL::GSLDateiV *( *GetGSLDatei )( );
 
-NLNachricht::NLNachricht( Schrift *zSchrift, Text *titel )
+NLNachricht::NLNachricht( Text *titel )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setRamenBreite( 1 );
     rahmen->setFarbe( 0xFFFFFFFF );
-    this->titel = initTextFeld( 1, 1, 208, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, titel->getText() );
-    titel = titel->release();
-    close = initKnopf( 208, 1, 20, 20, 0, 0, "" );
+    this->titel = initTextFeld( 1, 1, 208, 20, TextFeld::Style::Text | TextFeld::Style::Center, titel->getText() );
+    titel->release();
+    close = initKnopf( 208, 1, 20, 20, 0, "" );
     close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-    Bild * closeBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
+    Bild *closeBild = bilder->get( "data/client/bilder/chat.ltdb/entfernen.png" );
     close->setHintergrundBildZ( closeBild );
-    initToolTip( close, "Nachricht ignorieren.", zSchrift, hauptScreen );
+    initToolTip( close, "Nachricht ignorieren." );
     maxHöhe = 20;
-    ref = 1;
     animation = 1;
     ausgewählt = 0;
     tickVal = 0;
@@ -61,7 +61,7 @@ void NLNachricht::setAusgew
     }
 }
 
-void NLNachricht::doPublicMausEreignis( MausEreignis & me )
+void NLNachricht::doPublicMausEreignis( MausEreignis &me )
 {
     if( animation != 3 )
     {
@@ -155,7 +155,7 @@ bool NLNachricht::tick( double tickVal )
     return ret;
 }
 
-void NLNachricht::render( int y, Bild & zRObj )
+void NLNachricht::render( int y, Bild &zRObj )
 {
     int br = 228;
     int hö = höhe;
@@ -191,31 +191,16 @@ Text *NLNachricht::zTitel() const
     return titel->zText();
 }
 
-// Reference Counting
-NLNachricht *NLNachricht::getThis()
-{
-    ref++;
-    return this;
-}
-
-NLNachricht *NLNachricht::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
-SpielUpdateNachricht::SpielUpdateNachricht( Schrift * zSchrift, Text * titel, Text * nachricht, int dgID, std::function<void()> posAk, std::function<void()> negAk )
-    : NLNachricht( zSchrift, titel )
+SpielUpdateNachricht::SpielUpdateNachricht( Text *titel, Text *nachricht, int dgID, std::function<void()> posAk, std::function<void()> negAk )
+    : NLNachricht( titel )
 {
     Text *result = new Text( nachricht->getText() );
     int län = nachricht->getLength();
     char *txt = nachricht->getText();
     int x = 0;
     int y = 0;
-    Alphabet *tmp = zSchrift->getAlphabet( 12 );
-    TextRenderer rd( zSchrift->getThis() );
+    Alphabet *tmp = uiFactory.initParam.schrift->getAlphabet( 12 );
+    TextRenderer rd( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     rd.setSchriftSize( 12 );
     int zeilenHöhe = rd.getZeilenHeight() + rd.getZeilenAbstand();
     int lastPos = -1;
@@ -247,21 +232,21 @@ SpielUpdateNachricht::SpielUpdateNachricht( Schrift * zSchrift, Text * titel, Te
                 i = lastPos;
                 lastPos = -1;
             }
-            b = b->release();
+            b->release();
         }
     }
     y += zeilenHöhe;
-    tmp = tmp->release();
-    nachricht = nachricht->release();
-    text = initTextFeld( 1, 22, 228, y, zSchrift, TextFeld::Style::Text, result->getText() );
-    result = result->release();
-    fortschritt = initFBalken( 5, y + 20, 215, 20, zSchrift, FBalken::Style::normal );
-    herunterladen = initKnopf( 10, 45 + y, 120, 20, zSchrift, Knopf::Style::Sichtbar, "herunterladen" );
-    abbrechen = initKnopf( 140, 45 + y, 80, 20, zSchrift, Knopf::Style::Sichtbar, "abbrechen" );
+    tmp->release();
+    nachricht->release();
+    text = initTextFeld( 1, 22, 228, y, TextFeld::Style::Text, result->getText() );
+    result->release();
+    fortschritt = initFBalken( 5, y + 20, 215, 20, FBalken::Style::normal );
+    herunterladen = initKnopf( 10, 45 + y, 120, 20, Knopf::Style::Sichtbar, "herunterladen" );
+    abbrechen = initKnopf( 140, 45 + y, 80, 20, Knopf::Style::Sichtbar, "abbrechen" );
     this->posAk = posAk;
     this->negAk = negAk;
     maxHöhe = 75 + y;
-    update = new Update( zSchrift, (FBalken *)fortschritt->getThis(), dgID, [ this ]( bool ok )
+    update = new Update( dynamic_cast<FBalken *>( fortschritt->getThis() ), dgID, [this]( bool ok )
     {
         this->animation = 3;
         if( ok )
@@ -269,7 +254,7 @@ SpielUpdateNachricht::SpielUpdateNachricht( Schrift * zSchrift, Text * titel, Te
         else
             this->negAk();
     } );
-    if( !updateH->add( (Update *)update->getThis() ) )
+    if( !updateH->add( dynamic_cast<Update *>( update->getThis() ) ) )
         entfernen();
 }
 
@@ -280,6 +265,9 @@ SpielUpdateNachricht::~SpielUpdateNachricht()
     abbrechen->release();
     fortschritt->release();
     updateH->remove( update->getDateiGruppe() );
+    update->abbrechen();
+    update->warteAufThread( 10000 );
+    update->ende();
     update->release();
 }
 
@@ -290,7 +278,7 @@ void SpielUpdateNachricht::entfernen()
     negAk();
 }
 
-void SpielUpdateNachricht::doPublicMausEreignis( MausEreignis & me )
+void SpielUpdateNachricht::doPublicMausEreignis( MausEreignis &me )
 {
     __super::doPublicMausEreignis( me );
     if( animation != 3 )
@@ -340,7 +328,7 @@ bool SpielUpdateNachricht::tick( double tickVal )
     return __super::tick( tickVal );
 }
 
-void SpielUpdateNachricht::render( int y, Bild & zRObj )
+void SpielUpdateNachricht::render( int y, Bild &zRObj )
 {
     __super::render( y, zRObj );
     int rbr = rahmen->getRBreite();
@@ -355,8 +343,8 @@ void SpielUpdateNachricht::render( int y, Bild & zRObj )
 
 // Inhalt der Nachricht Klasse aus NachrichtListe.h
 // Konstruktor
-Nachricht::Nachricht( Schrift * zSchrift, Text * titel, Text * nachricht, Text * positiv, Text * negativ, std::function<void()> posAk, std::function<void()> negAk )
-    : NLNachricht( zSchrift, titel )
+Nachricht::Nachricht( Text *titel, Text *nachricht, Text *positiv, Text *negativ, std::function<void()> posAk, std::function<void()> negAk )
+    : NLNachricht( titel )
 {
 
     Text *result = new Text( nachricht->getText() );
@@ -364,8 +352,8 @@ Nachricht::Nachricht( Schrift * zSchrift, Text * titel, Text * nachricht, Text *
     char *txt = nachricht->getText();
     int x = 0;
     int y = 0;
-    Alphabet *tmp = zSchrift->getAlphabet( 12 );
-    TextRenderer rd( zSchrift->getThis() );
+    Alphabet *tmp = uiFactory.initParam.schrift->getAlphabet( 12 );
+    TextRenderer rd( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     rd.setSchriftSize( 12 );
     int zeilenHöhe = rd.getZeilenHeight() + rd.getZeilenAbstand();
     int lastPos = -1;
@@ -397,25 +385,25 @@ Nachricht::Nachricht( Schrift * zSchrift, Text * titel, Text * nachricht, Text *
                 i = lastPos;
                 lastPos = -1;
             }
-            b = b->release();
+            b->release();
         }
     }
     y += zeilenHöhe;
-    tmp = tmp->release();
-    nachricht = nachricht->release();
-    text = initTextFeld( 1, 22, 228, y, zSchrift, TextFeld::Style::Text, result->getText() );
-    result = result->release();
+    tmp->release();
+    nachricht->release();
+    text = initTextFeld( 1, 22, 228, y, TextFeld::Style::Text, result->getText() );
+    result->release();
     if( positiv )
     {
-        this->positiv = initKnopf( 10, 20 + y, 100, 20, zSchrift, Knopf::Style::Sichtbar, positiv->getText() );
-        positiv = positiv->release();
+        this->positiv = initKnopf( 10, 20 + y, 100, 20, Knopf::Style::Sichtbar, positiv->getText() );
+        positiv->release();
     }
     else
         this->positiv = 0;
     if( negativ )
     {
-        this->negativ = initKnopf( 120, 20 + y, 100, 20, zSchrift, Knopf::Style::Sichtbar, negativ->getText() );
-        negativ = negativ->release();
+        this->negativ = initKnopf( 120, 20 + y, 100, 20, Knopf::Style::Sichtbar, negativ->getText() );
+        negativ->release();
     }
     else
         this->negativ = 0;
@@ -440,7 +428,7 @@ void Nachricht::entfernen()
     negAk();
 }
 
-void Nachricht::doPublicMausEreignis( MausEreignis & me )
+void Nachricht::doPublicMausEreignis( MausEreignis &me )
 {
     __super::doPublicMausEreignis( me );
     if( animation != 3 )
@@ -491,7 +479,7 @@ bool Nachricht::tick( double tickVal )
     return __super::tick( tickVal );
 }
 
-void Nachricht::render( int yPos, Bild & zRObj )
+void Nachricht::render( int yPos, Bild &zRObj )
 {
     __super::render( yPos, zRObj );
     int rbr = rahmen->getRBreite();
@@ -508,14 +496,13 @@ void Nachricht::render( int yPos, Bild & zRObj )
 
 // Inhalt der NachrichtenListeObj Klasse aus NachrichtListe.h
 // Konstruktor
-NachrichtenListeObj::NachrichtenListeObj( Schrift * zSchrift )
+NachrichtenListeObj::NachrichtenListeObj()
     : Zeichnung()
 {
     members = new RCArray< NLNachricht >();
-    schrift = zSchrift->getThis();
     vsb = new VScrollBar();
     vsb->setKlickScroll( 10 );
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     vsb->update( 0, bildschirmGröße.y - 122 );
     anzahl = 0;
     gr = Punkt( 250, bildschirmGröße.y - 122 );
@@ -524,20 +511,19 @@ NachrichtenListeObj::NachrichtenListeObj( Schrift * zSchrift )
 // Destruktor
 NachrichtenListeObj::~NachrichtenListeObj()
 {
-    schrift = schrift->release();
     vsb = (VScrollBar *)vsb->release();
-    members = members->release();
+    members->release();
 }
 
 // nicht constant
-void NachrichtenListeObj::addNachricht( NLNachricht * nachricht )
+void NachrichtenListeObj::addNachricht( NLNachricht *nachricht )
 {
     members->add( nachricht, anzahl );
     anzahl++;
     rend = 1;
 }
 
-void NachrichtenListeObj::removeNachricht( NLNachricht * zNachricht )
+void NachrichtenListeObj::removeNachricht( NLNachricht *zNachricht )
 {
     for( int i = 0; i < anzahl; i++ )
     {
@@ -577,7 +563,7 @@ bool NachrichtenListeObj::tick( double tickVal )
     return ret;
 }
 
-void NachrichtenListeObj::doPublicMausEreignis( MausEreignis & me )
+void NachrichtenListeObj::doPublicMausEreignis( MausEreignis &me )
 {
     lockZeichnung();
     int my = me.my;
@@ -620,7 +606,7 @@ void NachrichtenListeObj::doPublicMausEreignis( MausEreignis & me )
     unlockZeichnung();
 }
 
-void NachrichtenListeObj::render( Bild & zrObj )
+void NachrichtenListeObj::render( Bild &zrObj )
 {
     lockZeichnung();
     int x = pos.x;
@@ -651,29 +637,29 @@ void NachrichtenListeObj::render( Bild & zrObj )
 
 // Inhalt der NachrichtenListe Klasse aus NachrichtListe.h
 // Konstruktor
-NachrichtenListe::NachrichtenListe( Schrift * zSchrift, Fenster * zNachLoginFenster )
+NachrichtenListe::NachrichtenListe( Fenster *zNachLoginFenster )
+    : ReferenceCounter()
 {
-    schrift = zSchrift->getThis();
     minimierenBild = bilder->get( "data/client/bilder/chat.ltdb/minimieren.png" );
     maximierenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
-    bildschirmGröße = hauptScreen->getBackBufferSize();
-    fenster = initFenster( bildschirmGröße.x - 21, 100, 250, 22, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::BodyHintergrund, "" );
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    fenster = initFenster( bildschirmGröße.x - 21, 100, 250, 22, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::BodyHintergrund, "" );
     fenster->setKBgFarbe( 0xFF000000 );
-    überschrift = initTextFeld( 1, 1, 248, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Sichtbar, "Nachrichten" );
+    überschrift = initTextFeld( 1, 1, 248, 20, TextFeld::Style::Text | TextFeld::Style::Center | TextFeld::Style::Sichtbar, "Nachrichten" );
     überschrift->setSchriftSize( 15 );
-    fenster->addMember( überschrift->getThis() );
-    minMax = initKnopf( 1, 1, 20, 20, 0, 0, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( überschrift->getThis() ) );
+    minMax = initKnopf( 1, 1, 20, 20, 0, "" );
     minMax->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
     minMax->setMausEreignisParameter( this );
     minMax->setMausEreignis( NachrichtenListeMinMaxME );
-    minMax->setHintergrundBildZ( minimierenBild->getThis() );
-    initToolTip( minMax, "Nachrichten Leiste minimieren.", zSchrift, hauptScreen );
-    fenster->addMember( minMax->getThis() );
-    nachrichtenListe = new NachrichtenListeObj( zSchrift );
+    minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
+    initToolTip( minMax, "Nachrichten Leiste minimieren." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( minMax->getThis() ) );
+    nachrichtenListe = new NachrichtenListeObj();
     nachrichtenListe->setPosition( 1, 21 );
     nachrichtenListe->setSize( 248, bildschirmGröße.y - 122 );
-    fenster->addMember( nachrichtenListe->getThis() );
-    zNachLoginFenster->addMember( fenster->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachrichtenListe->getThis() ) );
+    zNachLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
     tickVal = 0;
     animation = 1;
     rend = 0;
@@ -699,7 +685,6 @@ NachrichtenListe::NachrichtenListe( Schrift * zSchrift, Fenster * zNachLoginFens
         if( !msgSound && !errSound )
             Framework::getDLLRegister()->releaseDLL( "GSL.dll" );
     }
-    ref = 1;
 }
 
 // Destruktor
@@ -723,13 +708,13 @@ NachrichtenListe::~NachrichtenListe()
     fenster = (Fenster *)fenster->release();
     minMax = (Knopf *)minMax->release();
     nachrichtenListe = (NachrichtenListeObj *)nachrichtenListe->release();
-    minimierenBild = minimierenBild->release();
-    maximierenBild = maximierenBild->release();
+    minimierenBild->release();
+    maximierenBild->release();
     schrift->release();
 }
 
 // nicht constant
-void NachrichtenListe::addNachricht( Text * titel, Text * nachricht, Text * positiv, Text * negativ, std::function<void()> posAk, std::function<void()> negAk )
+void NachrichtenListe::addNachricht( Text *titel, Text *nachricht, Text *positiv, Text *negativ, std::function<void()> posAk, std::function<void()> negAk )
 {
     int sound = userOptions->wertExistiert( "GUISound" ) ? *userOptions->zWert( "GUISound" ) : 100;
     if( titel && titel->hat( "Fehler" ) && errSound )
@@ -742,9 +727,9 @@ void NachrichtenListe::addNachricht( Text * titel, Text * nachricht, Text * posi
         msgSound->setVolume( (int)( ( sound / 100.0 ) * 0xFFFF ), (int)( ( sound / 100.0 ) * 0xFFFF ) );
         msgSound->playSound();
     }
-    nachrichtenListe->addNachricht( new Nachricht( schrift, titel, nachricht, positiv, negativ, posAk, negAk ) );
+    nachrichtenListe->addNachricht( new Nachricht( titel, nachricht, positiv, negativ, posAk, negAk ) );
 }
-void NachrichtenListe::addNachricht( NLNachricht * nachricht )
+void NachrichtenListe::addNachricht( NLNachricht *nachricht )
 {
     int sound = userOptions->wertExistiert( "GUISound" ) ? *userOptions->zWert( "GUISound" ) : 100;
     if( nachricht->zTitel() && nachricht->zTitel()->hat( "Fehler" ) && errSound )
@@ -760,7 +745,7 @@ void NachrichtenListe::addNachricht( NLNachricht * nachricht )
     nachrichtenListe->addNachricht( nachricht );
 }
 
-void NachrichtenListe::removeNachricht( NLNachricht * zNachricht )
+void NachrichtenListe::removeNachricht( NLNachricht *zNachricht )
 {
     nachrichtenListe->removeNachricht( zNachricht );
 }
@@ -770,20 +755,20 @@ void NachrichtenListe::removeAll()
     nachrichtenListe->removeAll();
 }
 
-bool NachrichtenListe::druckMinMax( MausEreignis & me )
+bool NachrichtenListe::druckMinMax( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
         if( minMax->zHintergrundBild() == minimierenBild )
         {
             animation = 2;
-            minMax->setHintergrundBildZ( maximierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( maximierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Nachrichten Leiste maximieren." );
         }
         else
         {
             animation = 1;
-            minMax->setHintergrundBildZ( minimierenBild->getThis() );
+            minMax->setHintergrundBildZ( dynamic_cast<Bild *>( minimierenBild->getThis() ) );
             // TODO minMax->zToolTip()->setText( "Nachrichten Leiste minimieren." );
         }
     }
@@ -861,27 +846,6 @@ bool NachrichtenListe::tick( double tickVal )
     return ret;
 }
 
-// contant
-Schrift *NachrichtenListe::zSchrift() const
-{
-    return schrift;
-}
-
-// Reference Counting
-NachrichtenListe *NachrichtenListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-NachrichtenListe *NachrichtenListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Nachrichten
 bool NachrichtenListeMinMaxME( void *p, void *obj, MausEreignis me )
 {

+ 52 - 63
KSGClient/NachLogin/Chat/NachrichtenListe.h

@@ -15,7 +15,7 @@
 using namespace Framework;
 using namespace Network;
 
-class NLNachricht
+class NLNachricht : public virtual ReferenceCounter
 {
 protected:
     TextFeld *titel;
@@ -27,9 +27,8 @@ protected:
     int animation;
     double tickVal;
     bool rend;
-    int ref;
 
-    NLNachricht( Schrift *zSchrift, Text *titel );
+    NLNachricht( Text *titel );
     virtual ~NLNachricht();
 public:
     virtual void entfernen();
@@ -41,9 +40,6 @@ public:
     bool istAusgewählt() const;
     int getHeight() const;
     Text *zTitel() const;
-    // Reference Counting
-    NLNachricht *getThis();
-    NLNachricht *release();
 };
 
 class SpielUpdateNachricht : public NLNachricht
@@ -58,7 +54,7 @@ private:
     Update *update;
 
 public:
-    SpielUpdateNachricht( Schrift *zSchrift, Text *titel, Text *nachricht, int dgID, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
+    SpielUpdateNachricht( Text *titel, Text *nachricht, int dgID, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
     ~SpielUpdateNachricht();
     // nicht constant
     void entfernen() override;
@@ -70,82 +66,75 @@ public:
 class Nachricht : public NLNachricht
 {
 private:
-	TextFeld *text;
-	Knopf *positiv;
-	Knopf *negativ;
+    TextFeld *text;
+    Knopf *positiv;
+    Knopf *negativ;
     std::function<void()> posAk;
     std::function<void()> negAk;
 
 public:
-	// Konstruktor
-    Nachricht( Schrift *zSchrift, Text *titel, Text *nachricht, Text *positiv, Text *negativ, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
-	// Destruktor
-	~Nachricht();
-	// nicht constant
+    // Konstruktor
+    Nachricht( Text *titel, Text *nachricht, Text *positiv, Text *negativ, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
+    // Destruktor
+    ~Nachricht();
+    // nicht constant
     void entfernen() override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	bool tick( double tickVal ) override;
-	void render( int y, Bild &zRObj ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    bool tick( double tickVal ) override;
+    void render( int y, Bild &zRObj ) override;
 };
 
 class NachrichtenListeObj : public Zeichnung
 {
 private:
-	RCArray< NLNachricht > *members;
-	VScrollBar *vsb;
-	Schrift *schrift;
-	Punkt bildschirmGröße;
-	int anzahl;
+    RCArray< NLNachricht > *members;
+    VScrollBar *vsb;
+    Punkt bildschirmGröße;
+    int anzahl;
 
 public:
-	// Konstruktor
-	NachrichtenListeObj( Schrift *zSchrift );
-	// Destruktor
-	~NachrichtenListeObj();
-	// nicht constant
-	void addNachricht( NLNachricht *nachricht );
-	void removeNachricht( NLNachricht *zNachricht );
-	void removeAll();
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void render( Bild &zRObj ) override;
+    // Konstruktor
+    NachrichtenListeObj();
+    // Destruktor
+    ~NachrichtenListeObj();
+    // nicht constant
+    void addNachricht( NLNachricht *nachricht );
+    void removeNachricht( NLNachricht *zNachricht );
+    void removeAll();
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void render( Bild &zRObj ) override;
 };
 
-class NachrichtenListe
+class NachrichtenListe : public virtual ReferenceCounter
 {
 private:
     Schrift *schrift;
-	Fenster *fenster;
-	Knopf *minMax;
-	NachrichtenListeObj *nachrichtenListe;
-	Punkt bildschirmGröße;
-	TextFeld *überschrift;
-	Bild *minimierenBild;
-	Bild *maximierenBild;
-	GSL::GSLSoundV *msgSound;
-	GSL::GSLSoundV *errSound;
-	double tickVal;
-	int animation;
-	bool rend;
-	int ref;
+    Fenster *fenster;
+    Knopf *minMax;
+    NachrichtenListeObj *nachrichtenListe;
+    Punkt bildschirmGröße;
+    TextFeld *überschrift;
+    Bild *minimierenBild;
+    Bild *maximierenBild;
+    GSL::GSLSoundV *msgSound;
+    GSL::GSLSoundV *errSound;
+    double tickVal;
+    int animation;
+    bool rend;
 
 public:
-	// Konstruktor
-	NachrichtenListe( Schrift *zSchrift, Fenster *zNachLoginFenster );
-	// Destruktor
-	~NachrichtenListe();
-	// nicht constant
-	void addNachricht( Text *titel, Text *nachricht, Text *positiv = 0, Text *negativ = 0, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
+    // Konstruktor
+    NachrichtenListe( Fenster *zNachLoginFenster );
+    // Destruktor
+    ~NachrichtenListe();
+    // nicht constant
+    void addNachricht( Text *titel, Text *nachricht, Text *positiv = 0, Text *negativ = 0, std::function<void()> posAk = []() {}, std::function<void()> negAk = []() {} );
     void addNachricht( NLNachricht *nachricht );
-	void removeNachricht( NLNachricht *zNachricht );
-	void removeAll();
-	bool druckMinMax( MausEreignis &me );
-	bool tick( double tickVal );
-	// contant
-    Schrift *zSchrift() const;
-	// Reference Counting
-	NachrichtenListe *getThis();
-	NachrichtenListe *release();
+    void removeNachricht( NLNachricht *zNachricht );
+    void removeAll();
+    bool druckMinMax( MausEreignis &me );
+    bool tick( double tickVal );
 };
 
 // Nachrichten

+ 35 - 49
KSGClient/NachLogin/Editor/Auswahl/Auswahl.cpp

@@ -6,30 +6,29 @@
 
 // Inhalt der Auswahl Klasse aus Auswahl.h
 // Konstruktor
-Auswahl::Auswahl( Schrift *zSchrift, KartenEditor *kEditor )
+Auswahl::Auswahl( KartenEditor *kEditor )
     : Thread()
 {
     this->kEditor = kEditor;
     alpha = 255;
     sichtbar = 0;
-    suchFilterT = initTextFeld( 10, 10, 70, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Suchfilter:" );
-    suchFilter = initTextFeld( 90, 10, 210, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( suchFilter, "Gebe etwas vom Namen der Karte ein, nach der du suchst.", zSchrift, hauptScreen );
-    suchen = initKnopf( 310, 10, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
-    sortSpalte = initAuswahlBox( 640, 10, 120, 20, zSchrift, ABSTYLE,
+    suchFilterT = initTextFeld( 10, 10, 70, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Suchfilter:" );
+    suchFilter = initTextFeld( 90, 10, 210, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( suchFilter, "Gebe etwas vom Namen der Karte ein, nach der du suchst." );
+    suchen = initKnopf( 310, 10, 100, 20, Knopf::Style::Sichtbar, "suchen" );
+    sortSpalte = initAuswahlBox( 640, 10, 120, 20, ABSTYLE,
                                  { "Name", "Spielart", "Preis (Kupfer)", "Verkauft", "Spieleranzahl" } );
-    sortRichtung = initAuswahlBox( 770, 10, 120, 20, zSchrift, ABSTYLE, { "Aufsteigend", "Absteigend" } );
-    karten = initObjTabelle( 10, 40, 880, 520, zSchrift, OTSTYLE, { { "Name", 220, 220, 220 }, { "Spielart", 220, 220, 220 },
+    sortRichtung = initAuswahlBox( 770, 10, 120, 20, ABSTYLE, { "Aufsteigend", "Absteigend" } );
+    karten = initObjTabelle( 10, 40, 880, 520, OTSTYLE, { { "Name", 220, 220, 220 }, { "Spielart", 220, 220, 220 },
     { "Kupfer", 130, 130, 130 }, { "Verkauft", 125, 125, 125 }, { "Spieleranzahl", 140, 140, 140 },
     { "", 20, 20, 20 } }, 20 );
-    neuKarteName = initTextFeld( 10, 570, 195, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( neuKarteName, "Name einer neuen Karte", zSchrift, hauptScreen );
-    neuKarteSpielArt = initAuswahlBox( 215, 570, 195, 20, zSchrift, ABSTYLE, {} );
-    neuKarte = initKnopf( 420, 570, 120, 20, zSchrift, Knopf::Style::Sichtbar, "Karte Erstellen" );
-    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    neuKarteName = initTextFeld( 10, 570, 195, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( neuKarteName, "Name einer neuen Karte" );
+    neuKarteSpielArt = initAuswahlBox( 215, 570, 195, 20, ABSTYLE, {} );
+    neuKarte = initKnopf( 420, 570, 120, 20, Knopf::Style::Sichtbar, "Karte Erstellen" );
+    laden = (Framework::Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
-    schrift = zSchrift->getThis();
     aktion = 0;
     tickVal = 0;
     rend = 0;
@@ -48,7 +47,6 @@ Auswahl::~Auswahl()
     neuKarteName->release();
     neuKarteSpielArt->release();
     neuKarte->release();
-    schrift->release();
     kEditor->release();
 }
 
@@ -110,7 +108,7 @@ void Auswahl::thread()
         int port = 0;
         Text ip = "";
         if( editorClient )
-            editorClient = editorClient->release();
+            editorClient = (KSGClient::EditorServerClient *)editorClient->release();
         editorClient = infoClient->createEditorServerClient( aktion );
         if( !editorClient )
         {
@@ -152,7 +150,7 @@ void Auswahl::thread()
         {
             if( !saList->hat( i ) )
                 continue;
-            Text * name = infoClient->getSpielName( saList->hat( i ) ? saList->get( i ) : 0 );
+            Text *name = infoClient->getSpielName( saList->hat( i ) ? saList->get( i ) : 0 );
             if( name )
                 saNamen->add( name );
         }
@@ -176,13 +174,13 @@ void Auswahl::thread()
     for( int i = 1; i < anz; i++ )
         karten->removeZeile( 1 );
     karten->unlockZeichnung();
-    Bild * shopWeiter = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
-    Array< int > * kId = new Array< int >();
-    RCArray< Text > * kName = new RCArray< Text >();
-    RCArray< Text > * saName = new RCArray< Text >();
-    Array< int > * kupfer = new Array< int >();
-    Array< int > * verkauft = new Array< int >();
-    Array< int > * maxSpieler = new Array< int >();
+    Bild *shopWeiter = bilder->get( "data/client/bilder/shop.ltdb/weiter.png" );
+    Array< int > *kId = new Array< int >();
+    RCArray< Text > *kName = new RCArray< Text >();
+    RCArray< Text > *saName = new RCArray< Text >();
+    Array< int > *kupfer = new Array< int >();
+    Array< int > *verkauft = new Array< int >();
+    Array< int > *maxSpieler = new Array< int >();
     int kAnz = infoClient->getKartenListe( suchFilter->zText()->getText(), (char)sortSpalte->getAuswahl(), (char)sortRichtung->getAuswahl(),
                                            kId, kName, saName, kupfer, verkauft, maxSpieler );
     for( int i = 0; i < kAnz; i++ )
@@ -190,14 +188,14 @@ void Auswahl::thread()
         Text zeile;
         zeile = kId->get( i );
         karten->addZeile( zeile );
-        karten->setZeichnungZ( 0, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, kName->z( i )->getText() ) );
-        karten->setZeichnungZ( 1, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, saName->z( i )->getText() ) );
-        karten->setZeichnungZ( 2, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += kupfer->get( i ) ) );
-        karten->setZeichnungZ( 3, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += verkauft->get( i ) ) );
-        karten->setZeichnungZ( 4, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += maxSpieler->get( i ) ) );
-        Knopf * weiter = initKnopf( 0, 0, 0, 0, schrift, 0, "" );
+        karten->setZeichnungZ( 0, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, kName->z( i )->getText() ) );
+        karten->setZeichnungZ( 1, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, saName->z( i )->getText() ) );
+        karten->setZeichnungZ( 2, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += kupfer->get( i ) ) );
+        karten->setZeichnungZ( 3, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += verkauft->get( i ) ) );
+        karten->setZeichnungZ( 4, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text | TextFeld::Style::VCenter, Text() += maxSpieler->get( i ) ) );
+        Knopf *weiter = initKnopf( 0, 0, 0, 0, 0, "" );
         weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-        weiter->setHintergrundBildZ( shopWeiter->getThis() );
+        weiter->setHintergrundBildZ( dynamic_cast<Bild *>( shopWeiter->getThis() ) );
         weiter->setMausEreignisParameter( this );
         weiter->setMausEreignis( auswahlWeiterME );
         karten->setZeichnungZ( 5, i + 1, weiter );
@@ -213,7 +211,7 @@ void Auswahl::thread()
     run = 0;
 }
 
-bool Auswahl::weiterME( Zeichnung * obj, MausEreignis & me )
+bool Auswahl::weiterME( Zeichnung *obj, MausEreignis &me )
 {
     if( me.id != ME_RLinks )
         return 1;
@@ -231,14 +229,14 @@ bool Auswahl::weiterME( Zeichnung * obj, MausEreignis & me )
     return 1;
 }
 
-void Auswahl::doPublicMausEreignis( MausEreignis & me )
+void Auswahl::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar || run )
         return;
     suchFilter->doPublicMausEreignis( me );
     bool vera = me.verarbeitet;
     suchen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         aktion = 0;
         start();
@@ -271,13 +269,13 @@ void Auswahl::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void Auswahl::doTastaturEreignis( TastaturEreignis & te )
+void Auswahl::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar || run )
         return;
     bool vera = te.verarbeitet;
     suchFilter->doTastaturEreignis( te );
-    if( !vera && te.verarbeitet &&te.taste == T_Enter && te.id == TE_Release )
+    if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
     {
         MausEreignis me;
         me.id = ME_RLinks;
@@ -351,7 +349,7 @@ bool Auswahl::tick( double zeit )
     return ret;
 }
 
-void Auswahl::render( Bild & zRObj )
+void Auswahl::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -375,18 +373,6 @@ bool Auswahl::istSichtbar() const
     return sichtbar;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *Auswahl::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 1000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
-}
-
 
 // Ereignisse
 bool auswahlWeiterME( void *p, void *obj, MausEreignis me )

+ 30 - 33
KSGClient/NachLogin/Editor/Auswahl/Auswahl.h

@@ -13,41 +13,38 @@ using namespace Framework;
 class Auswahl : public Thread
 {
 private:
-	KartenEditor *kEditor;
-	Animation2D *laden;
-	TextFeld *suchFilterT;
-	TextFeld *suchFilter;
-	Knopf *suchen;
-	AuswahlBox *sortSpalte;
-	AuswahlBox *sortRichtung;
-	ObjTabelle *karten;
-	TextFeld *neuKarteName;
-	AuswahlBox *neuKarteSpielArt;
-	Knopf *neuKarte;
-	Schrift *schrift;
-	int aktion;
-	unsigned char alpha;
-	bool sichtbar;
-	double tickVal;
-	bool rend;
+    KartenEditor *kEditor;
+    Animation2D *laden;
+    TextFeld *suchFilterT;
+    TextFeld *suchFilter;
+    Knopf *suchen;
+    AuswahlBox *sortSpalte;
+    AuswahlBox *sortRichtung;
+    ObjTabelle *karten;
+    TextFeld *neuKarteName;
+    AuswahlBox *neuKarteSpielArt;
+    Knopf *neuKarte;
+    int aktion;
+    unsigned char alpha;
+    bool sichtbar;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	Auswahl( Schrift *zSchrift, KartenEditor *kEditor );
-	// Destruktor
-	~Auswahl();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	virtual void thread();
-	bool weiterME( Zeichnung *obj, MausEreignis &me );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    Auswahl( KartenEditor *kEditor );
+    // Destruktor
+    ~Auswahl();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    virtual void thread();
+    bool weiterME( Zeichnung *obj, MausEreignis &me );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 // Ereignisse

+ 160 - 157
KSGClient/NachLogin/Editor/Editor.cpp

@@ -5,197 +5,200 @@
 
 // Inhalt der Editor Klasse aus Editor.h
 // Konstruktor
-Editor::Editor( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
-	: Zeichnung()
+Editor::Editor( Fenster *zNachLoginFenster, int x )
+    : Zeichnung()
 {
-	schrift = zSchrift->getThis();
-	bildschirmGröße = hauptScreen->getBackBufferSize();
-	pos = Punkt( x, 35 );
-	gr = Punkt( 102, 32 );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setSize( 102, 32 );
-	alpha = 0;
-	animation = 0;
-	sichtbar = 0;
-	tickVal = 0;
-	jetzt = 0;
-	prozent1 = 0;
-	prozent2 = 0;
-	begPos = Punkt( 0, 0 );
-	begGröße = Punkt( 0, 0 );
-	größe1 = Punkt( 102, 32 );
-	pos1 = Punkt( x, 35 );
-	größe2 = Punkt( 900, 600 );
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	laden = (Animation2D*)ladeAnimation->dublizieren();
-	laden->setSichtbar( 0 );
-	laden->setPosition( 425, 275 );
-	zNachLoginFenster->addMember( getThis() );
-	kEditor = new KartenEditor( schrift->getThis() );
-	karteAuswahl = new Auswahl( zSchrift, (KartenEditor*)kEditor->getThis() );
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    pos = Punkt( x, 35 );
+    gr = Punkt( 102, 32 );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setSize( 102, 32 );
+    alpha = 0;
+    animation = 0;
+    sichtbar = 0;
+    tickVal = 0;
+    jetzt = 0;
+    prozent1 = 0;
+    prozent2 = 0;
+    begPos = Punkt( 0, 0 );
+    begGröße = Punkt( 0, 0 );
+    größe1 = Punkt( 102, 32 );
+    pos1 = Punkt( x, 35 );
+    größe2 = Punkt( 900, 600 );
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    laden = (Animation2D *)ladeAnimation->dublizieren();
+    laden->setSichtbar( 0 );
+    laden->setPosition( 425, 275 );
+    getThis();
+    zNachLoginFenster->addMember( this );
+    kEditor = new KartenEditor();
+    karteAuswahl = new Auswahl( dynamic_cast<KartenEditor *>( kEditor->getThis() ) );
 }
 
 // Destruktor
 Editor::~Editor()
 {
-	rahmen->release();
-	laden->release();
-	karteAuswahl->release();
-	kEditor->release();
-	schrift->release();
+    karteAuswahl->warteAufThread( 10000 );
+    karteAuswahl->ende();
+    kEditor->warteAufThread( 10000 );
+    kEditor->ende();
+    kEditor->release();
+    rahmen->release();
+    laden->release();
+    karteAuswahl->release();
 }
 
 // nicht constant
 void Editor::setSichtbar( bool sicht )
 {
-	begPos = pos;
-	begGröße = gr;
-	animation |= ( sicht ? 0x1 : 0x2 );
-	rend = 1;
+    begPos = pos;
+    begGröße = gr;
+    animation |= ( sicht ? 0x1 : 0x2 );
+    rend = 1;
 }
 
 void Editor::doPublicMausEreignis( MausEreignis &me )
 {
-	if( animation || !sichtbar )
-		return;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	switch( jetzt )
-	{
-	case 1: // Karten Auswahl
-		karteAuswahl->doPublicMausEreignis( me );
-		break;
-	case 2: // Karten Editor
-		kEditor->doPublicMausEreignis( me );
-		break;
-	}
-	me.mx += pos.x;
-	me.my += pos.y;
+    if( animation || !sichtbar )
+        return;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    switch( jetzt )
+    {
+    case 1: // Karten Auswahl
+        karteAuswahl->doPublicMausEreignis( me );
+        break;
+    case 2: // Karten Editor
+        kEditor->doPublicMausEreignis( me );
+        break;
+    }
+    me.mx += pos.x;
+    me.my += pos.y;
 }
 
 void Editor::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( animation || !sichtbar )
-		return;
-	switch( jetzt )
-	{
-	case 1: // Karten Auswahl
-		karteAuswahl->doTastaturEreignis( te );
-		break;
-	case 2: // Karten Editor
-		kEditor->doTastaturEreignis( te );
-		break;
-	}
+    if( animation || !sichtbar )
+        return;
+    switch( jetzt )
+    {
+    case 1: // Karten Auswahl
+        karteAuswahl->doTastaturEreignis( te );
+        break;
+    case 2: // Karten Editor
+        kEditor->doTastaturEreignis( te );
+        break;
+    }
 }
 
 bool Editor::tick( double z )
 {
-	rend |= laden->tick( z );
-	rend |= karteAuswahl->tick( z );
-	if( jetzt == 1 && !karteAuswahl->istSichtbar() )
-	{
-		kEditor->setSichtbar( 1 );
-		jetzt = 2;
-	}
-	if( jetzt == 2 && !kEditor->istSichtbar() )
-	{
-		karteAuswahl->setSichtbar( 1 );
-		jetzt = 1;
-	}
-	rend |= kEditor->tick( z );
-	tickVal += z * 150;
-	int val = (int)tickVal;
-	if( val < 1 )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	tickVal -= val;
-	if( ( animation | 0x1 ) == animation ) // Einblenden
-	{
-		if( prozent1 != 100 )
-		{
-			prozent1 += val;
-			if( prozent1 >= 100 )
-			{
-				if( !jetzt )
-				{
-					karteAuswahl->setSichtbar( 1 );
-					jetzt = 1;
-				}
-				prozent1 = 100;
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
-		}
-		else if( alpha != 255 )
-		{
-			alpha += val * 2;
-			if( alpha >= 255 || ( animation | 0x2 ) == animation )
-			{
-				alpha = 255;
-				animation &= ~0x1;
-				sichtbar = 1;
-				prozent1 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x2 ) == animation ) // ausblenden
-	{
-		if( alpha != 0 )
-		{
-			alpha -= val * 2;
-			if( alpha < 0 )
-				alpha = 0;
-		}
-		else
-		{
-			prozent2 += val;
-			if( prozent2 > 100 )
-				prozent2 = 100;
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
-			if( prozent2 == 100 )
-			{
-				prozent2 = 0;
-				animation &= ~0x2;
-				sichtbar = 0;
-			}
-		}
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= laden->tick( z );
+    rend |= karteAuswahl->tick( z );
+    if( jetzt == 1 && !karteAuswahl->istSichtbar() )
+    {
+        kEditor->setSichtbar( 1 );
+        jetzt = 2;
+    }
+    if( jetzt == 2 && !kEditor->istSichtbar() )
+    {
+        karteAuswahl->setSichtbar( 1 );
+        jetzt = 1;
+    }
+    rend |= kEditor->tick( z );
+    tickVal += z * 150;
+    int val = (int)tickVal;
+    if( val < 1 )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    tickVal -= val;
+    if( ( animation | 0x1 ) == animation ) // Einblenden
+    {
+        if( prozent1 != 100 )
+        {
+            prozent1 += val;
+            if( prozent1 >= 100 )
+            {
+                if( !jetzt )
+                {
+                    karteAuswahl->setSichtbar( 1 );
+                    jetzt = 1;
+                }
+                prozent1 = 100;
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
+        }
+        else if( alpha != 255 )
+        {
+            alpha += val * 2;
+            if( alpha >= 255 || ( animation | 0x2 ) == animation )
+            {
+                alpha = 255;
+                animation &= ~0x1;
+                sichtbar = 1;
+                prozent1 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x2 ) == animation ) // ausblenden
+    {
+        if( alpha != 0 )
+        {
+            alpha -= val * 2;
+            if( alpha < 0 )
+                alpha = 0;
+        }
+        else
+        {
+            prozent2 += val;
+            if( prozent2 > 100 )
+                prozent2 = 100;
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
+            if( prozent2 == 100 )
+            {
+                prozent2 = 0;
+                animation &= ~0x2;
+                sichtbar = 0;
+            }
+        }
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void Editor::render( Bild &zRObj )
 {
-	if( pos == pos1 )
-		return;
-	if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
-		return;
-	rahmen->setSize( gr );
-	rahmen->render( zRObj );
-	int rbr = rahmen->getRBreite();
-	zRObj.setAlpha( (unsigned char)alpha );
-	karteAuswahl->render( zRObj );
-	kEditor->render( zRObj );
-	laden->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    if( pos == pos1 )
+        return;
+    if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
+        return;
+    rahmen->setSize( gr );
+    rahmen->render( zRObj );
+    int rbr = rahmen->getRBreite();
+    zRObj.setAlpha( (unsigned char)alpha );
+    karteAuswahl->render( zRObj );
+    kEditor->render( zRObj );
+    laden->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool Editor::istAnimiert() const
 {
-	return animation != 0;
+    return animation != 0;
 }
 
 bool Editor::istSichtbar() const
 {
-	return sichtbar || prozent1 != 0;
+    return sichtbar || prozent1 != 0;
 }

+ 32 - 33
KSGClient/NachLogin/Editor/Editor.h

@@ -11,41 +11,40 @@ using namespace Framework;
 class Editor : public Zeichnung
 {
 private:
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	Animation2D *laden;
-	Schrift *schrift;
-	Auswahl *karteAuswahl;
-	KartenEditor *kEditor;
-	int dg;
-	int animation;
-	int alpha;
-	bool sichtbar;
-	int prozent1;
-	int prozent2;
-	double tickVal;
-	int jetzt;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    Animation2D *laden;
+    Auswahl *karteAuswahl;
+    KartenEditor *kEditor;
+    int dg;
+    int animation;
+    int alpha;
+    bool sichtbar;
+    int prozent1;
+    int prozent2;
+    double tickVal;
+    int jetzt;
 
 public:
-	// Konstruktor
-	Editor( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~Editor();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	bool tick( double z ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
+    // Konstruktor
+    Editor( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~Editor();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool tick( double z ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 22 - 22
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBEditor.cpp

@@ -11,23 +11,23 @@ bool KEBKnopfPressME( void *p, void *obj, MausEreignis me );
 
 // Inhalt der KEBEditor Klasse aus KEBEditor.h
 // Konstruktor
-KEBEditor::KEBEditor( Schrift *zSchrift, KEBeschreibung *zKeb )
+KEBEditor::KEBEditor( KEBeschreibung *zKeb )
     : Zeichnung()
 {
-    beschreibung = initKnopf( 10, 10, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beschreibung" );
-    initToolTip( beschreibung, "Beschreibung bei der Kartenauswahl", zSchrift, hauptScreen );
+    beschreibung = initKnopf( 10, 10, 100, 20, Knopf::Style::Sichtbar, "Beschreibung" );
+    initToolTip( beschreibung, "Beschreibung bei der Kartenauswahl" );
     beschreibung->setMausEreignisParameter( zKeb );
     beschreibung->setMausEreignis( KEBKnopfPressME );
-    titelBild = initKnopf( 10, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Titel Bild" );
-    initToolTip( titelBild, "Titelbild während der Kartenauswahl (200x100)", zSchrift, hauptScreen );
+    titelBild = initKnopf( 10, 40, 100, 20, Knopf::Style::Sichtbar, "Titel Bild" );
+    initToolTip( titelBild, "Titelbild während der Kartenauswahl (200x100)" );
     titelBild->setMausEreignisParameter( zKeb );
     titelBild->setMausEreignis( KEBKnopfPressME );
-    mapBild = initKnopf( 10, 70, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Minimap Bild" );
-    initToolTip( mapBild, "Kartenvorschau Bild währed des erstellens einer Gruppe (348x348)", zSchrift, hauptScreen );
+    mapBild = initKnopf( 10, 70, 100, 20, Knopf::Style::Sichtbar, "Minimap Bild" );
+    initToolTip( mapBild, "Kartenvorschau Bild währed des erstellens einer Gruppe (348x348)" );
     mapBild->setMausEreignisParameter( zKeb );
     mapBild->setMausEreignis( KEBKnopfPressME );
-    ladenBild = initKnopf( 10, 100, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Laden Bild" );
-    initToolTip( ladenBild, "Hintergrundbild beim Laden der Karte", zSchrift, hauptScreen );
+    ladenBild = initKnopf( 10, 100, 100, 20, Knopf::Style::Sichtbar, "Laden Bild" );
+    initToolTip( ladenBild, "Hintergrundbild beim Laden der Karte" );
     ladenBild->setMausEreignisParameter( zKeb );
     ladenBild->setMausEreignis( KEBKnopfPressME );
     bild = initBildZ( 120, 10, 750, 510, ( BildZ::Style::normal | BildZ::Style::Alpha ) & ~BildZ::Style::Sichtbar, 0 );
@@ -43,7 +43,7 @@ KEBEditor::KEBEditor( Schrift *zSchrift, KEBeschreibung *zKeb )
         if( getKSGScriptEditor )
         {
             text = getKSGScriptEditor();
-            text->setSchriftZ( ( ksgsS ? ksgsS : zSchrift )->getThis() );
+            text->setSchriftZ( dynamic_cast<Schrift *>( ( ksgsS ? ksgsS : uiFactory.initParam.schrift )->getThis() ) );
             text->setSize( 750, 510 );
             text->setPosition( 120, 10 );
             text->setStyle( ZeichnungHintergrund::Style::HScroll | ZeichnungHintergrund::Style::VScroll | ZeichnungHintergrund::Style::Erlaubt | ZeichnungHintergrund::Style::Rahmen | ZeichnungHintergrund::Style::Hintergrund );
@@ -59,30 +59,30 @@ KEBEditor::KEBEditor( Schrift *zSchrift, KEBeschreibung *zKeb )
         {
             text = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-                new Text( "Der Einstiegspunkt '" KSGS_EDITOR_FUNKTION "' in der DLL-Datei "
-                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
-                new Text( "Ok" ), 0 );
+                                                          new Text( "Der Einstiegspunkt '" KSGS_EDITOR_FUNKTION "' in der DLL-Datei "
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                          new Text( "Ok" ), 0 );
         }
     }
     else
     {
         text = 0;
         nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-            new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
-            new Text( "Ok" ), 0 );
+                                                      new Text( "Die DLL-Datei 'data/bin/KSGScript.dll' konnte nicht geladen werden." ),
+                                                      new Text( "Ok" ), 0 );
     }
     if( ksgsS )
         ksgsS->release();
-    speichern = initKnopf( 10, 500, 100, 20, zSchrift, 0, "Speichern" );
-    initToolTip( speichern, "Beschreibung speichern", zSchrift, hauptScreen );
+    speichern = initKnopf( 10, 500, 100, 20, 0, "Speichern" );
+    initToolTip( speichern, "Beschreibung speichern" );
     speichern->setMausEreignisParameter( zKeb );
     speichern->setMausEreignis( KEBKnopfPressME );
-    importieren = initKnopf( 10, 500, 100, 20, zSchrift, 0, "Importieren" );
-    initToolTip( importieren, "Bild von Festplatte hochladen", zSchrift, hauptScreen );
+    importieren = initKnopf( 10, 500, 100, 20, 0, "Importieren" );
+    initToolTip( importieren, "Bild von Festplatte hochladen" );
     importieren->setMausEreignisParameter( zKeb );
     importieren->setMausEreignis( KEBKnopfPressME );
-    vorschau = initKnopf( 10, 470, 100, 20, zSchrift, 0, "Script Testen" );
-    initToolTip( vorschau, "Die Beschreibung auf Scriptfehler testen", zSchrift, hauptScreen );
+    vorschau = initKnopf( 10, 470, 100, 20, 0, "Script Testen" );
+    initToolTip( vorschau, "Die Beschreibung auf Scriptfehler testen" );
     vorschau->setMausEreignisParameter( zKeb );
     vorschau->setMausEreignis( KEBKnopfPressME );
     jetzt = 0;
@@ -125,7 +125,7 @@ void KEBEditor::setText( Text *zText )
 
 void KEBEditor::setBild( Bild *zBild )
 {
-    bild->setBildZ( zBild->getThis() );
+    bild->setBildZ( dynamic_cast<Bild *>( zBild->getThis() ) );
     text->removeStyle( ZeichnungHintergrund::Style::Sichtbar );
     bild->addStyle( BildZ::Style::Sichtbar );
     speichern->removeStyle( Knopf::Style::Sichtbar );

+ 1 - 1
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBEditor.h

@@ -27,7 +27,7 @@ private:
 
 public:
     // Konstruktor
-    KEBEditor( Schrift *zSchrift, KEBeschreibung *zKeb );
+    KEBEditor( KEBeschreibung *zKeb );
     // Destruktor
     ~KEBEditor();
     // nicht constant

+ 23 - 25
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBVorschau.cpp

@@ -13,7 +13,7 @@ void kEBVorschauKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVar
 
 // Inhalt der KEBVorschauKarteScript Klasse aus KEBVorschau.h
 // Konstruktor
-KEBVorschauKarteScript::KEBVorschauKarteScript( Schrift * zSchrift, TextFeld * zLog )
+KEBVorschauKarteScript::KEBVorschauKarteScript( TextFeld *zLog )
     : Thread()
 {
     ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
@@ -23,18 +23,18 @@ KEBVorschauKarteScript::KEBVorschauKarteScript( Schrift * zSchrift, TextFeld * z
         if( getKSGScript )
         {
             fenster = getKSGScript();
-            fenster->setSchriftZ( zSchrift->getThis() );
+            fenster->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
             fenster->setSize( 578, 428 );
-            fenster->setRückrufParam( this );
-            fenster->setRückrufFunktion( kEBVorschauKSGSAktion );
-            fenster->setLog( (TextFeld *)zLog->getThis() );
+            fenster->setCallbackParam( this );
+            fenster->setCallbackFunktion( kEBVorschauKSGSAktion );
+            fenster->setLog( dynamic_cast<TextFeld *>( zLog->getThis() ) );
         }
         else
         {
             fenster = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -61,7 +61,7 @@ KEBVorschauKarteScript::~KEBVorschauKarteScript()
 {
     if( fenster )
     {
-        fenster->zurücksetzen();
+        fenster->reset();
         fenster->release();
     }
     ram->release();
@@ -124,10 +124,10 @@ void KEBVorschauKarteScript::ladeKarteSeite( char *pfad )
     start();
 }
 
-void KEBVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void KEBVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {}
 
-void KEBVorschauKarteScript::doPublicMausEreignis( MausEreignis & me )
+void KEBVorschauKarteScript::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -137,7 +137,7 @@ void KEBVorschauKarteScript::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void KEBVorschauKarteScript::doTastaturEreignis( TastaturEreignis & te )
+void KEBVorschauKarteScript::doTastaturEreignis( TastaturEreignis &te )
 {
     if( fenster )
         fenster->doTastaturEreignis( te );
@@ -154,7 +154,7 @@ bool KEBVorschauKarteScript::tick( double zeit )
             alpha -= (unsigned char)( zeit * 150 );
         rend = 1;
     }
-    if( sichtbar &&alpha < 255 )
+    if( sichtbar && alpha < 255 )
     {
         if( alpha + zeit * 150 > 255 )
             alpha = 255;
@@ -165,7 +165,7 @@ bool KEBVorschauKarteScript::tick( double zeit )
     return rend;
 }
 
-void KEBVorschauKarteScript::render( Bild & zRObj )
+void KEBVorschauKarteScript::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
         return;
@@ -180,15 +180,14 @@ void KEBVorschauKarteScript::render( Bild & zRObj )
 
 // Inhalt der KEBVorschau Klasse aus KEBVorschau.h
 // Konstruktor
-KEBVorschau::KEBVorschau( Schrift * zSchrift )
+KEBVorschau::KEBVorschau()
     : Zeichnung()
 {
-    this->schrift = zSchrift->getThis();
-    neu = initKnopf( 10, 10, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Neu starten" );
-    beenden = initKnopf( 10, 40, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Beenden" );
-    log = initTextFeld( 10, 445, 860, 75, zSchrift, ( TextFeld::Style::TextGebiet | TextFeld::Style::HScroll ) & ~TextFeld::Style::Erlaubt, "Log:\n" );
-    script = new KEBVorschauKarteScript( zSchrift, log );
-    erlaubt = initKontrollKnopf( 10, 70, 100, 20, zSchrift, KontrollKnopf::Style::Normal | KontrollKnopf::Style::Selected, "Erlaubt" );
+    neu = initKnopf( 10, 10, 100, 20, Knopf::Style::Sichtbar, "Neu starten" );
+    beenden = initKnopf( 10, 40, 100, 20, Knopf::Style::Sichtbar, "Beenden" );
+    log = initTextFeld( 10, 445, 860, 75, ( TextFeld::Style::TextGebiet | TextFeld::Style::HScroll ) & ~TextFeld::Style::Erlaubt, "Log:\n" );
+    script = new KEBVorschauKarteScript( log );
+    erlaubt = initKontrollKnopf( 10, 70, 100, 20, KontrollKnopf::Style::Normal | KontrollKnopf::Style::Selected, "Erlaubt" );
     alpha = 0;
     sichtbar = 0;
     tickVal = 0;
@@ -199,7 +198,6 @@ KEBVorschau::KEBVorschau( Schrift * zSchrift )
 // Destruktor
 KEBVorschau::~KEBVorschau()
 {
-    schrift->release();
     script->release();
     neu->release();
     beenden->release();
@@ -246,18 +244,18 @@ void KEBVorschau::setSichtbar( bool sicht )
     sichtbar = sicht;
 }
 
-void KEBVorschau::doPublicMausEreignis( MausEreignis & me )
+void KEBVorschau::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
     script->doPublicMausEreignis( me );
     bool mev = me.verarbeitet;
     neu->doPublicMausEreignis( me );
-    if( !mev && me.verarbeitet &&me.id == ME_RLinks )
+    if( !mev && me.verarbeitet && me.id == ME_RLinks )
         script->ladeKarteSeite( "data/tmp/ke/kbv" );
     mev = me.verarbeitet;
     beenden->doPublicMausEreignis( me );
-    if( !mev && me.verarbeitet &&me.id == ME_RLinks )
+    if( !mev && me.verarbeitet && me.id == ME_RLinks )
         aktion = 1;
     log->doPublicMausEreignis( me );
     bool eu = 0;
@@ -267,7 +265,7 @@ void KEBVorschau::doPublicMausEreignis( MausEreignis & me )
         script->setErlaubt( erlaubt->hatStyle( KontrollKnopf::Style::Selected ) );
 }
 
-void KEBVorschau::doTastaturEreignis( TastaturEreignis & te )
+void KEBVorschau::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar )
         return;
@@ -306,7 +304,7 @@ bool KEBVorschau::tick( double zeit )
     return ret;
 }
 
-void KEBVorschau::render( Bild & zRObj )
+void KEBVorschau::render( Bild &zRObj )
 {
     zRObj.setAlpha( alpha );
     script->render( zRObj );

+ 2 - 3
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBVorschau.h

@@ -24,7 +24,7 @@ private:
 
 public:
     // Konstruktor
-    KEBVorschauKarteScript( Schrift *zSchrift, TextFeld *zLog );
+    KEBVorschauKarteScript( TextFeld *zLog );
     // Destruktor
     ~KEBVorschauKarteScript();
     // nicht constant
@@ -41,7 +41,6 @@ public:
 class KEBVorschau : public Zeichnung
 {
 private:
-    Schrift *schrift;
     KEBVorschauKarteScript *script;
     Knopf *neu;
     Knopf *beenden;
@@ -55,7 +54,7 @@ private:
 
 public:
     // Konstruktor
-    KEBVorschau( Schrift *zSchrift );
+    KEBVorschau();
     // Destruktor
     ~KEBVorschau();
     // nicht constant

+ 23 - 37
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.cpp

@@ -5,27 +5,26 @@
 bool KEBKnopfPressME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        ( (KEBeschreibung*)p )->knopfPress( (Knopf*)obj, &me );
+        ( (KEBeschreibung *)p )->knopfPress( (Knopf *)obj, &me );
     return 1;
 }
 
 // Inhalt der KEBeschreibung Klasse aus KEBeschreibung.h
 // Konstruktor
-KEBeschreibung::KEBeschreibung( int karte, Schrift *zSchrift )
+KEBeschreibung::KEBeschreibung( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Beschreibung";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    editor = new KEBEditor( zSchrift, this );
-    vorschau = new KEBVorschau( zSchrift );
-    fenster->addMember( editor->getThis() );
-    fenster->addMember( vorschau->getThis() );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    editor = new KEBEditor( this );
+    vorschau = new KEBVorschau();
+    fenster->addMember( dynamic_cast<Zeichnung *>( editor->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( vorschau->getThis() ) );
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
     importDialog = 0;
@@ -47,7 +46,6 @@ KEBeschreibung::~KEBeschreibung()
 {
     fenster->release();
     laden->release();
-    schrift->release();
     editor->release();
     vorschau->release();
     if( importDialog )
@@ -91,45 +89,45 @@ void KEBeschreibung::thread()
         { // beschreibung laden
             Text *t = editorClient->beschreibungLaden();
             t->ersetzen( "\r\n", "\n" );
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( !t )
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
             else
                 editor->setText( t );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             t->release();
         }
         if( jetzt == 2 )
         { // Titelbild laden
             Bild *b = editorClient->titelbildLaden();
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( !b )
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
             else
                 editor->setBild( b );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             b->release();
         }
         if( jetzt == 3 )
         { // Minimap Bild laden
             Bild *b = editorClient->minimapLaden();
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( !b )
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
             else
                 editor->setBild( b );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             b->release();
         }
         if( jetzt == 4 )
         { // Ladebild laden
             Bild *b = editorClient->ladebildLaden();
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( !b )
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
             else
                 editor->setBild( b );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             b->release();
         }
         editor->setSichtbar( 1 );
@@ -156,9 +154,9 @@ void KEBeschreibung::thread()
                 err->release();
                 if( !editorClient->titelbildSpeichern( b ) )
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 editor->setBild( b );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
                 b->release();
             }
         }
@@ -177,9 +175,9 @@ void KEBeschreibung::thread()
                 err->release();
                 if( !editorClient->minimapSpeichern( b ) )
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 editor->setBild( b );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
                 b->release();
             }
         }
@@ -198,9 +196,9 @@ void KEBeschreibung::thread()
                 err->release();
                 if( !editorClient->ladebildSpeichern( b ) )
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 editor->setBild( b );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
                 b->release();
             }
         }
@@ -275,7 +273,7 @@ bool KEBeschreibung::tick( double z )
             if( importPfad )
                 importPfad->release();
             importPfad = importDialog->getPfad();
-            importDialog = (DateiDialogTh*)importDialog->release();
+            importDialog = (DateiDialogTh *)importDialog->release();
             if( sichtbar && importPfad )
             {
                 aktion = 1;
@@ -403,16 +401,4 @@ void KEBeschreibung::render( Bild &zRObj )
 bool KEBeschreibung::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KEBeschreibung::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 4
KSGClient/NachLogin/Editor/Karte/Beschreibung/KEBeschreibung.h

@@ -14,7 +14,6 @@ class KEBeschreibung : public Thread
 private:
     Fenster *fenster;
     Animation2D *laden;
-    Schrift *schrift;
     DateiDialogTh *importDialog;
     Text *importPfad;
     KEBEditor *editor;
@@ -32,7 +31,7 @@ private:
 
 public:
     // Konstruktor
-    KEBeschreibung( int karte, Schrift *zSchrift );
+    KEBeschreibung( int karte );
     // Destruktor
     ~KEBeschreibung();
     // nicht constant
@@ -45,6 +44,4 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };

+ 99 - 141
KSGClient/NachLogin/Editor/Karte/Dateien/KEDEditor.cpp

@@ -8,14 +8,15 @@
 
 // Inhalt der KEDBildSeite Klasse aus KEDEditor.h
 // Konstruktor
-KEDBildSeite::KEDBildSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove )
+KEDBildSeite::KEDBildSeite( Knopf *zNeueDatei, Knopf *zDateiRemove )
+    : ReferenceCounter()
 {
-    bilder = initAuswahlListe( 220, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
+    bilder = initAuswahlListe( 220, 10, 200, 510, AuswahlListe::Style::Normal, {} );
     bildObj = initBildZ( 430, 10, 440, 440, BildZ::Style::normal | BildZ::Style::Alpha, 0 );
-    bildLöschen = initKnopf( 430, 460, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Bild Löschen" );
-    importieren = initKnopf( 430, 490, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Importieren" );
-    dateiLöschen = (Knopf *)zDateiRemove->getThis();
-    neueDatei = (Knopf *)zNeueDatei->getThis();
+    bildLöschen = initKnopf( 430, 460, 100, 20, Knopf::Style::Sichtbar, "Bild Löschen" );
+    importieren = initKnopf( 430, 490, 100, 20, Knopf::Style::Sichtbar, "Importieren" );
+    dateiLöschen = dynamic_cast<Knopf *>( zDateiRemove->getThis() );
+    neueDatei = dynamic_cast<Knopf *>( zNeueDatei->getThis() );
     importDialog = 0;
     importPfad = 0;
     aktion = 0;
@@ -23,7 +24,6 @@ KEDBildSeite::KEDBildSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiR
     alpha = 0;
     alpha2 = 0;
     tickVal = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -49,9 +49,9 @@ int KEDBildSeite::getAktion()
     return ret;
 }
 
-void KEDBildSeite::setBildListe( RCArray< Text > * list )
+void KEDBildSeite::setBildListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     Text txt = bilder->zEintrag( bilder->getAuswahl() ) ? bilder->zEintrag( bilder->getAuswahl() )->zText()->getText() : "";
     while( bilder->getEintragAnzahl() )
         bilder->removeEintrag( 0 );
@@ -68,14 +68,14 @@ void KEDBildSeite::setBildListe( RCArray< Text > * list )
     else
         bilder->deSelect();
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KEDBildSeite::setBild( Bild * b )
+void KEDBildSeite::setBild( Bild *b )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     bildObj->setBild( b );
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
 void KEDBildSeite::setSichtbar( bool s )
@@ -93,7 +93,7 @@ bool KEDBildSeite::tick( double tv )
                 importPfad->release();
             importPfad = importDialog->getPfad();
             importDialog = (DateiDialogTh *)importDialog->release();
-            if( sichtbar &&importPfad )
+            if( sichtbar && importPfad )
                 aktion = 3;
         }
     }
@@ -144,7 +144,7 @@ bool KEDBildSeite::tick( double tv )
     return ret;
 }
 
-void KEDBildSeite::doPublicMausEreignis( MausEreignis & me )
+void KEDBildSeite::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -159,11 +159,11 @@ void KEDBildSeite::doPublicMausEreignis( MausEreignis & me )
     }
     bool vera = me.verarbeitet;
     dateiLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 4;
     vera = me.verarbeitet;
     neueDatei->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 5;
     vera = me.verarbeitet;
     importieren->doPublicMausEreignis( me );
@@ -186,11 +186,11 @@ void KEDBildSeite::doPublicMausEreignis( MausEreignis & me )
     bildObj->doPublicMausEreignis( me );
     vera = me.verarbeitet;
     bildLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 2;
 }
 
-void KEDBildSeite::render( Bild & zRObj )
+void KEDBildSeite::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -221,21 +221,6 @@ Text *KEDBildSeite::zBildAuswahl() const
     return bilder->zEintrag( bilder->getAuswahl() )->zText();
 }
 
-// Reference Counting
-KEDBildSeite *KEDBildSeite::getThis()
-{
-    ref++;
-    return this;
-}
-
-KEDBildSeite *KEDBildSeite::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 bool kEDEditorNeuModelOkME( void *p, void *obj, MausEreignis me )
 {
@@ -249,10 +234,11 @@ bool kEDEditorNeuModelOkME( void *p, void *obj, MausEreignis me )
 
 // Inhalt der KEDModellSeite Klasse aus KEDEditor.h
 // Konstruktor
-KEDModellSeite::KEDModellSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf * zDateiRemove, AuswahlListe * datL )
+KEDModellSeite::KEDModellSeite( Knopf *zNeueDatei, Knopf *zDateiRemove, AuswahlListe *datL )
+    : ReferenceCounter()
 {
     dateien = datL;
-    modelle = initAuswahlListe( 220, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
+    modelle = initAuswahlListe( 220, 10, 200, 510, AuswahlListe::Style::Normal, {} );
     modelObj = new M2DVorschau();
     modelObj->setPosition( 430, 10 );
     modelObj->setSize( 440, 440 );
@@ -262,32 +248,31 @@ KEDModellSeite::KEDModellSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf *
     modelObj->setModel2DZ( new Model2D() );
     modelObj->zModel()->setStyle( Model2D::Style::Erlaubt | Model2D::Style::Mesh | Model2D::Style::Sichtbar );
     modelObj->zModel()->setFarbe( 0xFFFFFFFF );
-    modelLöschen = initKnopf( 430, 460, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Modell2D Löschen" );
-    neuesModel = initKnopf( 430, 490, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Neues Modell2D" );
-    bearbeiten = initKnopf( 550, 490, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Bearbeiten" );
-    dateiLöschen = (Knopf *)zDateiRemove->getThis();
-    neueDatei = (Knopf *)zNeueDatei->getThis();
-    editor = new Model2DEditor::GUI( zSchrift );
-    neuModelF = initFenster( 365, 160, 150, 90, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
+    modelLöschen = initKnopf( 430, 460, 100, 20, Knopf::Style::Sichtbar, "Modell2D Löschen" );
+    neuesModel = initKnopf( 430, 490, 100, 20, Knopf::Style::Sichtbar, "Neues Modell2D" );
+    bearbeiten = initKnopf( 550, 490, 100, 20, Knopf::Style::Sichtbar, "Bearbeiten" );
+    dateiLöschen = dynamic_cast<Knopf *>( zDateiRemove->getThis() );
+    neueDatei = dynamic_cast<Knopf *>( zNeueDatei->getThis() );
+    editor = new Model2DEditor::GUI();
+    neuModelF = initFenster( 365, 160, 150, 90, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
                              Fenster::Style::Rahmen | Fenster::Style::Closable | Fenster::Style::ClosingKlickBuffer | Fenster::Style::ClosingHintergrund |
                              Fenster::Style::ClosingHAlpha | Fenster::Style::Titel | Fenster::Style::TitelHintergrund | Fenster::Style::TitelHAlpha | Fenster::Style::TitelBuffered, "Neues Modell" );
     neuModelF->setKBgFarbe( 0xC0000000 );
     neuModelF->setSBgFarbe( 0xC0000000 );
     neuModelF->setTBgFarbe( 0xC0000000 );
     neuModelF->setClosingMe( kEDEditorNeuModelOkME );
-    neuModelName = initTextFeld( 10, 10, 130, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
-    neuModelOk = initKnopf( 25, 40, 100, 20, zSchrift, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
+    neuModelName = initTextFeld( 10, 10, 130, 20, TextFeld::Style::TextFeld, "Name" );
+    neuModelOk = initKnopf( 25, 40, 100, 20, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
     neuModelOk->setMausEreignisParameter( this );
     neuModelOk->setMausEreignis( kEDEditorNeuModelOkME );
-    neuModelF->addMember( neuModelName->getThis() );
-    neuModelF->addMember( neuModelOk->getThis() );
+    neuModelF->addMember( dynamic_cast<Zeichnung *>( neuModelName->getThis() ) );
+    neuModelF->addMember( dynamic_cast<Zeichnung *>( neuModelOk->getThis() ) );
     aktion = 0;
     sichtbar = 0;
     alpha = 0;
     alpha2 = 0;
     alpha3 = 0;
     tickVal = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -315,7 +300,7 @@ int KEDModellSeite::getAktion()
     return ret;
 }
 
-bool KEDModellSeite::neuModelOkME( MausEreignis & me )
+bool KEDModellSeite::neuModelOkME( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -325,9 +310,9 @@ bool KEDModellSeite::neuModelOkME( MausEreignis & me )
     return 1;
 }
 
-void KEDModellSeite::setModelListe( RCArray< Text > * list )
+void KEDModellSeite::setModelListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     Text txt = modelle->zEintrag( modelle->getAuswahl() ) ? modelle->zEintrag( modelle->getAuswahl() )->zText()->getText() : "";
     while( modelle->getEintragAnzahl() )
         modelle->removeEintrag( 0 );
@@ -344,12 +329,12 @@ void KEDModellSeite::setModelListe( RCArray< Text > * list )
     else
         modelle->deSelect();
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KEDModellSeite::setModel( Model2DData * mdl )
+void KEDModellSeite::setModel( Model2DData *mdl )
 {
-    modelObj->setModel2D( mdl->getThis() );
+    modelObj->setModel2D( dynamic_cast<Model2DData *>( mdl->getThis() ) );
     editor->setModel( mdl );
 }
 
@@ -430,7 +415,7 @@ bool KEDModellSeite::tick( double tv )
             alpha3 -= val;
         ret = 1;
     }
-    if( sichtbar &&neuModelF->hatStyleNicht( Fenster::Style::Sichtbar ) && alpha3 < 255 )
+    if( sichtbar && neuModelF->hatStyleNicht( Fenster::Style::Sichtbar ) && alpha3 < 255 )
     {
         if( alpha3 + val > 255 )
             alpha3 = 255;
@@ -441,7 +426,7 @@ bool KEDModellSeite::tick( double tv )
     return ret;
 }
 
-void KEDModellSeite::doPublicMausEreignis( MausEreignis & me )
+void KEDModellSeite::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -461,21 +446,21 @@ void KEDModellSeite::doPublicMausEreignis( MausEreignis & me )
     }
     bool vera = me.verarbeitet;
     dateiLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 5;
     vera = me.verarbeitet;
     neueDatei->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 6;
     vera = me.verarbeitet;
     neuesModel->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         neuModelF->addStyle( Fenster::Style::Sichtbar );
     vera = me.verarbeitet;
     if( modelle->getAuswahl() < 0 )
         return;
     bearbeiten->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         editor->setSichtbar( 1 );
         modelObj->removeStyle( Model2D::Style::Sichtbar );
@@ -491,11 +476,11 @@ void KEDModellSeite::doPublicMausEreignis( MausEreignis & me )
     editor->doPublicMausEreignis( me );
     vera = me.verarbeitet;
     modelLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 2;
 }
 
-void KEDModellSeite::doTastaturEreignis( TastaturEreignis & te )
+void KEDModellSeite::doTastaturEreignis( TastaturEreignis &te )
 {
     if( neuModelF->hatStyle( Fenster::Style::Sichtbar ) )
     {
@@ -505,7 +490,7 @@ void KEDModellSeite::doTastaturEreignis( TastaturEreignis & te )
     editor->doTastaturEreignis( te );
 }
 
-void KEDModellSeite::render( Bild & zRObj )
+void KEDModellSeite::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -549,33 +534,19 @@ Model2DData *KEDModellSeite::getModelData() const
     return editor->getM2Data();
 }
 
-// Reference Counting
-KEDModellSeite *KEDModellSeite::getThis()
-{
-    ref++;
-    return this;
-}
-
-KEDModellSeite *KEDModellSeite::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der KEDSoundSeite Klasse aus KEDEditor.h
 // Konstruktor
-KEDSoundSeite::KEDSoundSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf * zDateiRemove )
+KEDSoundSeite::KEDSoundSeite( Knopf *zNeueDatei, Knopf *zDateiRemove )
+    : ReferenceCounter()
 {
     Framework::getDLLRegister()->ladeDLL( "GSL.dll", "data/bin/GSL.dll" );
-    sounds = initAuswahlListe( 220, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
-    play = initKnopf( 430, 430, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Play" );
-    soundLöschen = initKnopf( 430, 460, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Bild Löschen" );
-    importieren = initKnopf( 430, 490, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Importieren" );
-    dateiLöschen = (Knopf *)zDateiRemove->getThis();
-    neueDatei = (Knopf *)zNeueDatei->getThis();
+    sounds = initAuswahlListe( 220, 10, 200, 510, AuswahlListe::Style::Normal, {} );
+    play = initKnopf( 430, 430, 100, 20, Knopf::Style::Sichtbar, "Play" );
+    soundLöschen = initKnopf( 430, 460, 100, 20, Knopf::Style::Sichtbar, "Bild Löschen" );
+    importieren = initKnopf( 430, 490, 100, 20, Knopf::Style::Sichtbar, "Importieren" );
+    dateiLöschen = dynamic_cast<Knopf *>( zDateiRemove->getThis() );
+    neueDatei = dynamic_cast<Knopf *>( zNeueDatei->getThis() );
     importDialog = 0;
     importPfad = 0;
     aktion = 0;
@@ -584,7 +555,6 @@ KEDSoundSeite::KEDSoundSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf * zD
     alpha2 = 0;
     tickVal = 0;
     sound = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -616,9 +586,9 @@ int KEDSoundSeite::getAktion()
     return ret;
 }
 
-void KEDSoundSeite::setSoundListe( RCArray< Text > * list )
+void KEDSoundSeite::setSoundListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     Text txt = sounds->zEintrag( sounds->getAuswahl() ) ? sounds->zEintrag( sounds->getAuswahl() )->zText()->getText() : "";
     while( sounds->getEintragAnzahl() )
         sounds->removeEintrag( 0 );
@@ -635,10 +605,10 @@ void KEDSoundSeite::setSoundListe( RCArray< Text > * list )
     else
         sounds->deSelect();
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KEDSoundSeite::setSound( GSL::GSLSoundV * b )
+void KEDSoundSeite::setSound( GSL::GSLSoundV *b )
 {
     if( sound )
     {
@@ -666,7 +636,7 @@ bool KEDSoundSeite::tick( double tv )
                 importPfad->release();
             importPfad = importDialog->getPfad();
             importDialog = (DateiDialogTh *)importDialog->release();
-            if( sichtbar &&importPfad )
+            if( sichtbar && importPfad )
                 aktion = 3;
         }
     }
@@ -717,7 +687,7 @@ bool KEDSoundSeite::tick( double tv )
     return ret;
 }
 
-void KEDSoundSeite::doPublicMausEreignis( MausEreignis & me )
+void KEDSoundSeite::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -735,11 +705,11 @@ void KEDSoundSeite::doPublicMausEreignis( MausEreignis & me )
     }
     bool vera = me.verarbeitet;
     dateiLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 4;
     vera = me.verarbeitet;
     neueDatei->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 5;
     vera = me.verarbeitet;
     importieren->doPublicMausEreignis( me );
@@ -759,7 +729,7 @@ void KEDSoundSeite::doPublicMausEreignis( MausEreignis & me )
         return;
     vera = me.verarbeitet;
     play->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         if( sound )
             sound->stopSound();
@@ -767,11 +737,11 @@ void KEDSoundSeite::doPublicMausEreignis( MausEreignis & me )
     }
     vera = me.verarbeitet;
     soundLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 2;
 }
 
-void KEDSoundSeite::render( Bild & zRObj )
+void KEDSoundSeite::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -802,21 +772,6 @@ Text *KEDSoundSeite::zSoundAuswahl() const
     return sounds->zEintrag( sounds->getAuswahl() )->zText();
 }
 
-// Reference Counting
-KEDSoundSeite *KEDSoundSeite::getThis()
-{
-    ref++;
-    return this;
-}
-
-KEDSoundSeite *KEDSoundSeite::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 bool kEDEditorNeuDateiOkME( void *p, void *obj, MausEreignis me )
 {
@@ -830,30 +785,33 @@ bool kEDEditorNeuDateiOkME( void *p, void *obj, MausEreignis me )
 
 // Inhalt der KEDEditor Klasse aus KEDEditor.h
 // Konstruktor
-KEDEditor::KEDEditor( Schrift * zSchrift )
+KEDEditor::KEDEditor()
     : Zeichnung()
 {
-    neueDatei = initKnopf( 0, 0, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Neue Datei" );
-    dateiLöschen = initKnopf( 0, 0, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Datei Löschen" );
-    dateien = initAuswahlListe( 10, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
-    bildSeite = new KEDBildSeite( zSchrift, neueDatei, dateiLöschen );
-    modelSeite = new KEDModellSeite( zSchrift, neueDatei, dateiLöschen, (AuswahlListe *)dateien->getThis() );
-    soundSeite = new KEDSoundSeite( zSchrift, neueDatei, dateiLöschen );
-    neuDateiF = initFenster( 365, 145, 150, 120, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
+    neueDatei = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Neue Datei" );
+    dateiLöschen = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Datei Löschen" );
+    dateien = initAuswahlListe( 10, 10, 200, 510, AuswahlListe::Style::Normal, {} );
+    bildSeite = new KEDBildSeite( neueDatei, dateiLöschen );
+    modelSeite = new KEDModellSeite( neueDatei, dateiLöschen, dynamic_cast<AuswahlListe *>( dateien->getThis() ) );
+    soundSeite = new KEDSoundSeite( neueDatei, dateiLöschen );
+    neuDateiF = initFenster( 365, 145, 150, 120, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
                              Fenster::Style::Rahmen | Fenster::Style::Closable | Fenster::Style::ClosingKlickBuffer | Fenster::Style::ClosingHintergrund |
                              Fenster::Style::ClosingHAlpha | Fenster::Style::Titel | Fenster::Style::TitelHintergrund | Fenster::Style::TitelHAlpha | Fenster::Style::TitelBuffered, "Neue Datei" );
     neuDateiF->setKBgFarbe( 0xC0000000 );
     neuDateiF->setSBgFarbe( 0xC0000000 );
     neuDateiF->setTBgFarbe( 0xC0000000 );
     neuDateiF->setClosingMe( kEDEditorNeuDateiOkME );
-    neuDateiTyp = initAuswahlBox( 10, 10, 130, 20, zSchrift, ABSTYLE, { "Ordner", "Bild (.ltdb)", "Modell 2D (.m2)", "Sound (.gsl)" } );
-    neuDateiName = initTextFeld( 10, 40, 130, 20, zSchrift, TextFeld::Style::TextFeld, "Datei Name" );
-    neuDateiOk = initKnopf( 25, 70, 100, 20, zSchrift, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
+    neuDateiTyp = initAuswahlBox( 10, 10, 130, 20, ABSTYLE, { "Ordner", "Bild (.ltdb)", "Modell 2D (.m2)", "Sound (.gsl)" } );
+    neuDateiName = initTextFeld( 10, 40, 130, 20, TextFeld::Style::TextFeld, "Datei Name" );
+    neuDateiOk = initKnopf( 25, 70, 100, 20, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
     neuDateiOk->setMausEreignisParameter( this );
     neuDateiOk->setMausEreignis( kEDEditorNeuDateiOkME );
-    neuDateiF->addMember( neuDateiName->getThis() );
-    neuDateiF->addMember( neuDateiOk->getThis() );
-    neuDateiF->addMember( neuDateiTyp->getThis() );
+#pragma warning(push)
+#pragma warning(disable : 4436)
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiName->getThis() ) );
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiOk->getThis() ) );
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiTyp->getThis() ) );
+#pragma warning(pop)
     aktion = 0;
     sichtbar = 0;
     alpha = 0;
@@ -884,7 +842,7 @@ int KEDEditor::getAktion()
     return ret;
 }
 
-bool KEDEditor::neuDateiOkME( MausEreignis & me )
+bool KEDEditor::neuDateiOkME( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -894,9 +852,9 @@ bool KEDEditor::neuDateiOkME( MausEreignis & me )
     return 1;
 }
 
-void KEDEditor::setDateiListe( RCArray< Text > * list )
+void KEDEditor::setDateiListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     dateien->deSelect();
     while( dateien->getEintragAnzahl() )
         dateien->removeEintrag( 0 );
@@ -908,10 +866,10 @@ void KEDEditor::setDateiListe( RCArray< Text > * list )
     modelSeite->setSichtbar( 0 );
     neuDateiF->removeStyle( Fenster::Style::Sichtbar );
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KEDEditor::setBildListe( RCArray< Text > * list )
+void KEDEditor::setBildListe( RCArray< Text > *list )
 {
     soundSeite->setSichtbar( 0 );
     modelSeite->setSichtbar( 0 );
@@ -919,7 +877,7 @@ void KEDEditor::setBildListe( RCArray< Text > * list )
     bildSeite->setSichtbar( 1 );
 }
 
-void KEDEditor::setSoundListe( RCArray< Text > * list )
+void KEDEditor::setSoundListe( RCArray< Text > *list )
 {
     modelSeite->setSichtbar( 0 );
     bildSeite->setSichtbar( 0 );
@@ -927,7 +885,7 @@ void KEDEditor::setSoundListe( RCArray< Text > * list )
     soundSeite->setSichtbar( 1 );
 }
 
-void KEDEditor::setModel2dListe( RCArray< Text > * list )
+void KEDEditor::setModel2dListe( RCArray< Text > *list )
 {
     bildSeite->setSichtbar( 0 );
     soundSeite->setSichtbar( 0 );
@@ -935,17 +893,17 @@ void KEDEditor::setModel2dListe( RCArray< Text > * list )
     modelSeite->setSichtbar( 1 );
 }
 
-void KEDEditor::setBild( Bild * b )
+void KEDEditor::setBild( Bild *b )
 {
     bildSeite->setBild( b );
 }
 
-void KEDEditor::setSound( GSL::GSLSoundV * s )
+void KEDEditor::setSound( GSL::GSLSoundV *s )
 {
     soundSeite->setSound( s );
 }
 
-void KEDEditor::setModel2d( Model2DData * d )
+void KEDEditor::setModel2d( Model2DData *d )
 {
     modelSeite->setModel( d );
 }
@@ -1072,7 +1030,7 @@ bool KEDEditor::tick( double tv )
     return ret;
 }
 
-void KEDEditor::doPublicMausEreignis( MausEreignis & me )
+void KEDEditor::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -1097,19 +1055,19 @@ void KEDEditor::doPublicMausEreignis( MausEreignis & me )
     {
         bool vera = me.verarbeitet;
         neueDatei->doPublicMausEreignis( me );
-        if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+        if( !vera && me.verarbeitet && me.id == ME_RLinks )
             neuDateiF->addStyle( Fenster::Style::Sichtbar );
         if( dateien->getEintragAnzahl() > 0 && dateien->zEintrag( 0 )->zText()->istGleich( ".." ) )
         {
             vera = me.verarbeitet;
             dateiLöschen->doPublicMausEreignis( me );
-            if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+            if( !vera && me.verarbeitet && me.id == ME_RLinks )
                 aktion = 3;
         }
     }
 }
 
-void KEDEditor::doTastaturEreignis( TastaturEreignis & te )
+void KEDEditor::doTastaturEreignis( TastaturEreignis &te )
 {
     if( neuDateiF->hatStyle( Fenster::Style::Sichtbar ) )
     {
@@ -1119,7 +1077,7 @@ void KEDEditor::doTastaturEreignis( TastaturEreignis & te )
     modelSeite->doTastaturEreignis( te );
 }
 
-void KEDEditor::render( Bild & zRObj )
+void KEDEditor::render( Bild &zRObj )
 {
     zRObj.setAlpha( alpha );
     zRObj.setAlpha( alpha2 );

+ 7 - 19
KSGClient/NachLogin/Editor/Karte/Dateien/KEDEditor.h

@@ -12,7 +12,7 @@
 
 using namespace Framework;
 
-class KEDBildSeite
+class KEDBildSeite : public virtual ReferenceCounter
 {
 private:
     AuswahlListe *bilder;
@@ -28,11 +28,10 @@ private:
     unsigned char alpha;
     unsigned char alpha2;
     double tickVal;
-    int ref;
 
 public:
     // Konstruktor
-    KEDBildSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove );
+    KEDBildSeite( Knopf *zNeueDatei, Knopf *zDateiRemove );
     // Destruktor
     ~KEDBildSeite();
     // nicht constant
@@ -46,12 +45,9 @@ public:
     // constant
     Text *zBildImportPfad() const;
     Text *zBildAuswahl() const;
-    // Reference Counting
-    KEDBildSeite *getThis();
-    KEDBildSeite *release();
 };
 
-class KEDModellSeite
+class KEDModellSeite : public virtual ReferenceCounter
 {
 private:
     AuswahlListe *modelle;
@@ -72,11 +68,10 @@ private:
     unsigned char alpha2;
     unsigned char alpha3;
     double tickVal;
-    int ref;
 
 public:
     // Konstruktor
-    KEDModellSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove, AuswahlListe *dateien );
+    KEDModellSeite( Knopf *zNeueDatei, Knopf *zDateiRemove, AuswahlListe *dateien );
     // Destruktor
     ~KEDModellSeite();
     // nicht constant
@@ -93,12 +88,9 @@ public:
     Text *zModelAuswahl() const;
     Text *zNeuModelName() const;
     Model2DData *getModelData() const;
-    // Reference Counting
-    KEDModellSeite *getThis();
-    KEDModellSeite *release();
 };
 
-class KEDSoundSeite
+class KEDSoundSeite : public virtual ReferenceCounter
 {
 private:
     AuswahlListe *sounds;
@@ -115,11 +107,10 @@ private:
     unsigned char alpha;
     unsigned char alpha2;
     double tickVal;
-    int ref;
 
 public:
     // Konstruktor
-    KEDSoundSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove );
+    KEDSoundSeite( Knopf *zNeueDatei, Knopf *zDateiRemove );
     // Destruktor
     ~KEDSoundSeite();
     // nicht constant
@@ -133,9 +124,6 @@ public:
     // constant
     Text *zSoundImportPfad() const;
     Text *zSoundAuswahl() const;
-    // Reference Counting
-    KEDSoundSeite *getThis();
-    KEDSoundSeite *release();
 };
 
 class KEDEditor : public Zeichnung
@@ -159,7 +147,7 @@ private:
 
 public:
     // Konstruktor
-    KEDEditor( Schrift *zSchrift );
+    KEDEditor();
     // Destruktor
     ~KEDEditor();
     // nicht constant

+ 76 - 122
KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.cpp

@@ -14,12 +14,12 @@ using namespace Model2DEditor;
 // Inhalt der VertexData Klasse aus KEDModel2DEditor.h
 // Konstruktor
 VertexData::VertexData( Vec2< float > v, Vertex t )
+    : ReferenceCounter()
 {
     vertex = v;
     textur = t;
     selected = 0;
     sichtbar = 1;
-    ref = 1;
 }
 
 // nicht constant
@@ -94,31 +94,16 @@ Vertex VertexData::getTPos() const
     return textur;
 }
 
-// Reference Counting
-VertexData *VertexData::getThis()
-{
-    ref++;
-    return this;
-}
-
-VertexData *VertexData::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der PolygonData Klasse aus KEDModel2DEditor.h
 // Konstruktor
-PolygonData::PolygonData( Polygon2D & pg )
+PolygonData::PolygonData( Polygon2D &pg )
+    : ReferenceCounter()
 {
     name = pg.name->getText();
     vd = new RCArray< VertexData >();
     transparent = pg.transparent;
     sichtbar = 1;
-    ref = 1;
     int anz = pg.vertex->getEintragAnzahl();
     for( int i = 0; i < anz; i++ )
     {
@@ -126,7 +111,7 @@ PolygonData::PolygonData( Polygon2D & pg )
         Vertex t( 0, 0 );
         if( pg.vertex->hat( i ) )
             v = pg.vertex->get( i );
-        if( pg.tKordinaten &&pg.tKordinaten->hat( i ) )
+        if( pg.tKordinaten && pg.tKordinaten->hat( i ) )
             t = pg.tKordinaten->get( i );
         vd->add( new VertexData( v, t ) );
     }
@@ -215,7 +200,7 @@ int PolygonData::getVertexAnzahl() const
     return vd->getEintragAnzahl();
 }
 
-void PolygonData::getM2( Polygon2D & pd, bool textur ) const
+void PolygonData::getM2( Polygon2D &pd, bool textur ) const
 {
     int anz = vd->getEintragAnzahl();
     if( !pd.name )
@@ -237,25 +222,11 @@ bool PolygonData::istTransparent() const
     return transparent;
 }
 
-// Reference Counting
-PolygonData *PolygonData::getThis()
-{
-    ref++;
-    return this;
-}
-
-PolygonData *PolygonData::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der Data Klasse aus KEDModel2DEditor.h
 // Konstruktor
-Data::Data( Model2DData * mdl )
+Data::Data( Model2DData *mdl )
+    : ReferenceCounter()
 {
     pd = new RCArray< PolygonData >();
     tPos.x = 0;
@@ -263,7 +234,6 @@ Data::Data( Model2DData * mdl )
     textur = 0;
     rTextur = 0;
     sp = -1;
-    ref = 1;
     int anz = ( mdl && mdl->polygons ) ? mdl->polygons->getEintragAnzahl() : 0;
     for( int i = 0; i < anz; i++ )
     {
@@ -351,7 +321,7 @@ void Data::saveTextur()
         i->saveTextur( tPos, textur->getSize() );
 }
 
-void Data::setTextur( Bild * t )
+void Data::setTextur( Bild *t )
 {
     if( textur )
         textur->release();
@@ -420,25 +390,10 @@ Punkt Data::getTPos() const
     return tPos;
 }
 
-// Reference Counting
-Data *Data::getThis()
-{
-    ref++;
-    return this;
-}
-
-Data *Data::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der EditorListe Klasse aus KEDModel2DEditor.h
 // Konstruktor
-EditorListe::EditorListe( Schrift * zSchrift )
+EditorListe::EditorListe()
     : Zeichnung()
 {
     ram = new LRahmen();
@@ -447,50 +402,52 @@ EditorListe::EditorListe( Schrift * zSchrift )
     ram->setSize( 150, 480 );
     ram->setPosition( 720, 10 );
     scroll = new VScrollBar();
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift ? schrift->getThis() : 0 );
-    pName = initTextFeld( 0, 0, 70, 20, schrift, TextFeld::Style::TextFeld, "" );
-    koordF = initFenster( 10, 10, 150, 140, zSchrift, ( Fenster::Style::normal | Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund ) & ~Fenster::Style::Sichtbar, "Koordinaten" );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
+    pName = initTextFeld( 0, 0, 70, 20, TextFeld::Style::TextFeld, "" );
+    koordF = initFenster( 10, 10, 150, 140, ( Fenster::Style::normal | Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund ) & ~Fenster::Style::Sichtbar, "Koordinaten" );
     koordF->setKBgFarbe( 0xFF000000 );
     koordF->setTBgFarbe( 0xFF000000 );
     koordF->setClosingMe( _closeFensterME );
-    kxT = initTextFeld( 10, 10, 30, 20, zSchrift, TextFeld::Style::Text, "x:" );
-    kyT = initTextFeld( 10, 40, 30, 20, zSchrift, TextFeld::Style::Text, "y:" );
-    kx = initTextFeld( 40, 10, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    ky = initTextFeld( 40, 40, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    tkxT = initTextFeld( 10, 70, 30, 20, zSchrift, TextFeld::Style::Text, "tx:" );
-    tkyT = initTextFeld( 10, 100, 30, 20, zSchrift, TextFeld::Style::Text, "ty:" );
-    tkx = initTextFeld( 40, 70, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    tky = initTextFeld( 40, 100, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+    kxT = initTextFeld( 10, 10, 30, 20, TextFeld::Style::Text, "x:" );
+    kyT = initTextFeld( 10, 40, 30, 20, TextFeld::Style::Text, "y:" );
+    kx = initTextFeld( 40, 10, 90, 20, TextFeld::Style::TextFeld, "" );
+    ky = initTextFeld( 40, 40, 90, 20, TextFeld::Style::TextFeld, "" );
+    tkxT = initTextFeld( 10, 70, 30, 20, TextFeld::Style::Text, "tx:" );
+    tkyT = initTextFeld( 10, 100, 30, 20, TextFeld::Style::Text, "ty:" );
+    tkx = initTextFeld( 40, 70, 90, 20, TextFeld::Style::TextFeld, "" );
+    tky = initTextFeld( 40, 100, 90, 20, TextFeld::Style::TextFeld, "" );
     int *polIP = &polI, *verIP = &verI;
-    TextFeld * kxTmp = kx;
-    TextFeld * kyTmp = ky;
-    auto saveK = [ polIP, verIP, kxTmp, kyTmp ]( void *p, void *o, TastaturEreignis te )
+    TextFeld *kxTmp = kx;
+    TextFeld *kyTmp = ky;
+    auto saveK = [polIP, verIP, kxTmp, kyTmp]( void *p, void *o, TastaturEreignis te )
     {
         Data *data = (Data *)p;
-        data->zPolygon( *polIP )->zVertex( *verIP )->setPosition( Vertex( (float)(double)* kxTmp->zText(), (float)(double)* kyTmp->zText() ) );
+        data->zPolygon( *polIP )->zVertex( *verIP )->setPosition( Vertex( (float)(double)*kxTmp->zText(), (float)(double)*kyTmp->zText() ) );
         return 1;
     };
     kx->setNTastaturEreignis( saveK );
     ky->setNTastaturEreignis( saveK );
-    TextFeld * tkxTmp = tkx;
-    TextFeld * tkyTmp = tky;
-    auto saveTK = [ polIP, verIP, tkxTmp, tkyTmp ]( void *p, void *o, TastaturEreignis te )
+    TextFeld *tkxTmp = tkx;
+    TextFeld *tkyTmp = tky;
+    auto saveTK = [polIP, verIP, tkxTmp, tkyTmp]( void *p, void *o, TastaturEreignis te )
     {
         Data *data = (Data *)p;
-        data->zPolygon( *polIP )->zVertex( *verIP )->setTextur( Vertex( (float)(double)* tkxTmp->zText(), (float)(double)* tkyTmp->zText() ) );
+        data->zPolygon( *polIP )->zVertex( *verIP )->setTextur( Vertex( (float)(double)*tkxTmp->zText(), (float)(double)*tkyTmp->zText() ) );
         return 1;
     };
     tkx->setNTastaturEreignis( saveTK );
     tky->setNTastaturEreignis( saveTK );
-    koordF->addMember( kxT->getThis() );
-    koordF->addMember( kyT->getThis() );
-    koordF->addMember( kx->getThis() );
-    koordF->addMember( ky->getThis() );
-    koordF->addMember( tkxT->getThis() );
-    koordF->addMember( tkyT->getThis() );
-    koordF->addMember( tkx->getThis() );
-    koordF->addMember( tky->getThis() );
+#pragma warning(push)
+#pragma warning(disable : 4436)
+    koordF->addMember( dynamic_cast<Zeichnung *>( kxT->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( kyT->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( kx->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( ky->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( tkxT->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( tkyT->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( tkx->getThis() ) );
+    koordF->addMember( dynamic_cast<Zeichnung *>( tky->getThis() ) );
+#pragma warning(pop)
     polI = 0;
     verI = 0;
     data = 0;
@@ -504,7 +461,6 @@ EditorListe::~EditorListe()
     scroll->release();
     if( data )
         data->release();
-    schrift->release();
     koordF->release();
     kxT->release();
     kyT->release();
@@ -518,14 +474,14 @@ EditorListe::~EditorListe()
 }
 
 // nicht constant
-void EditorListe::setDataZ( Data * d )
+void EditorListe::setDataZ( Data *d )
 {
     if( data )
         data->release();
     data = d;
 }
 
-void EditorListe::doPublicMausEreignis( MausEreignis & me )
+void EditorListe::doPublicMausEreignis( MausEreignis &me )
 {
     koordF->doPublicMausEreignis( me );
     me.mx -= ram->getX();
@@ -566,7 +522,7 @@ void EditorListe::doPublicMausEreignis( MausEreignis & me )
                 data->zPolygon( i )->setTransparent( !data->zPolygon( i )->istTransparent() );
                 rend = 1;
             }
-            else if( me.mx > 0 && me.my > y &&me.mx < 133 && me.my < y + 20 )
+            else if( me.mx > 0 && me.my > y && me.mx < 133 && me.my < y + 20 )
             { // Polygon Auswählen und Abwählen
                 if( data->getSelectedPolygon() != i )
                     data->selectPolygon( i );
@@ -574,7 +530,7 @@ void EditorListe::doPublicMausEreignis( MausEreignis & me )
                     data->selectPolygon( -1 );
                 rend = 1;
             }
-            PolygonData * pd = data->zPolygon( i );
+            PolygonData *pd = data->zPolygon( i );
             if( pd && ausgeklappt.hat( i ) && ausgeklappt.get( i ) )
             {
                 int vAnz = pd->getVertexAnzahl();
@@ -607,7 +563,7 @@ void EditorListe::doPublicMausEreignis( MausEreignis & me )
                         ky->setText( Text() += pd->zVertex( j )->getPos().y );
                         koordF->addStyle( Fenster::Style::Sichtbar );
                     }
-                    else if( me.my > y &&me.my < y + 20 && me.mx > 0 && me.mx < 133 )
+                    else if( me.my > y && me.my < y + 20 && me.mx > 0 && me.mx < 133 )
                     { // Auswählen und Abwählen
                         pd->zVertex( j )->setAuswahl( !pd->zVertex( j )->istAusgewählt() );
                         rend = 1;
@@ -622,24 +578,24 @@ void EditorListe::doPublicMausEreignis( MausEreignis & me )
     me.my += ram->getY();
 }
 
-void EditorListe::doTastaturEreignis( TastaturEreignis & te )
+void EditorListe::doTastaturEreignis( TastaturEreignis &te )
 {
     koordF->doTastaturEreignis( te );
-    if( data &&data->getSelectedPolygon() >= 0 )
+    if( data && data->getSelectedPolygon() >= 0 )
         pName->doTastaturEreignis( te );
 }
 
 bool EditorListe::tick( double zeit )
 {
     rend |= koordF->tick( zeit );
-    if( data &&data->getSelectedPolygon() >= 0 )
+    if( data && data->getSelectedPolygon() >= 0 )
         rend |= pName->tick( zeit );
     bool ret = rend;
     rend = 0;
     return ret;
 }
 
-void EditorListe::render( Bild & zRObj )
+void EditorListe::render( Bild &zRObj )
 {
     ram->render( zRObj );
     if( !zRObj.setDrawOptions( ram->getPosition() + Punkt( 1, 1 ), ram->getSize() - Punkt( 2, 2 ) ) )
@@ -657,7 +613,7 @@ void EditorListe::render( Bild & zRObj )
             pName->setPosition( 20, y );
             pName->setText( data->zPolygon( data->getSelectedPolygon() )->getName() );
             Data *tmpData = data;
-            pName->setNTastaturEreignis( [ tmpData ]( void *p, void *o, TastaturEreignis te ) -> bool
+            pName->setNTastaturEreignis( [tmpData]( void *p, void *o, TastaturEreignis te ) -> bool
             {
                 if( tmpData->getSelectedPolygon() >= 0 )
                     tmpData->zPolygon( tmpData->getSelectedPolygon() )->setName( ( (TextFeld *)o )->zText()->getText() );
@@ -691,7 +647,7 @@ void EditorListe::render( Bild & zRObj )
         if( ausgeklappt.hat( i ) && ausgeklappt.get( i ) )
         {
             zRObj.drawDreieck( Punkt( 10, 4 + y ), Punkt( 4, 16 + y ), Punkt( 16, 16 + y ), 0xFFFFFFFF );
-            PolygonData * pd = data->zPolygon( i );
+            PolygonData *pd = data->zPolygon( i );
             if( pd )
             {
                 int vAnz = pd->getVertexAnzahl();
@@ -738,7 +694,7 @@ void EditorListe::render( Bild & zRObj )
 
 // Inhalt der Editor2D Klasse aus KEDModel2DEditor.h
 // Konstruktor
-Editor2D::Editor2D( Schrift * zSchrift )
+Editor2D::Editor2D()
     : Zeichnung()
 {
     pos.x = 10;
@@ -755,8 +711,7 @@ Editor2D::Editor2D( Schrift * zSchrift )
     select = new LRahmen();
     select->setFarbe( 0xFF5050FF );
     select->setRamenBreite( 1 );
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     addV = Vertex( 0, 0 );
     mausIn = 0;
     größe = 1;
@@ -767,21 +722,20 @@ Editor2D::~Editor2D()
 {
     ram->release();
     select->release();
-    schrift->release();
     tr->release();
     if( data )
         data->release();
 }
 
 // nicht constant
-void Editor2D::setDataZ( Data * d )
+void Editor2D::setDataZ( Data *d )
 {
     if( data )
         data->release();
     data = d;
 }
 
-void Editor2D::doPublicMausEreignis( MausEreignis & me )
+void Editor2D::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -848,7 +802,7 @@ void Editor2D::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void Editor2D::doTastaturEreignis( TastaturEreignis & te )
+void Editor2D::doTastaturEreignis( TastaturEreignis &te )
 {
     if( te.id == TE_Release && te.taste == T_Enter && mausIn )
     {
@@ -926,7 +880,7 @@ bool Editor2D::tick( double zeit )
     return ret;
 }
 
-void Editor2D::render( Bild & zRObj )
+void Editor2D::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
         return;
@@ -940,7 +894,7 @@ void Editor2D::render( Bild & zRObj )
     {
         Punkt tPos = data->getTPos();
         zRObj.alphaBildSkall( (int)( ( tPos.x - offs.x ) * größe ), (int)( ( tPos.y - offs.y ) * größe ),
-            (int)( data->zTextur()->getBreite() * größe ), (int)( data->zTextur()->getHeight() * größe ), *data->zTextur() );
+                              (int)( data->zTextur()->getBreite() * größe ), (int)( data->zTextur()->getHeight() * größe ), *data->zTextur() );
     }
     // Raster mahlen
     int xanz = (int)( ram->getBreite() / ( 50 * größe ) );
@@ -980,7 +934,7 @@ void Editor2D::render( Bild & zRObj )
             for( int j = -1; j < vAnz && vAnz > 0; j++ )
             {
                 VertexData *v = j < 0 ? &tmp : p->zVertex( j );
-                if( l &&v )
+                if( l && v )
                 {
                     if( l->istSichtbar() && v->istSichtbar() )
                         zRObj.drawLinie( ( ( l->getPos() - offs ) * größe ), ( ( v->getPos() - offs ) * größe ), 0xFFA0A0A0 );
@@ -993,7 +947,7 @@ void Editor2D::render( Bild & zRObj )
                     continue;
                 }
                 if( j == 0 )
-                    zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) *größe ) - 5, (int)( ( l->getPos().y - offs.y ) *größe ) - 5, 10, 10, 0xFF50FF50 );
+                    zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFF50FF50 );
                 else
                 {
                     if( !l->istAusgewählt() )
@@ -1042,19 +996,19 @@ void Editor2D::render( Bild & zRObj )
 
 // Inhalt der GUI Klasse aus KEDModel2DEditor.h
 // Konstruktor
-GUI::GUI( Schrift * zSchrift )
+GUI::GUI()
     : Zeichnung()
 {
-    speichern = initKnopf( 660, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Speichern" );
-    abbrechen = initKnopf( 770, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrehen" );
-    textur = initKontrollKnopf( 10, 500, 100, 20, zSchrift, KontrollKnopf::Style::Normal, "Textur" );
-    texturVerknüpfen = initKnopf( 120, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Textur Speichern" );
-    texturLaden = initKnopf( 230, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Textur Laden" );
+    speichern = initKnopf( 660, 500, 100, 20, Knopf::Style::Sichtbar, "Speichern" );
+    abbrechen = initKnopf( 770, 500, 100, 20, Knopf::Style::Sichtbar, "Abbrehen" );
+    textur = initKontrollKnopf( 10, 500, 100, 20, KontrollKnopf::Style::Normal, "Textur" );
+    texturVerknüpfen = initKnopf( 120, 500, 100, 20, Knopf::Style::Sichtbar, "Textur Speichern" );
+    texturLaden = initKnopf( 230, 500, 100, 20, Knopf::Style::Sichtbar, "Textur Laden" );
     data = new Data( 0 );
-    editor = new Editor2D( zSchrift );
-    editor->setDataZ( data->getThis() );
-    liste = new EditorListe( zSchrift );
-    liste->setDataZ( data->getThis() );
+    editor = new Editor2D();
+    editor->setDataZ( dynamic_cast<Data *>( data->getThis() ) );
+    liste = new EditorListe();
+    liste->setDataZ( dynamic_cast<Data *>( data->getThis() ) );
     importDialog = 0;
     aktion = 0;
     alpha = 0;
@@ -1082,16 +1036,16 @@ void GUI::setSichtbar( bool s )
     sichtbar = s;
 }
 
-void GUI::setModel( Model2DData * data )
+void GUI::setModel( Model2DData *data )
 {
     if( this->data )
         this->data->release();
     this->data = new Data( data );
-    editor->setDataZ( this->data->getThis() );
-    liste->setDataZ( this->data->getThis() );
+    editor->setDataZ( dynamic_cast<Data *>( this->data->getThis() ) );
+    liste->setDataZ( dynamic_cast<Data *>( this->data->getThis() ) );
 }
 
-void GUI::doPublicMausEreignis( MausEreignis & me )
+void GUI::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -1114,7 +1068,7 @@ void GUI::doPublicMausEreignis( MausEreignis & me )
     data->setRTextur( textur->hatStyle( KontrollKnopf::Style::Selected ) );
     vera = me.verarbeitet;
     texturVerknüpfen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         data->saveTextur();
     vera = me.verarbeitet;
     texturLaden->doPublicMausEreignis( me );
@@ -1134,7 +1088,7 @@ void GUI::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void GUI::doTastaturEreignis( TastaturEreignis & te )
+void GUI::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar )
         return;
@@ -1197,7 +1151,7 @@ bool GUI::tick( double zeit )
     return ret;
 }
 
-void GUI::render( Bild & zRObj )
+void GUI::render( Bild &zRObj )
 {
     zRObj.setAlpha( alpha );
     editor->render( zRObj );

+ 7 - 21
KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.h

@@ -13,14 +13,13 @@ using namespace Framework;
 
 namespace Model2DEditor
 {
-    class VertexData
+    class VertexData : public virtual ReferenceCounter
     {
     private:
         Vec2< float > vertex;
         Vertex textur;
         bool selected;
         bool sichtbar;
-        int ref;
 
     public:
         // Konstruktor
@@ -40,19 +39,15 @@ namespace Model2DEditor
         bool istAusgewählt() const;
         Vec2< float > getPos() const;
         Vertex getTPos() const;
-        // Reference Counting
-        VertexData *getThis();
-        VertexData *release();
     };
 
-    class PolygonData
+    class PolygonData : public virtual ReferenceCounter
     {
     private:
         RCArray< VertexData > *vd;
         Text name;
         bool transparent;
         bool sichtbar;
-        int ref;
 
     public:
         // Konstruktor
@@ -77,12 +72,9 @@ namespace Model2DEditor
         int getVertexAnzahl() const;
         void getM2( Polygon2D &pd, bool textur ) const;
         bool istTransparent() const;
-        // Reference Counting
-        PolygonData *getThis();
-        PolygonData *release();
     };
 
-    class Data
+    class Data : public virtual ReferenceCounter
     {
     private:
         RCArray< PolygonData > *pd;
@@ -90,7 +82,6 @@ namespace Model2DEditor
         Punkt tPos;
         bool rTextur;
         int sp;
-        int ref;
 
     public:
         // Konstruktor
@@ -117,9 +108,6 @@ namespace Model2DEditor
         Model2DData *getM2() const;
         Bild *zTextur() const;
         Punkt getTPos() const;
-        // Reference Counting
-        Data *getThis();
-        Data *release();
     };
 
     class EditorListe : public Zeichnung
@@ -129,7 +117,6 @@ namespace Model2DEditor
         VScrollBar *scroll;
         Data *data;
         Array< bool > ausgeklappt;
-        Schrift *schrift;
         TextRenderer *tr;
         TextFeld *pName;
         Fenster *koordF;
@@ -146,7 +133,7 @@ namespace Model2DEditor
 
     public:
         // Konstruktor
-        EditorListe( Schrift *zSchrift );
+        EditorListe();
         // Destruktor
         ~EditorListe();
         // nicht constant
@@ -156,7 +143,7 @@ namespace Model2DEditor
         bool tick( double zeit ) override;
         void render( Bild &zRObj ) override;
     };
-    
+
     class Editor2D : public Zeichnung
     {
     private:
@@ -165,7 +152,6 @@ namespace Model2DEditor
         Data *data;
         LRahmen *ram;
         LRahmen *select;
-        Schrift *schrift;
         TextRenderer *tr;
         Punkt mausPos;
         Vertex addV;
@@ -174,7 +160,7 @@ namespace Model2DEditor
 
     public:
         // Konstruktor
-        Editor2D( Schrift *zSchrift );
+        Editor2D();
         // Destruktor
         ~Editor2D();
         // nicht constant
@@ -203,7 +189,7 @@ namespace Model2DEditor
 
     public:
         // Konstruktor
-        GUI( Schrift *zSchrifto );
+        GUI();
         // Destruktor
         ~GUI();
         // nicht constant

+ 6 - 20
KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.cpp

@@ -11,22 +11,21 @@ typedef GSL::GSLDateiV *( *GetGSLDatei )( );
 
 // Inahlt der KEDateien Klasse aus KEDateien.h
 // Konstruktor
-KEDateien::KEDateien( int karte, Schrift *zSchrift )
+KEDateien::KEDateien( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Dateien";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    editor = new KEDEditor( zSchrift );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    editor = new KEDEditor();
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
-    fenster->addMember( editor->getThis() );
-    fort = initFBalken( 375, 350, 150, 20, zSchrift, FBalken::Style::normal );
+    fenster->addMember( dynamic_cast<KEBEditor *>( editor->getThis() ) );
+    fort = initFBalken( 375, 350, 150, 20, FBalken::Style::normal );
     animation = 0;
     tickVal = 0;
     sichtbar = 0;
@@ -45,7 +44,6 @@ KEDateien::~KEDateien()
     editor->release();
     laden->release();
     fort->release();
-    schrift->release();
 }
 
 // nicht constant
@@ -528,16 +526,4 @@ void KEDateien::render( Bild &zRObj )
 bool KEDateien::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KEDateien::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 4
KSGClient/NachLogin/Editor/Karte/Dateien/KEDateien.h

@@ -16,7 +16,6 @@ class KEDateien : public Thread
 private:
     Fenster *fenster;
     Animation2D *laden;
-    Schrift *schrift;
     KEDEditor *editor;
     FBalken *fort;
     int aktion;
@@ -31,7 +30,7 @@ private:
 
 public:
     // Konstruktor
-    KEDateien( int karte, Schrift *zSchrift );
+    KEDateien( int karte );
     // Destruktor
     ~KEDateien();
     // nicht constant
@@ -43,6 +42,4 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };

+ 5 - 15
KSGClient/NachLogin/Editor/Karte/Dateien/WAVDatei.cpp

@@ -15,6 +15,7 @@ bool istGleich( char *a, char *b, int l )
 // Inhalt der WAVDatei Klasse aus WAVDatei.h
 // Konstruktor
 WAVDatei::WAVDatei()
+    : ReferenceCounter()
 {}
 
 // nicht constant
@@ -23,12 +24,12 @@ bool WAVDatei::lade( char *pfad )
     d.setDatei( pfad );
     if( !d.open( Datei::Style::lesen ) )
         return 0;
-    d.lese( (char*)&kpf, sizeof( kpf ) );
+    d.lese( (char *)&kpf, sizeof( kpf ) );
     if( !istGleich( kpf.riff, "RIFF", 4 ) )
         return 0;
     if( !istGleich( kpf.wav, "WAVE", 4 ) )
         return 0;
-    d.lese( (char*)&fmt, sizeof( fmt ) );
+    d.lese( (char *)&fmt, sizeof( fmt ) );
     if( !istGleich( fmt.fmt, "fmt ", 4 ) )
         return 0;
     if( fmt.channels > 2 || fmt.channels < 1 )
@@ -39,11 +40,11 @@ bool WAVDatei::lade( char *pfad )
         return 0;
     if( fmt.blockAlign * fmt.sampleRate != fmt.bytesPerSec )
         return 0;
-    d.lese( (char*)&dBeg, sizeof( dBeg ) );
+    d.lese( (char *)&dBeg, sizeof( dBeg ) );
     while( !istGleich( dBeg.data, "data", 4 ) )
     {
         d.setLPosition( 1 + d.getLPosition() - sizeof( dBeg ), 0 );
-        d.lese( (char*)&dBeg, sizeof( dBeg ) );
+        d.lese( (char *)&dBeg, sizeof( dBeg ) );
     }
     pos = (int)d.getLPosition();
     d.close();
@@ -85,15 +86,4 @@ int WAVDatei::getSampleRate() const
 __int64 WAVDatei::getDatLength() const
 {
     return d.getSize() - pos;
-}
-
-// Reference Counting
-Thread *WAVDatei::getThis()
-{
-    return Thread::getThis();
-}
-
-Thread *WAVDatei::release()
-{
-    return Thread::release();
 }

+ 0 - 3
KSGClient/NachLogin/Editor/Karte/Dateien/WAVDatei.h

@@ -63,7 +63,4 @@ public:
     bool istMono() const override;
     int getSampleRate() const override;
     __int64 getDatLength() const override;
-    // Reference Counting
-    Thread *getThis() override;
-    Thread *release() override;
 };

+ 49 - 63
KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.cpp

@@ -7,91 +7,90 @@
 bool kEReleaseHerstellenME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        return ( (KERelease*)p )->herstellenME( (Knopf*)obj, me );
+        return ( (KERelease *)p )->herstellenME( (Knopf *)obj, me );
     return 1;
 }
 
 bool kEReleaseLöschenME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        return ( (KERelease*)p )->removeME( (Knopf*)obj, me );
+        return ( (KERelease *)p )->removeME( (Knopf *)obj, me );
     return 1;
 }
 
 bool kEReleaseVeröffME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        return ( (KERelease*)p )->veröffentlichenME( me );
+        return ( (KERelease *)p )->veröffentlichenME( me );
     return 1;
 }
 
 bool kEReleaseAbbildErstellenME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        return ( (KERelease*)p )->abbildErstellenME( me );
+        return ( (KERelease *)p )->abbildErstellenME( me );
     return 1;
 }
 
 bool kEReleaseShopÜbernehmenME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        return ( (KERelease*)p )->shopÜbernehmenME( me );
+        return ( (KERelease *)p )->shopÜbernehmenME( me );
     return 1;
 }
 
 // Inhalt der KERelease Klasse aus KERelease.h
 // Konstruktor
-KERelease::KERelease( int karte, Schrift *zSchrift )
+KERelease::KERelease( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Release";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    abbilder = initObjTabelle( 10, 10, 700, 510, zSchrift, OTSTYLE, { { "Name", 270, 270, 270 },
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    abbilder = initObjTabelle( 10, 10, 700, 510, OTSTYLE, { { "Name", 270, 270, 270 },
     { "Datum", 200, 200, 200 }, { "Herstellen", 100, 100, 100 }, { "Löschen", 100, 100, 100 } }, 20 );
-    veröff = initKnopf( 720, 10, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Veröffentlichen" );
+    veröff = initKnopf( 720, 10, 150, 20, Knopf::Style::Sichtbar, "Veröffentlichen" );
     veröff->setMausEreignisParameter( this );
     veröff->setMausEreignis( kEReleaseVeröffME );
-    initToolTip( veröff, "Veröffentlicht die momentane Version der Karte.\nDieser Vorgang kann einiege Minuten dauern.\nWährend dieses Vorgangs können keine Änderungen\nan der Karte vorgenommen werden.", schrift, hauptScreen );
-    abbildName = initTextFeld( 720, 40, 150, 20, zSchrift, TextFeld::Style::TextFeld, "Abbild Name" );
-    initToolTip( abbildName, "Name eines neu zu erstellenen Kartenabbilds.", schrift, hauptScreen );
-    abbildErstellen = initKnopf( 720, 70, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Abbild Erstellen" );
+    initToolTip( veröff, "Veröffentlicht die momentane Version der Karte.\nDieser Vorgang kann einiege Minuten dauern.\nWährend dieses Vorgangs können keine Änderungen\nan der Karte vorgenommen werden." );
+    abbildName = initTextFeld( 720, 40, 150, 20, TextFeld::Style::TextFeld, "Abbild Name" );
+    initToolTip( abbildName, "Name eines neu zu erstellenen Kartenabbilds." );
+    abbildErstellen = initKnopf( 720, 70, 150, 20, Knopf::Style::Sichtbar, "Abbild Erstellen" );
     abbildErstellen->setMausEreignisParameter( this );
     abbildErstellen->setMausEreignis( kEReleaseAbbildErstellenME );
-    initToolTip( abbildErstellen, "Erstellt ein Abbild von der aktuellen Kartenversion,\ndas zu einem späteren Zeitpunkt wiederhergestellt werden kann.", schrift, hauptScreen );
-    shopT = initTextFeld( 720, 350, 150, 20, zSchrift, TextFeld::Style::Text, "Im Shop zu kaufen:" );
-    testVersionErwerbbar = initAuswahlBox( 720, 375, 150, 20, zSchrift, ABSTYLE, { "Testversion ja", "Testversion nein" } );
-    vollVersionErwerbbar = initAuswahlBox( 720, 400, 150, 20, zSchrift, ABSTYLE, { "Vollversion ja","Vollversion nein" } );
-    preisT = initTextFeld( 720, 425, 150, 20, zSchrift, TextFeld::Style::Text, "Preis in Kupfer:" );
-    testVersionPreisT = initTextFeld( 720, 450, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Testversion:" );
-    vollVersionPreisT = initTextFeld( 720, 475, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Vollversion:" );
-    testVersionPreis = initTextFeld( 820, 450, 50, 20, zSchrift, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
+    initToolTip( abbildErstellen, "Erstellt ein Abbild von der aktuellen Kartenversion,\ndas zu einem späteren Zeitpunkt wiederhergestellt werden kann." );
+    shopT = initTextFeld( 720, 350, 150, 20, TextFeld::Style::Text, "Im Shop zu kaufen:" );
+    testVersionErwerbbar = initAuswahlBox( 720, 375, 150, 20, ABSTYLE, { "Testversion ja", "Testversion nein" } );
+    vollVersionErwerbbar = initAuswahlBox( 720, 400, 150, 20, ABSTYLE, { "Vollversion ja","Vollversion nein" } );
+    preisT = initTextFeld( 720, 425, 150, 20, TextFeld::Style::Text, "Preis in Kupfer:" );
+    testVersionPreisT = initTextFeld( 720, 450, 100, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Testversion:" );
+    vollVersionPreisT = initTextFeld( 720, 475, 100, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Vollversion:" );
+    testVersionPreis = initTextFeld( 820, 450, 50, 20, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
     testVersionPreis->setTastaturEreignis( _nurNummernTE );
-    vollVersionPreis = initTextFeld( 820, 475, 50, 20, zSchrift, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
+    vollVersionPreis = initTextFeld( 820, 475, 50, 20, TextFeld::Style::TextFeld | TextFeld::Style::VCenter, "" );
     vollVersionPreis->setTastaturEreignis( _nurNummernTE );
-    shopÜbernehmen = initKnopf( 745, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Übernehmen" );
+    shopÜbernehmen = initKnopf( 745, 500, 100, 20, Knopf::Style::Sichtbar, "Übernehmen" );
     shopÜbernehmen->setMausEreignis( kEReleaseShopÜbernehmenME );
     shopÜbernehmen->setMausEreignisParameter( this );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
-    fenster->addMember( abbilder->getThis() );
-    fenster->addMember( veröff->getThis() );
-    fenster->addMember( abbildName->getThis() );
-    fenster->addMember( abbildErstellen->getThis() );
-    fenster->addMember( shopT->getThis() );
-    fenster->addMember( preisT->getThis() );
-    fenster->addMember( testVersionPreisT->getThis() );
-    fenster->addMember( vollVersionPreisT->getThis() );
-    fenster->addMember( testVersionPreis->getThis() );
-    fenster->addMember( vollVersionPreis->getThis() );
-    fenster->addMember( shopÜbernehmen->getThis() );
-    fenster->addMember( vollVersionErwerbbar->getThis() );
-    fenster->addMember( testVersionErwerbbar->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( abbilder->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( veröff->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( abbildName->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( abbildErstellen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( shopT->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( preisT->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( testVersionPreisT->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( vollVersionPreisT->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( testVersionPreis->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( vollVersionPreis->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( shopÜbernehmen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( vollVersionErwerbbar->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( testVersionErwerbbar->getThis() ) );
     animation = 0;
     tickVal = 0;
     sichtbar = 0;
@@ -113,7 +112,6 @@ KERelease::~KERelease()
     abbildName->release();
     abbildErstellen->release();
     laden->release();
-    schrift->release();
     shopT->release();
     testVersionErwerbbar->release();
     vollVersionErwerbbar->release();
@@ -133,7 +131,7 @@ bool KERelease::herstellenME( Knopf *obj, MausEreignis &me )
         int anz = abbilder->getZeilenAnzahl();
         for( int i = 1; i < anz; i++ )
         {
-            if( obj == (Knopf*)abbilder->zZeichnung( 2, i ) )
+            if( obj == (Knopf *)abbilder->zZeichnung( 2, i ) )
             {
                 if( !run )
                 {
@@ -155,7 +153,7 @@ bool KERelease::removeME( Knopf *obj, MausEreignis &me )
         int anz = abbilder->getZeilenAnzahl();
         for( int i = 1; i < anz; i++ )
         {
-            if( obj == (Knopf*)abbilder->zZeichnung( 3, i ) )
+            if( obj == (Knopf *)abbilder->zZeichnung( 3, i ) )
             {
                 if( !run )
                 {
@@ -302,32 +300,32 @@ void KERelease::thread()
     int anz = abbilder->getZeilenAnzahl();
     for( int i = 1; i < anz; i++ )
     {
-        hauptScreen->lock();
+        uiFactory.initParam.bildschirm->lock();
         abbilder->removeZeile( 1 );
-        hauptScreen->unlock();
+        uiFactory.initParam.bildschirm->unlock();
     }
     RCArray< Text > *name = new RCArray< Text >();
     RCArray< Zeit > *datum = new RCArray< Zeit >();
     anz = editorClient->getAbbildListe( name, datum );
     for( int i = 0; i < anz; i++ )
     {
-        hauptScreen->lock();
+        uiFactory.initParam.bildschirm->lock();
         abbilder->addZeile( name->z( i )->getText() );
-        abbilder->setZeichnungZ( 0, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, name->z( i )->getText() ) );
+        abbilder->setZeichnungZ( 0, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text, name->z( i )->getText() ) );
         Text *d = datum->z( i )->getZeit( "h:i:s d.m.y" );
-        abbilder->setZeichnungZ( 1, i + 1, initTextFeld( 0, 0, 0, 0, schrift, TextFeld::Style::Text, d->getText() ) );
+        abbilder->setZeichnungZ( 1, i + 1, initTextFeld( 0, 0, 0, 0, TextFeld::Style::Text, d->getText() ) );
         d->release();
-        Knopf *k = initKnopf( 0, 0, 100, 20, schrift, Knopf::Style::Sichtbar, "Herstellen" );
-        initToolTip( k, "Stellt die abgespeicherte Version der Karte wiederher.", schrift, hauptScreen );
+        Knopf *k = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Herstellen" );
+        initToolTip( k, "Stellt die abgespeicherte Version der Karte wiederher." );
         k->setMausEreignisParameter( this );
         k->setMausEreignis( kEReleaseHerstellenME );
         abbilder->setZeichnungZ( 2, i + 1, k );
-        k = initKnopf( 0, 0, 100, 20, schrift, Knopf::Style::Sichtbar, "Löschen" );
-        initToolTip( k, "Löscht die abgespeicherte Version der Karte.", schrift, hauptScreen );
+        k = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Löschen" );
+        initToolTip( k, "Löscht die abgespeicherte Version der Karte." );
         k->setMausEreignisParameter( this );
         k->setMausEreignis( kEReleaseLöschenME );
         abbilder->setZeichnungZ( 3, i + 1, k );
-        hauptScreen->unlock();
+        uiFactory.initParam.bildschirm->unlock();
     }
     name->release();
     datum->release();
@@ -453,16 +451,4 @@ void KERelease::render( Bild &zRObj )
 bool KERelease::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KERelease::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 23 - 26
KSGClient/NachLogin/Editor/Karte/KarteRelease/KERelease.h

@@ -13,13 +13,12 @@ using namespace Framework;
 class KERelease : public Thread
 {
 private:
-	Fenster *fenster;
-	ObjTabelle *abbilder;
+    Fenster *fenster;
+    ObjTabelle *abbilder;
     Knopf *veröff;
     Knopf *abbildErstellen;
     TextFeld *abbildName;
-	Animation2D *laden;
-    Schrift *schrift;
+    Animation2D *laden;
     TextFeld *shopT;
     AuswahlBox *testVersionErwerbbar;
     AuswahlBox *vollVersionErwerbbar;
@@ -31,36 +30,34 @@ private:
     Knopf *shopÜbernehmen;
     int aktion;
     int zeile;
-	bool animation;
-	double tickVal;
-	bool sichtbar;
-	bool rechts;
-	int xStart;
-	int breite;
-	int karte;
-	unsigned char alpha;
+    bool animation;
+    double tickVal;
+    bool sichtbar;
+    bool rechts;
+    int xStart;
+    int breite;
+    int karte;
+    unsigned char alpha;
 
 public:
-	// Konstruktor
-	KERelease( int karte, Schrift *zSchrift );
-	// Destruktor
-	~KERelease();
-	// nicht constant
+    // Konstruktor
+    KERelease( int karte );
+    // Destruktor
+    ~KERelease();
+    // nicht constant
     bool herstellenME( Knopf *obj, MausEreignis &me );
     bool removeME( Knopf *obj, MausEreignis &me );
     bool veröffentlichenME( MausEreignis &me );
     bool abbildErstellenME( MausEreignis &me );
     bool shopÜbernehmenME( MausEreignis &me );
-	void setSichtbar( bool s, bool vr );
-	void thread() override;
-	void doPublicMausEreignis( MausEreignis &me );
+    void setSichtbar( bool s, bool vr );
+    void thread() override;
+    void doPublicMausEreignis( MausEreignis &me );
     void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double z );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    bool tick( double z );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 70 - 36
KSGClient/NachLogin/Editor/Karte/KartenEditor.cpp

@@ -4,22 +4,21 @@
 #include <KSGTDatei.h>
 #include <Globals.h>
 
-typedef EditorV*( *DllStart )( );
+typedef EditorV *( *DllStart )( );
 
 // Inhalt der KartenEditor Klasse aus KartenEditor.h
 // Konstruktor
-KartenEditor::KartenEditor( Schrift *schrift )
+KartenEditor::KartenEditor()
 {
-    this->schrift = schrift;
-    karteRelease = initKnopf( 10, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Karte Release" );
-    shopSeite = initKnopf( 120, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Shop Seite" );
-    beschreibung = initKnopf( 230, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Beschreibung" );
-    teams = initKnopf( 340, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Teams" );
-    dateien = initKnopf( 450, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Dateien" );
-    editor = initKnopf( 560, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Editor" );
-    kaufHistorie = initKnopf( 670, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Kauf Historie" );
-    beenden = initKnopf( 790, 10, 100, 20, schrift, Knopf::Style::Sichtbar, "Beenden" );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    karteRelease = initKnopf( 10, 10, 100, 20, Knopf::Style::Sichtbar, "Karte Release" );
+    shopSeite = initKnopf( 120, 10, 100, 20, Knopf::Style::Sichtbar, "Shop Seite" );
+    beschreibung = initKnopf( 230, 10, 100, 20, Knopf::Style::Sichtbar, "Beschreibung" );
+    teams = initKnopf( 340, 10, 100, 20, Knopf::Style::Sichtbar, "Teams" );
+    dateien = initKnopf( 450, 10, 100, 20, Knopf::Style::Sichtbar, "Dateien" );
+    editor = initKnopf( 560, 10, 100, 20, Knopf::Style::Sichtbar, "Editor" );
+    kaufHistorie = initKnopf( 670, 10, 100, 20, Knopf::Style::Sichtbar, "Kauf Historie" );
+    beenden = initKnopf( 790, 10, 100, 20, Knopf::Style::Sichtbar, "Beenden" );
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
     tickVal = 0;
@@ -41,7 +40,6 @@ KartenEditor::KartenEditor( Schrift *schrift )
 // Destruktor
 KartenEditor::~KartenEditor()
 {
-    schrift->release();
     karteRelease->release();
     shopSeite->release();
     beschreibung->release();
@@ -52,17 +50,41 @@ KartenEditor::~KartenEditor()
     beenden->release();
     laden->release();
     if( releaseF )
+    {
+        releaseF->warteAufThread( 10000 );
+        releaseF->ende();
         releaseF->release();
+    }
     if( shopSeiteF )
+    {
+        shopSeiteF->warteAufThread( 10000 );
+        shopSeiteF->ende();
         shopSeiteF->release();
+    }
     if( beschreibungF )
+    {
+        beschreibungF->warteAufThread( 10000 );
+        beschreibungF->ende();
         beschreibungF->release();
+    }
     if( teamsF )
+    {
+        teamsF->warteAufThread( 10000 );
+        teamsF->ende();
         teamsF->release();
+    }
     if( dateienF )
+    {
+        dateienF->warteAufThread( 10000 );
+        dateienF->ende();
         dateienF->release();
+    }
     if( kaufHF )
+    {
+        kaufHF->warteAufThread( 10000 );
+        kaufHF->ende();
         kaufHF->release();
+    }
     if( editorF )
         editorF->release();
     if( editorDll )
@@ -82,7 +104,7 @@ void KartenEditor::thread()
         run = 0;
         return;
     }
-    nachLogin->setEditor( editorF->getThis() );
+    nachLogin->setEditor( dynamic_cast<EditorV *>( editorF->getThis() ) );
     aktion = 9;
     laden->setSichtbar( 0 );
     editorF->setSichtbar();
@@ -91,24 +113,48 @@ void KartenEditor::thread()
 void KartenEditor::setKarte( int id )
 {
     jetzt = 0;
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     if( releaseF )
+    {
+        releaseF->warteAufThread( 10000 );
+        releaseF->ende();
         releaseF->release();
+    }
     if( shopSeiteF )
+    {
+        shopSeiteF->warteAufThread( 10000 );
+        shopSeiteF->ende();
         shopSeiteF->release();
+    }
     if( beschreibungF )
+    {
+        beschreibungF->warteAufThread( 10000 );
+        beschreibungF->ende();
         beschreibungF->release();
+    }
     if( teamsF )
+    {
+        teamsF->warteAufThread( 10000 );
+        teamsF->ende();
         teamsF->release();
+    }
     if( dateienF )
+    {
+        dateienF->warteAufThread( 10000 );
+        dateienF->ende();
         dateienF->release();
+    }
     if( kaufHF )
+    {
+        kaufHF->warteAufThread( 10000 );
+        kaufHF->ende();
         kaufHF->release();
+    }
     if( editorF )
         editorF->release();
     if( editorDll )
         Framework::getDLLRegister()->releaseDLL( dllName );
-    releaseF = new KERelease( id, schrift );
+    releaseF = new KERelease( id );
     releaseF->setSichtbar( 1, 0 );
     karteRelease->setAlphaFeldFarbe( 0x0000FF00 );
     shopSeite->setAlphaFeldFarbe( 0x5500FF00 );
@@ -118,11 +164,11 @@ void KartenEditor::setKarte( int id )
     editor->setAlphaFeldFarbe( 0x5500FF00 );
     kaufHistorie->setAlphaFeldFarbe( 0x5500FF00 );
     jetzt = 1;
-    shopSeiteF = new KEShopSeite( id, schrift );
-    beschreibungF = new KEBeschreibung( id, schrift );
-    teamsF = new KETeams( id, schrift );
-    dateienF = new KEDateien( id, schrift );
-    kaufHF = new KEKaufHistorie( id, schrift );
+    shopSeiteF = new KEShopSeite( id );
+    beschreibungF = new KEBeschreibung( id );
+    teamsF = new KETeams( id );
+    dateienF = new KEDateien( id );
+    kaufHF = new KEKaufHistorie( id );
     // Editor laden
     int spielArt = infoClient->getSpielId( id );
     KSGTDatei *dgt = new KSGTDatei( "data/dg.ksgt" );
@@ -206,8 +252,8 @@ void KartenEditor::setKarte( int id )
                 if( editorF )
                 {
                     editor->addStyle( Knopf::Style::Erlaubt );
-                    editorF->setSchrift( schrift->getThis() );
-                    editorF->setKlient( editorClient->getThis() );
+                    editorF->setUIFactory( uiFactory );
+                    editorF->setKlient( dynamic_cast<KSGClient::EditorServerClient *>( editorClient->getThis() ) );
                     editorF->setLadeAnimation( (Animation2D *)ladeAnimation->dublizieren() );
                     editor->addStyle( Knopf::Style::Sichtbar );
                 }
@@ -221,7 +267,7 @@ void KartenEditor::setKarte( int id )
             }
         }
     }
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
 void KartenEditor::setSichtbar( bool s )
@@ -667,16 +713,4 @@ void KartenEditor::render( Bild &zRObj )
 bool KartenEditor::istSichtbar() const
 {
     return sichtbar;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KartenEditor::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 26 - 29
KSGClient/NachLogin/Editor/Karte/KartenEditor.h

@@ -17,16 +17,15 @@ using namespace Framework;
 class KartenEditor : public Thread
 {
 private:
-	Schrift *schrift;
-	Knopf *karteRelease;
-	Knopf *shopSeite;
-	Knopf *beschreibung;
-	Knopf *teams;
-	Knopf *dateien;
-	Knopf *editor;
-	Knopf *kaufHistorie;
-	Knopf *beenden;
-	KERelease *releaseF;
+    Knopf *karteRelease;
+    Knopf *shopSeite;
+    Knopf *beschreibung;
+    Knopf *teams;
+    Knopf *dateien;
+    Knopf *editor;
+    Knopf *kaufHistorie;
+    Knopf *beenden;
+    KERelease *releaseF;
     KEShopSeite *shopSeiteF;
     KEBeschreibung *beschreibungF;
     KETeams *teamsF;
@@ -36,29 +35,27 @@ private:
     HINSTANCE editorDll;
     Text dllName;
     Animation2D *laden;
-	double tickVal;
-	int jetzt;
-	unsigned char alpha;
+    double tickVal;
+    int jetzt;
+    unsigned char alpha;
     unsigned char alpha2;
-	bool sichtbar;
+    bool sichtbar;
 
 public:
-	// Konstruktor
-	KartenEditor( Schrift *schrift );
-	// Destruktor
-	~KartenEditor();
-	// nicht constant
+    // Konstruktor
+    KartenEditor();
+    // Destruktor
+    ~KartenEditor();
+    // nicht constant
     void thread() override;
-	void setKarte( int id );
-	void setSichtbar( bool s );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    void setKarte( int id );
+    void setSichtbar( bool s );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif;

+ 14 - 28
KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.cpp

@@ -6,25 +6,24 @@
 
 // Inhalt der KEKaufHistorie Klasse
 // Konstruktor
-KEKaufHistorie::KEKaufHistorie( int karte, Schrift *zSchrift )
+KEKaufHistorie::KEKaufHistorie( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Release";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    aktualisieren = initKnopf( 10, 10, 100, 20, zSchrift, Knopf::Style::Normal, "Aktualisieren" );
-    aktualisieren->setMausEreignis( [ this ]( void *p, void *obj, MausEreignis me ) -> bool
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    aktualisieren = initKnopf( 10, 10, 100, 20, Knopf::Style::Normal, "Aktualisieren" );
+    aktualisieren->setMausEreignis( [this]( void *p, void *obj, MausEreignis me ) -> bool
     {
         if( me.id == ME_RLinks && me.verarbeitet == 0 )
             start();
         return 1;
     } );
-    gesammtVerkauf = initTextFeld( 120, 10, 750, 20, zSchrift, TextFeld::Style::Text, "Gesammt verkauft: " );
-    statistik = initLinienDiagramm( 10, 40, 860, 480, zSchrift, LDiag::Style::DatenRahmen, 0 );
+    gesammtVerkauf = initTextFeld( 120, 10, 750, 20, TextFeld::Style::Text, "Gesammt verkauft: " );
+    statistik = initLinienDiagramm( 10, 40, 860, 480, LDiag::Style::DatenRahmen, 0 );
     statistik->setHIntervallBreite( 36.8 );
     statistik->setDatenStyle( DiagDaten::Style::autoRaster | DiagDaten::Style::intervallTexte | DiagDaten::Style::intervalle | DiagDaten::Style::Sichtbar | DiagDaten::Style::autoIntervall );
     statistik->setRasterDicke( 1 );
@@ -36,9 +35,9 @@ KEKaufHistorie::KEKaufHistorie( int karte, Schrift *zSchrift )
     laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
-    fenster->addMember( aktualisieren->getThis() );
-    fenster->addMember( gesammtVerkauf->getThis() );
-    fenster->addMember( statistik->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( aktualisieren->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( gesammtVerkauf->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( statistik->getThis() ) );
     animation = 0;
     tickVal = 0;
     sichtbar = 0;
@@ -58,7 +57,6 @@ KEKaufHistorie::~KEKaufHistorie()
     gesammtVerkauf->release();
     fenster->release();
     laden->release();
-    schrift->release();
 }
 
 // nicht constant
@@ -125,13 +123,13 @@ void KEKaufHistorie::thread()
         maxS++;
         statistik->addVIntervallText( 0, Text() += 0 );
         statistik->addVIntervallText( maxS + 1, Text() += ( maxS + 1 ) );
-        Datum * d = Framework::getDatum();
+        Datum *d = Framework::getDatum();
         d->minusTag( 30 );
         statistik->addHIntervallText( 0, d->getDatum( "y-m-d" ) );
         d->plusTag( 30 );
         statistik->addHIntervallText( anz - 1, d->getDatum( "y-m-d" ) );
         d->release();
-        DiagWert * w = new DiagWert();
+        DiagWert *w = new DiagWert();
         w->farbe = 0xFF00FFFF;
         w->hintergrund = 0xFF205050;
         w->name->setText( "Einnahmen" );
@@ -160,13 +158,13 @@ void KEKaufHistorie::thread()
     laden->setSichtbar( 0 );
 }
 
-void KEKaufHistorie::doPublicMausEreignis( MausEreignis & me )
+void KEKaufHistorie::doPublicMausEreignis( MausEreignis &me )
 {
     if( !run )
         fenster->doPublicMausEreignis( me );
 }
 
-void KEKaufHistorie::doTastaturEreignis( TastaturEreignis & te )
+void KEKaufHistorie::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !run )
         fenster->doTastaturEreignis( te );
@@ -263,7 +261,7 @@ bool KEKaufHistorie::tick( double z )
     return ret || fenster->tick( z );
 }
 
-void KEKaufHistorie::render( Bild & zRObj )
+void KEKaufHistorie::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( xStart, 0, breite, 600 ) )
         return;
@@ -278,16 +276,4 @@ void KEKaufHistorie::render( Bild & zRObj )
 bool KEKaufHistorie::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KEKaufHistorie::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 4
KSGClient/NachLogin/Editor/Karte/KaufHistorie/KaufHistorie.h

@@ -16,7 +16,6 @@ private:
     Knopf *aktualisieren;
     TextFeld *gesammtVerkauf;
     Animation2D *laden;
-    Schrift *schrift;
     bool animation;
     double tickVal;
     bool sichtbar;
@@ -28,7 +27,7 @@ private:
 
 public:
     // Konstruktor
-    KEKaufHistorie( int karte, Schrift *zSchrift );
+    KEKaufHistorie( int karte );
     // Destruktor
     ~KEKaufHistorie();
     // nicht constant
@@ -40,6 +39,4 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };

+ 66 - 93
KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSEditor.cpp

@@ -9,7 +9,8 @@
 
 // Inhalt der KESSTextSeite Klasse aus KESSEditor.h
 // Konstruktor
-KESSTextSeite::KESSTextSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove )
+KESSTextSeite::KESSTextSeite( Knopf *zNeueDatei, Knopf *zDateiRemove )
+    : ReferenceCounter()
 {
     LTDSDatei *sd = new LTDSDatei();
     sd->setPfad( new Text( "data/schriften/ksgs.ltds" ) );
@@ -23,7 +24,7 @@ KESSTextSeite::KESSTextSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDate
         if( getKSGScriptEditor )
         {
             text = getKSGScriptEditor();
-            text->setSchriftZ( ( ksgsS ? ksgsS : zSchrift )->getThis() );
+            text->setSchriftZ( dynamic_cast<Schrift *>( ( ksgsS ? ksgsS : uiFactory.initParam.schrift )->getThis() ) );
             text->setSize( 540, 510 );
             text->setPosition( 220, 10 );
             text->setStyle( ZeichnungHintergrund::Style::HScroll | ZeichnungHintergrund::Style::VScroll | ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Erlaubt | ZeichnungHintergrund::Style::Rahmen | ZeichnungHintergrund::Style::Hintergrund );
@@ -40,7 +41,7 @@ KESSTextSeite::KESSTextSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDate
             text = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_EDITOR_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -53,14 +54,13 @@ KESSTextSeite::KESSTextSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDate
     }
     if( ksgsS )
         ksgsS->release();
-    speichern = initKnopf( 770, 10, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Speichern" );
-    dateiLöschen = (Knopf *)zDateiRemove->getThis();
-    neueDatei = (Knopf *)zNeueDatei->getThis();
+    speichern = initKnopf( 770, 10, 100, 20, Knopf::Style::Sichtbar, "Speichern" );
+    dateiLöschen = dynamic_cast<Knopf *>( zDateiRemove->getThis() );
+    neueDatei = dynamic_cast<Knopf *>( zNeueDatei->getThis() );
     aktion = 0;
     sichtbar = 0;
     alpha = 0;
     tickVal = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -82,7 +82,7 @@ int KESSTextSeite::getAktion()
     return ret;
 }
 
-void KESSTextSeite::setDateiText( Text * txt )
+void KESSTextSeite::setDateiText( Text *txt )
 {
     text->setText( txt );
 }
@@ -123,33 +123,33 @@ bool KESSTextSeite::tick( double tv )
     return ret;
 }
 
-void KESSTextSeite::doPublicMausEreignis( MausEreignis & me )
+void KESSTextSeite::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
     text->doPublicMausEreignis( me );
     bool vera = me.verarbeitet;
     speichern->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 1;
     vera = me.verarbeitet;
     dateiLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 2;
     vera = me.verarbeitet;
     neueDatei->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 3;
 }
 
-void KESSTextSeite::doTastaturEreignis( TastaturEreignis & te )
+void KESSTextSeite::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar )
         return;
     text->doTastaturEreignis( te );
 }
 
-void KESSTextSeite::render( Bild & zRObj )
+void KESSTextSeite::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -169,32 +169,18 @@ Text *KESSTextSeite::zDateiText() const
     return text->zText();
 }
 
-// Reference Counting 
-KESSTextSeite *KESSTextSeite::getThis()
-{
-    ref++;
-    return this;
-}
-
-KESSTextSeite *KESSTextSeite::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der KESSBildSeite Klasse aus KESSEditor.h
 // Konstruktor
-KESSBildSeite::KESSBildSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf * zDateiRemove )
+KESSBildSeite::KESSBildSeite( Knopf *zNeueDatei, Knopf *zDateiRemove )
+    : ReferenceCounter()
 {
-    bilder = initAuswahlListe( 220, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
+    bilder = initAuswahlListe( 220, 10, 200, 510, AuswahlListe::Style::Normal, {} );
     bildObj = initBildZ( 430, 10, 440, 440, BildZ::Style::normal | BildZ::Style::Alpha, 0 );
-    bildLöschen = initKnopf( 430, 460, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Bild Löschen" );
-    importieren = initKnopf( 430, 490, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Importieren" );
-    dateiLöschen = (Knopf *)zDateiRemove->getThis();
-    neueDatei = (Knopf *)zNeueDatei->getThis();
+    bildLöschen = initKnopf( 430, 460, 100, 20, Knopf::Style::Sichtbar, "Bild Löschen" );
+    importieren = initKnopf( 430, 490, 100, 20, Knopf::Style::Sichtbar, "Importieren" );
+    dateiLöschen = dynamic_cast<Knopf *>( zDateiRemove->getThis() );
+    neueDatei = dynamic_cast<Knopf *>( zNeueDatei->getThis() );
     importDialog = 0;
     importPfad = 0;
     aktion = 0;
@@ -202,7 +188,6 @@ KESSBildSeite::KESSBildSeite( Schrift * zSchrift, Knopf * zNeueDatei, Knopf * zD
     alpha = 0;
     alpha2 = 0;
     tickVal = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -228,9 +213,9 @@ int KESSBildSeite::getAktion()
     return ret;
 }
 
-void KESSBildSeite::setBildListe( RCArray< Text > * list )
+void KESSBildSeite::setBildListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     Text txt = bilder->zEintrag( bilder->getAuswahl() ) ? bilder->zEintrag( bilder->getAuswahl() )->zText()->getText() : "";
     while( bilder->getEintragAnzahl() )
         bilder->removeEintrag( 0 );
@@ -247,14 +232,14 @@ void KESSBildSeite::setBildListe( RCArray< Text > * list )
     else
         bilder->deSelect();
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KESSBildSeite::setBild( Bild * b )
+void KESSBildSeite::setBild( Bild *b )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     bildObj->setBild( b );
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
 void KESSBildSeite::setSichtbar( bool s )
@@ -272,7 +257,7 @@ bool KESSBildSeite::tick( double tv )
                 importPfad->release();
             importPfad = importDialog->getPfad();
             importDialog = (DateiDialogTh *)importDialog->release();
-            if( sichtbar &&importPfad )
+            if( sichtbar && importPfad )
                 aktion = 3;
         }
     }
@@ -323,7 +308,7 @@ bool KESSBildSeite::tick( double tv )
     return ret;
 }
 
-void KESSBildSeite::doPublicMausEreignis( MausEreignis & me )
+void KESSBildSeite::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -338,11 +323,11 @@ void KESSBildSeite::doPublicMausEreignis( MausEreignis & me )
     }
     bool vera = me.verarbeitet;
     dateiLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 4;
     vera = me.verarbeitet;
     neueDatei->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 5;
     vera = me.verarbeitet;
     importieren->doPublicMausEreignis( me );
@@ -365,11 +350,11 @@ void KESSBildSeite::doPublicMausEreignis( MausEreignis & me )
     bildObj->doPublicMausEreignis( me );
     vera = me.verarbeitet;
     bildLöschen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 2;
 }
 
-void KESSBildSeite::render( Bild & zRObj )
+void KESSBildSeite::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -400,21 +385,6 @@ Text *KESSBildSeite::zBildAuswahl() const
     return bilder->zEintrag( bilder->getAuswahl() )->zText();
 }
 
-// Reference Counting
-KESSBildSeite *KESSBildSeite::getThis()
-{
-    ref++;
-    return this;
-}
-
-KESSBildSeite *KESSBildSeite::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 bool kESSEditorNeuDateiOkME( void *p, void *obj, MausEreignis me )
 {
@@ -428,32 +398,35 @@ bool kESSEditorNeuDateiOkME( void *p, void *obj, MausEreignis me )
 
 // Inhalt der KESSEditor Klasse aus KESSEditor.h
 // Konstruktor
-KESSEditor::KESSEditor( Schrift * zSchrift )
+KESSEditor::KESSEditor()
     : Zeichnung()
 {
-    neueDatei = initKnopf( 0, 0, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Neue Datei" );
-    dateiLöschen = initKnopf( 0, 0, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Datei Löschen" );
-    dateien = initAuswahlListe( 10, 10, 200, 510, zSchrift, AuswahlListe::Style::Normal, {} );
-    textSeite = new KESSTextSeite( zSchrift, neueDatei, dateiLöschen );
-    bildSeite = new KESSBildSeite( zSchrift, neueDatei, dateiLöschen );
-    vorschau = initKnopf( 770, 470, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Vorschau" );
-    veröffentlichen = initKnopf( 770, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Fertig" );
-    initToolTip( veröffentlichen, "Veröffentlicht die geänderte Version der Shop-Seite.", zSchrift, hauptScreen );
-    neuDateiF = initFenster( 365, 145, 150, 120, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
+    neueDatei = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Neue Datei" );
+    dateiLöschen = initKnopf( 0, 0, 100, 20, Knopf::Style::Sichtbar, "Datei Löschen" );
+    dateien = initAuswahlListe( 10, 10, 200, 510, AuswahlListe::Style::Normal, {} );
+    textSeite = new KESSTextSeite( neueDatei, dateiLöschen );
+    bildSeite = new KESSBildSeite( neueDatei, dateiLöschen );
+    vorschau = initKnopf( 770, 470, 100, 20, Knopf::Style::Sichtbar, "Vorschau" );
+    veröffentlichen = initKnopf( 770, 500, 100, 20, Knopf::Style::Sichtbar, "Fertig" );
+    initToolTip( veröffentlichen, "Veröffentlicht die geänderte Version der Shop-Seite." );
+    neuDateiF = initFenster( 365, 145, 150, 120, Fenster::Style::Erlaubt | Fenster::Style::BodyHintergrund | Fenster::Style::BodyHAlpha |
                              Fenster::Style::Rahmen | Fenster::Style::Closable | Fenster::Style::ClosingKlickBuffer | Fenster::Style::ClosingHintergrund |
                              Fenster::Style::ClosingHAlpha | Fenster::Style::Titel | Fenster::Style::TitelHintergrund | Fenster::Style::TitelHAlpha | Fenster::Style::TitelBuffered, "Neue Datei" );
     neuDateiF->setKBgFarbe( 0xC0000000 );
     neuDateiF->setSBgFarbe( 0xC0000000 );
     neuDateiF->setTBgFarbe( 0xC0000000 );
     neuDateiF->setClosingMe( kESSEditorNeuDateiOkME );
-    neuDateiTyp = initAuswahlBox( 10, 10, 130, 20, zSchrift, ABSTYLE, { "Ordner", "Bild (.ltdb)", "Script (.ksgs)" } );
-    neuDateiName = initTextFeld( 10, 40, 130, 20, zSchrift, TextFeld::Style::TextFeld, "Datei Name" );
-    neuDateiOk = initKnopf( 25, 70, 100, 20, zSchrift, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
+    neuDateiTyp = initAuswahlBox( 10, 10, 130, 20, ABSTYLE, { "Ordner", "Bild (.ltdb)", "Script (.ksgs)" } );
+    neuDateiName = initTextFeld( 10, 40, 130, 20, TextFeld::Style::TextFeld, "Datei Name" );
+    neuDateiOk = initKnopf( 25, 70, 100, 20, Knopf::Style::Normal | Knopf::Style::Sichtbar, "Erstellen" );
     neuDateiOk->setMausEreignisParameter( this );
     neuDateiOk->setMausEreignis( kESSEditorNeuDateiOkME );
-    neuDateiF->addMember( neuDateiName->getThis() );
-    neuDateiF->addMember( neuDateiOk->getThis() );
-    neuDateiF->addMember( neuDateiTyp->getThis() );
+#pragma warning(push)
+#pragma warning(disable : 4436)
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiName->getThis() ) );
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiOk->getThis() ) );
+    neuDateiF->addMember( dynamic_cast<Zeichnung *>( neuDateiTyp->getThis() ) );
+#pragma warning(pop)
     aktion = 0;
     sichtbar = 0;
     alpha = 0;
@@ -485,7 +458,7 @@ int KESSEditor::getAktion()
     return ret;
 }
 
-bool KESSEditor::neuDateiOkME( MausEreignis & me )
+bool KESSEditor::neuDateiOkME( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -495,9 +468,9 @@ bool KESSEditor::neuDateiOkME( MausEreignis & me )
     return 1;
 }
 
-void KESSEditor::setDateiListe( RCArray< Text > * list )
+void KESSEditor::setDateiListe( RCArray< Text > *list )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     dateien->deSelect();
     while( dateien->getEintragAnzahl() )
         dateien->removeEintrag( 0 );
@@ -508,24 +481,24 @@ void KESSEditor::setDateiListe( RCArray< Text > * list )
     textSeite->setSichtbar( 0 );
     neuDateiF->removeStyle( Fenster::Style::Sichtbar );
     list->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
 }
 
-void KESSEditor::setBildListe( RCArray< Text > * list )
+void KESSEditor::setBildListe( RCArray< Text > *list )
 {
     textSeite->setSichtbar( 0 );
     bildSeite->setBildListe( list );
     bildSeite->setSichtbar( 1 );
 }
 
-void KESSEditor::setDateiText( Text * txt )
+void KESSEditor::setDateiText( Text *txt )
 {
     bildSeite->setSichtbar( 0 );
     textSeite->setDateiText( txt );
     textSeite->setSichtbar( 1 );
 }
 
-void KESSEditor::setBild( Bild * b )
+void KESSEditor::setBild( Bild *b )
 {
     bildSeite->setBild( b );
 }
@@ -625,7 +598,7 @@ bool KESSEditor::tick( double tv )
     return ret;
 }
 
-void KESSEditor::doPublicMausEreignis( MausEreignis & me )
+void KESSEditor::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -649,27 +622,27 @@ void KESSEditor::doPublicMausEreignis( MausEreignis & me )
     {
         bool vera = me.verarbeitet;
         neueDatei->doPublicMausEreignis( me );
-        if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+        if( !vera && me.verarbeitet && me.id == ME_RLinks )
             neuDateiF->addStyle( Fenster::Style::Sichtbar );
         if( dateien->getEintragAnzahl() > 0 && dateien->zEintrag( 0 )->zText()->istGleich( ".." ) )
         {
             vera = me.verarbeitet;
             dateiLöschen->doPublicMausEreignis( me );
-            if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+            if( !vera && me.verarbeitet && me.id == ME_RLinks )
                 aktion = 4;
         }
     }
     bool vera = me.verarbeitet;
     vorschau->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 8;
     vera = me.verarbeitet;
     veröffentlichen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 9;
 }
 
-void KESSEditor::doTastaturEreignis( TastaturEreignis & te )
+void KESSEditor::doTastaturEreignis( TastaturEreignis &te )
 {
     if( neuDateiF->hatStyle( Fenster::Style::Sichtbar ) )
     {
@@ -679,7 +652,7 @@ void KESSEditor::doTastaturEreignis( TastaturEreignis & te )
     textSeite->doTastaturEreignis( te );
 }
 
-void KESSEditor::render( Bild & zRObj )
+void KESSEditor::render( Bild &zRObj )
 {
     zRObj.setAlpha( alpha );
     zRObj.setAlpha( alpha2 );

+ 5 - 13
KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSEditor.h

@@ -13,7 +13,7 @@ using namespace Framework;
 
 class KEShopSeite;
 
-class KESSTextSeite
+class KESSTextSeite : public virtual ReferenceCounter
 {
 private:
     KSGScript::KSGScriptEditor *text;
@@ -25,11 +25,10 @@ private:
     bool sichtbar;
     unsigned char alpha;
     double tickVal;
-    int ref;
 
 public:
     // Konstruktor
-    KESSTextSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove );
+    KESSTextSeite( Knopf *zNeueDatei, Knopf *zDateiRemove );
     // Destruktor
     ~KESSTextSeite();
     // nicht constant
@@ -42,12 +41,9 @@ public:
     void render( Bild &zRObj );
     // constant
     Text *zDateiText() const;
-    // Reference Counting 
-    KESSTextSeite *getThis();
-    KESSTextSeite *release();
 };
 
-class KESSBildSeite
+class KESSBildSeite : public virtual ReferenceCounter
 {
 private:
     AuswahlListe *bilder;
@@ -63,11 +59,10 @@ private:
     unsigned char alpha;
     unsigned char alpha2;
     double tickVal;
-    int ref;
 
 public:
     // Konstruktor
-    KESSBildSeite( Schrift *zSchrift, Knopf *zNeueDatei, Knopf *zDateiRemove );
+    KESSBildSeite( Knopf *zNeueDatei, Knopf *zDateiRemove );
     // Destruktor
     ~KESSBildSeite();
     // nicht constant
@@ -81,9 +76,6 @@ public:
     // constant
     Text *zBildImportPfad() const;
     Text *zBildAuswahl() const;
-    // Reference Counting
-    KESSBildSeite *getThis();
-    KESSBildSeite *release();
 };
 
 class KESSEditor : public Zeichnung
@@ -108,7 +100,7 @@ private:
 
 public:
     // Konstruktor
-    KESSEditor( Schrift *zSchrift );
+    KESSEditor();
     // Destruktor
     ~KESSEditor();
     // nicht constant

+ 54 - 72
KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSVorschau.cpp

@@ -13,7 +13,7 @@ void kESSVorschauKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVa
 
 // Inhalt der KESSVorschauKarteScript Klasse aus KESSVorschau.h
 // Konstruktor
-KESSVorschauKarteScript::KESSVorschauKarteScript( Schrift * zSchrift, TextFeld * zLog )
+KESSVorschauKarteScript::KESSVorschauKarteScript( TextFeld *zLog )
     : Thread()
 {
     ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
@@ -23,18 +23,18 @@ KESSVorschauKarteScript::KESSVorschauKarteScript( Schrift * zSchrift, TextFeld *
         if( getKSGScript )
         {
             fenster = getKSGScript();
-            fenster->setSchriftZ( zSchrift->getThis() );
+            fenster->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
             fenster->setSize( 555, 380 );
-            fenster->setRückrufParam( this );
-            fenster->setRückrufFunktion( kESSVorschauKSGSAktion );
-            fenster->setLog( (TextFeld *)zLog->getThis() );
+            fenster->setCallbackParam( this );
+            fenster->setCallbackFunktion( kESSVorschauKSGSAktion );
+            fenster->setLog( dynamic_cast<TextFeld *>( zLog->getThis() ) );
         }
         else
         {
             fenster = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -67,7 +67,7 @@ KESSVorschauKarteScript::~KESSVorschauKarteScript()
 {
     if( fenster )
     {
-        fenster->zurücksetzen();
+        fenster->reset();
         fenster->release();
     }
     ram->release();
@@ -120,12 +120,12 @@ void KESSVorschauKarteScript::ladeKarteSeite( char *pfad )
     start();
 }
 
-void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
     KSGSVariable *befehl = parameter->z( 0 );
     if( !befehl )
         return;
-    Text * b = befehl->getText();
+    Text *b = befehl->getText();
     if( !b )
         return;
     if( b->istGleich( "GetBesitzStatus" ) )
@@ -141,7 +141,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -154,7 +154,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -171,7 +171,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                              "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                        "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                               new Text( "Ok" ), 0 );
             }
         }
@@ -190,7 +190,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -209,7 +209,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -227,7 +227,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -240,7 +240,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -254,7 +254,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -265,7 +265,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                              "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                        "Sie könnte eventuell nicht richtig funktionieren." ),
                                                               new Text( "Ok" ), 0 );
             }
             else
@@ -279,7 +279,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
                     else
                         p += 6;
                     Text nn = Text( pf->getText() ) + "/" + (const char *)( n->getText() + p );
-                    Bild * b = bilder->get( nn );
+                    Bild *b = bilder->get( nn );
                     if( b )
                     {
                         KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
@@ -289,7 +289,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
                         {
                             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                           new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
-                                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                           new Text( "Ok" ), 0 );
                             b->release();
                         }
@@ -302,7 +302,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
                 {
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                   new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                                  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                            "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                   new Text( "Ok" ), 0 );
                 }
             }
@@ -316,7 +316,7 @@ void KESSVorschauKarteScript::ksgsAktion( RCArray< KSGSVariable > * parameter, K
     }
 }
 
-void KESSVorschauKarteScript::doPublicMausEreignis( MausEreignis & me )
+void KESSVorschauKarteScript::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -326,7 +326,7 @@ void KESSVorschauKarteScript::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void KESSVorschauKarteScript::doTastaturEreignis( TastaturEreignis & te )
+void KESSVorschauKarteScript::doTastaturEreignis( TastaturEreignis &te )
 {
     if( fenster )
         fenster->doTastaturEreignis( te );
@@ -343,7 +343,7 @@ bool KESSVorschauKarteScript::tick( double zeit )
             alpha -= (unsigned char)( zeit * 150 );
         rend = 1;
     }
-    if( sichtbar &&alpha < 255 )
+    if( sichtbar && alpha < 255 )
     {
         if( alpha + zeit * 150 > 255 )
             alpha = 255;
@@ -354,7 +354,7 @@ bool KESSVorschauKarteScript::tick( double zeit )
     return rend;
 }
 
-void KESSVorschauKarteScript::render( Bild & zRObj )
+void KESSVorschauKarteScript::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
         return;
@@ -369,13 +369,13 @@ void KESSVorschauKarteScript::render( Bild & zRObj )
 
 // Inhalt der KESSVorschauKarte Klasse aus KESSVorschau.h
 // Konstruktor
-KESSVorschauKarte::KESSVorschauKarte( Schrift * schrift )
+KESSVorschauKarte::KESSVorschauKarte()
+    : ReferenceCounter()
 {
-    auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
+    auswählen = initKnopf( 173, 73, 22, 22, 0, "" );
     auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     auswählen->setHintergrundBildZ( bilder->get( "data/client/bilder/shop.ltdb/weiter.png" ) );
-    initToolTip( auswählen, "Karte auswählen.", schrift, hauptScreen );
-    schrift->release();
+    initToolTip( auswählen, "Karte auswählen." );
     auswählen->setRahmenBreite( 1 );
     hintergrund = 0;
     ausgewählt = new AlphaFeld();
@@ -389,7 +389,6 @@ KESSVorschauKarte::KESSVorschauKarte( Schrift * schrift )
     ram->setFarbe( 0xFFFFFFFF );
     ausw = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -413,11 +412,11 @@ void KESSVorschauKarte::ladeKarte( char *pfad )
     datei->release();
 }
 
-bool KESSVorschauKarte::doPublicMausEreignis( MausEreignis & me )
+bool KESSVorschauKarte::doPublicMausEreignis( MausEreignis &me )
 {
     bool vera = me.verarbeitet;
     auswählen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         ausw = 1;
         return 1;
@@ -453,7 +452,7 @@ bool KESSVorschauKarte::tick( double zeit )
     return ret;
 }
 
-void KESSVorschauKarte::render( Bild & zRObj )
+void KESSVorschauKarte::render( Bild &zRObj )
 {
     ram->render( zRObj );
     if( !zRObj.setDrawOptions( ram->getX(), ram->getY(), 200, 100 ) )
@@ -465,43 +464,27 @@ void KESSVorschauKarte::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// Reference Counting
-KESSVorschauKarte * KESSVorschauKarte::getThis()
-{
-    ref++;
-    return this;
-}
-
-KESSVorschauKarte *KESSVorschauKarte::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der KESSVorschau Klasse aus KESSVorschau.h
 // Konstruktor
-KESSVorschau::KESSVorschau( Schrift * zSchrift )
+KESSVorschau::KESSVorschau()
     : Zeichnung()
 {
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
-    log = initTextFeld( 10, 400, 860, 90, zSchrift, TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt, "Log:\n" );
-    script = new KESSVorschauKarteScript( zSchrift, log );
-    karte = new KESSVorschauKarte( zSchrift->getThis() );
-    beenden = initKnopf( 10, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Zurück" );
-    besitztTestVersion = initAuswahlBox( 10, 120, 200, 20, zSchrift, ABSTYLE, { "Besitzt Testversion nicht", "Besitzt Testversion" } );
-    spieleVerbleibend = initTextFeld( 110, 150, 100, 20, zSchrift, TextFeld::Style::TextFeld, "0" );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
+    log = initTextFeld( 10, 400, 860, 90, TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt, "Log:\n" );
+    script = new KESSVorschauKarteScript( log );
+    karte = new KESSVorschauKarte();
+    beenden = initKnopf( 10, 500, 100, 20, Knopf::Style::Sichtbar, "Zurück" );
+    besitztTestVersion = initAuswahlBox( 10, 120, 200, 20, ABSTYLE, { "Besitzt Testversion nicht", "Besitzt Testversion" } );
+    spieleVerbleibend = initTextFeld( 110, 150, 100, 20, TextFeld::Style::TextFeld, "0" );
     spieleVerbleibend->setTastaturEreignis( _nurNummernTE );
-    vvErwerbbar = initAuswahlBox( 10, 180, 200, 20, zSchrift, ABSTYLE, { "Vollversion erwerbbar", "Vollversion nicht erwerbbar" } );
-    tvErwerbbar = initAuswahlBox( 10, 210, 200, 20, zSchrift, ABSTYLE, { "Testversion erwerbbar", "Testversion nicht erwerbbar" } );
-    vvPreis = initTextFeld( 110, 240, 100, 20, zSchrift, TextFeld::Style::TextFeld, "0" );
+    vvErwerbbar = initAuswahlBox( 10, 180, 200, 20, ABSTYLE, { "Vollversion erwerbbar", "Vollversion nicht erwerbbar" } );
+    tvErwerbbar = initAuswahlBox( 10, 210, 200, 20, ABSTYLE, { "Testversion erwerbbar", "Testversion nicht erwerbbar" } );
+    vvPreis = initTextFeld( 110, 240, 100, 20, TextFeld::Style::TextFeld, "0" );
     vvPreis->setTastaturEreignis( _nurNummernTE );
-    tvPreis = initTextFeld( 110, 270, 100, 20, zSchrift, TextFeld::Style::TextFeld, "0" );
+    tvPreis = initTextFeld( 110, 270, 100, 20, TextFeld::Style::TextFeld, "0" );
     tvPreis->setTastaturEreignis( _nurNummernTE );
-    kupfer = initTextFeld( 110, 300, 100, 20, zSchrift, TextFeld::Style::TextFeld, "0" );
+    kupfer = initTextFeld( 110, 300, 100, 20, TextFeld::Style::TextFeld, "0" );
     pfad = "";
     alpha = 0;
     sichtbar = 0;
@@ -513,7 +496,6 @@ KESSVorschau::KESSVorschau( Schrift * zSchrift )
 // Destruktor
 KESSVorschau::~KESSVorschau()
 {
-    schrift->release();
     tr->release();
     script->release();
     karte->release();
@@ -547,7 +529,7 @@ void KESSVorschau::setSichtbar( bool sicht )
     sichtbar = sicht;
 }
 
-void KESSVorschau::doPublicMausEreignis( MausEreignis & me )
+void KESSVorschau::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
@@ -578,7 +560,7 @@ void KESSVorschau::doPublicMausEreignis( MausEreignis & me )
         script->ladeKarteSeite( pfad );
     bool vera = me.verarbeitet;
     beenden->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
         aktion = 1;
     vvPreis->doPublicMausEreignis( me );
     tvPreis->doPublicMausEreignis( me );
@@ -587,21 +569,21 @@ void KESSVorschau::doPublicMausEreignis( MausEreignis & me )
     log->doPublicMausEreignis( me );
     if( paramUpdate )
     {
-        script->setScriptParams( besitztTestVersion->getAuswahl() == 1, (int)* spieleVerbleibend->zText(), vvErwerbbar->getAuswahl() == 0,
-                                 tvErwerbbar->getAuswahl() == 0, (int)* vvPreis->zText(), (int)* tvPreis->zText(), (int)* kupfer->zText() );
+        script->setScriptParams( besitztTestVersion->getAuswahl() == 1, (int)*spieleVerbleibend->zText(), vvErwerbbar->getAuswahl() == 0,
+                                 tvErwerbbar->getAuswahl() == 0, (int)*vvPreis->zText(), (int)*tvPreis->zText(), (int)*kupfer->zText() );
     }
 }
 
-void KESSVorschau::doTastaturEreignis( TastaturEreignis & te )
+void KESSVorschau::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar )
         return;
-    if( !te.verarbeitet &&te.id == TE_Release && te.taste == T_Enter )
+    if( !te.verarbeitet && te.id == TE_Release && te.taste == T_Enter )
     {
         if( spieleVerbleibend->hatStyle( TextFeld::Style::Fokus ) || vvPreis->hatStyle( TextFeld::Style::Fokus ) || tvPreis->hatStyle( TextFeld::Style::Fokus ) || kupfer->hatStyle( TextFeld::Style::Fokus ) )
         {
-            script->setScriptParams( besitztTestVersion->getAuswahl() == 1, (int)* spieleVerbleibend->zText(), vvErwerbbar->getAuswahl() == 0,
-                                     tvErwerbbar->getAuswahl() == 0, (int)* vvPreis->zText(), (int)* tvPreis->zText(), (int)* kupfer->zText() );
+            script->setScriptParams( besitztTestVersion->getAuswahl() == 1, (int)*spieleVerbleibend->zText(), vvErwerbbar->getAuswahl() == 0,
+                                     tvErwerbbar->getAuswahl() == 0, (int)*vvPreis->zText(), (int)*tvPreis->zText(), (int)*kupfer->zText() );
         }
     }
     script->doTastaturEreignis( te );
@@ -649,7 +631,7 @@ bool KESSVorschau::tick( double zeit )
     return ret;
 }
 
-void KESSVorschau::render( Bild & zRObj )
+void KESSVorschau::render( Bild &zRObj )
 {
     zRObj.setAlpha( alpha );
     script->render( zRObj );

+ 4 - 9
KSGClient/NachLogin/Editor/Karte/ShopSeite/KESSVorschau.h

@@ -31,7 +31,7 @@ private:
 
 public:
     // Konstruktor
-    KESSVorschauKarteScript( Schrift *zSchrift, TextFeld *zLog );
+    KESSVorschauKarteScript( TextFeld *zLog );
     // Destruktor
     ~KESSVorschauKarteScript();
     // nicht constant
@@ -45,7 +45,7 @@ public:
     void render( Bild &zRObj );
 };
 
-class KESSVorschauKarte
+class KESSVorschauKarte : public virtual ReferenceCounter
 {
 private:
     Knopf *auswählen;
@@ -54,11 +54,10 @@ private:
     LRahmen *ram;
     bool ausw;
     bool rend;
-    int ref;
 
 public:
     // Konstruktor
-    KESSVorschauKarte( Schrift *schrift );
+    KESSVorschauKarte();
     // Destruktor
     ~KESSVorschauKarte();
     // nicht constant
@@ -66,15 +65,11 @@ public:
     bool doPublicMausEreignis( MausEreignis &me );
     bool tick( double zeit );
     void render( Bild &zRObj );
-    // Reference Counting
-    KESSVorschauKarte *getThis();
-    KESSVorschauKarte *release();
 };
 
 class KESSVorschau : public Zeichnung
 {
 private:
-    Schrift *schrift;
     TextRenderer *tr;
     KESSVorschauKarteScript *script;
     KESSVorschauKarte *karte;
@@ -96,7 +91,7 @@ private:
 
 public:
     // Konstruktor
-    KESSVorschau( Schrift *zSchrift );
+    KESSVorschau();
     // Destruktor
     ~KESSVorschau();
     // nicht constant

+ 8 - 22
KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.cpp

@@ -7,23 +7,22 @@
 
 // Inhalt der KEShopSeite Klasse aus KEShopSeite.h
 // Konstruktor
-KEShopSeite::KEShopSeite( int karte, Schrift *zSchrift )
+KEShopSeite::KEShopSeite( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Shop Seite";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    editor = new KESSEditor( zSchrift );
-    vorschau = new KESSVorschau( zSchrift );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    editor = new KESSEditor();
+    vorschau = new KESSVorschau();
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
-    fenster->addMember( editor->getThis() );
-    fenster->addMember( vorschau->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( editor->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( vorschau->getThis() ) );
     animation = 0;
     tickVal = 0;
     sichtbar = 0;
@@ -43,7 +42,6 @@ KEShopSeite::~KEShopSeite()
     editor->release();
     vorschau->release();
     laden->release();
-    schrift->release();
 }
 
 // nicht constant
@@ -135,7 +133,7 @@ void KEShopSeite::thread()
         }
         else
         {
-            if( !editorClient->ssOrdnerÖffnen(zName->getText() ) )
+            if( !editorClient->ssOrdnerÖffnen( zName->getText() ) )
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( editorClient->getLetzterFehler() ), new Text( "Ok" ) );
                 break;
@@ -406,16 +404,4 @@ void KEShopSeite::render( Bild &zRObj )
 bool KEShopSeite::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KEShopSeite::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 4
KSGClient/NachLogin/Editor/Karte/ShopSeite/KEShopSeite.h

@@ -14,7 +14,6 @@ class KEShopSeite : public Thread
 private:
     Fenster *fenster;
     Animation2D *laden;
-    Schrift *schrift;
     KESSEditor *editor;
     KESSVorschau *vorschau;
     int aktion;
@@ -30,7 +29,7 @@ private:
 
 public:
     // Konstruktor
-    KEShopSeite( int karte, Schrift *zSchrift );
+    KEShopSeite( int karte );
     // Destruktor
     ~KEShopSeite();
     // nicht constant
@@ -42,8 +41,6 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 #endif

+ 37 - 51
KSGClient/NachLogin/Editor/Karte/Teams/KETeams.cpp

@@ -5,88 +5,87 @@
 bool KETNachME( void *p, void *obj, MausEreignis me )
 {
     if( p )
-        ( (KETeams*)p )->nachME( obj, me );
+        ( (KETeams *)p )->nachME( obj, me );
     return 1;
 }
 
 bool KETNachTE( void *p, void *obj, TastaturEreignis te )
 {
     if( p )
-        ( (KETeams*)p )->nachTE( obj, te );
+        ( (KETeams *)p )->nachTE( obj, te );
     return 1;
 }
 
 // Inhalt der KETeams Klasse aus KETeams.h
 // Konstruktor
-KETeams::KETeams( int karte, Schrift *zSchrift )
+KETeams::KETeams( int karte )
     : Thread()
 {
-    schrift = zSchrift->getThis();
     Text *kName = infoClient->getKarteName( karte );
     Text titel = kName ? kName->getText() : "<Karte>";
     titel += " - Teams";
     if( kName )
         kName->release();
-    fenster = initFenster( 10, 40, 880, 550, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
-    teams = initAuswahlListe( 10, 10, 265, 510, zSchrift, AuswahlListe::Style::Normal, {} );
+    fenster = initFenster( 10, 40, 880, 550, Fenster::Style::Sichtbar | Fenster::Style::Titel | Fenster::Style::TitelBuffered | Fenster::Style::Erlaubt | Fenster::Style::Rahmen, titel );
+    teams = initAuswahlListe( 10, 10, 265, 510, AuswahlListe::Style::Normal, {} );
     teams->setNMausEreignisParameter( this );
     teams->setNMausEreignis( KETNachME );
-    tName = initTextFeld( 285, 10, 150, 20, zSchrift, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Team Name" );
-    initToolTip( tName, "Name des Teams ändern", zSchrift, hauptScreen );
+    tName = initTextFeld( 285, 10, 150, 20, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Team Name" );
+    initToolTip( tName, "Name des Teams ändern" );
     tName->setNTastaturEreignisParameter( this );
     tName->setNTastaturEreignis( KETNachTE );
-    tFarbe = initTextFeld( 285, 40, 150, 20, zSchrift, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Team Farbe" );
-    initToolTip( tFarbe, "Farbe des Teams ändern", zSchrift, hauptScreen );
+    tFarbe = initTextFeld( 285, 40, 150, 20, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Team Farbe" );
+    initToolTip( tFarbe, "Farbe des Teams ändern" );
     tFarbe->setTastaturEreignis( _nurHexTE );
     tFarbe->setNTastaturEreignisParameter( this );
     tFarbe->setNTastaturEreignis( KETNachTE );
     tFarbeV = initZeichnungHintergrund( 285, 70, 150, 20, ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Hintergrund, 0 );
-    tNeu = initKnopf( 285, 100, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Neues Team" );
+    tNeu = initKnopf( 285, 100, 150, 20, Knopf::Style::Sichtbar, "Neues Team" );
     tNeu->setNMausEreignisParameter( this );
     tNeu->setNMausEreignis( KETNachME );
-    tLöschen = initKnopf( 285, 130, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Team remove" );
+    tLöschen = initKnopf( 285, 130, 150, 20, Knopf::Style::Sichtbar, "Team remove" );
     tLöschen->removeStyle( Knopf::Style::Erlaubt );
     tLöschen->setNMausEreignisParameter( this );
     tLöschen->setNMausEreignis( KETNachME );
-    spieler = initAuswahlListe( 445, 10, 265, 510, zSchrift, AuswahlListe::Style::Normal & ~AuswahlListe::Style::Erlaubt, {} );
+    spieler = initAuswahlListe( 445, 10, 265, 510, AuswahlListe::Style::Normal & ~AuswahlListe::Style::Erlaubt, {} );
     spieler->setNMausEreignisParameter( this );
     spieler->setNMausEreignis( KETNachME );
-    sFarbe = initTextFeld( 720, 10, 150, 20, zSchrift, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Spieler Farbe" );
-    initToolTip( sFarbe, "Farbe des Spielers ändern", zSchrift, hauptScreen );
+    sFarbe = initTextFeld( 720, 10, 150, 20, TextFeld::Style::TextFeld & ~TextFeld::Style::Erlaubt, "Spieler Farbe" );
+    initToolTip( sFarbe, "Farbe des Spielers ändern" );
     sFarbe->setTastaturEreignis( _nurHexTE );
     sFarbe->setNTastaturEreignisParameter( this );
     sFarbe->setNTastaturEreignis( KETNachTE );
     sFarbeV = initZeichnungHintergrund( 720, 40, 150, 20, ZeichnungHintergrund::Style::Sichtbar | ZeichnungHintergrund::Style::Hintergrund, 0 );
-    sNeu = initKnopf( 720, 70, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Neuer Spieler" );
+    sNeu = initKnopf( 720, 70, 150, 20, Knopf::Style::Sichtbar, "Neuer Spieler" );
     sNeu->removeStyle( Knopf::Style::Erlaubt );
     sNeu->setNMausEreignisParameter( this );
     sNeu->setNMausEreignis( KETNachME );
-    sLöschen = initKnopf( 720, 100, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Spieler remove" );
+    sLöschen = initKnopf( 720, 100, 150, 20, Knopf::Style::Sichtbar, "Spieler remove" );
     sLöschen->removeStyle( Knopf::Style::Erlaubt );
     sLöschen->setNMausEreignisParameter( this );
     sLöschen->setNMausEreignis( KETNachME );
-    abbrechen = initKnopf( 720, 470, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrechen" );
-    initToolTip( abbrechen, "Verwirft alle änderungen an den Team Einstellungen", zSchrift, hauptScreen );
+    abbrechen = initKnopf( 720, 470, 150, 20, Knopf::Style::Sichtbar, "Abbrechen" );
+    initToolTip( abbrechen, "Verwirft alle änderungen an den Team Einstellungen" );
     abbrechen->setNMausEreignisParameter( this );
     abbrechen->setNMausEreignis( KETNachME );
-    speichern = initKnopf( 720, 500, 150, 20, zSchrift, Knopf::Style::Sichtbar, "Speichern" );
-    initToolTip( speichern, "Speichert alle Änderungen an den Team Einstellungen", zSchrift, hauptScreen );
+    speichern = initKnopf( 720, 500, 150, 20, Knopf::Style::Sichtbar, "Speichern" );
+    initToolTip( speichern, "Speichert alle Änderungen an den Team Einstellungen" );
     speichern->setNMausEreignisParameter( this );
     speichern->setNMausEreignis( KETNachME );
-    fenster->addMember( teams->getThis() );
-    fenster->addMember( tName->getThis() );
-    fenster->addMember( tFarbe->getThis() );
-    fenster->addMember( tFarbeV->getThis() );
-    fenster->addMember( tNeu->getThis() );
-    fenster->addMember( tLöschen->getThis() );
-    fenster->addMember( spieler->getThis() );
-    fenster->addMember( sFarbe->getThis() );
-    fenster->addMember( sFarbeV->getThis() );
-    fenster->addMember( sNeu->getThis() );
-    fenster->addMember( sLöschen->getThis() );
-    fenster->addMember( abbrechen->getThis() );
-    fenster->addMember( speichern->getThis() );
-    laden = (Animation2D*)ladeAnimation->dublizieren();
+    fenster->addMember( dynamic_cast<Zeichnung *>( teams->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( tName->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( tFarbe->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( tFarbeV->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( tNeu->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( tLöschen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( spieler->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( sFarbe->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( sFarbeV->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( sNeu->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( sLöschen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( abbrechen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( speichern->getThis() ) );
+    laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 425, 275 );
     laden->setSichtbar( 0 );
     sts = new SpielerTeamStruktur();
@@ -106,7 +105,6 @@ KETeams::~KETeams()
 {
     fenster->release();
     laden->release();
-    schrift->release();
     teams->release();
     tName->release();
     tFarbe->release();
@@ -128,7 +126,7 @@ void KETeams::updateGUI()
 {
     Text *teamAusw = teams->zEintrag( teams->getAuswahl() ) ? teams->zEintrag( teams->getAuswahl() )->getText() : 0;
     Text *spielerAusw = spieler->zEintrag( spieler->getAuswahl() ) ? spieler->zEintrag( spieler->getAuswahl() )->getText() : 0;
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     teams->deSelect();
     spieler->deSelect();
     while( teams->getEintragAnzahl() )
@@ -172,7 +170,7 @@ void KETeams::updateGUI()
     sts->spielerAnzahl = 0;
     for( int i = 0; i < sts->teamAnzahl; i++ )
         sts->spielerAnzahl += sts->teamSize->get( i );
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
     bool sAusw = spieler->zEintrag( spieler->getAuswahl() ) != 0;
     tName->setStyle( TextFeld::Style::Erlaubt, tausw );
     tFarbe->setStyle( TextFeld::Style::Erlaubt, tausw );
@@ -222,7 +220,7 @@ void KETeams::nachME( void *obj, MausEreignis &me )
                 }
             }
         }
-        sts->teamName->set( new Text( (char*)tn ), sts->teamAnzahl );
+        sts->teamName->set( new Text( (char *)tn ), sts->teamAnzahl );
         sts->teamAnzahl++;
         updateGUI();
     }
@@ -453,16 +451,4 @@ void KETeams::render( Bild &zRObj )
 bool KETeams::istSichtbar() const
 {
     return sichtbar || animation;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KETeams::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 1 - 4
KSGClient/NachLogin/Editor/Karte/Teams/KETeams.h

@@ -14,7 +14,6 @@ class KETeams : public Thread
 private:
     Fenster *fenster;
     Animation2D *laden;
-    Schrift *schrift;
     AuswahlListe *teams;
     TextFeld *tName;
     TextFeld *tFarbe;
@@ -44,7 +43,7 @@ private:
 
 public:
     // Konstruktor
-    KETeams( int karte, Schrift *zSchrift );
+    KETeams( int karte );
     // Destruktor
     ~KETeams();
     // nicht constant
@@ -58,6 +57,4 @@ public:
     void render( Bild &zRObj );
     // constant
     bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };

+ 27 - 42
KSGClient/NachLogin/Einstellungen/Einstellungen.cpp

@@ -7,9 +7,10 @@
 
 // Inhalt der Einstellungen Klasse aus Einstellungen.h
 // Konstruktor
-Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
+Einstellungen::Einstellungen( Fenster *zF )
+    : ReferenceCounter()
 {
-    f = initFenster( zF->getBreite() / 2 - 250, zF->getHeight() / 2 - 250, 500, 500, zSchrift,
+    f = initFenster( zF->getBreite() / 2 - 250, zF->getHeight() / 2 - 250, 500, 500,
                      Fenster::Style::normal | Fenster::Style::BodyHAlpha | Fenster::Style::BodyHintergrund |
                      Fenster::Style::TitelHintergrund | Fenster::Style::TitelHAlpha, "Einstellungen" );
     f->removeStyle( Fenster::Style::Sichtbar );
@@ -18,9 +19,9 @@ Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
     f->setSBgFarbe( 0xF0000000 );
     f->setClosingMeParam( this );
     f->setClosingMe( einstellungenSchließenME );
-    TextFeld *gat = initTextFeld( 5, 5, 300, 20, zSchrift, TextFeld::Style::Text, "Grafik Engine (Neustart erforderlich)" );
+    TextFeld *gat = initTextFeld( 5, 5, 300, 20, TextFeld::Style::Text, "Grafik Engine (Neustart erforderlich)" );
     f->addMember( gat );
-    AuswahlBox *graphicAPI = initAuswahlBox( 5, 25, 100, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Aktuellste", "DirectX 9" } );
+    AuswahlBox *graphicAPI = initAuswahlBox( 5, 25, 100, 20, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, { "Aktuellste", "DirectX 9" } );
     if( DirectX11::isAvailable() )
         graphicAPI->addEintrag( "DirectX 11" );
     if( DirectX12::isAvailable() )
@@ -32,7 +33,7 @@ Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
         graphicAPI->setAuswahl( 2 );
     if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX12" ) )
         graphicAPI->setAuswahl( 3 );
-    graphicAPI->setEventAktion( [ this ]( void *p, AuswahlBox * b, int unused, int auswahl )
+    graphicAPI->setEventAktion( [this]( void *p, AuswahlBox *b, int unused, int auswahl )
     {
         userOptions->addWert( "GraphicAPI", "BEST" );
         switch( auswahl )
@@ -51,19 +52,19 @@ Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
             break;
         }
     } );
-    TextFeld *mft = initTextFeld( 5, 50, 200, 20, zSchrift, TextFeld::Style::Text, "Maximale FPS" );
+    TextFeld *mft = initTextFeld( 5, 50, 200, 20, TextFeld::Style::Text, "Maximale FPS" );
     f->addMember( mft );
-    maxFPS = initTextFeld( 5, 70, 50, 20, zSchrift, TextFeld::Style::TextFeld, userOptions->wertExistiert( "MaxFPS" ) ? userOptions->zWert( "MaxFPS" )->getText() : "30" );
+    maxFPS = initTextFeld( 5, 70, 50, 20, TextFeld::Style::TextFeld, userOptions->wertExistiert( "MaxFPS" ) ? userOptions->zWert( "MaxFPS" )->getText() : "30" );
     maxFPS->setTastaturEreignis( _nurNummernTE );
-    f->addMember( maxFPS->getThis() );
-    TextFeld * gst = initTextFeld( 5, 95, 200, 20, zSchrift, TextFeld::Style::Text, "GUI Lautstärke (0 bis 100)" );
+    f->addMember( dynamic_cast<Zeichnung *>( maxFPS->getThis() ) );
+    TextFeld *gst = initTextFeld( 5, 95, 200, 20, TextFeld::Style::Text, "GUI Lautstärke (0 bis 100)" );
     f->addMember( gst );
-    guiSound = initTextFeld( 5, 115, 50, 20, zSchrift, TextFeld::Style::TextFeld, userOptions->wertExistiert( "GUISound" ) ? userOptions->zWert( "GUISound" )->getText() : "100" );
+    guiSound = initTextFeld( 5, 115, 50, 20, TextFeld::Style::TextFeld, userOptions->wertExistiert( "GUISound" ) ? userOptions->zWert( "GUISound" )->getText() : "100" );
     guiSound->setTastaturEreignis( _nurNummernTE );
-    f->addMember( guiSound->getThis() );
-    TextFeld * mt = initTextFeld( 255, 5, 200, 20, zSchrift, TextFeld::Style::Text, "Monitor (Neustart erforderlich)" );
+    f->addMember( dynamic_cast<Zeichnung *>( guiSound->getThis() ) );
+    TextFeld *mt = initTextFeld( 255, 5, 200, 20, TextFeld::Style::Text, "Monitor (Neustart erforderlich)" );
     f->addMember( mt );
-    AuswahlBox * monitorAuswahl = initAuswahlBox( 255, 25, 200, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, {} );
+    AuswahlBox *monitorAuswahl = initAuswahlBox( 255, 25, 200, 20, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, {} );
     Monitor m = getMonitor( 0 );
     int index = 0;
     do
@@ -73,7 +74,7 @@ Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
     } while( m.existiert );
     if( userOptions->wertExistiert( "Monitor" ) )
         monitorAuswahl->setAuswahl( *userOptions->zWert( "Monitor" ) );
-    monitorAuswahl->setEventAktion( [ this ]( void *p, AuswahlBox * b, int unused, int auswahl )
+    monitorAuswahl->setEventAktion( [this]( void *p, AuswahlBox *b, int unused, int auswahl )
     {
         if( !userOptions->wertExistiert( "Monitor" ) )
             userOptions->addWert( "Monitor", Text( auswahl ) );
@@ -91,28 +92,27 @@ Einstellungen::Einstellungen( Schrift *zSchrift, Fenster *zF )
         breite->setText( Text( m.breite ) );
         height->setText( Text( m.height ) );
     } );
-    TextFeld *at = initTextFeld( 255, 50, 200, 20, zSchrift, TextFeld::Style::Text, "Auflösung (Neustart erforderlich)" );
+    TextFeld *at = initTextFeld( 255, 50, 200, 20, TextFeld::Style::Text, "Auflösung (Neustart erforderlich)" );
     f->addMember( at );
-    breite = initTextFeld( 255, 70, 50, 20, zSchrift, TextFeld::Style::TextFeld, userOptions->wertExistiert( "ScreenWidth" ) ? userOptions->zWert( "ScreenWidth" )->getText() : 
+    breite = initTextFeld( 255, 70, 50, 20, TextFeld::Style::TextFeld, userOptions->wertExistiert( "ScreenWidth" ) ? userOptions->zWert( "ScreenWidth" )->getText() :
                            Text( getMonitor( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 ).breite ) );
-    height = initTextFeld( 312, 70, 50, 20, zSchrift, TextFeld::Style::TextFeld, userOptions->wertExistiert( "ScreenHeight" ) ? userOptions->zWert( "ScreenHeight" )->getText() :
+    height = initTextFeld( 312, 70, 50, 20, TextFeld::Style::TextFeld, userOptions->wertExistiert( "ScreenHeight" ) ? userOptions->zWert( "ScreenHeight" )->getText() :
                            Text( getMonitor( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 ).height ) );
     breite->setTastaturEreignis( _nurNummernTE );
     height->setTastaturEreignis( _nurNummernTE );
-    f->addMember( breite->getThis() );
-    f->addMember( initTextFeld( 305, 70, 5, 20, zSchrift, TextFeld::Style::Text, "x" ) );
-    f->addMember( height->getThis() );
-    ok = initKnopf( 390, 450, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Ok" );
+    f->addMember( dynamic_cast<Zeichnung *>( breite->getThis() ) );
+    f->addMember( initTextFeld( 305, 70, 5, 20, TextFeld::Style::Text, "x" ) );
+    f->addMember( dynamic_cast<Zeichnung *>( height->getThis() ) );
+    ok = initKnopf( 390, 450, 100, 20, Knopf::Style::Sichtbar, "Ok" );
     ok->setMausEreignisParameter( this );
     ok->setMausEreignis( einstellungenOkME );
-    f->addMember( ok->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( ok->getThis() ) );
 
     // add AuswahlBoxen
     f->addMember( graphicAPI );
     f->addMember( monitorAuswahl );
 
-    zF->addMember( f->getThis() );
-    ref = 1;
+    zF->addMember( dynamic_cast<Zeichnung *>( f->getThis() ) );
 }
 
 // Destruktor
@@ -139,7 +139,7 @@ bool Einstellungen::closeME( MausEreignis &me )
     return 1;
 }
 
-bool Einstellungen::okME( MausEreignis & me )
+bool Einstellungen::okME( MausEreignis &me )
 {
     if( me.id == ME_RLinks )
     {
@@ -150,7 +150,7 @@ bool Einstellungen::okME( MausEreignis & me )
         if( fps > 0 && sound >= 0 && sound <= 100 && wi > 0 && hi > 0 )
         {
             f->removeStyle( Fenster::Style::Sichtbar );
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( !userOptions->wertExistiert( "MaxFPS" ) )
                 userOptions->addWert( "MaxFPS", maxFPS->zText()->getText() );
             else
@@ -167,28 +167,13 @@ bool Einstellungen::okME( MausEreignis & me )
                 userOptions->addWert( "ScreenHeight", Text( hi ) );
             else
                 userOptions->setWert( "ScreenHeight", Text( hi ) );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             userOptions->speichern();
         }
     }
     return 1;
 }
 
-// Reference Counting
-Einstellungen *Einstellungen::getThis()
-{
-    ref++;
-    return this;
-}
-
-Einstellungen *Einstellungen::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Ereignisse
 bool einstellungenSchließenME( void *p, void *obj, MausEreignis me )

+ 11 - 15
KSGClient/NachLogin/Einstellungen/Einstellungen.h

@@ -6,29 +6,25 @@
 
 using namespace Framework;
 
-class Einstellungen
+class Einstellungen : public virtual ReferenceCounter
 {
 private:
-	Fenster *f;
-	Knopf *ok;
+    Fenster *f;
+    Knopf *ok;
     TextFeld *maxFPS;
     TextFeld *guiSound;
     TextFeld *breite;
     TextFeld *height;
-	int ref;
 
 public:
-	// Konstruktor
-	Einstellungen( Schrift *zSchrift, Fenster *zF );
-	// Destruktor
-	~Einstellungen();
-	// nicht constant
-	void setSichtbar();
-	bool closeME( MausEreignis &me );
-	bool okME( MausEreignis &me );
-	// Reference Counting
-	Einstellungen *getThis();
-	Einstellungen *release();
+    // Konstruktor
+    Einstellungen( Fenster *zF );
+    // Destruktor
+    ~Einstellungen();
+    // nicht constant
+    void setSichtbar();
+    bool closeME( MausEreignis &me );
+    bool okME( MausEreignis &me );
 };
 
 // Ereignisse

+ 150 - 149
KSGClient/NachLogin/ImSpiel/ImSpiel.cpp

@@ -5,146 +5,148 @@
 #include "..\..\Global\Variablen.h"
 #include <Globals.h>
 
-typedef SpielV* ( *DllStart )( void );
+typedef SpielV *( *DllStart )( void );
 
 // Inhalt der ImSpielObj Klasse aus ImSpiel.h
 // Konstruktor
-ImSpiel::ImSpiel( Schrift *zSchrift )
-	: Thread()
-{
-	sichtbar = 0;
-	ladenFenster = 0;
-	spielFenster = 0;
-	schrift = zSchrift->getThis();
-	ladenStatus = 0;
-	karteId = 0;
-	mainDll = 0;
-	dllName = 0;
-	rend = 0;
+ImSpiel::ImSpiel()
+    : Thread()
+{
+    sichtbar = 0;
+    ladenFenster = 0;
+    spielFenster = 0;
+    ladenStatus = 0;
+    karteId = 0;
+    mainDll = 0;
+    dllName = 0;
+    rend = 0;
 }
 
 // Destruktor
 ImSpiel::~ImSpiel()
 {
-	if( sichtbar )
-		setSichtbar( 0 );
-	schrift->release();
+    if( sichtbar )
+        setSichtbar( 0 );
 }
 
 // nicht constant
 void ImSpiel::setSichtbar( bool sichtbar )
 {
-	if( sichtbar && !this->sichtbar )
-	{
-		ladenFenster = new SpielLaden( schrift );
-		spielFenster = 0;
-		ladenStatus = 0;
-		karteId = 0;
-		mainDll = 0;
-		dllName = new Text( "" );
-		this->sichtbar = 1;
-	}
-	else if( !sichtbar && this->sichtbar )
-	{
-		if( ladenFenster )
-			ladenFenster->release();
-		if( spielFenster )
-			spielFenster->release();
-		if( mainDll )
-			Framework::getDLLRegister()->releaseDLL( *dllName );
-		dllName->release();
-		this->sichtbar = 0;
-	}
+    if( sichtbar && !this->sichtbar )
+    {
+        ladenFenster = new SpielLaden();
+        spielFenster = 0;
+        ladenStatus = 0;
+        karteId = 0;
+        mainDll = 0;
+        dllName = new Text( "" );
+        this->sichtbar = 1;
+    }
+    else if( !sichtbar && this->sichtbar )
+    {
+        if( ladenFenster )
+        {
+            ladenFenster->warteAufThread( 10000 );
+            dynamic_cast<Thread *>( ladenFenster )->ende();
+            ladenFenster->release();
+        }
+        if( spielFenster )
+            spielFenster->release();
+        if( mainDll )
+            Framework::getDLLRegister()->releaseDLL( *dllName );
+        dllName->release();
+        this->sichtbar = 0;
+    }
 }
 void ImSpiel::beginnLaden( int karteId, SpielerTeamStruktur *sts )
 {
-	if( !sichtbar )
-		return;
-	ladenFenster->setSpielerTeamStruktur( sts );
-	ladenFenster->setKarte( karteId );
-	ladenFenster->setSichtbar( 1 );
-	this->karteId = karteId;
-	spielClient->bereitZumLaden();
-	rend = 1;
-	start();
+    if( !sichtbar )
+        return;
+    ladenFenster->setSpielerTeamStruktur( sts );
+    ladenFenster->setKarte( karteId );
+    ladenFenster->setSichtbar( 1 );
+    this->karteId = karteId;
+    spielClient->bereitZumLaden();
+    rend = 1;
+    start();
 }
 
 void ImSpiel::lBAddSpieler( int accountId, int spielerNummer )
 {
-	if( !sichtbar )
-		return;
-	ladenFenster->addSpieler( accountId, spielerNummer );
-	rend = 1;
+    if( !sichtbar )
+        return;
+    ladenFenster->addSpieler( accountId, spielerNummer );
+    rend = 1;
 }
 
 void ImSpiel::lBSetSpielerProzent( int accountId, int prozent )
 {
-	if( !sichtbar )
-		return;
-	ladenFenster->setSpielerFortschritt( accountId, prozent );
-	rend = 1;
+    if( !sichtbar )
+        return;
+    ladenFenster->setSpielerFortschritt( accountId, prozent );
+    rend = 1;
 }
 
 void ImSpiel::lBSetSpielerPing( int accountId, int ping )
 {
-	if( !sichtbar )
-		return;
-	ladenFenster->setSpielerPing( accountId, ping );
-	rend = 1;
+    if( !sichtbar )
+        return;
+    ladenFenster->setSpielerPing( accountId, ping );
+    rend = 1;
 }
 
 void ImSpiel::spielNachricht( int län, char *bytes )
 {
-	if( !sichtbar )
-		return;
-	if( ladenStatus > 1 )
-		spielFenster->nachricht( län, bytes );
+    if( !sichtbar )
+        return;
+    if( ladenStatus > 1 )
+        spielFenster->nachricht( län, bytes );
 }
 
 void ImSpiel::endLaden()
 {
-	if( !sichtbar )
-		return;
-	ladenFenster->setSichtbar( 0 );
+    if( !sichtbar )
+        return;
+    ladenFenster->setSichtbar( 0 );
 }
 
 void ImSpiel::thread()
 {
-	KartenLeser *reader = KartenLeser::getInstance();
+    KartenLeser *reader = KartenLeser::getInstance();
     reader->lock();
-	reader->setKarteId( karteId );
-	Text *pfad = reader->getSpielPfad();
-	pfad->append( "bin/" );
-	pfad->append( reader->getSpielName() );
-	pfad->append( ".dll" );
-	dllName->setText( "Spiele/" );
-	dllName->append( reader->getSpielName() );
+    reader->setKarteId( karteId );
+    Text *pfad = reader->getSpielPfad();
+    pfad->append( "bin/" );
+    pfad->append( reader->getSpielName() );
+    pfad->append( ".dll" );
+    dllName->setText( "Spiele/" );
+    dllName->append( reader->getSpielName() );
     reader->unlock();
-	reader->release();
-	dllName->append( ".dll" );
-	mainDll = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
-	if( !mainDll )
-	{
-		Text *nachricht = new Text( "Die Spiel DLL " );
-		nachricht->append( pfad->getText() );
-		nachricht->append( " konnte nicht geladen werden.\n" );
-		nachricht->append( "Wenn sie nicht existiert dann installiere das Spiel neu." );
-		WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
-		//------------------------------
-		exit( 0 );
-	}
-	pfad->release();
-	DllStart getSpielKlasse = (DllStart)GetProcAddress( mainDll, "getSpielKlasse" );
-	if( !getSpielKlasse )
-	{
-		Text *nachricht = new Text( "Die Spiel DLL " );
-		nachricht->append( pfad->getText() );
-		nachricht->append( " konnte nicht geladen werden.\n" );
-		nachricht->append( "Die Einstiegsfunktion getSpielKlasse() wurde nicht gefunden." );
-		WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
-		//------------------------------
-		exit( 0 );
-	}
+    reader->release();
+    dllName->append( ".dll" );
+    mainDll = Framework::getDLLRegister()->ladeDLL( *dllName, *pfad );
+    if( !mainDll )
+    {
+        Text *nachricht = new Text( "Die Spiel DLL " );
+        nachricht->append( pfad->getText() );
+        nachricht->append( " konnte nicht geladen werden.\n" );
+        nachricht->append( "Wenn sie nicht existiert dann installiere das Spiel neu." );
+        WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
+        //------------------------------
+        exit( 0 );
+    }
+    pfad->release();
+    DllStart getSpielKlasse = (DllStart)GetProcAddress( mainDll, "getSpielKlasse" );
+    if( !getSpielKlasse )
+    {
+        Text *nachricht = new Text( "Die Spiel DLL " );
+        nachricht->append( pfad->getText() );
+        nachricht->append( " konnte nicht geladen werden.\n" );
+        nachricht->append( "Die Einstiegsfunktion getSpielKlasse() wurde nicht gefunden." );
+        WMessageBox( 0, new Text( "Unerwarteter Fehler" ), nachricht, MB_ICONERROR );
+        //------------------------------
+        exit( 0 );
+    }
     int port = 0;
     Text ip;
     KSGClient::KartenServerClient *kartenClient = infoClient->createKartenServerClient( karteId );
@@ -155,80 +157,79 @@ void ImSpiel::thread()
     }
     if( kartenClient )
         kartenClient->release();
-	spielFenster = getSpielKlasse();
-	ladenStatus = 1;
-	spielFenster->setKarteId( karteId );
-	spielFenster->setKlients( infoClient->getThis(), spielClient->getThis() );
-	spielFenster->setBildschirm( hauptScreen );
-	spielFenster->setSchrift( schrift->getThis() );
-	spielFenster->ladeDaten();
-	ladenStatus = 2;
-	run = 0;
+    spielFenster = getSpielKlasse();
+    ladenStatus = 1;
+    spielFenster->setKarteId( karteId );
+    spielFenster->setKlients( dynamic_cast<KSGClient::InformationServerClient *>( infoClient->getThis() ), dynamic_cast<KSGClient::SpielServerClient *>( spielClient->getThis() ) );
+    spielFenster->setUIFactory( uiFactory );
+    spielFenster->ladeDaten();
+    ladenStatus = 2;
+    run = 0;
 }
 
 bool ImSpiel::tick( double tickVal )
 {
-	if( !sichtbar )
-		return 0;
-	if( ladenStatus < 3 ) // Vor dem Spiel
-		rend |= ladenFenster->tick( tickVal );
-	if( ladenStatus == 2 ) // Im spiel
-	{
-		rend |= spielFenster->tick( tickVal );
-		if( spielFenster->läuft() == 1 )
-		{
-			ladenStatus = 3;
-			rend = 1;
-		}
-	}
-	if( ladenStatus == 3 ) // Ende des Spiels
-	{
-		rend |= spielFenster->tick( tickVal );
-		if( !spielFenster->läuft() )
-		{
-			ladenStatus = 4;
-			aktion = 6; // Spiel Statistik laden (Render => new AktionsThread( 20, 0, 0, 0, 0, 0 ))
-			rend = 1;
-		}
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( !sichtbar )
+        return 0;
+    if( ladenStatus < 3 ) // Vor dem Spiel
+        rend |= ladenFenster->tick( tickVal );
+    if( ladenStatus == 2 ) // Im spiel
+    {
+        rend |= spielFenster->tick( tickVal );
+        if( spielFenster->läuft() == 1 )
+        {
+            ladenStatus = 3;
+            rend = 1;
+        }
+    }
+    if( ladenStatus == 3 ) // Ende des Spiels
+    {
+        rend |= spielFenster->tick( tickVal );
+        if( !spielFenster->läuft() )
+        {
+            ladenStatus = 4;
+            aktion = 6; // Spiel Statistik laden (Render => new AktionsThread( 20, 0, 0, 0, 0, 0 ))
+            rend = 1;
+        }
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void ImSpiel::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !sichtbar )
-		return;
-	if( ladenStatus > 1 )
-		spielFenster->doPublicMausEreignis( me );
+    if( !sichtbar )
+        return;
+    if( ladenStatus > 1 )
+        spielFenster->doPublicMausEreignis( me );
 }
 
 void ImSpiel::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( !sichtbar )
-		return;
-	if( ladenStatus > 1 )
-		spielFenster->doTastaturEreignis( te );
+    if( !sichtbar )
+        return;
+    if( ladenStatus > 1 )
+        spielFenster->doTastaturEreignis( te );
 }
 
 void ImSpiel::render( Bild &zRObj )
 {
-	if( !sichtbar )
-		return;
-	if( ladenStatus < 3 && ( !spielFenster || spielFenster->läuft() == 3 ) )
-		ladenFenster->render( zRObj );
-	if( ladenStatus == 3 || ladenStatus == 2 )
-		spielFenster->render( zRObj );
+    if( !sichtbar )
+        return;
+    if( ladenStatus < 3 && ( !spielFenster || spielFenster->läuft() == 3 ) )
+        ladenFenster->render( zRObj );
+    if( ladenStatus == 3 || ladenStatus == 2 )
+        spielFenster->render( zRObj );
 }
 
 // constant
 int ImSpiel::getKarteId() const
 {
-	return karteId;
+    return karteId;
 }
 
 bool ImSpiel::istSichtbar() const
 {
-	return sichtbar;
+    return sichtbar;
 }

+ 28 - 29
KSGClient/NachLogin/ImSpiel/ImSpiel.h

@@ -8,37 +8,36 @@
 class ImSpiel : public Thread
 {
 private:
-	SpielLaden *ladenFenster;
-	SpielV *spielFenster;
-	Schrift *schrift;
-	int ladenStatus;
-	int karteId;
-	HINSTANCE mainDll;
-	Text *dllName;
-	bool sichtbar;
-	bool rend;
+    SpielLaden *ladenFenster;
+    SpielV *spielFenster;
+    int ladenStatus;
+    int karteId;
+    HINSTANCE mainDll;
+    Text *dllName;
+    bool sichtbar;
+    bool rend;
 
 public:
-	// Konstruktor
-	ImSpiel( Schrift *zSchrift );
-	// Destruktor
-	~ImSpiel();
-	// nicht constant
-	void setSichtbar( bool sichtbar );
-	void beginnLaden( int karteId, SpielerTeamStruktur *sts );
-	void lBAddSpieler( int accountId, int spielerNummer );
-	void lBSetSpielerProzent( int accountId, int prozent );
-	void lBSetSpielerPing( int accountId, int ping );
-	void spielNachricht( int län, char *bytes );
-	void endLaden();
-	void thread() override;
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-	int getKarteId() const;
-	bool istSichtbar() const;
+    // Konstruktor
+    ImSpiel();
+    // Destruktor
+    ~ImSpiel();
+    // nicht constant
+    void setSichtbar( bool sichtbar );
+    void beginnLaden( int karteId, SpielerTeamStruktur *sts );
+    void lBAddSpieler( int accountId, int spielerNummer );
+    void lBSetSpielerProzent( int accountId, int prozent );
+    void lBSetSpielerPing( int accountId, int ping );
+    void spielNachricht( int län, char *bytes );
+    void endLaden();
+    void thread() override;
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
+    // constant
+    int getKarteId() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 384 - 427
KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.cpp

@@ -10,570 +10,527 @@
 
 // Inhalt der SpielLadenListeSpieler Klasse aus SpielLaden.h
 // Konstruktor
-SpielLadenListeSpieler::SpielLadenListeSpieler( int accountId, Schrift *zSchrift )
-{
-	rahmen = new LRahmen();
-	rahmen->setSize( 862, 22 );
-	rahmen->setRamenBreite( 1 );
-	rahmen->setFarbe( 0xFFFFFFFF );
-	this->accountId = accountId;
-	Text *n = infoClient->getSpielerName( accountId );
-	name = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
-	n->release();
-	team = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
-	ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
-	fortschritt = new FBalken();
-	fortschritt->setStyle( FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::L_R | FBalken::Style::FBild | FBalken::Style::Prozent | FBalken::Style::Sichtbar );
-	fortschritt->setSchriftZ( zSchrift->getThis() );
-	fortschritt->setSFarbe( 0xFFFFFFFF );
-	fortschritt->setSSize( 12 );
-	fortschritt->setPosition( 461, 1 );
-	fortschritt->setSize( 400, 20 );
-	fortschritt->reset();
-	fortschritt->setAktionAnzahl( 100 );
-	Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
-	Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
-	fortschritt->setHintergrundBildZ( fbhb );
-	fortschritt->setFBgBildZ( fbfhb );
-	spielerFarbe = 0;
-	teamFarbe = 0;
-	p = 0;
-	teamName = new Text( "" );
-	rend = 0;
-	ref = 1;
+SpielLadenListeSpieler::SpielLadenListeSpieler( int accountId )
+    : ReferenceCounter()
+{
+    rahmen = new LRahmen();
+    rahmen->setSize( 862, 22 );
+    rahmen->setRamenBreite( 1 );
+    rahmen->setFarbe( 0xFFFFFFFF );
+    this->accountId = accountId;
+    Text *n = infoClient->getSpielerName( accountId );
+    name = initTextFeld( 1, 1, 149, 20, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
+    n->release();
+    team = initTextFeld( 230, 1, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
+    ping = initTextFeld( 410, 1, 50, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
+    fortschritt = uiFactory.createFBalken( uiFactory.initParam );
+    fortschritt->setStyle( FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::L_R | FBalken::Style::FBild | FBalken::Style::Prozent | FBalken::Style::Sichtbar );
+    fortschritt->setPosition( 461, 1 );
+    fortschritt->setSize( 400, 20 );
+    fortschritt->reset();
+    fortschritt->setAktionAnzahl( 100 );
+    Bild *fbhb = bilder->get( "data/bilder/system.ltdb/fortschrittleh" );
+    Bild *fbfhb = bilder->get( "data/bilder/system.ltdb/fortschrittvol" );
+    fortschritt->setHintergrundBildZ( fbhb );
+    fortschritt->setFBgBildZ( fbfhb );
+    spielerFarbe = 0;
+    teamFarbe = 0;
+    p = 0;
+    teamName = new Text( "" );
+    rend = 0;
 }
 
 // Destruktor
 SpielLadenListeSpieler::~SpielLadenListeSpieler()
 {
-	rahmen->release();
-	name->release();
-	team->release();
-	ping->release();
-	fortschritt->release();
-	teamName->release();
+    rahmen->release();
+    name->release();
+    team->release();
+    ping->release();
+    fortschritt->release();
+    teamName->release();
 }
 
 // nicht constant
 void SpielLadenListeSpieler::setFortschritt( int prozent )
 {
-	fortschritt->aktionPlus( prozent - fortschritt->getAktion() );
-	rend = 1;
+    fortschritt->aktionPlus( prozent - fortschritt->getAktion() );
+    rend = 1;
 }
 
 void SpielLadenListeSpieler::setPing( int ping )
 {
-	p = ping;
-	rend = 1;
+    p = ping;
+    rend = 1;
 }
 
 void SpielLadenListeSpieler::setTeamName( Text *zName )
 {
-	teamName->setText( zName->getText() );
-	rend = 1;
+    teamName->setText( zName->getText() );
+    rend = 1;
 }
 
 void SpielLadenListeSpieler::setSpielerFarbe( int farbe )
 {
-	spielerFarbe = farbe;
-	rend = 1;
+    spielerFarbe = farbe;
+    rend = 1;
 }
 
 void SpielLadenListeSpieler::setTeamFarbe( int farbe )
 {
-	teamFarbe = farbe;
-	rend = 1;
+    teamFarbe = farbe;
+    rend = 1;
 }
 
 bool SpielLadenListeSpieler::tick( double tickVal )
 {
-	if( !team->zText()->istGleich( teamName->getText() ) )
-	{
-		team->setText( teamName->getText() );
-		rend = 1;
-	}
-	if( TextZuInt( ping->zText()->getText(), 10 ) != p )
-	{
-		ping->setText( "" );
-		ping->zText()->append( p );
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( !team->zText()->istGleich( teamName->getText() ) )
+    {
+        team->setText( teamName->getText() );
+        rend = 1;
+    }
+    if( TextZuInt( ping->zText()->getText(), 10 ) != p )
+    {
+        ping->setText( "" );
+        ping->zText()->append( p );
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void SpielLadenListeSpieler::render( int y, Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( 0, y, 862, 22 ) )
-		return;
-	rahmen->render( zRObj );
-	name->render( zRObj );
-	zRObj.alphaRegion( 170, 1, 40, 20, spielerFarbe );
-	team->render( zRObj );
-	zRObj.alphaRegion( 350, 1, 40, 20, teamFarbe );
-	ping->render( zRObj );
-	fortschritt->render( zRObj );
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( 0, y, 862, 22 ) )
+        return;
+    rahmen->render( zRObj );
+    name->render( zRObj );
+    zRObj.alphaRegion( 170, 1, 40, 20, spielerFarbe );
+    team->render( zRObj );
+    zRObj.alphaRegion( 350, 1, 40, 20, teamFarbe );
+    ping->render( zRObj );
+    fortschritt->render( zRObj );
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int SpielLadenListeSpieler::getAccountId() const
 {
-	return accountId;
-}
-
-// Reference Counting
-SpielLadenListeSpieler *SpielLadenListeSpieler::getThis()
-{
-	ref++;
-	return this;
-}
-
-SpielLadenListeSpieler *SpielLadenListeSpieler::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return accountId;
 }
 
 // Inhalt der SpielLadenListe Klasse aus SpielLaden.h
 // Konstruktor
-SpielLadenListe::SpielLadenListe( Schrift *zSchrift )
-{
-	bildschirmGröße = hauptScreen->getBackBufferSize();
-	spielerAnzahl = 0;
-	höhe = 0;
-	breite = 0;
-	tickVal = 0;
-	spielerName = initTextFeld( 1, 1, 149, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Name" );
-	spielerFarbe = initTextFeld( 150, 1, 90, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Farbe" );
-	teamName = initTextFeld( 230, 1, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Name" );
-	teamFarbe = initTextFeld( 330, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe" );
-	ping = initTextFeld( 410, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Ping" );
-	fortschritt = initTextFeld( 460, 1, 400, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Fortschritt" );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setRamenBreite( 1 );
-	titel = new AlphaFeld();
-	titel->setFarbe( 0x1000FF00 );
-	titel->setStrength( -15 );
-	spieler = new RCArray < SpielLadenListeSpieler >();
-	sts = 0;
-	schrift = zSchrift->getThis();
-	alpha = 0;
-	animation = 0;
-	rend = 0;
-	ref = 1;
+SpielLadenListe::SpielLadenListe()
+    : ReferenceCounter()
+{
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    spielerAnzahl = 0;
+    höhe = 0;
+    breite = 0;
+    tickVal = 0;
+    spielerName = initTextFeld( 1, 1, 149, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Name" );
+    spielerFarbe = initTextFeld( 150, 1, 90, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler Farbe" );
+    teamName = initTextFeld( 230, 1, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team Name" );
+    teamFarbe = initTextFeld( 330, 1, 80, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe" );
+    ping = initTextFeld( 410, 1, 50, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Ping" );
+    fortschritt = initTextFeld( 460, 1, 400, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Fortschritt" );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setRamenBreite( 1 );
+    titel = new AlphaFeld();
+    titel->setFarbe( 0x1000FF00 );
+    titel->setStrength( -15 );
+    spieler = new RCArray < SpielLadenListeSpieler >();
+    sts = 0;
+    alpha = 0;
+    animation = 0;
+    rend = 0;
 }
 
 // Destruktor
 SpielLadenListe::~SpielLadenListe()
 {
-	spielerName->release();
-	spielerFarbe->release();
-	teamName->release();
-	teamFarbe->release();
-	ping->release();
-	fortschritt->release();
-	rahmen->release();
-	titel->release();
-	spieler->release();
-	schrift->release();
-	if( sts )
-		sts->release();
+    spielerName->release();
+    spielerFarbe->release();
+    teamName->release();
+    teamFarbe->release();
+    ping->release();
+    fortschritt->release();
+    rahmen->release();
+    titel->release();
+    spieler->release();
+    if( sts )
+        sts->release();
 }
 
 // nicht constant
 void SpielLadenListe::setSTS( SpielerTeamStruktur *sts )
 {
-	if( this->sts )
-		this->sts->release();
-	this->sts = sts;
-	rend = 1;
+    if( this->sts )
+        this->sts->release();
+    this->sts = sts;
+    rend = 1;
 }
 
 void SpielLadenListe::setSichtbar( bool sichtbar )
 {
-	animation = sichtbar ? 1 : 3;
+    animation = sichtbar ? 1 : 3;
 }
 
 void SpielLadenListe::addSpieler( int accountId, int spielerNummer )
 {
-	SpielLadenListeSpieler *tmp = new SpielLadenListeSpieler( accountId, schrift );
-	int team = 0;
-	int max = 0;
-	int min = 0;
-	for( int i = 0; i < sts->teamAnzahl; i++ )
-	{
-		min = max;
-		max += sts->teamSize->get( i );
-		if( spielerNummer >= min && spielerNummer < max )
-		{
-			team = i;
-			break;
-		}
-	}
-	tmp->setSpielerFarbe( sts->spielerFarbe->hat( spielerNummer ) ? sts->spielerFarbe->get( spielerNummer ) : 0 );
-	tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
-	tmp->setTeamName( sts->teamName->z( team ) );
-	spieler->set( tmp, spielerAnzahl );
-	spielerAnzahl++;
-	rend = 1;
+    SpielLadenListeSpieler *tmp = new SpielLadenListeSpieler( accountId );
+    int team = 0;
+    int max = 0;
+    int min = 0;
+    for( int i = 0; i < sts->teamAnzahl; i++ )
+    {
+        min = max;
+        max += sts->teamSize->get( i );
+        if( spielerNummer >= min && spielerNummer < max )
+        {
+            team = i;
+            break;
+        }
+    }
+    tmp->setSpielerFarbe( sts->spielerFarbe->hat( spielerNummer ) ? sts->spielerFarbe->get( spielerNummer ) : 0 );
+    tmp->setTeamFarbe( sts->teamFarbe->hat( team ) ? sts->teamFarbe->get( team ) : 0 );
+    tmp->setTeamName( sts->teamName->z( team ) );
+    spieler->set( tmp, spielerAnzahl );
+    spielerAnzahl++;
+    rend = 1;
 }
 
 void SpielLadenListe::setSpielerFortschritt( int accountId, int prozent )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i )->getAccountId() == accountId )
-		{
-			spieler->z( i )->setFortschritt( prozent );
-			break;
-		}
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i )->getAccountId() == accountId )
+        {
+            spieler->z( i )->setFortschritt( prozent );
+            break;
+        }
+    }
 }
 
 void SpielLadenListe::setSpielerPing( int accountId, int ping )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-	{
-		if( spieler->z( i )->getAccountId() == accountId )
-		{
-			spieler->z( i )->setPing( ping );
-			break;
-		}
-	}
+    for( int i = 0; i < spielerAnzahl; i++ )
+    {
+        if( spieler->z( i )->getAccountId() == accountId )
+        {
+            spieler->z( i )->setPing( ping );
+            break;
+        }
+    }
 }
 
 bool SpielLadenListe::tick( double tickVal )
 {
-	for( int i = 0; i < spielerAnzahl; i++ )
-		rend |= spieler->z( i )->tick( tickVal );
-	this->tickVal += tickVal * 500;
-	int val = ( int )this->tickVal;
-	if( !val )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	this->tickVal -= val;
-	if( breite && animation != 4 && höhe != spielerAnzahl * 22 + 23 )
-	{
-		höhe += val / 2;
-		if( höhe > spielerAnzahl * 22 + 23 )
-			höhe = spielerAnzahl * 22 + 23;
-		rend = 1;
-	}
-	switch( animation )
-	{
-	case 1: // größe ++
-		breite += val;
-		if( breite >= 864 )
-		{
-			breite = 864;
-			animation = 2;
-		}
-		rend = 1;
-		break;
-	case 2: // alpha ++
-		if( alpha + val > 255 )
-		{
-			alpha = 255;
-			animation = 0;
-		}
-		else
-			alpha += val;
-		rend = 1;
-		break;
-	case 3: // alpha --
-		if( alpha - val < 0 )
-		{
-			alpha = 0;
-			animation = 4;
-		}
-		else
-			alpha -= val;
-		rend = 1;
-		break;
-	case 4: // größe --
-		breite -= val;
-		if( breite <= 0 )
-		{
-			breite = 0;
-			höhe = 0;
-			animation = 0;
-		}
-		else if( breite < spielerAnzahl * 22 + 23 )
-			höhe = breite;
-		rend = 1;
-		break;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    for( int i = 0; i < spielerAnzahl; i++ )
+        rend |= spieler->z( i )->tick( tickVal );
+    this->tickVal += tickVal * 500;
+    int val = (int)this->tickVal;
+    if( !val )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    this->tickVal -= val;
+    if( breite && animation != 4 && höhe != spielerAnzahl * 22 + 23 )
+    {
+        höhe += val / 2;
+        if( höhe > spielerAnzahl * 22 + 23 )
+            höhe = spielerAnzahl * 22 + 23;
+        rend = 1;
+    }
+    switch( animation )
+    {
+    case 1: // größe ++
+        breite += val;
+        if( breite >= 864 )
+        {
+            breite = 864;
+            animation = 2;
+        }
+        rend = 1;
+        break;
+    case 2: // alpha ++
+        if( alpha + val > 255 )
+        {
+            alpha = 255;
+            animation = 0;
+        }
+        else
+            alpha += val;
+        rend = 1;
+        break;
+    case 3: // alpha --
+        if( alpha - val < 0 )
+        {
+            alpha = 0;
+            animation = 4;
+        }
+        else
+            alpha -= val;
+        rend = 1;
+        break;
+    case 4: // größe --
+        breite -= val;
+        if( breite <= 0 )
+        {
+            breite = 0;
+            höhe = 0;
+            animation = 0;
+        }
+        else if( breite < spielerAnzahl * 22 + 23 )
+            höhe = breite;
+        rend = 1;
+        break;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void SpielLadenListe::render( Bild &zRObj )
 {
-	if( !breite )
-		return;
-	int x = bildschirmGröße.x / 2 - breite / 2;
-	int y = bildschirmGröße.y / 2 - höhe / 2;
-	if( !zRObj.setDrawOptions( x, y, breite, höhe ) )
-		return;
-	rahmen->setSize( breite, höhe );
-	rahmen->render( zRObj );
-	zRObj.setAlpha( alpha );
-	titel->setPosition( 1, 1 );
-	titel->setSize( breite - 2, 20 );
-	titel->render( zRObj );
-	spielerName->render( zRObj );
-	spielerFarbe->render( zRObj );
-	spielerName->render( zRObj );
-	teamFarbe->render( zRObj );
-	ping->render( zRObj );
-	fortschritt->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.drawLinieH( 1, 21, breite - 2, 0xFFFFFFFF );
-	if( höhe > 22 )
-	{
-		if( !zRObj.setDrawOptions( 1, 22, breite - 2, höhe - 2 ) )
-		{
-			zRObj.releaseDrawOptions();
-			return;
-		}
-		zRObj.alphaRegion( 0, 0, breite - 2, höhe - 23, 0x50000000 );
-		zRObj.setAlpha( alpha );
-		for( int i = 0; i < spielerAnzahl; i++ )
-			spieler->z( i )->render( i * 22, zRObj );
-		zRObj.releaseAlpha();
-		zRObj.releaseDrawOptions();
-	}
-	zRObj.releaseDrawOptions();
+    if( !breite )
+        return;
+    int x = bildschirmGröße.x / 2 - breite / 2;
+    int y = bildschirmGröße.y / 2 - höhe / 2;
+    if( !zRObj.setDrawOptions( x, y, breite, höhe ) )
+        return;
+    rahmen->setSize( breite, höhe );
+    rahmen->render( zRObj );
+    zRObj.setAlpha( alpha );
+    titel->setPosition( 1, 1 );
+    titel->setSize( breite - 2, 20 );
+    titel->render( zRObj );
+    spielerName->render( zRObj );
+    spielerFarbe->render( zRObj );
+    spielerName->render( zRObj );
+    teamFarbe->render( zRObj );
+    ping->render( zRObj );
+    fortschritt->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.drawLinieH( 1, 21, breite - 2, 0xFFFFFFFF );
+    if( höhe > 22 )
+    {
+        if( !zRObj.setDrawOptions( 1, 22, breite - 2, höhe - 2 ) )
+        {
+            zRObj.releaseDrawOptions();
+            return;
+        }
+        zRObj.alphaRegion( 0, 0, breite - 2, höhe - 23, 0x50000000 );
+        zRObj.setAlpha( alpha );
+        for( int i = 0; i < spielerAnzahl; i++ )
+            spieler->z( i )->render( i * 22, zRObj );
+        zRObj.releaseAlpha();
+        zRObj.releaseDrawOptions();
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 int SpielLadenListe::getHeight() const
 {
-	return höhe;
+    return höhe;
 }
 
 int SpielLadenListe::getAlpha() const
 {
-	return (int)alpha;
-}
-
-// Reference Counting
-SpielLadenListe *SpielLadenListe::getThis()
-{
-	ref++;
-	return this;
-}
-
-SpielLadenListe *SpielLadenListe::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return (int)alpha;
 }
 
 // Inhalt der SpielLaden Klasse aus SpielLaden.h
 // Konstruktor
-SpielLaden::SpielLaden( Schrift *zSchrift )
-	: Thread()
-{
-	karteId = 0;
-	bildschirmGröße = hauptScreen->getBackBufferSize();
-	hintergrundBild = 0;
-	ladenAlpha = 0;
-	hintergrundAlpha = 0;
-	ladenBild = 0;
-	tickVal = 0;
-	geladen = 0;
-	liste = new SpielLadenListe( zSchrift );
-	animation = 0;
-	ende = 0;
-	rend = 0;
+SpielLaden::SpielLaden()
+    : Thread()
+{
+    karteId = 0;
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    hintergrundBild = 0;
+    ladenAlpha = 0;
+    hintergrundAlpha = 0;
+    ladenBild = 0;
+    tickVal = 0;
+    geladen = 0;
+    liste = new SpielLadenListe();
+    animation = 0;
+    ende = 0;
+    rend = 0;
 }
 
 // Destruktor
 SpielLaden::~SpielLaden()
 {
-	if( geladen )
-		hintergrundBild->release();
-	liste->release();
+    if( geladen )
+        hintergrundBild->release();
+    liste->release();
 }
 
 // nicht constant
 void SpielLaden::setSpielerTeamStruktur( SpielerTeamStruktur *sts )
 {
-	liste->setSTS( sts );
-	rend = 1;
+    liste->setSTS( sts );
+    rend = 1;
 }
 
 void SpielLaden::setKarte( int karteId )
 {
-	this->karteId = karteId;
-	start();
-	rend = 1;
+    this->karteId = karteId;
+    start();
+    rend = 1;
 }
 
 void SpielLaden::setSichtbar( bool sichtbar )
 {
-	animation = sichtbar ? 1 : 4;
+    animation = sichtbar ? 1 : 4;
 }
 
 void SpielLaden::thread()
 {
-	KartenLeser *reader = KartenLeser::getInstance();
+    KartenLeser *reader = KartenLeser::getInstance();
     reader->lock();
-	reader->setKarteId( karteId );
-	hintergrundBild = reader->getLadeBild();
+    reader->setKarteId( karteId );
+    hintergrundBild = reader->getLadeBild();
     reader->unlock();
-	reader->release();
-	if( hintergrundBild )
-		geladen = 1;
-	else
-		run = 0;
+    reader->release();
+    if( hintergrundBild )
+        geladen = 1;
+    else
+        run = 0;
 }
 
 void SpielLaden::addSpieler( int accountId, int spielerNummer )
 {
-	liste->addSpieler( accountId, spielerNummer );
+    liste->addSpieler( accountId, spielerNummer );
 }
 
 void SpielLaden::setSpielerFortschritt( int accountId, int prozent )
 {
-	liste->setSpielerFortschritt( accountId, prozent );
+    liste->setSpielerFortschritt( accountId, prozent );
 }
 
 void SpielLaden::setSpielerPing( int accountId, int ping )
 {
-	liste->setSpielerPing( accountId, ping );
+    liste->setSpielerPing( accountId, ping );
 }
 
 bool SpielLaden::tick( double tickVal )
 {
-	if( ende )
-		return 0;
-	rend |= liste->tick( tickVal );
-	if( ladenAlpha )
-		rend = 1;
-	ladenBild++;
-	if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
-		ladenBild = 0;
-	if( !animation && geladen && ladenAlpha && !ende )
-		animation = 2;
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	if( !val )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	this->tickVal -= val;
-	switch( animation )
-	{ // ------- Beginne zu laden -------
-	case 1: // Sichtbar machen der Ladeanimation
-		if( ladenAlpha + val >= 255 )
-		{
-			ladenAlpha = 255;
-			animation = 0;
-			if( geladen )
-				animation = 2;
-		}
-		else
-			ladenAlpha += val;
-		rend = 1;
-		break;
-	case 2: // Sichtbar machen des Hintergrund Bildes
-		if( hintergrundAlpha + val > 255 )
-		{
-			hintergrundAlpha = 255;
-			animation = 3;
-		}
-		else
-			hintergrundAlpha += val;
-		rend = 1;
-		break;
-	case 3: // Unsichtbar machen der Lade Animation
-		if( ladenAlpha == 255 )
-			liste->setSichtbar( 1 ); // während dessen die Liste sichtbar machen
-		if( ladenAlpha - val < 0 )
-		{
-			ladenAlpha = 0;
-			animation = 0;
-		}
-		else
-			ladenAlpha -= val;
-		rend = 1;
-		break;
-		// ------- Laden beenden -------
-	case 4: // Ladeanimation sichtbar machen
-		if( !ladenAlpha && liste->getAlpha() == 255 )
-			liste->setSichtbar( 0 ); // während dessen die Liste unsichtbar machen
-		if( ladenAlpha + val > 255 )
-		{
-			ladenAlpha = 255;
-			animation = 5;
-		}
-		else
-			ladenAlpha += val;
-		rend = 1;
-		break;
-	case 5: // Hintergrund Bild mit Lade Animation unsichtbar machen
-		if( hintergrundAlpha - val < 0 )
-		{
-			hintergrundAlpha = 0;
-			ladenAlpha = 0;
-			ende = 1;
-			animation = 0;
-			spielClient->bereitZumSpiel();
-		}
-		else
-		{
-			hintergrundAlpha -= val;
-			ladenAlpha -= val;
-		}
-		rend = 1;
-		break;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( ende )
+        return 0;
+    rend |= liste->tick( tickVal );
+    if( ladenAlpha )
+        rend = 1;
+    ladenBild++;
+    if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
+        ladenBild = 0;
+    if( !animation && geladen && ladenAlpha && !ende )
+        animation = 2;
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    if( !val )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    this->tickVal -= val;
+    switch( animation )
+    { // ------- Beginne zu laden -------
+    case 1: // Sichtbar machen der Ladeanimation
+        if( ladenAlpha + val >= 255 )
+        {
+            ladenAlpha = 255;
+            animation = 0;
+            if( geladen )
+                animation = 2;
+        }
+        else
+            ladenAlpha += val;
+        rend = 1;
+        break;
+    case 2: // Sichtbar machen des Hintergrund Bildes
+        if( hintergrundAlpha + val > 255 )
+        {
+            hintergrundAlpha = 255;
+            animation = 3;
+        }
+        else
+            hintergrundAlpha += val;
+        rend = 1;
+        break;
+    case 3: // Unsichtbar machen der Lade Animation
+        if( ladenAlpha == 255 )
+            liste->setSichtbar( 1 ); // während dessen die Liste sichtbar machen
+        if( ladenAlpha - val < 0 )
+        {
+            ladenAlpha = 0;
+            animation = 0;
+        }
+        else
+            ladenAlpha -= val;
+        rend = 1;
+        break;
+        // ------- Laden beenden -------
+    case 4: // Ladeanimation sichtbar machen
+        if( !ladenAlpha && liste->getAlpha() == 255 )
+            liste->setSichtbar( 0 ); // während dessen die Liste unsichtbar machen
+        if( ladenAlpha + val > 255 )
+        {
+            ladenAlpha = 255;
+            animation = 5;
+        }
+        else
+            ladenAlpha += val;
+        rend = 1;
+        break;
+    case 5: // Hintergrund Bild mit Lade Animation unsichtbar machen
+        if( hintergrundAlpha - val < 0 )
+        {
+            hintergrundAlpha = 0;
+            ladenAlpha = 0;
+            ende = 1;
+            animation = 0;
+            spielClient->bereitZumSpiel();
+        }
+        else
+        {
+            hintergrundAlpha -= val;
+            ladenAlpha -= val;
+        }
+        rend = 1;
+        break;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void SpielLaden::render( Bild &zRObj )
 {
-	zRObj.setAlpha( hintergrundAlpha );
-	if( hintergrundBild )
-	{
-		zRObj.drawBild( bildschirmGröße.x / 2 - hintergrundBild->getBreite() / 2, bildschirmGröße.y / 2 - hintergrundBild->getHeight() / 2,
-						hintergrundBild->getBreite(), hintergrundBild->getHeight(), *hintergrundBild );
-	}
-	zRObj.releaseAlpha();
-	liste->render( zRObj );
-	zRObj.setAlpha( ladenAlpha );
-	Bild *zLadenBild = ladeAnimation->zAnimationData()->zBild( ladenBild );
-	zRObj.drawBild( bildschirmGröße.x / 2 - 25, bildschirmGröße.y / 2 - 25, zLadenBild->getBreite(), zLadenBild->getHeight(), *zLadenBild );
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( hintergrundAlpha );
+    if( hintergrundBild )
+    {
+        zRObj.drawBild( bildschirmGröße.x / 2 - hintergrundBild->getBreite() / 2, bildschirmGröße.y / 2 - hintergrundBild->getHeight() / 2,
+                        hintergrundBild->getBreite(), hintergrundBild->getHeight(), *hintergrundBild );
+    }
+    zRObj.releaseAlpha();
+    liste->render( zRObj );
+    zRObj.setAlpha( ladenAlpha );
+    Bild *zLadenBild = ladeAnimation->zAnimationData()->zBild( ladenBild );
+    zRObj.drawBild( bildschirmGröße.x / 2 - 25, bildschirmGröße.y / 2 - 25, zLadenBild->getBreite(), zLadenBild->getHeight(), *zLadenBild );
+    zRObj.releaseAlpha();
 }
 
 // constant
 int SpielLaden::getAlpha() const
 {
-	return hintergrundAlpha;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *SpielLaden::release()
-{
-    if( ref == 2 && run )
-        warteAufThread( 1000 );
-    return Thread::release();
+    return hintergrundAlpha;
 }

+ 88 - 99
KSGClient/NachLogin/ImSpiel/Laden/SpielLaden.h

@@ -11,122 +11,111 @@
 
 using namespace Framework;
 
-class SpielLadenListeSpieler
+class SpielLadenListeSpieler : public virtual ReferenceCounter
 {
 private:
-	int accountId;
-	TextFeld *name;
-	TextFeld *team;
-	TextFeld *ping;
-	FBalken *fortschritt;
-	LRahmen *rahmen;
-	Text *teamName;
-	int p;
-	int spielerFarbe;
-	int teamFarbe;
-	bool rend;
-	int ref;
+    int accountId;
+    TextFeld *name;
+    TextFeld *team;
+    TextFeld *ping;
+    FBalken *fortschritt;
+    LRahmen *rahmen;
+    Text *teamName;
+    int p;
+    int spielerFarbe;
+    int teamFarbe;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpielLadenListeSpieler( int accountId, Schrift *zSchrift );
-	// Destruktor
-	~SpielLadenListeSpieler();
-	// nicht constant
-	void setFortschritt( int prozent );
-	void setPing( int ping );
-	void setTeamName( Text *zName );
-	void setSpielerFarbe( int farbe );
-	void setTeamFarbe( int farbe );
-	bool tick( double tickVal );
-	void render( int y, Bild &zRObj );
-	// constant
-	int getAccountId() const;
-	// Reference Counting
-	SpielLadenListeSpieler *getThis();
-	SpielLadenListeSpieler *release();
+    // Konstruktor
+    SpielLadenListeSpieler( int accountId );
+    // Destruktor
+    ~SpielLadenListeSpieler();
+    // nicht constant
+    void setFortschritt( int prozent );
+    void setPing( int ping );
+    void setTeamName( Text *zName );
+    void setSpielerFarbe( int farbe );
+    void setTeamFarbe( int farbe );
+    bool tick( double tickVal );
+    void render( int y, Bild &zRObj );
+    // constant
+    int getAccountId() const;
 };
 
-class SpielLadenListe
+class SpielLadenListe : public virtual ReferenceCounter
 {
 private:
-	int spielerAnzahl;
-	int höhe;
-	int breite;
-	double tickVal;
-	TextFeld *spielerName;
-	TextFeld *spielerFarbe;
-	TextFeld *teamName;
-	TextFeld *teamFarbe;
-	TextFeld *ping;
-	TextFeld *fortschritt;
-	LRahmen *rahmen;
-	AlphaFeld *titel;
-	RCArray < SpielLadenListeSpieler > *spieler;
-	SpielerTeamStruktur *sts;
-	Schrift *schrift;
-	Punkt bildschirmGröße;
-	unsigned char alpha;
-	int animation;
-	bool rend;
-	int ref;
+    int spielerAnzahl;
+    int höhe;
+    int breite;
+    double tickVal;
+    TextFeld *spielerName;
+    TextFeld *spielerFarbe;
+    TextFeld *teamName;
+    TextFeld *teamFarbe;
+    TextFeld *ping;
+    TextFeld *fortschritt;
+    LRahmen *rahmen;
+    AlphaFeld *titel;
+    RCArray < SpielLadenListeSpieler > *spieler;
+    SpielerTeamStruktur *sts;
+    Punkt bildschirmGröße;
+    unsigned char alpha;
+    int animation;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpielLadenListe( Schrift *zSchrift );
-	// Destruktor
-	~SpielLadenListe();
-	// nicht constant
-	void setSTS( SpielerTeamStruktur *sts );
-	void setSichtbar( bool sichtbar );
-	void addSpieler( int accountId, int spielerNummer );
-	void setSpielerFortschritt( int accountId, int prozent );
-	void setSpielerPing( int accountId, int ping );
-	bool tick( double tickval );
-	void render( Bild &zRObj );
-	// constant
-	int getHeight() const;
-	int getAlpha() const;
-	// Reference Counting
-	SpielLadenListe *getThis();
-	SpielLadenListe *release();
+    // Konstruktor
+    SpielLadenListe();
+    // Destruktor
+    ~SpielLadenListe();
+    // nicht constant
+    void setSTS( SpielerTeamStruktur *sts );
+    void setSichtbar( bool sichtbar );
+    void addSpieler( int accountId, int spielerNummer );
+    void setSpielerFortschritt( int accountId, int prozent );
+    void setSpielerPing( int accountId, int ping );
+    bool tick( double tickval );
+    void render( Bild &zRObj );
+    // constant
+    int getHeight() const;
+    int getAlpha() const;
 };
 
 class SpielLaden : public Thread
 {
 private:
-	int karteId;
-	Punkt bildschirmGröße;
-	Bild *hintergrundBild;
-	unsigned char ladenAlpha;
-	unsigned char hintergrundAlpha;
-	int ladenBild;
-	double tickVal;
-	bool geladen;
-	SpielLadenListe *liste;
-	int animation;
-	bool ende;
-	bool rend;
+    int karteId;
+    Punkt bildschirmGröße;
+    Bild *hintergrundBild;
+    unsigned char ladenAlpha;
+    unsigned char hintergrundAlpha;
+    int ladenBild;
+    double tickVal;
+    bool geladen;
+    SpielLadenListe *liste;
+    int animation;
+    bool ende;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpielLaden( Schrift *zSchrift );
-	// Destruktor
-	~SpielLaden();
-	// nicht constant
-	void setSpielerTeamStruktur( SpielerTeamStruktur *sts );
-	void setKarte( int karteId );
-	void setSichtbar( bool sichtbar );
-	void thread() override;
-	void addSpieler( int accountId, int spielerNummer );
-	void setSpielerFortschritt( int accountId, int prozent );
-	void setSpielerPing( int accountId, int ping );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	int getAlpha() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    SpielLaden();
+    // Destruktor
+    ~SpielLaden();
+    // nicht constant
+    void setSpielerTeamStruktur( SpielerTeamStruktur *sts );
+    void setKarte( int karteId );
+    void setSichtbar( bool sichtbar );
+    void thread() override;
+    void addSpieler( int accountId, int spielerNummer );
+    void setSpielerFortschritt( int accountId, int prozent );
+    void setSpielerPing( int accountId, int ping );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    int getAlpha() const;
 };
 
 #endif

+ 227 - 242
KSGClient/NachLogin/MiniGames/MiniGame.cpp

@@ -8,282 +8,267 @@
 // Inhalt der Minigame Klasse aus MiniGame.h
 // Konstruktor
 MiniGame::MiniGame( char *name )
+    : ReferenceCounter()
 {
-	xPos = 0;
-	yPos = 0;
-	xAbs = 0;
-	yAbs = 0;
-	zXPos = 0;
-	zYPos = 0;
-	xSpeed = 0;
-	ySpeed = 0;
-	this->name = new Text( name );
-	bgBild = 0;
-	mausAlpha = new AlphaFeld();
-	mausAlpha->setSize( 248, 98 );
-	mausAlpha->setFarbe( 0xFF00FF00 );
-	mausAlpha->setStrength( 50 );
-	rahmen = new LRahmen();
-	rahmen->setSize( 250, 100 );
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setRamenBreite( 1 );
-	sichtbar = 1;
-	alpha = 0;
-	mausIn = 0;
-	ok = 1;
-	rend = 0;
-	ref = 1;
-	Text *pfad = new Text( "data/Minigames/" );
-	pfad->append( name );
-	if( !DateiExistiert( pfad->getThis() ) )
-	{
-		ok = 0;
-		pfad->release();
-		return;
-	}
-	pfad->append( "/mg.ini" );
-	if( !DateiExistiert( pfad->getThis() ) )
-	{
-		ok = 0;
-		pfad->release();
-		return;
-	}
-	InitDatei *mgIni = new InitDatei( pfad );
-	if( !mgIni->laden() )
-	{
-		ok = 0;
-		mgIni->release();
-		return;
-	}
-	if( !mgIni->wertExistiert( "TitelBild" ) || !mgIni->wertExistiert( "TitelBildPfad" ) || !mgIni->wertExistiert( "DllPfad" ) )
-	{
-		ok = 0;
-		mgIni->release();
-		return;
-	}
-	Text *bPfad = new Text( "data/Minigames/" );
-	bPfad->append( name );
-	bPfad->append( "/" );
-	bPfad->append( mgIni->zWert( "TitelBildPfad" )->getText() );
-	if( !DateiExistiert( bPfad->getThis() ) )
-	{
-		ok = 0;
-		bPfad->release();
-		mgIni->release();
-		return;
-	}
-	LTDBDatei *bDat = new LTDBDatei();
-	bDat->setDatei( bPfad );
-	bDat->leseDaten( 0 );
-	bgBild = bDat->laden( 0, mgIni->getWert( "TitelBild" ) );
-	bDat->release();
-	mgIni->release();
-	if( !bgBild )
-		ok = 0;
+    xPos = 0;
+    yPos = 0;
+    xAbs = 0;
+    yAbs = 0;
+    zXPos = 0;
+    zYPos = 0;
+    xSpeed = 0;
+    ySpeed = 0;
+    this->name = new Text( name );
+    bgBild = 0;
+    mausAlpha = new AlphaFeld();
+    mausAlpha->setSize( 248, 98 );
+    mausAlpha->setFarbe( 0xFF00FF00 );
+    mausAlpha->setStrength( 50 );
+    rahmen = new LRahmen();
+    rahmen->setSize( 250, 100 );
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setRamenBreite( 1 );
+    sichtbar = 1;
+    alpha = 0;
+    mausIn = 0;
+    ok = 1;
+    rend = 0;
+    Text *pfad = new Text( "data/Minigames/" );
+    pfad->append( name );
+    if( !DateiExistiert( pfad->getText() ) )
+    {
+        ok = 0;
+        pfad->release();
+        return;
+    }
+    pfad->append( "/mg.ini" );
+    if( !DateiExistiert( pfad->getText() ) )
+    {
+        ok = 0;
+        pfad->release();
+        return;
+    }
+    InitDatei *mgIni = new InitDatei( pfad );
+    if( !mgIni->laden() )
+    {
+        ok = 0;
+        mgIni->release();
+        return;
+    }
+    if( !mgIni->wertExistiert( "TitelBild" ) || !mgIni->wertExistiert( "TitelBildPfad" ) || !mgIni->wertExistiert( "DllPfad" ) )
+    {
+        ok = 0;
+        mgIni->release();
+        return;
+    }
+    Text *bPfad = new Text( "data/Minigames/" );
+    bPfad->append( name );
+    bPfad->append( "/" );
+    bPfad->append( mgIni->zWert( "TitelBildPfad" )->getText() );
+    if( !DateiExistiert( bPfad->getText() ) )
+    {
+        ok = 0;
+        bPfad->release();
+        mgIni->release();
+        return;
+    }
+    LTDBDatei *bDat = new LTDBDatei();
+    bDat->setDatei( bPfad );
+    bDat->leseDaten( 0 );
+    bgBild = bDat->laden( 0, mgIni->getWert( "TitelBild" ) );
+    bDat->release();
+    mgIni->release();
+    if( !bgBild )
+        ok = 0;
 }
 
 // Destruktor
 MiniGame::~MiniGame()
 {
-	name->release();
-	if( bgBild )
-		bgBild->release();
-	mausAlpha->release();
-	rahmen->release();
+    name->release();
+    if( bgBild )
+        bgBild->release();
+    mausAlpha->release();
+    rahmen->release();
 }
 
 // nicht constant
 void MiniGame::setPosition( int x, int y )
 {
-	if( !xPos && !yPos )
-	{
-		xPos = x;
-		yPos = y;
-	}
-	zXPos = x;
-	zYPos = y;
-	xAbs = (int)( zXPos - xPos );
-	yAbs = (int)( zYPos - yPos );
+    if( !xPos && !yPos )
+    {
+        xPos = x;
+        yPos = y;
+    }
+    zXPos = x;
+    zYPos = y;
+    xAbs = (int)( zXPos - xPos );
+    yAbs = (int)( zYPos - yPos );
 }
 
 void MiniGame::setSichtbar( bool sichtbar )
 {
-	this->sichtbar = sichtbar;
+    this->sichtbar = sichtbar;
 }
 
 void MiniGame::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !this->sichtbar )
-		return;
-	if( me.mx > xPos && me.mx < xPos + 250 && me.my > yPos && me.my < yPos + 100 )
-	{
-		if( !mausIn )
-		{
-			rend = 1;
-			rahmen->setFarbe( 0xFF00FF00 );
-		}
-		mausIn = 1;
-	}
-	else
-	{
-		if( mausIn )
-		{
-			rend = 1;
-			rahmen->setFarbe( 0xFFFFFFFF );
-		}
-		mausIn = 0;
-	}
-	me.verarbeitet |= mausIn;
+    if( !this->sichtbar )
+        return;
+    if( me.mx > xPos && me.mx < xPos + 250 && me.my > yPos && me.my < yPos + 100 )
+    {
+        if( !mausIn )
+        {
+            rend = 1;
+            rahmen->setFarbe( 0xFF00FF00 );
+        }
+        mausIn = 1;
+    }
+    else
+    {
+        if( mausIn )
+        {
+            rend = 1;
+            rahmen->setFarbe( 0xFFFFFFFF );
+        }
+        mausIn = 0;
+    }
+    me.verarbeitet |= mausIn;
 }
 
 bool MiniGame::tick( double z )
 {
-	bool ret = rend;
-	rend = 0;
-	int val = (int)( z * 150 );
-	if( sichtbar && alpha != 255 )
-	{
-		if( alpha + val > 255 )
-			alpha = 255;
-		else
-			alpha += val;
-		ret = 1;
-	}
-	if( !sichtbar && alpha )
-	{
-		if( alpha - val < 0 )
-			alpha = 0;
-		else
-			alpha -= val;
-		ret = 1;
-	}
-	if( xPos != zXPos || yPos != zYPos )
-	{
-		if( xPos != zXPos )
-		{
-			if( xAbs > 0 )
-			{
-				if( zXPos - xPos >= xAbs / 2 )
-					xSpeed += xAbs * z;
-				else
-				{
-					xSpeed -= xAbs * z;
-					if( xSpeed < zXPos - xPos )
-						xSpeed += xAbs * z;
-				}
-			}
-			else
-			{
-				if( zXPos - xPos <= xAbs / 2 )
-					xSpeed += xAbs * z;
-				else
-				{
-					xSpeed -= xAbs * z;
-					if( xSpeed > zXPos - xPos )
-						xSpeed += xAbs * z;
-				}
-			}
-		}
-		if( yPos != zYPos )
-		{
-			if( yAbs > 0 )
-			{
-				if( zYPos - yPos >= yAbs / 2 )
-					ySpeed += yAbs * z;
-				else
-				{
-					ySpeed -= yAbs * z;
-					if( ySpeed < zYPos - yPos )
-						ySpeed += yAbs * z;
-				}
-			}
-			else
-			{
-				if( zYPos - yPos <= yAbs / 2 )
-					ySpeed += yAbs * z;
-				else
-				{
-					ySpeed -= yAbs * z;
-					if( ySpeed > zYPos - yPos )
-						ySpeed += yAbs * z;
-				}
-			}
-		}
-		xPos += xSpeed * z;
-		yPos += ySpeed * z;
-		if( xAbs > 0 )
-		{
-			if( xPos >= zXPos )
-			{
-				xPos = zXPos;
-				xSpeed = 0;
-			}
-		}
-		else
-		{
-			if( xPos <= zXPos )
-			{
-				xPos = zXPos;
-				xSpeed = 0;
-			}
-		}
-		if( yAbs > 0 )
-		{
-			if( yPos >= zYPos )
-			{
-				yPos = zYPos;
-				ySpeed = 0;
-			}
-		}
-		else
-		{
-			if( yPos <= zYPos )
-			{
-				yPos = zYPos;
-				ySpeed = 0;
-			}
-		}
-		ret = 1;
-	}
-	return ret;
+    bool ret = rend;
+    rend = 0;
+    int val = (int)( z * 150 );
+    if( sichtbar && alpha != 255 )
+    {
+        if( alpha + val > 255 )
+            alpha = 255;
+        else
+            alpha += val;
+        ret = 1;
+    }
+    if( !sichtbar && alpha )
+    {
+        if( alpha - val < 0 )
+            alpha = 0;
+        else
+            alpha -= val;
+        ret = 1;
+    }
+    if( xPos != zXPos || yPos != zYPos )
+    {
+        if( xPos != zXPos )
+        {
+            if( xAbs > 0 )
+            {
+                if( zXPos - xPos >= xAbs / 2 )
+                    xSpeed += xAbs * z;
+                else
+                {
+                    xSpeed -= xAbs * z;
+                    if( xSpeed < zXPos - xPos )
+                        xSpeed += xAbs * z;
+                }
+            }
+            else
+            {
+                if( zXPos - xPos <= xAbs / 2 )
+                    xSpeed += xAbs * z;
+                else
+                {
+                    xSpeed -= xAbs * z;
+                    if( xSpeed > zXPos - xPos )
+                        xSpeed += xAbs * z;
+                }
+            }
+        }
+        if( yPos != zYPos )
+        {
+            if( yAbs > 0 )
+            {
+                if( zYPos - yPos >= yAbs / 2 )
+                    ySpeed += yAbs * z;
+                else
+                {
+                    ySpeed -= yAbs * z;
+                    if( ySpeed < zYPos - yPos )
+                        ySpeed += yAbs * z;
+                }
+            }
+            else
+            {
+                if( zYPos - yPos <= yAbs / 2 )
+                    ySpeed += yAbs * z;
+                else
+                {
+                    ySpeed -= yAbs * z;
+                    if( ySpeed > zYPos - yPos )
+                        ySpeed += yAbs * z;
+                }
+            }
+        }
+        xPos += xSpeed * z;
+        yPos += ySpeed * z;
+        if( xAbs > 0 )
+        {
+            if( xPos >= zXPos )
+            {
+                xPos = zXPos;
+                xSpeed = 0;
+            }
+        }
+        else
+        {
+            if( xPos <= zXPos )
+            {
+                xPos = zXPos;
+                xSpeed = 0;
+            }
+        }
+        if( yAbs > 0 )
+        {
+            if( yPos >= zYPos )
+            {
+                yPos = zYPos;
+                ySpeed = 0;
+            }
+        }
+        else
+        {
+            if( yPos <= zYPos )
+            {
+                yPos = zYPos;
+                ySpeed = 0;
+            }
+        }
+        ret = 1;
+    }
+    return ret;
 }
 
 void MiniGame::render( Bild &zRObj )
 {
-	zRObj.setAlpha( alpha );
-	zRObj.drawBild( (int)( xPos ), (int)( yPos ), 250, 100, *bgBild );
-	rahmen->setPosition( (int)xPos, (int)yPos );
-	rahmen->render( zRObj );
-	if( mausIn )
-	{
-		mausAlpha->setPosition( (int)xPos + 1, (int)yPos + 1 );
-		mausAlpha->render( zRObj );
-	}
-	zRObj.releaseAlpha();
+    zRObj.setAlpha( alpha );
+    zRObj.drawBild( (int)( xPos ), (int)( yPos ), 250, 100, *bgBild );
+    rahmen->setPosition( (int)xPos, (int)yPos );
+    rahmen->render( zRObj );
+    if( mausIn )
+    {
+        mausAlpha->setPosition( (int)xPos + 1, (int)yPos + 1 );
+        mausAlpha->render( zRObj );
+    }
+    zRObj.releaseAlpha();
 }
 
 // constant
 Text *MiniGame::zName()
 {
-	return name;
+    return name;
 }
 
 bool MiniGame::istOk() const
 {
-	return ok;
-}
-
-// Reference Counting
-MiniGame *MiniGame::getThis()
-{
-	ref++;
-	return this;
-}
-
-MiniGame *MiniGame::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return ok;
 }

+ 31 - 35
KSGClient/NachLogin/MiniGames/MiniGame.h

@@ -8,45 +8,41 @@
 
 using namespace Framework;
 
-class MiniGame
+class MiniGame : public virtual ReferenceCounter
 {
 private:
-	double xPos;
-	double yPos;
-	int xAbs;
-	int yAbs;
-	int zXPos;
-	int zYPos;
-	double xSpeed;
-	double ySpeed;
-	Text *name;
-	Bild *bgBild;
-	AlphaFeld *mausAlpha;
-	LRahmen *rahmen;
-	bool sichtbar;
-	unsigned char alpha;
-	bool mausIn;
-	bool ok;
-	bool rend;
-	int ref;
+    double xPos;
+    double yPos;
+    int xAbs;
+    int yAbs;
+    int zXPos;
+    int zYPos;
+    double xSpeed;
+    double ySpeed;
+    Text *name;
+    Bild *bgBild;
+    AlphaFeld *mausAlpha;
+    LRahmen *rahmen;
+    bool sichtbar;
+    unsigned char alpha;
+    bool mausIn;
+    bool ok;
+    bool rend;
 
 public:
-	// Konstruktor
-	MiniGame( char *name );
-	// Destruktor
-	~MiniGame();
-	// nicht constant
-	void setPosition( int x, int y );
-	void setSichtbar( bool sichtbar );
-	void doPublicMausEreignis( MausEreignis &me );
-	bool tick( double z );
-	void render( Bild &zRObj );
-	// constant
-	Text *zName();
-	bool istOk() const;
-	// Reference Counting
-	MiniGame *getThis();
-	MiniGame *release();
+    // Konstruktor
+    MiniGame( char *name );
+    // Destruktor
+    ~MiniGame();
+    // nicht constant
+    void setPosition( int x, int y );
+    void setSichtbar( bool sichtbar );
+    void doPublicMausEreignis( MausEreignis &me );
+    bool tick( double z );
+    void render( Bild &zRObj );
+    // constant
+    Text *zName();
+    bool istOk() const;
 };
 
 #endif

+ 23 - 25
KSGClient/NachLogin/MiniGames/Minigames.cpp

@@ -98,14 +98,14 @@ void MGLaden::thread()
 {
     Text *pfad = new Text( "data/Minigames/" );
     pfad->append( name->getText() );
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( pfad->getText() ) )
     {
         pfad->release();
         run = 0;
         return;
     }
     pfad->append( "/mg.ini" );
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( pfad->getText() ) )
     {
         pfad->release();
         run = 0;
@@ -129,7 +129,7 @@ void MGLaden::thread()
     dllPfad->append( "/" );
     dllPfad->append( mgIni->zWert( "DllPfad" )->getText() );
     mgIni->release();
-    if( !DateiExistiert( dllPfad->getThis() ) )
+    if( !DateiExistiert( dllPfad->getText() ) )
     {
         dllPfad->release();
         run = 0;
@@ -159,10 +159,10 @@ void MGLaden::thread()
     if( !minigameClient )
         minigameClient = mainClient->createMinigameServerClient();
     if( minigameClient )
-        game->setMinigameClientZ( minigameClient->getThis() );
+        game->setMinigameClientZ( dynamic_cast<KSGClient::MinigameServerClient *>( minigameClient->getThis() ) );
     if( !game->laden() )
     {
-        game = game->release();
+        game = (MiniGameV *)game->release();
         Framework::getDLLRegister()->releaseDLL( name->getText() );
     }
     run = 0;
@@ -182,11 +182,10 @@ MiniGameV *MGLaden::zGame() const
 
 // Inhalt der MiniGames Klasse aus MiniGames.h
 // Konstruktor
-MiniGames::MiniGames( Schrift * zSchrift, Fenster * zNachLoginFenster, int x )
+MiniGames::MiniGames( Fenster *zNachLoginFenster, int x )
     : Zeichnung()
 {
-    schrift = zSchrift->getThis();
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     pos = Punkt( x, 67 );
     gr = Punkt( 102, 32 );
     rahmen = new LRahmen();
@@ -209,28 +208,28 @@ MiniGames::MiniGames( Schrift * zSchrift, Fenster * zNachLoginFenster, int x )
     laden->setSichtbar( 0 );
     laden->setPosition( 375, 225 );
     games = new RCArray< MiniGame >();
-    suchFilter = initTextFeld( 10, 10, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Suchfilter:" );
-    TextRenderer tr( zSchrift->getThis() );
+    suchFilter = initTextFeld( 10, 10, 100, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Suchfilter:" );
+    TextRenderer tr( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     tr.setSchriftSize( 12 );
     suchFilter->setSize( tr.getTextBreite( suchFilter->zText()->getText() ), 20 );
-    suchName = initTextFeld( 20 + suchFilter->getBreite(), 10, 200, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    suchen = initKnopf( 230 + suchFilter->getBreite(), 10, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Suchen" );
+    suchName = initTextFeld( 20 + suchFilter->getBreite(), 10, 200, 20, TextFeld::Style::TextFeld, "" );
+    suchen = initKnopf( 230 + suchFilter->getBreite(), 10, 100, 20, Knopf::Style::Sichtbar, "Suchen" );
     gefiltert = 0;
-    zNachLoginFenster->addMember( getThis() );
+    getThis();
+    zNachLoginFenster->addMember( this );
     dg = 0;
     mgl = 0;
     mgInitialized = 0;
     fullscreen = 0;
     slo = 0;
     minAlpha = 0;
-    new MGSuchen( (MiniGames *)getThis() );
+    getThis();
+    new MGSuchen( this );
 }
 
 // Destruktor
 MiniGames::~MiniGames()
 {
-    if( schrift )
-        schrift->release();
     rahmen->release();
     suchName->release();
     suchFilter->release();
@@ -250,7 +249,7 @@ void MiniGames::setSichtbar( bool sicht )
     rend = 1;
 }
 
-void MiniGames::addMiniGame( MiniGame * mg )
+void MiniGames::addMiniGame( MiniGame *mg )
 {
     games->add( mg );
     if( gefiltert )
@@ -266,13 +265,13 @@ void MiniGames::setAktuell( bool aktuell, int dg )
 {
     this->aktuell = aktuell;
     if( aktuell )
-        new MGSuchen( (MiniGames *)getThis() );
+        new MGSuchen( dynamic_cast<MiniGames *>( getThis() ) );
     if( !this->dg )
         this->dg = dg;
     if( !aktuell && !updateH->hat( dg ) )
     {
-        nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( schrift, new Text( "Update" ), new Text( "Die minigames müssen aktualisiert werden." ), dg,
-                                                      []()
+        nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( new Text( "Update" ), new Text( "Die minigames müssen aktualisiert werden." ), dg,
+                                                                                []()
         {
             if( nachLogin && nachLogin->zMGFenster() )
                 nachLogin->zMGFenster()->setAktuell( 1 );
@@ -345,7 +344,7 @@ void MiniGames::filter()
     delete[] fertig;
 }
 
-void MiniGames::doPublicMausEreignis( MausEreignis & me )
+void MiniGames::doPublicMausEreignis( MausEreignis &me )
 {
     if( laden->istSichtbar() || !sichtbar )
         return;
@@ -379,7 +378,7 @@ void MiniGames::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void MiniGames::doTastaturEreignis( TastaturEreignis & te )
+void MiniGames::doTastaturEreignis( TastaturEreignis &te )
 {
     if( laden->istSichtbar() || !sichtbar )
         return;
@@ -408,8 +407,7 @@ bool MiniGames::tick( double z )
         else if( !mgInitialized )
         {
             mgl->zGame()->setMinigameAPI( this );
-            mgl->zGame()->setSchriftZ( schrift->getThis() );
-            mgl->zGame()->setBildschirmZ( hauptScreen );
+            mgl->zGame()->setUIFactory( uiFactory );
             mgInitialized = 1;
         }
         if( !slo )
@@ -559,7 +557,7 @@ bool MiniGames::tick( double z )
     return ret;
 }
 
-void MiniGames::render( Bild & zRObj )
+void MiniGames::render( Bild &zRObj )
 {
     if( pos == pos1 )
         return;

+ 58 - 59
KSGClient/NachLogin/MiniGames/Minigames.h

@@ -15,88 +15,87 @@ class MiniGames; // aus dieser Datei
 class MGSuchen : private Thread
 {
 private:
-	MiniGames *mGames;
+    MiniGames *mGames;
 public:
-	// Konstruktor
-	MGSuchen( MiniGames *mGames );
-	// Destruktor
-	~MGSuchen();
-	// nicht constant
-	void thread() override;
+    // Konstruktor
+    MGSuchen( MiniGames *mGames );
+    // Destruktor
+    ~MGSuchen();
+    // nicht constant
+    void thread() override;
 };
 
 class MGLaden : public Thread
 {
 private:
-	Text *name;
-	MiniGameV *game;
+    Text *name;
+    MiniGameV *game;
 
 public:
-	// Konstruktor
-	MGLaden( char *name );
-	// Destruktor
-	~MGLaden();
-	// nicht constant
-	void thread();
-	// constant
-	bool fertig() const;
-	MiniGameV *zGame() const;
+    // Konstruktor
+    MGLaden( char *name );
+    // Destruktor
+    ~MGLaden();
+    // nicht constant
+    void thread();
+    // constant
+    bool fertig() const;
+    MiniGameV *zGame() const;
 };
 
 class MiniGames : public Zeichnung, MinigameAPI
 {
 private:
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	Animation2D *laden;
-	TextFeld *suchFilter;
-	TextFeld *suchName;
-	Knopf *suchen;
-	RCArray< MiniGame > *games;
-	MGLaden *mgl;
-	Schrift *schrift;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    Animation2D *laden;
+    TextFeld *suchFilter;
+    TextFeld *suchName;
+    Knopf *suchen;
+    RCArray< MiniGame > *games;
+    MGLaden *mgl;
     bool mgInitialized;
-	int dg;
-	bool aktuell;
-	bool gefiltert;
-	int animation;
-	int alpha;
-	bool sichtbar;
-	int prozent1;
-	int prozent2;
-	double tickVal;
+    int dg;
+    bool aktuell;
+    bool gefiltert;
+    int animation;
+    int alpha;
+    bool sichtbar;
+    int prozent1;
+    int prozent2;
+    double tickVal;
     bool fullscreen;
-	int alpha2;
+    int alpha2;
     int slo;
     unsigned char minAlpha;
 
 public:
-	// Konstruktor
-	MiniGames( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~MiniGames();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	void addMiniGame( MiniGame *mg );
-	void setAktuell( bool aktuell, int dg = 0 );
+    // Konstruktor
+    MiniGames( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~MiniGames();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    void addMiniGame( MiniGame *mg );
+    void setAktuell( bool aktuell, int dg = 0 );
     void setFullScreenMode( bool enabled ) override;
     void showLoadingOverlay( unsigned char minAlpha ) override;
     void hideLoadingOverlay() override;
     Bild *loadBild( const char *path ) override;
-	void filter();
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	bool tick( double z ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
+    void filter();
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool tick( double z ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 47 - 51
KSGClient/NachLogin/NachLogin.cpp

@@ -7,13 +7,9 @@
 
 // Inhalt der NachLogin Klasse aus NachLogin.h
 // Konstruktor
-NachLogin::NachLogin( Schrift *zSchrift, Bildschirm *zBildschirm )
+NachLogin::NachLogin()
     : Zeichnung()
 {
-    if( zSchrift )
-        schrift = zSchrift->getThis();
-    if( zBildschirm )
-        bildschirm = zBildschirm->getThis();
     fenster = 0;
     titel = 0;
     freunde = 0;
@@ -36,10 +32,6 @@ NachLogin::~NachLogin()
 {
     if( fenster )
         setAnzeige( NLALogin );
-    if( schrift )
-        schrift = schrift->release();
-    if( bildschirm )
-        bildschirm = bildschirm->release();
     if( editor )
         editor->release();
 }
@@ -50,31 +42,31 @@ void NachLogin::login() // Initialisiert die Oberfl
     lockZeichnung();
     if( fenster )
         logout();
-    fenster = new Fenster();
-    fenster->addStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
-    fenster->setSize( bildschirm->getBackBufferSize() );
-    leistenFenster = new Fenster();
-    leistenFenster->addStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar | Fenster::Style::METransparenz );
-    leistenFenster->setSize( bildschirm->getBackBufferSize() );
-    titel = new TitelLeiste( leistenFenster, schrift );
-    spielenFenster = new Spiele( schrift, fenster, titel->getSpielenX() );
-    shopFenster = new Shop( schrift, fenster, titel->getSpielenX() + 101 );
-    accountAnsehenFenster = new AccountAnsehen( schrift, fenster, titel->getSpielenX() + 202 );
-    mgFenster = new MiniGames( schrift, fenster, titel->getSpielenX() + 303 );
-    newsFenster = new Neuigkeiten( schrift, fenster, titel->getSpielenX() + 404 );
-    editorFenster = new Editor( schrift, fenster, titel->getSpielenX() );
-    nachrichtenListe = new NachrichtenListe( schrift, leistenFenster );
-    freunde = new FreundesListe( schrift, leistenFenster );
-    chatLeiste = new ChatLeiste( schrift, leistenFenster );
-    op = new Einstellungen( schrift, leistenFenster );
-    imSpiel = new ImSpiel( schrift );
-    fenster->addMember( leistenFenster->getThis() );
-    bildschirm->addMember( getThis() );
+    fenster = uiFactory.createFenster( uiFactory.initParam );
+    fenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
+    fenster->setSize( uiFactory.initParam.bildschirm->getBackBufferSize() );
+    leistenFenster = uiFactory.createFenster( uiFactory.initParam );
+    leistenFenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar | Fenster::Style::METransparenz );
+    leistenFenster->setSize( uiFactory.initParam.bildschirm->getBackBufferSize() );
+    titel = new TitelLeiste( leistenFenster );
+    spielenFenster = new Spiele( fenster, titel->getSpielenX() );
+    shopFenster = new Shop( fenster, titel->getSpielenX() + 101 );
+    accountAnsehenFenster = new AccountAnsehen( fenster, titel->getSpielenX() + 202 );
+    mgFenster = new MiniGames( fenster, titel->getSpielenX() + 303 );
+    newsFenster = new Neuigkeiten( fenster, titel->getSpielenX() + 404 );
+    editorFenster = new Editor( fenster, titel->getSpielenX() );
+    nachrichtenListe = new NachrichtenListe( leistenFenster );
+    freunde = new FreundesListe( leistenFenster );
+    chatLeiste = new ChatLeiste( leistenFenster );
+    op = new Einstellungen( leistenFenster );
+    imSpiel = new ImSpiel();
+    fenster->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
+    uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( getThis() ) );
     MausEreignis me;
     me.id = ME_RLinks;
-    bildschirm->lock();
+    uiFactory.initParam.bildschirm->lock();
     titel->druckSpielen( me );
-    bildschirm->unlock();
+    uiFactory.initParam.bildschirm->unlock();
     status = NLANormal;
     unlockZeichnung();
 }
@@ -83,8 +75,7 @@ void NachLogin::logout() // Setzt die Oberfl
 {
     lockZeichnung();
     status = NLALogin;
-    if( bildschirm )
-        bildschirm->removeMember( this );
+    uiFactory.initParam.bildschirm->removeMember( this );
     if( spielenFenster )
         spielenFenster = (Spiele *)spielenFenster->release();
     if( shopFenster )
@@ -99,15 +90,20 @@ void NachLogin::logout() // Setzt die Oberfl
         editorFenster = (Editor *)editorFenster->release();
     if( titel )
     {
+        titel->warteAufThread( 10000 );
         titel->ende();
         titel = (TitelLeiste *)titel->release();
     }
     if( freunde )
+    {
+        freunde->warteAufThread( 10000 );
+        freunde->ende();
         freunde = (FreundesListe *)freunde->release();
+    }
     if( chatLeiste )
         chatLeiste = (ChatLeiste *)chatLeiste->release();
     if( nachrichtenListe )
-        nachrichtenListe = nachrichtenListe->release();
+        nachrichtenListe = (NachrichtenListe *)nachrichtenListe->release();
     if( leistenFenster )
         leistenFenster = (Fenster *)leistenFenster->release();
     if( fenster )
@@ -119,12 +115,12 @@ void NachLogin::logout() // Setzt die Oberfl
     unlockZeichnung();
 }
 
-void NachLogin::setSpielAufzeichnung( AufzeichnungV * video ) // Setzt die Spiel Aufzeichnung
+void NachLogin::setSpielAufzeichnung( AufzeichnungV *video ) // Setzt die Spiel Aufzeichnung
 {
     spielAufzeichnung = video;
 }
 
-void NachLogin::setEditor( EditorV * editor ) // Setzt die Spiel Aufzeichnung
+void NachLogin::setEditor( EditorV *editor ) // Setzt die Spiel Aufzeichnung
 {
     if( this->editor )
         this->editor->release();
@@ -141,14 +137,14 @@ void NachLogin::setAnzeige( NachLoginAnzeige s ) // Setzt den Status des Program
         leistenFenster->doPublicMausEreignis( me );
         leistenFenster->removeStyle( Fenster::Style::Sichtbar );
         fenster->removeMember( leistenFenster );
-        bildschirm->addMember( leistenFenster->getThis() );
+        uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
         titel->setImSpiel( 1 );
     }
     else if( status == NLAImSpiel )
     {
         imSpiel->setSichtbar( 0 );
-        fenster->addMember( leistenFenster->getThis() );
-        bildschirm->removeMember( leistenFenster );
+        fenster->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
+        uiFactory.initParam.bildschirm->removeMember( leistenFenster );
         leistenFenster->addStyle( Fenster::Style::Sichtbar );
         titel->setImSpiel( 0 );
     }
@@ -158,15 +154,15 @@ void NachLogin::setAnzeige( NachLoginAnzeige s ) // Setzt den Status des Program
         leistenFenster->doPublicMausEreignis( me );
         leistenFenster->removeStyle( Fenster::Style::Sichtbar );
         fenster->removeMember( leistenFenster );
-        bildschirm->addMember( leistenFenster->getThis() );
+        uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
         titel->setImVideo( 1 );
     }
     else if( status == NLASpielVideo )
     {
-        fenster->addMember( leistenFenster->getThis() );
-        bildschirm->removeMember( leistenFenster );
+        fenster->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
+        uiFactory.initParam.bildschirm->removeMember( leistenFenster );
         leistenFenster->addStyle( Fenster::Style::Sichtbar );
-        spielAufzeichnung = spielAufzeichnung->release();
+        spielAufzeichnung = (AufzeichnungV *)spielAufzeichnung->release();
         titel->setImVideo( 0 );
     }
     if( s == NLAEditor )
@@ -175,15 +171,15 @@ void NachLogin::setAnzeige( NachLoginAnzeige s ) // Setzt den Status des Program
         leistenFenster->doPublicMausEreignis( me );
         leistenFenster->removeStyle( Fenster::Style::Sichtbar );
         fenster->removeMember( leistenFenster );
-        bildschirm->addMember( leistenFenster->getThis() );
+        uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
         titel->setImSpiel( 1 );
     }
     else if( status == NLAEditor )
     {
-        fenster->addMember( leistenFenster->getThis() );
-        bildschirm->removeMember( leistenFenster );
+        fenster->addMember( dynamic_cast<Zeichnung *>( leistenFenster->getThis() ) );
+        uiFactory.initParam.bildschirm->removeMember( leistenFenster );
         leistenFenster->addStyle( Fenster::Style::Sichtbar );
-        editor = editor->release();
+        editor = (EditorV *)editor->release();
         titel->setImSpiel( 0 );
     }
     if( s == NLALogin )
@@ -208,7 +204,7 @@ void NachLogin::showBars()
     leistenFenster->addStyle( Fenster::Style::Sichtbar );
 }
 
-void NachLogin::doPublicMausEreignis( MausEreignis & me )
+void NachLogin::doPublicMausEreignis( MausEreignis &me )
 {
     if( status == NLASpielVideo )
     {
@@ -264,7 +260,7 @@ void NachLogin::doPublicMausEreignis( MausEreignis & me )
     unlockZeichnung();
 }
 
-void NachLogin::doTastaturEreignis( TastaturEreignis & te )
+void NachLogin::doTastaturEreignis( TastaturEreignis &te )
 {
     if( status == NLASpielVideo )
     {
@@ -382,7 +378,7 @@ bool NachLogin::tick( double tickVal )
     return ret;
 }
 
-void NachLogin::render( Bild & zRObj )
+void NachLogin::render( Bild &zRObj )
 {
     if( status == NLASpielVideo )
     {
@@ -420,7 +416,7 @@ void NachLogin::render( Bild & zRObj )
 }
 
 // constant
-TitelLeiste * NachLogin::zTitelLeiste() const // gibt die Titelleiste zurück
+TitelLeiste *NachLogin::zTitelLeiste() const // gibt die Titelleiste zurück
 {
     return titel;
 }

+ 47 - 49
KSGClient/NachLogin/NachLogin.h

@@ -19,66 +19,64 @@ using namespace Framework;
 
 enum NachLoginAnzeige
 {
-	NLALogin,
-	NLANormal,
-	NLAImSpiel,
-	NLASpielVideo,
+    NLALogin,
+    NLANormal,
+    NLAImSpiel,
+    NLASpielVideo,
     NLAEditor
 };
 
 class NachLogin : public Zeichnung
 {
 private:
-	Fenster *fenster;
-	Fenster *leistenFenster;
-	Schrift *schrift;
-	Bildschirm *bildschirm;
-	TitelLeiste *titel;
-	FreundesListe *freunde;
-	ChatLeiste *chatLeiste;
-	NachrichtenListe *nachrichtenListe;
-	Spiele *spielenFenster;
-	Shop *shopFenster;
-	AccountAnsehen *accountAnsehenFenster;
-	MiniGames *mgFenster;
-	Neuigkeiten *newsFenster;
-	Editor *editorFenster;
-	ImSpiel *imSpiel;
-	AufzeichnungV *spielAufzeichnung;
-	Einstellungen *op;
-	NachLoginAnzeige status;
+    Fenster *fenster;
+    Fenster *leistenFenster;
+    TitelLeiste *titel;
+    FreundesListe *freunde;
+    ChatLeiste *chatLeiste;
+    NachrichtenListe *nachrichtenListe;
+    Spiele *spielenFenster;
+    Shop *shopFenster;
+    AccountAnsehen *accountAnsehenFenster;
+    MiniGames *mgFenster;
+    Neuigkeiten *newsFenster;
+    Editor *editorFenster;
+    ImSpiel *imSpiel;
+    AufzeichnungV *spielAufzeichnung;
+    Einstellungen *op;
+    NachLoginAnzeige status;
     EditorV *editor;
 
 public:
-	// Konstruktor
-	NachLogin( Schrift *zSchrift, Bildschirm *zBildschirm );
-	// Destruktor
-	~NachLogin();
-	// nicht constant
-	void login(); // Initialisiert die Oberfläche
-	void logout(); // Setzt die Oberfläche zurück
-	void setSpielAufzeichnung( AufzeichnungV *video ); // Setzt die Spiel Aufzeichnung
-	void setEditor( EditorV *editor ); // Setzt den Editor
-	void setAnzeige( NachLoginAnzeige s ); // Setzt den Status des Programms
+    // Konstruktor
+    NachLogin();
+    // Destruktor
+    ~NachLogin();
+    // nicht constant
+    void login(); // Initialisiert die Oberfläche
+    void logout(); // Setzt die Oberfläche zurück
+    void setSpielAufzeichnung( AufzeichnungV *video ); // Setzt die Spiel Aufzeichnung
+    void setEditor( EditorV *editor ); // Setzt den Editor
+    void setAnzeige( NachLoginAnzeige s ); // Setzt den Status des Programms
     void hideBars();
     void showBars();
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	bool tick( double tickVal ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	TitelLeiste *zTitelLeiste() const;// gibt die Titelleiste zurück
-	FreundesListe *zFreundesListe() const; // gibt die FreundesListe zurück
-	ChatLeiste *zChatLeiste() const; // gibt die ChatLeiste zurück
-	NachrichtenListe *zNachrichtenListe() const; // gibt die NachrichtenListe zurück
-	Spiele *zSpielenFenster() const; // gibt das Spiele Fenster zurück
-	Shop *zShopFenster() const; // gibt das Shop Fenster zurück
-	AccountAnsehen *zAccountAnsehenFenster() const; // gibt das Account Ansehen Fenster zurück
-	MiniGames *zMGFenster() const; // gibt das MiniGames Fenster zurück
-	Neuigkeiten *zNewsFenster() const; // gibt das News Fenster zurück
-	Editor *zEditorFenster() const; // Gibt das Editor Fenster zurück
-	ImSpiel *zImSpiel() const; // Gibt das Im Spiel Zeichnung zurück
-	Einstellungen *zEinstellungen() const; // Gibt das Einstellungen Zeichnung zurück
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool tick( double tickVal ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    TitelLeiste *zTitelLeiste() const;// gibt die Titelleiste zurück
+    FreundesListe *zFreundesListe() const; // gibt die FreundesListe zurück
+    ChatLeiste *zChatLeiste() const; // gibt die ChatLeiste zurück
+    NachrichtenListe *zNachrichtenListe() const; // gibt die NachrichtenListe zurück
+    Spiele *zSpielenFenster() const; // gibt das Spiele Fenster zurück
+    Shop *zShopFenster() const; // gibt das Shop Fenster zurück
+    AccountAnsehen *zAccountAnsehenFenster() const; // gibt das Account Ansehen Fenster zurück
+    MiniGames *zMGFenster() const; // gibt das MiniGames Fenster zurück
+    Neuigkeiten *zNewsFenster() const; // gibt das News Fenster zurück
+    Editor *zEditorFenster() const; // Gibt das Editor Fenster zurück
+    ImSpiel *zImSpiel() const; // Gibt das Im Spiel Zeichnung zurück
+    Einstellungen *zEinstellungen() const; // Gibt das Einstellungen Zeichnung zurück
 };
 
 #endif;

+ 22 - 20
KSGClient/NachLogin/Neuigkeiten/Neuigkeiten.cpp

@@ -75,10 +75,10 @@ void KSGSR
 
 // Inhalt der Neuigkeiten Klasse aus Neuigkeiten.h
 // Konstruktor
-Neuigkeiten::Neuigkeiten( Schrift * zSchrift, Fenster * zNachLoginFenster, int x )
+Neuigkeiten::Neuigkeiten( Fenster *zNachLoginFenster, int x )
     : Zeichnung()
 {
-    bildschirmGröße = hauptScreen->getBackBufferSize();
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     pos = Punkt( x, 67 );
     gr = Punkt( 102, 32 );
     rahmen = new LRahmen();
@@ -97,11 +97,12 @@ Neuigkeiten::Neuigkeiten( Schrift * zSchrift, Fenster * zNachLoginFenster, int x
     pos1 = Punkt( x, 67 );
     größe2 = Punkt( 800, 500 );
     pos2 = bildschirmGröße / 2 - größe2 / 2;
-    fehler = initTextFeld( 5, 5, 790, 490, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "" );
+    fehler = initTextFeld( 5, 5, 790, 490, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "" );
     laden = (Animation2D *)ladeAnimation->dublizieren();
     laden->setSichtbar( 0 );
     laden->setPosition( 375, 225 );
-    zNachLoginFenster->addMember( getThis() );
+    getThis();
+    zNachLoginFenster->addMember( this );
     ksgsDLL = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
     if( !ksgsDLL )
     {
@@ -122,13 +123,14 @@ Neuigkeiten::Neuigkeiten( Schrift * zSchrift, Fenster * zNachLoginFenster, int x
         {
             script = getKSGSZeichnung();
             script->setSize( 800, 500 );
-            script->setBildschirmZ( hauptScreen->getThis() );
-            script->setSchriftZ( zSchrift->getThis() );
-            script->setRückrufParam( this );
-            script->setRückrufFunktion( KSGSRückruf );
+            script->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+            script->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
+            script->setCallbackParam( this );
+            script->setCallbackFunktion( KSGSRückruf );
             wirdGeladen = 1;
             laden->setSichtbar( 1 );
-            new NewsThread( "Client/Start", dynamic_cast<KSGScriptObj *>( script->getThis() ), (Neuigkeiten *)getThis() );
+            getThis();
+            new NewsThread( "Client/Start", dynamic_cast<KSGScriptObj *>( script->getThis() ), this );
         }
     }
 }
@@ -139,7 +141,7 @@ Neuigkeiten::~Neuigkeiten()
     rahmen->release();
     if( script )
     {
-        script->zurücksetzen();
+        script->reset();
         script->release();
     }
     if( ksgsDLL )
@@ -173,14 +175,14 @@ void Neuigkeiten::endLaden( char *err )
     }
 }
 
-void Neuigkeiten::rückruf( RCArray< KSGSVariable > * parameter, KSGSVariable * *ret )
+void Neuigkeiten::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
 {
     if( wirdGeladen )
         return;
-    KSGSVariable * befehl = parameter->z( 0 );
+    KSGSVariable *befehl = parameter->z( 0 );
     if( !befehl )
         return;
-    Text * b = befehl->getText();
+    Text *b = befehl->getText();
     if( !b || !b->getLength() )
     {
         if( b )
@@ -189,27 +191,27 @@ void Neuigkeiten::r
     }
     wirdGeladen = 1;
     laden->setSichtbar( 1 );
-    new NewsThread( b->getText(), dynamic_cast<KSGScriptObj *>( script->getThis() ), (Neuigkeiten *)getThis() );
+    new NewsThread( b->getText(), dynamic_cast<KSGScriptObj *>( script->getThis() ), dynamic_cast<Neuigkeiten *>( getThis() ) );
     b->release();
 }
 
-void Neuigkeiten::doPublicMausEreignis( MausEreignis & me )
+void Neuigkeiten::doPublicMausEreignis( MausEreignis &me )
 {
     if( wirdGeladen )
         return;
     me.mx -= pos.x;
     me.my -= pos.y;
-    if( script &&sichtbar )
+    if( script && sichtbar )
         script->doPublicMausEreignis( me );
     me.mx += pos.x;
     me.my += pos.y;
 }
 
-void Neuigkeiten::doTastaturEreignis( TastaturEreignis & te )
+void Neuigkeiten::doTastaturEreignis( TastaturEreignis &te )
 {
     if( wirdGeladen )
         return;
-    if( script &&sichtbar )
+    if( script && sichtbar )
         script->doTastaturEreignis( te );
 }
 
@@ -223,7 +225,7 @@ bool Neuigkeiten::tick( double z )
         rend = 0;
         return ret;
     }
-    if( script &&sichtbar )
+    if( script && sichtbar )
         rend |= script->tick( z );
     tickVal += z * 150;
     int val = (int)tickVal;
@@ -286,7 +288,7 @@ bool Neuigkeiten::tick( double z )
     return ret;
 }
 
-void Neuigkeiten::render( Bild & zRObj )
+void Neuigkeiten::render( Bild &zRObj )
 {
     if( pos == pos1 )
         return;

+ 44 - 44
KSGClient/NachLogin/Neuigkeiten/Neuigkeiten.h

@@ -13,58 +13,58 @@ class Neuigkeiten; // Aus dieser Datei
 class NewsThread : private Thread
 {
 private:
-	Text *scriptName;
-	KSGScriptObj *obj;
-	Neuigkeiten *news;
-	
+    Text *scriptName;
+    KSGScriptObj *obj;
+    Neuigkeiten *news;
+
 public:
-	// Konstruktor
-	NewsThread( char *name, KSGScriptObj *obj, Neuigkeiten *n );
-	// Destruktor
-	~NewsThread();
-	// nicht constant
-	void thread();
+    // Konstruktor
+    NewsThread( char *name, KSGScriptObj *obj, Neuigkeiten *n );
+    // Destruktor
+    ~NewsThread();
+    // nicht constant
+    void thread();
 };
 
 class Neuigkeiten : public Zeichnung
 {
 private:
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	HMODULE ksgsDLL;
-	KSGScriptObj *script;
-	TextFeld *fehler;
-	Animation2D *laden;
-	int animation;
-	bool wirdGeladen;
-	int alpha;
-	bool sichtbar;
-	int prozent1;
-	int prozent2;
-	double tickVal;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    HMODULE ksgsDLL;
+    KSGScriptObj *script;
+    TextFeld *fehler;
+    Animation2D *laden;
+    int animation;
+    bool wirdGeladen;
+    int alpha;
+    bool sichtbar;
+    int prozent1;
+    int prozent2;
+    double tickVal;
 
 public:
-	// Konstruktor
-	Neuigkeiten( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~Neuigkeiten();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	void endLaden( char *err );
-	void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	bool tick( double z ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
+    // Konstruktor
+    Neuigkeiten( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~Neuigkeiten();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    void endLaden( char *err );
+    void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    bool tick( double z ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 73 - 138
KSGClient/NachLogin/Shop/Karten/KartenKaufen.cpp

@@ -17,7 +17,7 @@ void KarteKaufenKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVar
 
 // Inhalt der KartenKaufenAuswahl Klasse aus KartenKaufen.h
 // Konstruktor
-KartenKaufenAuswahl::KartenKaufenAuswahl( Schrift * zSchrift )
+KartenKaufenAuswahl::KartenKaufenAuswahl()
     : Thread()
 {
     karteId = 0;
@@ -29,17 +29,17 @@ KartenKaufenAuswahl::KartenKaufenAuswahl( Schrift * zSchrift )
         if( getKSGScript )
         {
             fenster = getKSGScript();
-            fenster->setSchriftZ( zSchrift->getThis() );
+            fenster->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
             fenster->setSize( 555, 380 );
-            fenster->setRückrufParam( this );
-            fenster->setRückrufFunktion( KarteKaufenKSGSAktion );
+            fenster->setCallbackParam( this );
+            fenster->setCallbackFunktion( KarteKaufenKSGSAktion );
         }
         else
         {
             fenster = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -53,7 +53,7 @@ KartenKaufenAuswahl::KartenKaufenAuswahl( Schrift * zSchrift )
     ram = new LRahmen();
     ram->setSize( 555, 380 );
     ram->setFarbe( 0xFFFFFFFF );
-    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    laden = (Framework::Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 252, 165 );
     laden->setSichtbar( 0 );
     pos = Punkt( 220, 55 );
@@ -65,7 +65,7 @@ KartenKaufenAuswahl::~KartenKaufenAuswahl()
 {
     if( fenster )
     {
-        fenster->zurücksetzen();
+        fenster->reset();
         fenster->release();
     }
     ram->release();
@@ -106,7 +106,7 @@ void KartenKaufenAuswahl::thread()
         if( !aktion )
             karteId = 0;
         if( fenster )
-            fenster->zurücksetzen();
+            fenster->reset();
     }
     if( aktion )
     {
@@ -114,7 +114,7 @@ void KartenKaufenAuswahl::thread()
             Sleep( 100 );
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             shopClient->ladeKarteSeite( karteId );
             shopClient->trenne( 0 );
@@ -132,12 +132,12 @@ void KartenKaufenAuswahl::thread()
     run = 0;
 }
 
-void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
     KSGSVariable *befehl = parameter->z( 0 );
     if( !befehl )
         return;
-    Text * b = befehl->getText();
+    Text *b = befehl->getText();
     if( !b )
         return;
     if( b->istGleich( "GetBesitzStatus" ) )
@@ -145,7 +145,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int besitz = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             besitz = shopClient->getKarteBesitzStatus( karteId );
             shopClient->trenne( 0 );
@@ -160,7 +160,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -173,7 +173,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -182,7 +182,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             int preis = 0;
             if( !shopClient )
                 shopClient = mainClient->createShopServerClient();
-            if( shopClient &&shopClient->verbinde() )
+            if( shopClient && shopClient->verbinde() )
             {
                 preis = shopClient->getKartePreis( karteId, testVersion );
                 shopClient->trenne( 0 );
@@ -197,7 +197,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                              "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                        "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                               new Text( "Ok" ), 0 );
             }
         }
@@ -209,7 +209,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int verbleibend = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             verbleibend = shopClient->getKarteTestversion( karteId );
             shopClient->trenne( 0 );
@@ -224,7 +224,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -235,7 +235,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int erwerbbar = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             erwerbbar = shopClient->istKarteErwerbbar( karteId );
             shopClient->trenne( 0 );
@@ -250,7 +250,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -269,7 +269,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -282,7 +282,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -333,7 +333,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -344,7 +344,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                              "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                        "Sie könnte eventuell nicht richtig funktionieren." ),
                                                               new Text( "Ok" ), 0 );
             }
             else
@@ -358,7 +358,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                     else
                         p += 6;
                     Text nn = Text( pf->getText() ) + "/" + (const char *)( n->getText() + p );
-                    Bild * b = bilder->get( nn );
+                    Bild *b = bilder->get( nn );
                     if( b )
                     {
                         KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
@@ -368,7 +368,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                         {
                             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                           new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
-                                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                           new Text( "Ok" ), 0 );
                             b->release();
                         }
@@ -381,7 +381,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                 {
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                   new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                                  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                            "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                   new Text( "Ok" ), 0 );
                 }
             }
@@ -395,7 +395,7 @@ void KartenKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
     }
 }
 
-void KartenKaufenAuswahl::doPublicMausEreignis( MausEreignis & me )
+void KartenKaufenAuswahl::doPublicMausEreignis( MausEreignis &me )
 {
     if( run )
         return;
@@ -407,7 +407,7 @@ void KartenKaufenAuswahl::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void KartenKaufenAuswahl::doTastaturEreignis( TastaturEreignis & te )
+void KartenKaufenAuswahl::doTastaturEreignis( TastaturEreignis &te )
 {
     if( run )
         return;
@@ -427,7 +427,7 @@ bool KartenKaufenAuswahl::tick( double zeit )
             alpha -= (unsigned char)( zeit * 150 );
         rend = 1;
     }
-    if( !run && karteId &&alpha < 255 )
+    if( !run && karteId && alpha < 255 )
     {
         if( alpha + zeit * 150 > 255 )
             alpha = 255;
@@ -438,7 +438,7 @@ bool KartenKaufenAuswahl::tick( double zeit )
     return rend;
 }
 
-void KartenKaufenAuswahl::render( Bild & zRObj )
+void KartenKaufenAuswahl::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
         return;
@@ -451,32 +451,20 @@ void KartenKaufenAuswahl::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread * KartenKaufenAuswahl::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 2000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
-}
-
 
 // Inhalt der KartenKaufenListeEintrag Klasse aus KartenKaufen.h
 // Konstruktor
-KartenKaufenListeEintrag::KartenKaufenListeEintrag( int id, Schrift * schrift )
+KartenKaufenListeEintrag::KartenKaufenListeEintrag( int id )
+    : ReferenceCounter()
 {
     karteId = id;
-    auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
+    auswählen = initKnopf( 173, 73, 22, 22, 0, "" );
     auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     auswählen->setHintergrundBildZ( bilder->get( "data/client/bilder/shop.ltdb/weiter.png" ) );
-    initToolTip( auswählen, "Karte auswählen.", schrift, hauptScreen );
-    schrift->release();
+    initToolTip( auswählen, "Karte auswählen." );
     auswählen->setRahmenBreite( 1 );
-    LTDBDatei * datei = new LTDBDatei();
-    Text * bdpf = new Text( "data/tmp/shop/kaufen/karten/" );
+    LTDBDatei *datei = new LTDBDatei();
+    Text *bdpf = new Text( "data/tmp/shop/kaufen/karten/" );
     bdpf->append( id );
     bdpf->append( "/titelbg.ltdb" );
     datei->setDatei( bdpf );
@@ -492,7 +480,6 @@ KartenKaufenListeEintrag::KartenKaufenListeEintrag( int id, Schrift * schrift )
     ram->setFarbe( 0xFFFFFFFF );
     ausw = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -511,11 +498,11 @@ void KartenKaufenListeEintrag::resetAuswahl()
     ausw = 0;
 }
 
-bool KartenKaufenListeEintrag::doPublicMausEreignis( MausEreignis & me )
+bool KartenKaufenListeEintrag::doPublicMausEreignis( MausEreignis &me )
 {
     bool vera = me.verarbeitet;
     auswählen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         ausw = 1;
         return 1;
@@ -551,7 +538,7 @@ bool KartenKaufenListeEintrag::tick( double zeit )
     return ret;
 }
 
-void KartenKaufenListeEintrag::render( int yOff, Bild & zRObj )
+void KartenKaufenListeEintrag::render( int yOff, Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) )
         return;
@@ -569,27 +556,12 @@ int KartenKaufenListeEintrag::getKarteId() const
     return karteId;
 }
 
-// Reference Counting
-KartenKaufenListeEintrag *KartenKaufenListeEintrag::getThis()
-{
-    ref++;
-    return this;
-}
-
-KartenKaufenListeEintrag *KartenKaufenListeEintrag::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der KartenKaufenListe Klasse aus KartenKaufen.h
 // Konstruktor
-KartenKaufenListe::KartenKaufenListe( Schrift * schrift )
+KartenKaufenListe::KartenKaufenListe()
+    : ReferenceCounter()
 {
-    s = schrift;
     pos = Punkt( 5, 55 );
     ram = new LRahmen();
     ram->setSize( 215, 380 );
@@ -599,31 +571,29 @@ KartenKaufenListe::KartenKaufenListe( Schrift * schrift )
     vScroll->setKlickScroll( 10 );
     vScroll->update( 0, 380 );
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
 KartenKaufenListe::~KartenKaufenListe()
 {
-    s->release();
     ram->release();
     einträge->release();
     vScroll->release();
 }
 
 // nicht constant
-void KartenKaufenListe::ladeKarten( Array< int > * karten )
+void KartenKaufenListe::ladeKarten( Array< int > *karten )
 {
     leeren();
     int anz = karten->getEintragAnzahl();
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient &&shopClient->verbinde() )
+    if( shopClient && shopClient->verbinde() )
     {
         for( int i = 0; i < anz; i++ )
         {
             if( shopClient->ladeKarteTitel( karten->hat( i ) ? karten->get( i ) : 0 ) )
-                einträge->add( new KartenKaufenListeEintrag( karten->hat( i ) ? karten->get( i ) : 0, s->getThis() ) );
+                einträge->add( new KartenKaufenListeEintrag( karten->hat( i ) ? karten->get( i ) : 0 ) );
         }
         shopClient->trenne( 0 );
     }
@@ -640,7 +610,7 @@ void KartenKaufenListe::leeren()
     rend = 1;
 }
 
-int KartenKaufenListe::doPublicMausEreignis( MausEreignis & me )
+int KartenKaufenListe::doPublicMausEreignis( MausEreignis &me )
 {
     int mx = me.mx;
     int my = me.my;
@@ -684,7 +654,7 @@ bool KartenKaufenListe::tick( double zeit )
     return ret;
 }
 
-void KartenKaufenListe::render( Bild & zRObj )
+void KartenKaufenListe::render( Bild &zRObj )
 {
     int br = ram->getBreite();
     int hö = ram->getHeight();
@@ -706,25 +676,10 @@ int KartenKaufenListe::getEintragAnzahl()
     return einträge->getEintragAnzahl();
 }
 
-// Reference Counting
-KartenKaufenListe *KartenKaufenListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-KartenKaufenListe *KartenKaufenListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der KartenKaufen Klasse aus KartenKaufen.h
 // Konstruktor
-KartenKaufen::KartenKaufen( Schrift * zSchrift )
+KartenKaufen::KartenKaufen()
     : Thread()
 {
     Bild *shopZurück = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
@@ -736,39 +691,29 @@ KartenKaufen::KartenKaufen( Schrift * zSchrift )
     ram->setSize( 780, 440 );
     ram->setFarbe( 0xFFFFFFFF );
     pos = Punkt( 10, 50 );
-    spielArt = new AuswahlBox();
+    spielArt = uiFactory.createAuswahlBox( uiFactory.initParam );
     spielArt->setStyle( AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Hintergrund |
                         AuswahlBox::Style::Rahmen | AuswahlBox::Style::Sichtbar | AuswahlBox::Style::VScroll | AuswahlBox::Style::MaxHeight );
     spielArt->setSize( 200, 20 );
     spielArt->setPosition( 5, 5 );
-    spielArt->setRahmenFarbe( 0xFFFFFFFF );
-    spielArt->setRahmenBreite( 1 );
-    spielArt->setMaxAuskappHeight( 100 );
-    spielArt->setSchriftZ( zSchrift->getThis() );
-    spielArt->setHintergrundFarbe( 0xFF000000 );
-    spielArt->setMausEreignis( _ret1ME );
-    spielArt->setAuswAlphaFeldFarbe( 0x5000FF00 );
-    spielArt->setAuswAlphaFeldStrength( -10 );
-    spielArt->setMausAlphaFeldFarbe( 0x1000FF00 );
-    spielArt->setMausAlphaFeldStrength( -10 );
     spielArt->setEintragHeight( 20 );
     spielArt->addEintrag( "Spiel Art wählen" );
-    suchFilterT = initTextFeld( 210, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" );
-    suchFilter = initTextFeld( 285, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( suchFilter, "Gebe etwas vom Namen der Karte ein, nach der du suchst.", zSchrift, hauptScreen );
-    suchen = initKnopf( 515, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
-    seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
-    zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" );
+    suchFilterT = initTextFeld( 210, 5, 70, 20, TextFeld::Style::Text, "Suchfilter:" );
+    suchFilter = initTextFeld( 285, 5, 225, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( suchFilter, "Gebe etwas vom Namen der Karte ein, nach der du suchst." );
+    suchen = initKnopf( 515, 5, 100, 20, Knopf::Style::Sichtbar, "suchen" );
+    seiten = initTextFeld( 55, 30, 250, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
+    zurück = initKnopf( 5, 30, 20, 20, 0, "" );
     zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     zurück->setHintergrundBildZ( shopZurück );
-    initToolTip( zurück, "Seite zurück blättern.", zSchrift, hauptScreen );
-    weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" );
+    initToolTip( zurück, "Seite zurück blättern." );
+    weiter = initKnopf( 30, 30, 20, 20, 0, "" );
     weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     weiter->setHintergrundBildZ( shopWeiter );
-    initToolTip( weiter, "Seite weiter blättern.", zSchrift, hauptScreen );
-    liste = new KartenKaufenListe( zSchrift->getThis() );
-    auswahl = new KartenKaufenAuswahl( zSchrift );
-    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    initToolTip( weiter, "Seite weiter blättern." );
+    liste = new KartenKaufenListe();
+    auswahl = new KartenKaufenAuswahl();
+    laden = (Framework::Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 365, 195 );
     laden->setSichtbar( 0 );
     tickVal = 0;
@@ -792,6 +737,8 @@ KartenKaufen::~KartenKaufen()
     weiter->release();
     zurück->release();
     liste->release();
+    auswahl->warteAufThread( 10000 );
+    auswahl->ende();
     auswahl->release();
     laden->release();
 }
@@ -821,7 +768,7 @@ void KartenKaufen::thread()
             {
                 if( !saList->hat( i ) )
                     continue;
-                Text * name = infoClient->getSpielName( saList->hat( i ) ? saList->get( i ) : 0 );
+                Text *name = infoClient->getSpielName( saList->hat( i ) ? saList->get( i ) : 0 );
                 if( name )
                     saNamen->add( name );
             }
@@ -842,12 +789,12 @@ void KartenKaufen::thread()
         }
         if( !liste->getEintragAnzahl() )
         {
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             suchText->setText( suchFilter->zText()->getText() );
             seite = 1;
             maxSeite = 1;
             aktion = 1;
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
         }
         if( !aktion )
         {
@@ -858,10 +805,10 @@ void KartenKaufen::thread()
     int spielArtId = 0;
     if( spielArt->getAuswahl() > 0 )
         spielArtId = infoClient->getSpielId( spielArt->zEintrag( spielArt->getAuswahl() )->zText()->getText() );
-    Array< int > * list = 0;
+    Array< int > *list = 0;
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient &&shopClient->verbinde() )
+    if( shopClient && shopClient->verbinde() )
     {
         list = shopClient->suchKarten( suchText->getText(), spielArtId );
         shopClient->trenne( 0 );
@@ -885,7 +832,7 @@ void KartenKaufen::thread()
     auswahl->reset();
     liste->ladeKarten( slist );
     slist->release();
-    Text * t = new Text( "Seite " );
+    Text *t = new Text( "Seite " );
     t->append( maxSeite ? seite + 1 : 0 );
     t->append( " von " );
     t->append( maxSeite );
@@ -901,7 +848,7 @@ void KartenKaufen::thread()
     laden->setSichtbar( 0 );
 }
 
-void KartenKaufen::doPublicMausEreignis( MausEreignis & me )
+void KartenKaufen::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar || run )
         return;
@@ -956,13 +903,13 @@ void KartenKaufen::doPublicMausEreignis( MausEreignis & me )
     me.my = my;
 }
 
-void KartenKaufen::doTastaturEreignis( TastaturEreignis & te )
+void KartenKaufen::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar || run )
         return;
     bool vera = te.verarbeitet;
     suchFilter->doTastaturEreignis( te );
-    if( !vera && te.verarbeitet &&te.taste == T_Enter && te.id == TE_Release )
+    if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
     {
         MausEreignis me;
         me.id = ME_RLinks;
@@ -1035,7 +982,7 @@ bool KartenKaufen::tick( double zeit )
     return ret;
 }
 
-void KartenKaufen::render( Bild & zRObj )
+void KartenKaufen::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -1063,16 +1010,4 @@ void KartenKaufen::render( Bild & zRObj )
 bool KartenKaufen::istSichtbar() const
 {
     return sichtbar;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KartenKaufen::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 1000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 92 - 105
KSGClient/NachLogin/Shop/Karten/KartenKaufen.h

@@ -17,132 +17,119 @@ using namespace KSGScript;
 class KartenKaufenAuswahl : public Thread
 {
 private:
-	int karteId;
-	unsigned char alpha;
-	KSGScriptObj *fenster;
-	Framework::Animation2D *laden;
-	Punkt pos;
-	LRahmen *ram;
-	HINSTANCE ksgs;
-	bool aktion;
+    int karteId;
+    unsigned char alpha;
+    KSGScriptObj *fenster;
+    Framework::Animation2D *laden;
+    Punkt pos;
+    LRahmen *ram;
+    HINSTANCE ksgs;
+    bool aktion;
 
 public:
-	// Konstruktor
-	KartenKaufenAuswahl( Schrift *zSchrift );
-	// Destruktor
-	~KartenKaufenAuswahl();
-	// nicht constant
-	void ladeKarteSeite( int id );
-	void reset();
-	virtual void thread();
-	void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    KartenKaufenAuswahl();
+    // Destruktor
+    ~KartenKaufenAuswahl();
+    // nicht constant
+    void ladeKarteSeite( int id );
+    void reset();
+    virtual void thread();
+    void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
 };
 
-class KartenKaufenListeEintrag
+class KartenKaufenListeEintrag : public virtual ReferenceCounter
 {
 private:
-	int karteId;
-	Knopf *auswählen;
-	Bild *hintergrund;
-	AlphaFeld *ausgewählt;
-	LRahmen *ram;
-	bool ausw;
-	bool rend;
-	int ref;
+    int karteId;
+    Knopf *auswählen;
+    Bild *hintergrund;
+    AlphaFeld *ausgewählt;
+    LRahmen *ram;
+    bool ausw;
+    bool rend;
 
 public:
-	// Konstruktor
-	KartenKaufenListeEintrag( int id, Schrift *schrift );
-	// Destruktor
-	~KartenKaufenListeEintrag();
-	// nicht constant
-	void resetAuswahl();
-	bool doPublicMausEreignis( MausEreignis &me );
-	bool tick( double zeit );
-	void render( int yOff, Bild &zRObj );
-	// constant
-	int getKarteId() const;
-	// Reference Counting
-	KartenKaufenListeEintrag *getThis();
-	KartenKaufenListeEintrag *release();
+    // Konstruktor
+    KartenKaufenListeEintrag( int id );
+    // Destruktor
+    ~KartenKaufenListeEintrag();
+    // nicht constant
+    void resetAuswahl();
+    bool doPublicMausEreignis( MausEreignis &me );
+    bool tick( double zeit );
+    void render( int yOff, Bild &zRObj );
+    // constant
+    int getKarteId() const;
 };
 
-class KartenKaufenListe
+class KartenKaufenListe : public virtual ReferenceCounter
 {
 private:
-	Schrift *s;
-	LRahmen *ram;
-	Punkt pos;
-	RCArray< KartenKaufenListeEintrag > *einträge;
-	VScrollBar *vScroll;
-	bool rend;
-	int ref;
-	Critical cs;
+    LRahmen *ram;
+    Punkt pos;
+    RCArray< KartenKaufenListeEintrag > *einträge;
+    VScrollBar *vScroll;
+    bool rend;
+    Critical cs;
 
 public:
-	// Konstruktor
-	KartenKaufenListe( Schrift *schrift );
-	// Destruktor
-	~KartenKaufenListe();
-	// nicht constant
-	void ladeKarten( Array< int > *karten );
-	void leeren();
-	int doPublicMausEreignis( MausEreignis &me );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	int getEintragAnzahl();
-	// Reference Counting
-	KartenKaufenListe *getThis();
-	KartenKaufenListe *release();
+    // Konstruktor
+    KartenKaufenListe();
+    // Destruktor
+    ~KartenKaufenListe();
+    // nicht constant
+    void ladeKarten( Array< int > *karten );
+    void leeren();
+    int doPublicMausEreignis( MausEreignis &me );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    int getEintragAnzahl();
 };
 
 class KartenKaufen : public Thread
 {
 private:
-	unsigned char alpha;
-	bool sichtbar;
-	Text *suchText;
-	LRahmen *ram;
-	AuswahlBox *spielArt;
-	TextFeld *suchFilterT;
-	TextFeld *suchFilter;
-	Knopf *suchen;
-	TextFeld *seiten;
-	Knopf *weiter;
-	Knopf *zurück;
-	Punkt pos;
-	KartenKaufenListe *liste;
-	KartenKaufenAuswahl *auswahl;
-	Framework::Animation2D *laden;
-	double tickVal;
-	int seite;
-	int maxSeite;
-	int aktion;
-	bool rend;
+    unsigned char alpha;
+    bool sichtbar;
+    Text *suchText;
+    LRahmen *ram;
+    AuswahlBox *spielArt;
+    TextFeld *suchFilterT;
+    TextFeld *suchFilter;
+    Knopf *suchen;
+    TextFeld *seiten;
+    Knopf *weiter;
+    Knopf *zurück;
+    Punkt pos;
+    KartenKaufenListe *liste;
+    KartenKaufenAuswahl *auswahl;
+    Framework::Animation2D *laden;
+    double tickVal;
+    int seite;
+    int maxSeite;
+    int aktion;
+    bool rend;
 
 public:
-	// Konstruktor
-	KartenKaufen( Schrift *zSchrift );
-	// Destruktor
-	~KartenKaufen();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	virtual void thread();
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    KartenKaufen();
+    // Destruktor
+    ~KartenKaufen();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    virtual void thread();
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 201 - 196
KSGClient/NachLogin/Shop/Shop.cpp

@@ -7,236 +7,241 @@
 
 // Inhalt der Shop Klasse aus Shop.h
 // Konstruktor
-Shop::Shop( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
-	: Zeichnung()
+Shop::Shop( Fenster *zNachLoginFenster, int x )
+    : Zeichnung()
 {
-	bildschirmGröße = hauptScreen->getBackBufferSize();
-	pos = Punkt( x, 67 );
-	gr = Punkt( 102, 32 );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setSize( 102, 32 );
-	spiele = initKnopf( 10, 10, 100, 30, zSchrift, Knopf::Style::Sichtbar, "Spiele" );
-	spiele->setRahmenBreite( 2 );
-	spiele->setAlphaFeldFarbe( 0xFF000000 );
-	spiele->setAlphaFeldStrength( 20 );
-	initToolTip( spiele, "Shop nach Spielen durchsuchen.", zSchrift, hauptScreen );
-	karten = initKnopf( 120, 10, 100, 30, zSchrift, Knopf::Style::Sichtbar, "Karten" );
-	initToolTip( karten, "Shop nach Karten durchsuchen.", zSchrift, hauptScreen );
-	alpha = 0;
-	animation = 0;
-	sichtbar = 0;
-	tickVal = 0;
-	jetzt = 0;
-	prozent1 = 0;
-	prozent2 = 0;
-	begPos = Punkt( 0, 0 );
-	begGröße = Punkt( 0, 0 );
-	größe1 = Punkt( 102, 32 );
-	pos1 = Punkt( x, 67 );
-	größe2 = Punkt( 800, 500 );
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	zNachLoginFenster->addMember( getThis() );
-	spielKaufen = new SpieleKaufen( zSchrift );
-	karteKaufen = new KartenKaufen( zSchrift );
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    pos = Punkt( x, 67 );
+    gr = Punkt( 102, 32 );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setSize( 102, 32 );
+    spiele = initKnopf( 10, 10, 100, 30, Knopf::Style::Sichtbar, "Spiele" );
+    spiele->setRahmenBreite( 2 );
+    spiele->setAlphaFeldFarbe( 0xFF000000 );
+    spiele->setAlphaFeldStrength( 20 );
+    initToolTip( spiele, "Shop nach Spielen durchsuchen." );
+    karten = initKnopf( 120, 10, 100, 30, Knopf::Style::Sichtbar, "Karten" );
+    initToolTip( karten, "Shop nach Karten durchsuchen." );
+    alpha = 0;
+    animation = 0;
+    sichtbar = 0;
+    tickVal = 0;
+    jetzt = 0;
+    prozent1 = 0;
+    prozent2 = 0;
+    begPos = Punkt( 0, 0 );
+    begGröße = Punkt( 0, 0 );
+    größe1 = Punkt( 102, 32 );
+    pos1 = Punkt( x, 67 );
+    größe2 = Punkt( 800, 500 );
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    getThis();
+    zNachLoginFenster->addMember( this );
+    spielKaufen = new SpieleKaufen();
+    karteKaufen = new KartenKaufen();
 }
 
 // Destruktor
 Shop::~Shop()
 {
-	rahmen->release();
-	spiele->release();
-	karten->release();
-	spielKaufen->release();
-	karteKaufen->release();
+    rahmen->release();
+    spiele->release();
+    karten->release();
+    spielKaufen->warteAufThread( 10000 );
+    spielKaufen->ende();
+    spielKaufen->release();
+    karteKaufen->warteAufThread( 10000 );
+    karteKaufen->ende();
+    karteKaufen->release();
 }
 
 // nicht constant
 void Shop::setSichtbar( bool sicht )
 {
-	begPos = pos;
-	begGröße = gr;
-	animation |= ( sicht ? 0x1 : 0x2 );
-	rend = 1;
+    begPos = pos;
+    begGröße = gr;
+    animation |= ( sicht ? 0x1 : 0x2 );
+    rend = 1;
 }
 
 bool Shop::tick( double tickVal )
 {
-	rend |= spiele->tick( tickVal );
-	rend |= karten->tick( tickVal );
-	rend |= spielKaufen->tick( tickVal );
-	rend |= karteKaufen->tick( tickVal );
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	if( val < 1 )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	this->tickVal -= val;
-	if( ( animation | 0x1 ) == animation ) // Einblenden
-	{
-		if( prozent1 != 100 )
-		{
-			prozent1 += val;
-			if( prozent1 >= 100 )
-			{
-				prozent1 = 100;
-				if( !jetzt )
-				{
-					spielKaufen->setSichtbar( 1 );
-					jetzt = 1;
-				}
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
-		}
-		else if( alpha != 255 )
-		{
-			alpha += val * 2;
-			if( alpha >= 255 || ( animation | 0x2 ) == animation )
-			{
-				alpha = 255;
-				animation &= ~0x1;
-				sichtbar = 1;
-				prozent1 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x2 ) == animation ) // ausblenden
-	{
-		if( alpha != 0 )
-		{
-			alpha -= val * 2;
-			if( alpha < 0 )
-				alpha = 0;
-		}
-		else
-		{
-			prozent2 += val;
-			if( prozent2 > 100 )
-				prozent2 = 100;
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
-			if( prozent2 == 100 )
-			{
-				prozent2 = 0;
-				animation &= ~0x2;
-				sichtbar = 0;
-			}
-		}
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= spiele->tick( tickVal );
+    rend |= karten->tick( tickVal );
+    rend |= spielKaufen->tick( tickVal );
+    rend |= karteKaufen->tick( tickVal );
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    if( val < 1 )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    this->tickVal -= val;
+    if( ( animation | 0x1 ) == animation ) // Einblenden
+    {
+        if( prozent1 != 100 )
+        {
+            prozent1 += val;
+            if( prozent1 >= 100 )
+            {
+                prozent1 = 100;
+                if( !jetzt )
+                {
+                    spielKaufen->setSichtbar( 1 );
+                    jetzt = 1;
+                }
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
+        }
+        else if( alpha != 255 )
+        {
+            alpha += val * 2;
+            if( alpha >= 255 || ( animation | 0x2 ) == animation )
+            {
+                alpha = 255;
+                animation &= ~0x1;
+                sichtbar = 1;
+                prozent1 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x2 ) == animation ) // ausblenden
+    {
+        if( alpha != 0 )
+        {
+            alpha -= val * 2;
+            if( alpha < 0 )
+                alpha = 0;
+        }
+        else
+        {
+            prozent2 += val;
+            if( prozent2 > 100 )
+                prozent2 = 100;
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
+            if( prozent2 == 100 )
+            {
+                prozent2 = 0;
+                animation &= ~0x2;
+                sichtbar = 0;
+            }
+        }
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void Shop::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !sichtbar )
-		return;
-	if( animation )
-		return;
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	int ak = 0;
-	bool tmp = me.verarbeitet;
-	spiele->doPublicMausEreignis( me );
-	ak = me.verarbeitet ? 1 : 0;
-	karten->doPublicMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 2 : ak;
-	if( tmp )
-		ak = 0;
-	if( me.id == ME_RLinks )
-	{
-		switch( ak )
-		{
-		case 1: // spiele Klick
-			if( jetzt == 1 )
-				break;
-			karten->setRahmenBreite( 1 );
-			karten->setAlphaFeldFarbe( 0x5500FF00 );
-			karten->setAlphaFeldStrength( -5 );
-			spiele->setRahmenBreite( 2 );
-			spiele->setAlphaFeldFarbe( 0xFF000000 );
-			spiele->setAlphaFeldStrength( 20 );
-			karteKaufen->setSichtbar( 0 );
-			spielKaufen->setSichtbar( 1 );
-			jetzt = 1;
-			break;
-		case 2: // karten Klick
-			if( jetzt == 2 || jetzt == 3 )
-				break;
-			spiele->setRahmenBreite( 1 );
-			spiele->setAlphaFeldFarbe( 0x5500FF00 );
-			spiele->setAlphaFeldStrength( -5 );
-			karten->setRahmenBreite( 2 );
-			karten->setAlphaFeldFarbe( 0xFF000000 );
-			karten->setAlphaFeldStrength( 20 );
-			spielKaufen->setSichtbar( 0 );
-			karteKaufen->setSichtbar( 1 );
-			jetzt = 2;
-			break;
-		}
-	}
-	switch( jetzt )
-	{
-	case 1: // Spiel kaufen
-		spielKaufen->doPublicMausEreignis( me );
-		break;
-	case 2: // Karten kaufen
-		karteKaufen->doPublicMausEreignis( me );
-		break;
-	}
-	me.mx = mx;
-	me.my = my;
+    if( !sichtbar )
+        return;
+    if( animation )
+        return;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    int ak = 0;
+    bool tmp = me.verarbeitet;
+    spiele->doPublicMausEreignis( me );
+    ak = me.verarbeitet ? 1 : 0;
+    karten->doPublicMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 2 : ak;
+    if( tmp )
+        ak = 0;
+    if( me.id == ME_RLinks )
+    {
+        switch( ak )
+        {
+        case 1: // spiele Klick
+            if( jetzt == 1 )
+                break;
+            karten->setRahmenBreite( 1 );
+            karten->setAlphaFeldFarbe( 0x5500FF00 );
+            karten->setAlphaFeldStrength( -5 );
+            spiele->setRahmenBreite( 2 );
+            spiele->setAlphaFeldFarbe( 0xFF000000 );
+            spiele->setAlphaFeldStrength( 20 );
+            karteKaufen->setSichtbar( 0 );
+            spielKaufen->setSichtbar( 1 );
+            jetzt = 1;
+            break;
+        case 2: // karten Klick
+            if( jetzt == 2 || jetzt == 3 )
+                break;
+            spiele->setRahmenBreite( 1 );
+            spiele->setAlphaFeldFarbe( 0x5500FF00 );
+            spiele->setAlphaFeldStrength( -5 );
+            karten->setRahmenBreite( 2 );
+            karten->setAlphaFeldFarbe( 0xFF000000 );
+            karten->setAlphaFeldStrength( 20 );
+            spielKaufen->setSichtbar( 0 );
+            karteKaufen->setSichtbar( 1 );
+            jetzt = 2;
+            break;
+        }
+    }
+    switch( jetzt )
+    {
+    case 1: // Spiel kaufen
+        spielKaufen->doPublicMausEreignis( me );
+        break;
+    case 2: // Karten kaufen
+        karteKaufen->doPublicMausEreignis( me );
+        break;
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
 void Shop::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( !sichtbar )
-		return;
-	switch( jetzt )
-	{
-	case 1: // Spiel kaufen
-		spielKaufen->doTastaturEreignis( te );
-		break;
-	case 2: // Karten kaufen
-		karteKaufen->doTastaturEreignis( te );
-		break;
-	}
+    if( !sichtbar )
+        return;
+    switch( jetzt )
+    {
+    case 1: // Spiel kaufen
+        spielKaufen->doTastaturEreignis( te );
+        break;
+    case 2: // Karten kaufen
+        karteKaufen->doTastaturEreignis( te );
+        break;
+    }
 }
 
 void Shop::render( Bild &zRObj )
 {
-	if( pos == pos1 )
-		return;
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	rahmen->setSize( gr );
-	rahmen->render( zRObj );
-	int rbr = rahmen->getRBreite();
-	zRObj.setAlpha( (unsigned char)alpha );
-	spiele->render( zRObj );
-	karten->render( zRObj );
-	spielKaufen->render( zRObj );
-	karteKaufen->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    if( pos == pos1 )
+        return;
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    rahmen->setSize( gr );
+    rahmen->render( zRObj );
+    int rbr = rahmen->getRBreite();
+    zRObj.setAlpha( (unsigned char)alpha );
+    spiele->render( zRObj );
+    karten->render( zRObj );
+    spielKaufen->render( zRObj );
+    karteKaufen->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool Shop::istAnimiert() const
 {
-	return animation != 0;
+    return animation != 0;
 }
 
 bool Shop::istSichtbar() const
 {
-	return sichtbar || prozent1 != 0;
+    return sichtbar || prozent1 != 0;
 }

+ 32 - 32
KSGClient/NachLogin/Shop/Shop.h

@@ -14,40 +14,40 @@ using namespace Framework;
 class Shop : public Zeichnung
 {
 private:
-	int animation;
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	Knopf *spiele;
-	Knopf *karten;
-	SpieleKaufen *spielKaufen;
-	KartenKaufen *karteKaufen;
-	int alpha;
-	bool sichtbar;
-	int jetzt;
-	int prozent1;
-	int prozent2;
-	double tickVal;
+    int animation;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    Knopf *spiele;
+    Knopf *karten;
+    SpieleKaufen *spielKaufen;
+    KartenKaufen *karteKaufen;
+    int alpha;
+    bool sichtbar;
+    int jetzt;
+    int prozent1;
+    int prozent2;
+    double tickVal;
 
 public:
-	// Konstruktor
-	Shop( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~Shop();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
+    // Konstruktor
+    Shop( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~Shop();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
 };
 
 #endif

+ 69 - 124
KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.cpp

@@ -17,7 +17,7 @@ void SpielKaufenKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVar
 
 // Inhalt der SpieleKaufenAuswahl Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift * zSchrift )
+SpieleKaufenAuswahl::SpieleKaufenAuswahl()
     : Thread()
 {
     spielId = 0;
@@ -29,18 +29,18 @@ SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift * zSchrift )
         if( getKSGScript )
         {
             fenster = getKSGScript();
-            fenster->setBildschirmZ( hauptScreen->getThis() );
-            fenster->setSchriftZ( zSchrift->getThis() );
+            fenster->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+            fenster->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
             fenster->setSize( 555, 380 );
-            fenster->setRückrufParam( this );
-            fenster->setRückrufFunktion( SpielKaufenKSGSAktion );
+            fenster->setCallbackParam( this );
+            fenster->setCallbackFunktion( SpielKaufenKSGSAktion );
         }
         else
         {
             fenster = 0;
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -54,7 +54,7 @@ SpieleKaufenAuswahl::SpieleKaufenAuswahl( Schrift * zSchrift )
     ram = new LRahmen();
     ram->setSize( 555, 380 );
     ram->setFarbe( 0xFFFFFFFF );
-    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    laden = (Framework::Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 252, 165 );
     laden->setSichtbar( 0 );
     pos = Punkt( 220, 55 );
@@ -66,7 +66,7 @@ SpieleKaufenAuswahl::~SpieleKaufenAuswahl()
 {
     if( fenster )
     {
-        fenster->zurücksetzen();
+        fenster->reset();
         fenster->release();
     }
     ram->release();
@@ -107,7 +107,7 @@ void SpieleKaufenAuswahl::thread()
         if( !aktion )
             spielId = 0;
         if( fenster )
-            fenster->zurücksetzen();
+            fenster->reset();
     }
     if( aktion )
     {
@@ -115,7 +115,7 @@ void SpieleKaufenAuswahl::thread()
             Sleep( 100 );
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             shopClient->ladeSpielSeite( spielId );
             shopClient->trenne( 0 );
@@ -133,12 +133,12 @@ void SpieleKaufenAuswahl::thread()
     run = 0;
 }
 
-void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
     KSGSVariable *befehl = parameter->z( 0 );
     if( !befehl )
         return;
-    Text * b = befehl->getText();
+    Text *b = befehl->getText();
     if( !b )
         return;
     if( b->istGleich( "GetBesitzStatus" ) )
@@ -146,7 +146,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int besitz = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             besitz = shopClient->getSpielBesitzStatus( spielId );
             shopClient->trenne( 0 );
@@ -161,7 +161,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -174,7 +174,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -183,7 +183,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             int preis = 0;
             if( !shopClient )
                 shopClient = mainClient->createShopServerClient();
-            if( shopClient &&shopClient->verbinde() )
+            if( shopClient && shopClient->verbinde() )
             {
                 preis = shopClient->getSpielPreis( spielId, testVersion );
                 shopClient->trenne( 0 );
@@ -198,7 +198,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                              "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                        "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                               new Text( "Ok" ), 0 );
             }
         }
@@ -210,7 +210,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int verbleibend = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             verbleibend = shopClient->getSpielTestversion( spielId );
             shopClient->trenne( 0 );
@@ -225,7 +225,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -236,7 +236,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         int erwerbbar = 0;
         if( !shopClient )
             shopClient = mainClient->createShopServerClient();
-        if( shopClient &&shopClient->verbinde() )
+        if( shopClient && shopClient->verbinde() )
         {
             erwerbbar = shopClient->istSpielErwerbbar( spielId );
             shopClient->trenne( 0 );
@@ -251,7 +251,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -270,7 +270,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
         b->release();
@@ -283,7 +283,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -381,7 +381,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                          "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                    "Sie könnte eventuell nicht richtig funktionieren." ),
                                                           new Text( "Ok" ), 0 );
         }
         else
@@ -392,7 +392,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
             {
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Auf dieser Seite befindet sich ein Fehler im KSG-Script. "
-                                                              "Sie könnte eventuell nicht richtig funktionieren." ),
+                                                                        "Sie könnte eventuell nicht richtig funktionieren." ),
                                                               new Text( "Ok" ), 0 );
             }
             else
@@ -406,7 +406,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                     else
                         p += 6;
                     Text nn = Text( pf->getText() ) + "/" + (const char *)( n->getText() + p );
-                    Bild * b = bilder->get( nn );
+                    Bild *b = bilder->get( nn );
                     if( b )
                     {
                         KSGSVariableDef def = { KSGS_BILD, 0, 3, "" };
@@ -416,7 +416,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                         {
                             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                           new Text( "Der Einstiegspunkt '" KSGS_SET_BILD_FUNKTION "' in der DLL-Datei "
-                                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                           new Text( "Ok" ), 0 );
                             b->release();
                         }
@@ -429,7 +429,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
                 {
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                   new Text( "Der Einstiegspunkt '" KSGS_VARIABLE_FUNKTION "' in der DLL-Datei "
-                                                                  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                            "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                   new Text( "Ok" ), 0 );
                 }
             }
@@ -443,7 +443,7 @@ void SpieleKaufenAuswahl::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSV
     }
 }
 
-void SpieleKaufenAuswahl::doPublicMausEreignis( MausEreignis & me )
+void SpieleKaufenAuswahl::doPublicMausEreignis( MausEreignis &me )
 {
     if( run )
         return;
@@ -455,7 +455,7 @@ void SpieleKaufenAuswahl::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis & te )
+void SpieleKaufenAuswahl::doTastaturEreignis( TastaturEreignis &te )
 {
     if( run )
         return;
@@ -475,7 +475,7 @@ bool SpieleKaufenAuswahl::tick( double zeit )
             alpha -= (unsigned char)( zeit * 150 );
         rend = 1;
     }
-    if( !run && spielId &&alpha < 255 )
+    if( !run && spielId && alpha < 255 )
     {
         if( alpha + zeit * 150 > 255 )
             alpha = 255;
@@ -486,7 +486,7 @@ bool SpieleKaufenAuswahl::tick( double zeit )
     return rend;
 }
 
-void SpieleKaufenAuswahl::render( Bild & zRObj )
+void SpieleKaufenAuswahl::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, ram->getBreite(), ram->getHeight() ) )
         return;
@@ -499,32 +499,20 @@ void SpieleKaufenAuswahl::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread * SpieleKaufenAuswahl::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 2000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
-}
-
 
 // Inhalt der SpieleKaufenListeEintrag Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift * schrift )
+SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id )
+    : ReferenceCounter()
 {
     spielId = id;
-    auswählen = initKnopf( 173, 73, 22, 22, 0, 0, "" );
+    auswählen = initKnopf( 173, 73, 22, 22, 0, "" );
     auswählen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Rahmen | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     auswählen->setHintergrundBildZ( bilder->get( "data/client/bilder/shop.ltdb/weiter.png" ) );
-    initToolTip( auswählen, "Spiel auswählen.", schrift, hauptScreen );
-    schrift->release();
+    initToolTip( auswählen, "Spiel auswählen." );
     auswählen->setRahmenBreite( 1 );
-    LTDBDatei * datei = new LTDBDatei();
-    Text * bdpf = new Text( "data/tmp/shop/kaufen/spiele/" );
+    LTDBDatei *datei = new LTDBDatei();
+    Text *bdpf = new Text( "data/tmp/shop/kaufen/spiele/" );
     bdpf->append( id );
     bdpf->append( "/titelbg.ltdb" );
     datei->setDatei( bdpf );
@@ -540,7 +528,6 @@ SpieleKaufenListeEintrag::SpieleKaufenListeEintrag( int id, Schrift * schrift )
     ram->setFarbe( 0xFFFFFFFF );
     ausw = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -559,11 +546,11 @@ void SpieleKaufenListeEintrag::resetAuswahl()
     ausw = 0;
 }
 
-bool SpieleKaufenListeEintrag::doPublicMausEreignis( MausEreignis & me )
+bool SpieleKaufenListeEintrag::doPublicMausEreignis( MausEreignis &me )
 {
     bool vera = me.verarbeitet;
     auswählen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         ausw = 1;
         return 1;
@@ -599,7 +586,7 @@ bool SpieleKaufenListeEintrag::tick( double zeit )
     return ret;
 }
 
-void SpieleKaufenListeEintrag::render( int yOff, Bild & zRObj )
+void SpieleKaufenListeEintrag::render( int yOff, Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 0, yOff, 200, 100 ) )
         return;
@@ -617,27 +604,12 @@ int SpieleKaufenListeEintrag::getSpielId() const
     return spielId;
 }
 
-// Reference Counting
-SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpieleKaufenListeEintrag *SpieleKaufenListeEintrag::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der SpieleKaufenListe Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufenListe::SpieleKaufenListe( Schrift * schrift )
+SpieleKaufenListe::SpieleKaufenListe()
+    : ReferenceCounter()
 {
-    s = schrift;
     pos = Punkt( 5, 55 );
     ram = new LRahmen();
     ram->setSize( 215, 380 );
@@ -647,31 +619,29 @@ SpieleKaufenListe::SpieleKaufenListe( Schrift * schrift )
     vScroll->setKlickScroll( 10 );
     vScroll->update( 0, 380 );
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
 SpieleKaufenListe::~SpieleKaufenListe()
 {
-    s->release();
     ram->release();
     einträge->release();
     vScroll->release();
 }
 
 // nicht constant
-void SpieleKaufenListe::ladeSpiele( Array< int > * spiele )
+void SpieleKaufenListe::ladeSpiele( Array< int > *spiele )
 {
     leeren();
     int anz = spiele->getEintragAnzahl();
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient &&shopClient->verbinde() )
+    if( shopClient && shopClient->verbinde() )
     {
         for( int i = 0; i < anz; i++ )
         {
             if( shopClient->ladeSpielTitel( spiele->hat( i ) ? spiele->get( i ) : 0 ) )
-                einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0, s->getThis() ) );
+                einträge->add( new SpieleKaufenListeEintrag( spiele->hat( i ) ? spiele->get( i ) : 0 ) );
         }
         shopClient->trenne( 0 );
     }
@@ -688,7 +658,7 @@ void SpieleKaufenListe::leeren()
     rend = 1;
 }
 
-int SpieleKaufenListe::doPublicMausEreignis( MausEreignis & me )
+int SpieleKaufenListe::doPublicMausEreignis( MausEreignis &me )
 {
     int mx = me.mx;
     int my = me.my;
@@ -732,7 +702,7 @@ bool SpieleKaufenListe::tick( double zeit )
     return ret;
 }
 
-void SpieleKaufenListe::render( Bild & zRObj )
+void SpieleKaufenListe::render( Bild &zRObj )
 {
     int br = ram->getBreite();
     int hö = ram->getHeight();
@@ -754,25 +724,10 @@ int SpieleKaufenListe::getEintragAnzahl()
     return einträge->getEintragAnzahl();
 }
 
-// Reference Counting
-SpieleKaufenListe *SpieleKaufenListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpieleKaufenListe *SpieleKaufenListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der SpieleKaufen Klasse aus SpieleKaufen.h
 // Konstruktor
-SpieleKaufen::SpieleKaufen( Schrift * zSchrift )
+SpieleKaufen::SpieleKaufen()
     : Thread()
 {
     Bild *shopZurück = bilder->get( "data/client/bilder/shop.ltdb/zurück.png" );
@@ -784,22 +739,22 @@ SpieleKaufen::SpieleKaufen( Schrift * zSchrift )
     ram->setSize( 780, 440 );
     ram->setFarbe( 0xFFFFFFFF );
     pos = Punkt( 10, 50 );
-    suchFilterT = initTextFeld( 5, 5, 70, 20, zSchrift, TextFeld::Style::Text, "Suchfilter:" );
-    suchFilter = initTextFeld( 80, 5, 225, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst.", zSchrift, hauptScreen );
-    suchen = initKnopf( 310, 5, 100, 20, zSchrift, Knopf::Style::Sichtbar, "suchen" );
-    seiten = initTextFeld( 55, 30, 250, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
-    zurück = initKnopf( 5, 30, 20, 20, 0, 0, "" );
+    suchFilterT = initTextFeld( 5, 5, 70, 20, TextFeld::Style::Text, "Suchfilter:" );
+    suchFilter = initTextFeld( 80, 5, 225, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( suchFilter, "Gebe etwas vom Namen des Spieles ein, nach dem du suchst." );
+    suchen = initKnopf( 310, 5, 100, 20, Knopf::Style::Sichtbar, "suchen" );
+    seiten = initTextFeld( 55, 30, 250, 20, TextFeld::Style::Text | TextFeld::Style::VCenter, "Seite 0 von 0, 0 Funde." );
+    zurück = initKnopf( 5, 30, 20, 20, 0, "" );
     zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     zurück->setHintergrundBildZ( shopZurück );
-    initToolTip( zurück, "Seite zurück blättern.", zSchrift, hauptScreen );
-    weiter = initKnopf( 30, 30, 20, 20, 0, 0, "" );
+    initToolTip( zurück, "Seite zurück blättern." );
+    weiter = initKnopf( 30, 30, 20, 20, 0, "" );
     weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     weiter->setHintergrundBildZ( shopWeiter );
-    initToolTip( weiter, "Seite weiter blättern.", zSchrift, hauptScreen );
-    liste = new SpieleKaufenListe( zSchrift->getThis() );
-    auswahl = new SpieleKaufenAuswahl( zSchrift );
-    laden = ( Framework::Animation2D * )ladeAnimation->dublizieren();
+    initToolTip( weiter, "Seite weiter blättern." );
+    liste = new SpieleKaufenListe();
+    auswahl = new SpieleKaufenAuswahl();
+    laden = (Framework::Animation2D *)ladeAnimation->dublizieren();
     laden->setPosition( 365, 195 );
     laden->setSichtbar( 0 );
     tickVal = 0;
@@ -820,6 +775,8 @@ SpieleKaufen::~SpieleKaufen()
     weiter->release();
     zurück->release();
     liste->release();
+    auswahl->warteAufThread( 10000 );
+    auswahl->ende();
     auswahl->release();
     laden->release();
 }
@@ -845,7 +802,7 @@ void SpieleKaufen::thread()
     Array< int > *list = 0;
     if( !shopClient )
         shopClient = mainClient->createShopServerClient();
-    if( shopClient &&shopClient->verbinde() )
+    if( shopClient && shopClient->verbinde() )
     {
         list = shopClient->suchSpiele( suchText->getText() );
         shopClient->trenne( 0 );
@@ -869,7 +826,7 @@ void SpieleKaufen::thread()
     auswahl->reset();
     liste->ladeSpiele( slist );
     slist->release();
-    Text * t = new Text( "Seite " );
+    Text *t = new Text( "Seite " );
     t->append( maxSeite ? seite + 1 : 0 );
     t->append( " von " );
     t->append( maxSeite );
@@ -886,7 +843,7 @@ void SpieleKaufen::thread()
     run = 0;
 }
 
-void SpieleKaufen::doPublicMausEreignis( MausEreignis & me )
+void SpieleKaufen::doPublicMausEreignis( MausEreignis &me )
 {
     if( !sichtbar || run )
         return;
@@ -937,13 +894,13 @@ void SpieleKaufen::doPublicMausEreignis( MausEreignis & me )
     me.my = my;
 }
 
-void SpieleKaufen::doTastaturEreignis( TastaturEreignis & te )
+void SpieleKaufen::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !sichtbar || run )
         return;
     bool vera = te.verarbeitet;
     suchFilter->doTastaturEreignis( te );
-    if( !vera && te.verarbeitet &&te.taste == T_Enter && te.id == TE_Release )
+    if( !vera && te.verarbeitet && te.taste == T_Enter && te.id == TE_Release )
     {
         MausEreignis me;
         me.id = ME_RLinks;
@@ -1016,7 +973,7 @@ bool SpieleKaufen::tick( double zeit )
     return ret;
 }
 
-void SpieleKaufen::render( Bild & zRObj )
+void SpieleKaufen::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -1043,16 +1000,4 @@ void SpieleKaufen::render( Bild & zRObj )
 bool SpieleKaufen::istSichtbar() const
 {
     return sichtbar;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *SpieleKaufen::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 1000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 90 - 103
KSGClient/NachLogin/Shop/Spiele/SpieleKaufen.h

@@ -16,130 +16,117 @@ using namespace KSGScript;
 class SpieleKaufenAuswahl : public Thread
 {
 private:
-	int spielId;
-	unsigned char alpha;
-	KSGScriptObj *fenster;
-	Framework::Animation2D *laden;
-	Punkt pos;
-	LRahmen *ram;
-	HINSTANCE ksgs;
-	bool aktion;
+    int spielId;
+    unsigned char alpha;
+    KSGScriptObj *fenster;
+    Framework::Animation2D *laden;
+    Punkt pos;
+    LRahmen *ram;
+    HINSTANCE ksgs;
+    bool aktion;
 
 public:
-	// Konstruktor
-	SpieleKaufenAuswahl( Schrift *zSchrift );
-	// Destruktor
-	~SpieleKaufenAuswahl();
-	// nicht constant
-	void ladeSpielSeite( int id );
-	void reset();
-	virtual void thread();
-	void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    SpieleKaufenAuswahl();
+    // Destruktor
+    ~SpieleKaufenAuswahl();
+    // nicht constant
+    void ladeSpielSeite( int id );
+    void reset();
+    virtual void thread();
+    void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
 };
 
-class SpieleKaufenListeEintrag
+class SpieleKaufenListeEintrag : public virtual ReferenceCounter
 {
 private:
-	int spielId;
-	Knopf *auswählen;
-	Bild *hintergrund;
-	AlphaFeld *ausgewählt;
-	LRahmen *ram;
-	bool ausw;
-	bool rend;
-	int ref;
+    int spielId;
+    Knopf *auswählen;
+    Bild *hintergrund;
+    AlphaFeld *ausgewählt;
+    LRahmen *ram;
+    bool ausw;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpieleKaufenListeEintrag( int id, Schrift *schrift );
-	// Destruktor
-	~SpieleKaufenListeEintrag();
-	// nicht constant
-	void resetAuswahl();
-	bool doPublicMausEreignis( MausEreignis &me );
-	bool tick( double zeit );
-	void render( int yOff, Bild &zRObj );
-	// constant
-	int getSpielId() const;
-	// Reference Counting
-	SpieleKaufenListeEintrag *getThis();
-	SpieleKaufenListeEintrag *release();
+    // Konstruktor
+    SpieleKaufenListeEintrag( int id );
+    // Destruktor
+    ~SpieleKaufenListeEintrag();
+    // nicht constant
+    void resetAuswahl();
+    bool doPublicMausEreignis( MausEreignis &me );
+    bool tick( double zeit );
+    void render( int yOff, Bild &zRObj );
+    // constant
+    int getSpielId() const;
 };
 
-class SpieleKaufenListe
+class SpieleKaufenListe : public virtual ReferenceCounter
 {
 private:
-	Schrift *s;
-	LRahmen *ram;
-	Punkt pos;
-	RCArray< SpieleKaufenListeEintrag > *einträge;
-	VScrollBar *vScroll;
-	bool rend;
-	int ref;
-	Critical cs;
+    LRahmen *ram;
+    Punkt pos;
+    RCArray< SpieleKaufenListeEintrag > *einträge;
+    VScrollBar *vScroll;
+    bool rend;
+    Critical cs;
 
 public:
-	// Konstruktor
-	SpieleKaufenListe( Schrift *schrift );
-	// Destruktor
-	~SpieleKaufenListe();
-	// nicht constant
-	void ladeSpiele( Array< int > *spiele );
-	void leeren();
-	int doPublicMausEreignis( MausEreignis &me );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	int getEintragAnzahl();
-	// Reference Counting
-	SpieleKaufenListe *getThis();
-	SpieleKaufenListe *release();
+    // Konstruktor
+    SpieleKaufenListe();
+    // Destruktor
+    ~SpieleKaufenListe();
+    // nicht constant
+    void ladeSpiele( Array< int > *spiele );
+    void leeren();
+    int doPublicMausEreignis( MausEreignis &me );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    int getEintragAnzahl();
 };
 
 class SpieleKaufen : public Thread
 {
 private:
-	unsigned char alpha;
-	bool sichtbar;
-	Text *suchText;
-	LRahmen *ram;
-	TextFeld *suchFilter;
-	TextFeld *suchFilterT;
-	Knopf *suchen;
-	TextFeld *seiten;
-	Knopf *weiter;
-	Knopf *zurück;
-	Punkt pos;
-	SpieleKaufenListe *liste;
-	SpieleKaufenAuswahl *auswahl;
-	Animation2D *laden;
-	double tickVal;
-	int seite;
-	int maxSeite;
-	bool rend;
+    unsigned char alpha;
+    bool sichtbar;
+    Text *suchText;
+    LRahmen *ram;
+    TextFeld *suchFilter;
+    TextFeld *suchFilterT;
+    Knopf *suchen;
+    TextFeld *seiten;
+    Knopf *weiter;
+    Knopf *zurück;
+    Punkt pos;
+    SpieleKaufenListe *liste;
+    SpieleKaufenAuswahl *auswahl;
+    Animation2D *laden;
+    double tickVal;
+    int seite;
+    int maxSeite;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpieleKaufen( Schrift *zSchrift );
-	// Destruktor
-	~SpieleKaufen();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	virtual void thread();
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    SpieleKaufen();
+    // Destruktor
+    ~SpieleKaufen();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    virtual void thread();
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 15 - 30
KSGClient/NachLogin/Spiele/Angemeldet/Angemeldet.cpp

@@ -6,7 +6,8 @@
 
 // Inhalt der AngemeldetFenster Klasse aus Angemeldet.h
 // Konstruktor
-AngemeldetFenster::AngemeldetFenster( Schrift *zSchrift )
+AngemeldetFenster::AngemeldetFenster()
+    : ReferenceCounter()
 {
     pos = Punkt( 10, 10 );
     gr = Punkt( 780, 480 );
@@ -14,15 +15,15 @@ AngemeldetFenster::AngemeldetFenster( Schrift *zSchrift )
     rahmen->setRamenBreite( 1 );
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setSize( 780, 480 );
-    spielName = initTextFeld( 290, 165, 200, 20, zSchrift, TextFeld::Style::Text, "" );
-    karteName = initTextFeld( 290, 190, 200, 20, zSchrift, TextFeld::Style::Text, "" );
-    zeit = initTextFeld( 290, 215, 200, 20, zSchrift, TextFeld::Style::Text, "Zeit in Warteschlange: " );
-    abbrechen = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal, "abbrechen" );
-    spielGefunden = initTextFeld( 340, 140, 100, 20, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Spiel gefunden" );
-    warten = initTextFeld( 290, 240, 200, 20, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Warte auf andere Spieler" );
-    beitreten = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "beitreten" );
-    kick = initTextFeld( 190, 215, 400, 20, zSchrift, TextFeld::Style::Text & ~Knopf::Style::Sichtbar, "Du wurdest wegen Abwesenheit aus der Warteschlange entfernt." );
-    ok = initKnopf( 340, 240, 100, 20, zSchrift, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "Zurück" );
+    spielName = initTextFeld( 290, 165, 200, 20, TextFeld::Style::Text, "" );
+    karteName = initTextFeld( 290, 190, 200, 20, TextFeld::Style::Text, "" );
+    zeit = initTextFeld( 290, 215, 200, 20, TextFeld::Style::Text, "Zeit in Warteschlange: " );
+    abbrechen = initKnopf( 340, 240, 100, 20, Knopf::Style::Normal, "abbrechen" );
+    spielGefunden = initTextFeld( 340, 140, 100, 20, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Spiel gefunden" );
+    warten = initTextFeld( 290, 240, 200, 20, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Warte auf andere Spieler" );
+    beitreten = initKnopf( 340, 240, 100, 20, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "beitreten" );
+    kick = initTextFeld( 190, 215, 400, 20, TextFeld::Style::Text & ~Knopf::Style::Sichtbar, "Du wurdest wegen Abwesenheit aus der Warteschlange entfernt." );
+    ok = initKnopf( 340, 240, 100, 20, Knopf::Style::Normal & ~Knopf::Style::Sichtbar, "Zurück" );
     karteId = 0;
     gameId = 0;
     animation = 0;
@@ -32,7 +33,6 @@ AngemeldetFenster::AngemeldetFenster( Schrift *zSchrift )
     time = 0;
     status = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -77,9 +77,9 @@ bool AngemeldetFenster::setKarteId( int karteId )
         if( nachLogin && nachLogin->zNachrichtenListe() )
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
-                                                            new Text( anmeldungClient->getLetzterFehler() ),
-                                                            new Text( "Ok" ),
-                                                            0 );
+                                                          new Text( anmeldungClient->getLetzterFehler() ),
+                                                          new Text( "Ok" ),
+                                                          0 );
         }
         return 0;
     }
@@ -212,7 +212,7 @@ bool AngemeldetFenster::tick( double tickVal )
     if( status == 1 )
         time += tickVal;
     this->tickVal += tickVal * 750;
-    int val = ( int )this->tickVal;
+    int val = (int)this->tickVal;
     if( val < 1 )
     {
         bool ret = rend;
@@ -375,19 +375,4 @@ int AngemeldetFenster::getAktion()
 int AngemeldetFenster::getKarteId() const
 {
     return karteId;
-}
-
-// Reference Countong
-AngemeldetFenster *AngemeldetFenster::getThis()
-{
-    ref++;
-    return this;
-}
-
-AngemeldetFenster *AngemeldetFenster::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 39 - 43
KSGClient/NachLogin/Spiele/Angemeldet/Angemeldet.h

@@ -8,54 +8,50 @@
 
 using namespace Framework;
 
-class AngemeldetFenster
+class AngemeldetFenster : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	TextFeld *spielName;
-	TextFeld *karteName;
-	TextFeld *zeit;
-	Knopf *abbrechen;
-	TextFeld *spielGefunden;
-	TextFeld *warten;
-	Knopf *beitreten;
-	TextFeld *kick;
-	Knopf *ok;
-	int karteId;
-	int gameId;
-	int animation;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    TextFeld *spielName;
+    TextFeld *karteName;
+    TextFeld *zeit;
+    Knopf *abbrechen;
+    TextFeld *spielGefunden;
+    TextFeld *warten;
+    Knopf *beitreten;
+    TextFeld *kick;
+    Knopf *ok;
+    int karteId;
+    int gameId;
+    int animation;
     unsigned char aAlpha;
-	unsigned char alpha;
-	double tickVal;
-	double time;
-	int status;
-	int aktion;
-	bool rend;
-	int ref;
+    unsigned char alpha;
+    double tickVal;
+    double time;
+    int status;
+    int aktion;
+    bool rend;
 
 public:
-	// Konstruktor
-	AngemeldetFenster( Schrift *zSchrift );
-	// Destruktor
-	~AngemeldetFenster();
-	// nicht constant
-	bool setKarteId( int karteId );
-	void setSichtbar( bool sichtbar );
-	void setSpielGefunden();
-	void setVerbleibendeZeit( int sekunden );
-	void spielGefundenAbbruch();
-	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zrObj );
-	int getAktion();
-	// constant
-	int getKarteId() const;
-	// Reference Countong
-	AngemeldetFenster *getThis();
-	AngemeldetFenster *release();
+    // Konstruktor
+    AngemeldetFenster();
+    // Destruktor
+    ~AngemeldetFenster();
+    // nicht constant
+    bool setKarteId( int karteId );
+    void setSichtbar( bool sichtbar );
+    void setSpielGefunden();
+    void setVerbleibendeZeit( int sekunden );
+    void spielGefundenAbbruch();
+    void zurückInWarteschlange( int stunden, int minuten, int sekunden );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zrObj );
+    int getAktion();
+    // constant
+    int getKarteId() const;
 };
 
 #endif

+ 102 - 246
KSGClient/NachLogin/Spiele/Gruppe/Gruppe.cpp

@@ -11,7 +11,8 @@
 
 // Inhalt der GruppeEinladungAccount Klasse aus Gruppe.h
 // Konstruktor
-GruppeEinladungAccount::GruppeEinladungAccount( Schrift *zSchrift )
+GruppeEinladungAccount::GruppeEinladungAccount()
+    : ReferenceCounter()
 {
     Bild *nachrichtBild = bilder->get( "data/client/bilder/chat.ltdb/nachricht.png" );
     Bild *neuSendenBild = bilder->get( "data/client/bilder/chat.ltdb/neusenden.png" );
@@ -23,19 +24,19 @@ GruppeEinladungAccount::GruppeEinladungAccount( Schrift *zSchrift )
     auswahl->setFarbe( 0x0000FF00 );
     auswahl->setStrength( -2 );
     auswahl->setPosition( 1, 1 );
-    name = initTextFeld( 0, 5, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-    nachrichtSenden = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    name = initTextFeld( 0, 5, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    nachrichtSenden = initKnopf( 0, 30, 20, 20, 0, "" );
     nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     nachrichtSenden->setHintergrundBildZ( nachrichtBild );
-    initToolTip( nachrichtSenden, "Nachricht senden.", zSchrift, hauptScreen );
-    erneutSenden = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    initToolTip( nachrichtSenden, "Nachricht senden." );
+    erneutSenden = initKnopf( 0, 30, 20, 20, 0, "" );
     erneutSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     erneutSenden->setHintergrundBildZ( neuSendenBild );
-    initToolTip( erneutSenden, "Einladung erneut senden.", zSchrift, hauptScreen );
-    einladungAbbrechen = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    initToolTip( erneutSenden, "Einladung erneut senden." );
+    einladungAbbrechen = initKnopf( 0, 30, 20, 20, 0, "" );
     einladungAbbrechen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     einladungAbbrechen->setHintergrundBildZ( entfernenBild );
-    initToolTip( einladungAbbrechen, "Einladung abbrechen.", zSchrift, hauptScreen );
+    initToolTip( einladungAbbrechen, "Einladung abbrechen." );
     status = 0;
     knopfX = 500;
     tickVal = 0;
@@ -47,7 +48,6 @@ GruppeEinladungAccount::GruppeEinladungAccount( Schrift *zSchrift )
     höhe = 0;
     animation = 0x1;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -258,7 +258,7 @@ bool GruppeEinladungAccount::tick( double tickVal )
     return ret;
 }
 
-void GruppeEinladungAccount::doPublicMausEreignis( MausEreignis & me )
+void GruppeEinladungAccount::doPublicMausEreignis( MausEreignis &me )
 {
     if( me.mx < 0 || me.my < 0 || me.mx > br || me.my > höhe )
         mausIn = 0;
@@ -327,7 +327,7 @@ void GruppeEinladungAccount::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void GruppeEinladungAccount::render( int y, Bild & zrObj )
+void GruppeEinladungAccount::render( int y, Bild &zrObj )
 {
     if( !zrObj.setDrawOptions( 0, y, br, höhe ) )
         return;
@@ -368,26 +368,11 @@ int GruppeEinladungAccount::getHeight() const
     return höhe;
 }
 
-// Reference Counting
-GruppeEinladungAccount *GruppeEinladungAccount::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeEinladungAccount *GruppeEinladungAccount::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der GruppeEinladungListe Klasse aus Gruppe.h
 // Konstruktor
-GruppeEinladungListe::GruppeEinladungListe( Schrift * zSchrift )
+GruppeEinladungListe::GruppeEinladungListe()
+    : ReferenceCounter()
 {
-    schrift = zSchrift->getThis();
     Bild *maximierenBild = bilder->get( "data/client/bilder/chat.ltdb/maximieren.png" );
     pos = Punkt( 200, 0 );
     gr = Punkt( 150, 350 );
@@ -395,12 +380,12 @@ GruppeEinladungListe::GruppeEinladungListe( Schrift * zSchrift )
     rahmen->setRamenBreite( 1 );
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setSize( 150, 350 );
-    einladenName = initTextFeld( 5, 5, 115, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( einladenName, "Name des Spielers den du einladen möchtest.", zSchrift, hauptScreen );
-    einladen = initKnopf( 125, 5, 20, 20, 0, 0, "" );
+    einladenName = initTextFeld( 5, 5, 115, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( einladenName, "Name des Spielers den du einladen möchtest." );
+    einladen = initKnopf( 125, 5, 20, 20, 0, "" );
     einladen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     einladen->setHintergrundBildZ( maximierenBild );
-    initToolTip( einladen, "Diesen Spieler einladen.", zSchrift, hauptScreen );
+    initToolTip( einladen, "Diesen Spieler einladen." );
     scroll = new VScrollBar();
     accounts = new RCArray< GruppeEinladungAccount >();
     einladungHöhe = 0;
@@ -409,7 +394,6 @@ GruppeEinladungListe::GruppeEinladungListe( Schrift * zSchrift )
     gruppeId = 0;
     admin = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -420,7 +404,6 @@ GruppeEinladungListe::~GruppeEinladungListe()
     einladen->release();
     scroll->release();
     accounts->release();
-    schrift->release();
 }
 
 // nicht constant
@@ -452,7 +435,7 @@ void GruppeEinladungListe::addAccount( int id )
         if( tmp->getAccountId() == id )
             tmp->setRemove();
     }
-    GruppeEinladungAccount * tmp = new GruppeEinladungAccount( schrift );
+    GruppeEinladungAccount *tmp = new GruppeEinladungAccount();
     tmp->setGruppeId( gruppeId );
     tmp->setAccountId( id );
     tmp->setAdmin( admin );
@@ -568,7 +551,7 @@ bool GruppeEinladungListe::tick( double tickVal )
     return ret;
 }
 
-void GruppeEinladungListe::doPublicMausEreignis( MausEreignis & me )
+void GruppeEinladungListe::doPublicMausEreignis( MausEreignis &me )
 {
     int tmpX = me.mx;
     int tmpY = me.my;
@@ -647,7 +630,7 @@ void GruppeEinladungListe::doPublicMausEreignis( MausEreignis & me )
     me.my = tmpY;
 }
 
-void GruppeEinladungListe::doTastaturEreignis( TastaturEreignis & te )
+void GruppeEinladungListe::doTastaturEreignis( TastaturEreignis &te )
 {
     bool b = !te.verarbeitet;
     einladenName->doTastaturEreignis( te );
@@ -695,7 +678,7 @@ void GruppeEinladungListe::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void GruppeEinladungListe::render( Bild & zRObj )
+void GruppeEinladungListe::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos, gr ) )
         return;
@@ -732,26 +715,10 @@ void GruppeEinladungListe::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// constant
-
-// Reference Counting
-GruppeEinladungListe *GruppeEinladungListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeEinladungListe *GruppeEinladungListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der GruppeAccountDaten Klasse aus Gruppe.h
 // Konstruktor
-GruppeAccountDaten::GruppeAccountDaten( Schrift * zSchrift )
+GruppeAccountDaten::GruppeAccountDaten()
+    : ReferenceCounter()
 {
     Bild *nachrichtBild = bilder->get( "data/client/bilder/chat.ltdb/nachricht.png" );
     Bild *einladungBild = bilder->get( "data/client/bilder/chat.ltdb/neuerfreund.png" );
@@ -764,24 +731,24 @@ GruppeAccountDaten::GruppeAccountDaten( Schrift * zSchrift )
     auswahl->setFarbe( 0x0000FF00 );
     auswahl->setStrength( -2 );
     auswahl->setPosition( 1, 1 );
-    name = initTextFeld( 1, 6, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-    punkte = initTextFeld( 101, 6, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0p" );
-    nachrichtSenden = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    name = initTextFeld( 1, 6, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    punkte = initTextFeld( 101, 6, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0p" );
+    nachrichtSenden = initKnopf( 0, 30, 20, 20, 0, "" );
     nachrichtSenden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     nachrichtSenden->setHintergrundBildZ( nachrichtBild );
-    initToolTip( nachrichtSenden, "Nachricht senden.", zSchrift, hauptScreen );
-    freundEinladung = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    initToolTip( nachrichtSenden, "Nachricht senden." );
+    freundEinladung = initKnopf( 0, 30, 20, 20, 0, "" );
     freundEinladung->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     freundEinladung->setHintergrundBildZ( einladungBild );
-    initToolTip( freundEinladung, "Freundeseinladung senden.", zSchrift, hauptScreen );
-    accountAnsehen = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    initToolTip( freundEinladung, "Freundeseinladung senden." );
+    accountAnsehen = initKnopf( 0, 30, 20, 20, 0, "" );
     accountAnsehen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     accountAnsehen->setHintergrundBildZ( ansehenBild );
-    initToolTip( accountAnsehen, "Account ansehen.", zSchrift, hauptScreen );
-    kick = initKnopf( 0, 30, 20, 20, 0, 0, "" );
+    initToolTip( accountAnsehen, "Account ansehen." );
+    kick = initKnopf( 0, 30, 20, 20, 0, "" );
     kick->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     kick->setHintergrundBildZ( entfernenBild );
-    initToolTip( kick, "Diesen Spieler kicken.", zSchrift, hauptScreen );
+    initToolTip( kick, "Diesen Spieler kicken." );
     tickVal = 0;
     mausIn = 0;
     remove = 0;
@@ -791,7 +758,6 @@ GruppeAccountDaten::GruppeAccountDaten( Schrift * zSchrift )
     höhe = 0;
     animation = 0x1;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -1021,7 +987,7 @@ bool GruppeAccountDaten::tick( double tickVal )
     return ret;
 }
 
-void GruppeAccountDaten::doPublicMausEreignis( MausEreignis & me )
+void GruppeAccountDaten::doPublicMausEreignis( MausEreignis &me )
 {
     if( me.mx < 0 || me.my < 0 || me.mx > br || me.my > höhe )
         mausIn = 0;
@@ -1079,7 +1045,7 @@ void GruppeAccountDaten::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void GruppeAccountDaten::render( int y, Bild & zrObj )
+void GruppeAccountDaten::render( int y, Bild &zrObj )
 {
     if( !zrObj.setDrawOptions( 0, y, br, höhe ) )
         return;
@@ -1128,26 +1094,11 @@ int GruppeAccountDaten::getHeight() const
     return höhe;
 }
 
-// Reference Counting
-GruppeAccountDaten *GruppeAccountDaten::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeAccountDaten *GruppeAccountDaten::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der GruppeAccountListe Klasse aus Gruppe.h
 // Konstruktor
-GruppeAccountListe::GruppeAccountListe( Schrift * zSchrift )
+GruppeAccountListe::GruppeAccountListe()
+    : ReferenceCounter()
 {
-    schrift = zSchrift->getThis();
     pos = Punkt( 0, 0 );
     gr = Punkt( 200, 350 );
     rahmen = new LRahmen();
@@ -1160,13 +1111,11 @@ GruppeAccountListe::GruppeAccountListe( Schrift * zSchrift )
     gruppeId = 0;
     admin = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
 GruppeAccountListe::~GruppeAccountListe()
 {
-    schrift->release();
     rahmen->release();
     scroll->release();
     accounts->release();
@@ -1191,7 +1140,7 @@ void GruppeAccountListe::setGruppeId( int gruppeId )
 
 void GruppeAccountListe::addAccount( int id )
 {
-    GruppeAccountDaten *tmp = new GruppeAccountDaten( schrift );
+    GruppeAccountDaten *tmp = new GruppeAccountDaten();
     tmp->setGruppeId( gruppeId );
     tmp->setAccountId( id );
     tmp->setAdmin( admin );
@@ -1238,7 +1187,7 @@ bool GruppeAccountListe::tick( double tickVal )
     return ret;
 }
 
-void GruppeAccountListe::doPublicMausEreignis( MausEreignis & me )
+void GruppeAccountListe::doPublicMausEreignis( MausEreignis &me )
 {
     int tmpX = me.mx;
     int tmpY = me.my;
@@ -1265,7 +1214,7 @@ void GruppeAccountListe::doPublicMausEreignis( MausEreignis & me )
     me.my = tmpY;
 }
 
-void GruppeAccountListe::render( Bild & zRObj )
+void GruppeAccountListe::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos, gr ) )
         return;
@@ -1293,26 +1242,10 @@ void GruppeAccountListe::render( Bild & zRObj )
     scroll->update( höhe, gr.y - rbr * 2 );
 }
 
-// constant
-
-// Reference Counting
-GruppeAccountListe *GruppeAccountListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeAccountListe *GruppeAccountListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der GruppeChat Klasse aus Gruppe.h
 // Konstruktor
-GruppeChat::GruppeChat( Schrift * zSchrift )
+GruppeChat::GruppeChat()
+    : ReferenceCounter()
 {
     Bild *sendenBild = bilder->get( "data/client/bilder/chat.ltdb/senden.png" );
     pos = Punkt( 0, 350 );
@@ -1321,19 +1254,18 @@ GruppeChat::GruppeChat( Schrift * zSchrift )
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
     rahmen->setSize( 750, 200 );
-    nachricht = initTextFeld( 2, 176, 724, 20, zSchrift, TextFeld::Style::TextFeld, "" );
-    initToolTip( nachricht, "Nachricht an die Gruppe senden.", zSchrift, hauptScreen );
-    senden = initKnopf( 726, 176, 20, 20, 0, 0, "" );
+    nachricht = initTextFeld( 2, 176, 724, 20, TextFeld::Style::TextFeld, "" );
+    initToolTip( nachricht, "Nachricht an die Gruppe senden." );
+    senden = initKnopf( 726, 176, 20, 20, 0, "" );
     senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     senden->setHintergrundBildZ( sendenBild );
-    initToolTip( senden, "Diese Nachricht an die Gruppe senden.", zSchrift, hauptScreen );
-    verlauf = initTextFeld( 2, 2, 746, 174, zSchrift, TextFeld::Style::TextGebiet, "" );
+    initToolTip( senden, "Diese Nachricht an die Gruppe senden." );
+    verlauf = initTextFeld( 2, 2, 746, 174, TextFeld::Style::TextGebiet, "" );
     verlauf->removeStyle( TextFeld::Style::Erlaubt );
     verlauf->updateVScroll();
     verlauf->setVertikalKlickScroll( 5 );
     gruppeId = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -1377,7 +1309,7 @@ bool GruppeChat::tick( double tickVal )
     return ret;
 }
 
-void GruppeChat::doPublicMausEreignis( MausEreignis & me )
+void GruppeChat::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -1426,7 +1358,7 @@ void GruppeChat::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void GruppeChat::doTastaturEreignis( TastaturEreignis & te )
+void GruppeChat::doTastaturEreignis( TastaturEreignis &te )
 {
     bool b = te.verarbeitet;
     nachricht->doTastaturEreignis( te );
@@ -1462,7 +1394,7 @@ void GruppeChat::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void GruppeChat::render( Bild & zRObj )
+void GruppeChat::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
         return;
@@ -1472,26 +1404,11 @@ void GruppeChat::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// constant
-
-// Reference Counting
-GruppeChat *GruppeChat::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeChat *GruppeChat::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
 
 // Inhalt der GruppeAnmeldung Klasse aus Gruppe.h
 // Konstruktor
-GruppeAnmeldung::GruppeAnmeldung( Schrift * zSchrift )
+GruppeAnmeldung::GruppeAnmeldung()
+    : ReferenceCounter()
 {
     pos = Punkt( 750, 350 );
     gr = Punkt( 200, 200 );
@@ -1499,21 +1416,20 @@ GruppeAnmeldung::GruppeAnmeldung( Schrift * zSchrift )
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
     rahmen->setSize( 200, 200 );
-    spielerHinzufügen = initKontrollKnopf( 25, 45, 150, 20, zSchrift, KontrollKnopf::Style::Normal, "Spieler hinzufügen" );
+    spielerHinzufügen = initKontrollKnopf( 25, 45, 150, 20, KontrollKnopf::Style::Normal, "Spieler hinzufügen" );
     spielerHinzufügen->removeStyle( KontrollKnopf::Style::Erlaubt );
     spielerHinzufügen->setMausEreignis( _ret1ME );
-    initToolTip( spielerHinzufügen, "Es werden nur Spieler aus dieser Gruppe mit ins Spiel kommen.", zSchrift, hauptScreen );
-    angemeldet = initKontrollKnopf( 25, 75, 150, 20, zSchrift, KontrollKnopf::Style::Normal, "in Warteschlange" );
+    initToolTip( spielerHinzufügen, "Es werden nur Spieler aus dieser Gruppe mit ins Spiel kommen." );
+    angemeldet = initKontrollKnopf( 25, 75, 150, 20, KontrollKnopf::Style::Normal, "in Warteschlange" );
     angemeldet->removeStyle( KontrollKnopf::Style::Erlaubt );
     angemeldet->setMausEreignis( _ret1ME );
-    initToolTip( angemeldet, "Die Gruppe befindet sich momentan nicht in der Warteschlange.", zSchrift, hauptScreen );
-    zeit = initTextFeld( 0, 105, 200, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Zeit in Warteschlange: " );
-    gruppeVerlassen = initKnopf( 40, 135, 120, 20, zSchrift, Knopf::Style::Normal, "Gruppe verlassen" );
+    initToolTip( angemeldet, "Die Gruppe befindet sich momentan nicht in der Warteschlange." );
+    zeit = initTextFeld( 0, 105, 200, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Zeit in Warteschlange: " );
+    gruppeVerlassen = initKnopf( 40, 135, 120, 20, Knopf::Style::Normal, "Gruppe verlassen" );
     admin = 0;
     time = 0;
     gruppeId = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -1623,7 +1539,7 @@ bool GruppeAnmeldung::tick( double tickVal )
     return ret;
 }
 
-void GruppeAnmeldung::doPublicMausEreignis( MausEreignis & me )
+void GruppeAnmeldung::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -1749,7 +1665,7 @@ void GruppeAnmeldung::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void GruppeAnmeldung::render( Bild & zRObj )
+void GruppeAnmeldung::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
         return;
@@ -1761,24 +1677,8 @@ void GruppeAnmeldung::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// constant
-
-// Reference Counting
-GruppeAnmeldung *GruppeAnmeldung::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeAnmeldung *GruppeAnmeldung::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
 
-void GruppeKarteKSGSAktion( void *p, RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void GruppeKarteKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
     if( !p )
         return;
@@ -1787,11 +1687,10 @@ void GruppeKarteKSGSAktion( void *p, RCArray< KSGSVariable > * parameter, KSGSVa
 
 // Inhalt der GruppeKarte Klasse aus Gruppe.h
 // Konstruktor
-GruppeKarte::GruppeKarte( Schrift * zSchrift )
+GruppeKarte::GruppeKarte()
     : Thread()
 {
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     pos = Punkt( 350, 0 );
     gr = Punkt( 600, 350 );
     rahmen = new LRahmen();
@@ -1807,17 +1706,17 @@ GruppeKarte::GruppeKarte( Schrift * zSchrift )
         if( getKSGScript )
         {
             info = getKSGScript();
-            info->setBildschirmZ( hauptScreen->getThis() );
-            info->setSchriftZ( schrift->getThis() );
+            info->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+            info->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
             info->setSize( 248, 350 );
-            info->setRückrufParam( this );
-            info->setRückrufFunktion( GruppeKarteKSGSAktion );
+            info->setCallbackParam( this );
+            info->setCallbackFunktion( GruppeKarteKSGSAktion );
         }
         else
         {
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                           new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                          "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                    "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                           new Text( "Ok" ), 0 );
         }
     }
@@ -1847,15 +1746,13 @@ GruppeKarte::~GruppeKarte()
     rahmen->release();
     if( info )
     {
-        info->zurücksetzen();
+        info->reset();
         info->release();
     }
     if( hintergrund )
         hintergrund->release();
     if( fehler )
         fehler->release();
-    if( schrift )
-        schrift->release();
     tr->release();
     if( ksgs )
         Framework::getDLLRegister()->releaseDLL( "KSGScript.dll" );
@@ -1865,9 +1762,9 @@ GruppeKarte::~GruppeKarte()
 void GruppeKarte::reset()
 {
     if( info )
-        info->zurücksetzen();
+        info->reset();
     if( hintergrund )
-        hintergrund = hintergrund->release();
+        hintergrund = (Bild *)hintergrund->release();
     if( fehler )
         fehler = (TextFeld *)fehler->release();
     if( run )
@@ -1889,7 +1786,7 @@ void GruppeKarte::reset()
     rend = 1;
 }
 
-void GruppeKarte::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void GruppeKarte::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {
 
 }
@@ -1920,7 +1817,7 @@ bool GruppeKarte::tick( double tickVal )
     if( ladenZeit >= 1 / 30.0 )
     {
         ladenZeit -= 1 / 30.0;
-        if( ladeAnimation &&ladeAnimation->zAnimationData() )
+        if( ladeAnimation && ladeAnimation->zAnimationData() )
         {
             if( alpha1 )
                 rend = 1;
@@ -1971,7 +1868,7 @@ bool GruppeKarte::tick( double tickVal )
     return ret;
 }
 
-void GruppeKarte::doPublicMausEreignis( MausEreignis & me )
+void GruppeKarte::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -1981,7 +1878,7 @@ void GruppeKarte::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void GruppeKarte::render( Bild & zrObj )
+void GruppeKarte::render( Bild &zrObj )
 {
     int x = pos.x;
     int y = pos.y;
@@ -2018,9 +1915,9 @@ void GruppeKarte::render( Bild & zrObj )
 void GruppeKarte::thread()
 {
     if( info )
-        info->zurücksetzen();
+        info->reset();
     if( hintergrund )
-        hintergrund = hintergrund->release();
+        hintergrund = (Bild *)hintergrund->release();
     if( fehler )
         fehler = (TextFeld *)fehler->release();
     karteId = infoClient->getGruppenKarteId( gruppeId );
@@ -2036,7 +1933,7 @@ void GruppeKarte::thread()
     if( exit )
     {
         if( hintergrund )
-            hintergrund = hintergrund->release();
+            hintergrund = (Bild *)hintergrund->release();
         karte->unlock();
         karte->release();
         run = 0;
@@ -2049,7 +1946,7 @@ void GruppeKarte::thread()
         int br = tr->getTextBreite( f->getText() );
         int hö = tr->getTextHeight( f->getText() );
         fehler = initTextFeld( gr.x / 2 - ( br + 10 ) / 2, gr.y / 2 - ( hö + 4 ) / 2, br + 10, hö + 4,
-                               schrift, TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
+                               TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
         f->release();
         karte->unlock();
         karte->release();
@@ -2079,7 +1976,7 @@ void GruppeKarte::thread()
         int br = tr->getTextBreite( f->getText() );
         int hö = tr->getTextHeight( f->getText() );
         fehler = initTextFeld( gr.x / 2 - ( br + 10 ) / 2, gr.y / 2 - ( hö + 4 ) / 2, br + 10, hö + 4,
-                               schrift, TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
+                               TextFeld::Style::Text | TextFeld::Style::Center, f->getText() );
         f->release();
         karte->unlock();
         karte->release();
@@ -2099,35 +1996,22 @@ int GruppeKarte::getKarteId() const
     return karteId;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *GruppeKarte::release()
-{
-    if( ref == 2 && run )
-    {
-        exit = 1;
-        warteAufThread( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
-}
-
 // Inhalt der GruppeSpielGefunden Klasse aus Gruppe.h
 // Konstruktor
-GruppeSpielGefunden::GruppeSpielGefunden( Schrift * zSchrift )
+GruppeSpielGefunden::GruppeSpielGefunden()
+    : ReferenceCounter()
 {
     pos = Punkt( 375, 235 );
     gr = Punkt( 200, 90 );
-    spielGefunden = initFenster( 0, 0, 200, 90, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Rahmen | Fenster::Style::Titel, "Spiel gefunden" );
-    zeit = initTextFeld( 0, 30, 200, 20, zSchrift, TextFeld::Style::Text, "Verbleibende Zeit: 10" );
-    warte = initTextFeld( 0, 60, 200, 20, zSchrift, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Warte auf andere Spieler. . ." );
-    annehmen = initKnopf( 50, 60, 100, 20, zSchrift, Knopf::Style::Normal, "beitreten" );
+    spielGefunden = initFenster( 0, 0, 200, 90, Fenster::Style::Sichtbar | Fenster::Style::Rahmen | Fenster::Style::Titel, "Spiel gefunden" );
+    zeit = initTextFeld( 0, 30, 200, 20, TextFeld::Style::Text, "Verbleibende Zeit: 10" );
+    warte = initTextFeld( 0, 60, 200, 20, TextFeld::Style::Text & ~TextFeld::Style::Sichtbar, "Warte auf andere Spieler. . ." );
+    annehmen = initKnopf( 50, 60, 100, 20, Knopf::Style::Normal, "beitreten" );
     alpha = 0;
     time = 0;
     sichtbar = 0;
     tickVal = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -2212,7 +2096,7 @@ bool GruppeSpielGefunden::tick( double tickVal )
     return ret;
 }
 
-void GruppeSpielGefunden::doPublicMausEreignis( MausEreignis & me )
+void GruppeSpielGefunden::doPublicMausEreignis( MausEreignis &me )
 {
     me.mx -= pos.x;
     me.my -= pos.y;
@@ -2226,14 +2110,14 @@ void GruppeSpielGefunden::doPublicMausEreignis( MausEreignis & me )
             warte->addStyle( TextFeld::Style::Sichtbar );
             rend = 1;
         }
-        else if( nachLogin &&nachLogin->zSpielenFenster() )
+        else if( nachLogin && nachLogin->zSpielenFenster() )
             nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( spielClient->getLetzterFehler() ), new Text( "Ok" ), 0 );
     }
     me.mx += pos.x;
     me.my += pos.y;
 }
 
-void GruppeSpielGefunden::render( Bild & zRObj )
+void GruppeSpielGefunden::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( pos.x, pos.y, gr.x, gr.y ) )
         return;
@@ -2252,38 +2136,23 @@ bool GruppeSpielGefunden::istSichtbar() const
     return sichtbar;
 }
 
-// Reference Counting
-GruppeSpielGefunden *GruppeSpielGefunden::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeSpielGefunden *GruppeSpielGefunden::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der GruppeFenster Klasse aus Gruppe.h
 // Konstruktor
-GruppeFenster::GruppeFenster( Schrift * zSchrift )
+GruppeFenster::GruppeFenster()
+    : ReferenceCounter()
 {
     pos = Punkt( 0, 0 );
     gr = Punkt( 950, 550 );
-    anmeldung = new GruppeAnmeldung( zSchrift );
-    chat = new GruppeChat( zSchrift );
-    accounts = new GruppeAccountListe( zSchrift );
-    einladungen = new GruppeEinladungListe( zSchrift );
-    karte = new GruppeKarte( zSchrift );
-    spiel = new GruppeSpielGefunden( zSchrift );
+    anmeldung = new GruppeAnmeldung();
+    chat = new GruppeChat();
+    accounts = new GruppeAccountListe();
+    einladungen = new GruppeEinladungListe();
+    karte = new GruppeKarte();
+    spiel = new GruppeSpielGefunden();
     alpha = 0;
     sichtbar = 0;
     tickVal = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -2293,6 +2162,8 @@ GruppeFenster::~GruppeFenster()
     chat->release();
     accounts->release();
     einladungen->release();
+    karte->warteAufThread( 10000 );
+    karte->ende();
     karte->release();
     spiel->release();
 }
@@ -2481,7 +2352,7 @@ bool GruppeFenster::tick( double tickVal )
     return ret;
 }
 
-void GruppeFenster::doPublicMausEreignis( MausEreignis & me )
+void GruppeFenster::doPublicMausEreignis( MausEreignis &me )
 {
     if( !spiel->istSichtbar() )
     {
@@ -2494,7 +2365,7 @@ void GruppeFenster::doPublicMausEreignis( MausEreignis & me )
     spiel->doPublicMausEreignis( me );
 }
 
-void GruppeFenster::doTastaturEreignis( TastaturEreignis & te )
+void GruppeFenster::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !spiel->istSichtbar() )
     {
@@ -2503,7 +2374,7 @@ void GruppeFenster::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void GruppeFenster::render( Bild & zRObj )
+void GruppeFenster::render( Bild &zRObj )
 {
     if( alpha )
     {
@@ -2533,19 +2404,4 @@ int GruppeFenster::getGruppeId() const
 int GruppeFenster::getKarteId() const
 {
     return karte ? karte->getKarteId() : 0;
-}
-
-// Reference Counting
-GruppeFenster *GruppeFenster::getThis()
-{
-    ref++;
-    return this;
-}
-
-GruppeFenster *GruppeFenster::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 271 - 316
KSGClient/NachLogin/Spiele/Gruppe/Gruppe.h

@@ -13,379 +13,334 @@
 using namespace Framework;
 using namespace KSGScript;
 
-class GruppeEinladungAccount
+class GruppeEinladungAccount : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	AlphaFeld *auswahl;
-	TextFeld *name;
-	Knopf *nachrichtSenden;
-	Knopf *erneutSenden;
-	Knopf *einladungAbbrechen;
-	int status;
-	int br;
-	int knopfX;
-	double tickVal;
-	bool mausIn;
-	bool remove;
-	int accountId;
-	int gruppeId;
-	int admin;
-	int höhe;
-	int animation;
-	bool rend;
-	int ref;
+    LRahmen *rahmen;
+    AlphaFeld *auswahl;
+    TextFeld *name;
+    Knopf *nachrichtSenden;
+    Knopf *erneutSenden;
+    Knopf *einladungAbbrechen;
+    int status;
+    int br;
+    int knopfX;
+    double tickVal;
+    bool mausIn;
+    bool remove;
+    int accountId;
+    int gruppeId;
+    int admin;
+    int höhe;
+    int animation;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeEinladungAccount( Schrift *zSchrift );
-	// Destruktor
-	~GruppeEinladungAccount();
-	// nicht constant
-	void setGruppeId( int gruppeId );
-	void setAccountId( int id );
-	void setSize( int br );
-	void setAbgelehnt();
-	void setAngenommen();
-	void setRemove();
-	void setAdmin( int admin );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int yOff, Bild &zrObj );
-	// constant
-	bool getRemove() const;
-	int getAccountId() const;
-	int getHeight() const;
-	// Reference Counting
-	GruppeEinladungAccount *getThis();
-	GruppeEinladungAccount *release();
+    // Konstruktor
+    GruppeEinladungAccount();
+    // Destruktor
+    ~GruppeEinladungAccount();
+    // nicht constant
+    void setGruppeId( int gruppeId );
+    void setAccountId( int id );
+    void setSize( int br );
+    void setAbgelehnt();
+    void setAngenommen();
+    void setRemove();
+    void setAdmin( int admin );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int yOff, Bild &zrObj );
+    // constant
+    bool getRemove() const;
+    int getAccountId() const;
+    int getHeight() const;
 };
 
-class GruppeEinladungListe
+class GruppeEinladungListe : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	TextFeld *einladenName;
-	Knopf *einladen;
-	VScrollBar *scroll;
-	RCArray< GruppeEinladungAccount > *accounts;
-	Schrift *schrift;
-	int einladungHöhe;
-	double tickVal;
-	int anzahl;
-	int gruppeId;
-	int admin;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    TextFeld *einladenName;
+    Knopf *einladen;
+    VScrollBar *scroll;
+    RCArray< GruppeEinladungAccount > *accounts;
+    int einladungHöhe;
+    double tickVal;
+    int anzahl;
+    int gruppeId;
+    int admin;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeEinladungListe( Schrift *zSchrift );
-	// Destruktor
-	~GruppeEinladungListe();
-	// nicht constant
-	void reset();
-	void setGruppeId( int gruppeId );
-	void addAccount( int id );
-	void setAbgelehnt( int id );
-	void setAngenommen( int id );
-	void remove( int id );
-	void setAdmin( int admin );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	GruppeEinladungListe *getThis();
-	GruppeEinladungListe *release();
+    // Konstruktor
+    GruppeEinladungListe();
+    // Destruktor
+    ~GruppeEinladungListe();
+    // nicht constant
+    void reset();
+    void setGruppeId( int gruppeId );
+    void addAccount( int id );
+    void setAbgelehnt( int id );
+    void setAngenommen( int id );
+    void remove( int id );
+    void setAdmin( int admin );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
 };
 
-class GruppeAccountDaten
+class GruppeAccountDaten : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	AlphaFeld *auswahl;
-	TextFeld *name;
-	TextFeld *punkte;
-	Knopf *nachrichtSenden;
-	Knopf *accountAnsehen;
-	Knopf *freundEinladung;
-	Knopf *kick;
-	int br;
-	double tickVal;
-	bool mausIn;
-	bool remove;
-	int gruppeId;
-	int accountId;
-	int admin;
-	int höhe;
-	int animation;
-	bool rend;
-	int ref;
+    LRahmen *rahmen;
+    AlphaFeld *auswahl;
+    TextFeld *name;
+    TextFeld *punkte;
+    Knopf *nachrichtSenden;
+    Knopf *accountAnsehen;
+    Knopf *freundEinladung;
+    Knopf *kick;
+    int br;
+    double tickVal;
+    bool mausIn;
+    bool remove;
+    int gruppeId;
+    int accountId;
+    int admin;
+    int höhe;
+    int animation;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeAccountDaten( Schrift *zSchrift );
-	// Destruktor
-	~GruppeAccountDaten();
-	// nicht constant
-	void setGruppeId( int gruppeId );
-	void setAccountId( int id );
-	void setAdmin( int admin );
-	void setSize( int x );
-	void entfernen();
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int y, Bild &zrObj );
-	// constant
-	bool getRemove() const;
-	int getAccountId() const;
-	int getHeight() const;
-	// Reference Counting
-	GruppeAccountDaten *getThis();
-	GruppeAccountDaten *release();
+    // Konstruktor
+    GruppeAccountDaten();
+    // Destruktor
+    ~GruppeAccountDaten();
+    // nicht constant
+    void setGruppeId( int gruppeId );
+    void setAccountId( int id );
+    void setAdmin( int admin );
+    void setSize( int x );
+    void entfernen();
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int y, Bild &zrObj );
+    // constant
+    bool getRemove() const;
+    int getAccountId() const;
+    int getHeight() const;
 };
 
-class GruppeAccountListe
+class GruppeAccountListe : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	VScrollBar *scroll;
-	RCArray< GruppeAccountDaten > *accounts;
-	Schrift *schrift;
-	int anzahl;
-	int gruppeId;
-	int admin;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    VScrollBar *scroll;
+    RCArray< GruppeAccountDaten > *accounts;
+    int anzahl;
+    int gruppeId;
+    int admin;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeAccountListe( Schrift *zSchrift );
-	// Destruktor
-	~GruppeAccountListe();
-	// nicht constant
-	void reset();
-	void setGruppeId( int gruppeId );
-	void addAccount( int id );
-	void removeAccount( int id );
-	void setAdmin( int admin );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	GruppeAccountListe *getThis();
-	GruppeAccountListe *release();
+    // Konstruktor
+    GruppeAccountListe();
+    // Destruktor
+    ~GruppeAccountListe();
+    // nicht constant
+    void reset();
+    void setGruppeId( int gruppeId );
+    void addAccount( int id );
+    void removeAccount( int id );
+    void setAdmin( int admin );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
 };
 
-class GruppeChat
+class GruppeChat : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	TextFeld *nachricht;
-	Knopf *senden;
-	TextFeld *verlauf;
-	int gruppeId;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    TextFeld *nachricht;
+    Knopf *senden;
+    TextFeld *verlauf;
+    int gruppeId;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeChat( Schrift *zSchrift );
-	// Destruktor
-	~GruppeChat();
-	// nicht constant
-	void reset();
-	void setGruppeId( int gruppeId );
-	void gruppeNachricht( const char *nachricht );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	GruppeChat *getThis();
-	GruppeChat *release();
+    // Konstruktor
+    GruppeChat();
+    // Destruktor
+    ~GruppeChat();
+    // nicht constant
+    void reset();
+    void setGruppeId( int gruppeId );
+    void gruppeNachricht( const char *nachricht );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
 };
 
-class GruppeAnmeldung
+class GruppeAnmeldung : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	KontrollKnopf *spielerHinzufügen;
-	KontrollKnopf *angemeldet;
-	TextFeld *zeit;
-	Knopf *gruppeVerlassen;
-	int admin;
-	double time;
-	int gruppeId;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    KontrollKnopf *spielerHinzufügen;
+    KontrollKnopf *angemeldet;
+    TextFeld *zeit;
+    Knopf *gruppeVerlassen;
+    int admin;
+    double time;
+    int gruppeId;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeAnmeldung( Schrift *zSchrift );
-	// Destruktor
-	~GruppeAnmeldung();
-	// nicht constant
-	void reset();
-	void setGruppeId( int gruppeId );
-	void setSpielerHinzufügen( bool spielerHinzufügen );
-	void setAngemeldet( bool angemeldet );
-	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
-	void spielGefunden();
-	void setAdmin( int admin );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	GruppeAnmeldung *getThis();
-	GruppeAnmeldung *release();
+    // Konstruktor
+    GruppeAnmeldung();
+    // Destruktor
+    ~GruppeAnmeldung();
+    // nicht constant
+    void reset();
+    void setGruppeId( int gruppeId );
+    void setSpielerHinzufügen( bool spielerHinzufügen );
+    void setAngemeldet( bool angemeldet );
+    void zurückInWarteschlange( int stunden, int minuten, int sekunden );
+    void spielGefunden();
+    void setAdmin( int admin );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
 };
 
 class GruppeKarte : public Thread
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	LRahmen *rahmen;
-	Bild *hintergrund;
-	KSGScriptObj *info;
+    Punkt pos;
+    Punkt gr;
+    LRahmen *rahmen;
+    Bild *hintergrund;
+    KSGScriptObj *info;
     HINSTANCE ksgs;
-	TextFeld *fehler;
-	Schrift *schrift;
+    TextFeld *fehler;
     TextRenderer *tr;
-	unsigned char alpha1;
-	unsigned char alpha2;
-	double tickVal;
-	double ladenZeit;
-	int ladeBild;
-	int karteId;
-	int gruppeId;
-	bool exit;
-	bool geladen;
-	bool rend;
+    unsigned char alpha1;
+    unsigned char alpha2;
+    double tickVal;
+    double ladenZeit;
+    int ladeBild;
+    int karteId;
+    int gruppeId;
+    bool exit;
+    bool geladen;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeKarte( Schrift *zSchrift );
-	// Destruktor
-	~GruppeKarte();
-	// nicht constant
+    // Konstruktor
+    GruppeKarte();
+    // Destruktor
+    ~GruppeKarte();
+    // nicht constant
     void reset();
     void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
-	void setGruppeId( int gruppeId );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zrObj );
-	virtual void thread();
-	// constant
-	int getKarteId() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    void setGruppeId( int gruppeId );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zrObj );
+    virtual void thread();
+    // constant
+    int getKarteId() const;
 };
 
-class GruppeSpielGefunden
+class GruppeSpielGefunden : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	Fenster *spielGefunden;
-	TextFeld *zeit;
-	TextFeld *warte;
-	Knopf *annehmen;
-	unsigned char alpha;
-	double time;
-	double tickVal;
-	bool sichtbar;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    Fenster *spielGefunden;
+    TextFeld *zeit;
+    TextFeld *warte;
+    Knopf *annehmen;
+    unsigned char alpha;
+    double time;
+    double tickVal;
+    bool sichtbar;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeSpielGefunden( Schrift *zSchrift );
-	// Destruktor
-	~GruppeSpielGefunden();
-	// nicht constant
-	void reset();
-	void setSichtbar( bool sichtbar );
-	void setVerbleibendeZeit( int sekunden );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-	// Reference Counting
-	GruppeSpielGefunden *getThis();
-	GruppeSpielGefunden *release();
+    // Konstruktor
+    GruppeSpielGefunden();
+    // Destruktor
+    ~GruppeSpielGefunden();
+    // nicht constant
+    void reset();
+    void setSichtbar( bool sichtbar );
+    void setVerbleibendeZeit( int sekunden );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
 };
 
-class GruppeFenster
+class GruppeFenster : public virtual ReferenceCounter
 {
 private:
-	Punkt pos;
-	Punkt gr;
-	GruppeAnmeldung *anmeldung;
-	GruppeChat *chat;
-	GruppeAccountListe *accounts;
-	GruppeEinladungListe *einladungen;
-	GruppeKarte *karte;
-	GruppeSpielGefunden *spiel;
-	bool sichtbar;
-	unsigned char alpha;
-	int gruppeId;
-	double tickVal;
-	bool rend;
-	int ref;
+    Punkt pos;
+    Punkt gr;
+    GruppeAnmeldung *anmeldung;
+    GruppeChat *chat;
+    GruppeAccountListe *accounts;
+    GruppeEinladungListe *einladungen;
+    GruppeKarte *karte;
+    GruppeSpielGefunden *spiel;
+    bool sichtbar;
+    unsigned char alpha;
+    int gruppeId;
+    double tickVal;
+    bool rend;
 
 public:
-	// Konstruktor
-	GruppeFenster( Schrift *zSchrift );
-	// Destruktor
-	~GruppeFenster();
-	// nicht constant
-	void setGruppeId( int id );
-	void setSichtbar( bool sichtbar );
-	void chatNachricht( const char *nachricht );
-	void neuerSpieler( int accountId );
-	void spielerVerlässt( int accountId );
-	void neueEinladung( int accountId );
-	void einladungEntfernt( int accountId );
-	void einladungAbgelehnt( int accountId );
-	void setSpielerHinzufügen( bool sh );
-	void setAngemeldet( bool angemeldet );
-	void spielGefunden();
-	void verbleibendeZeit( int sekunden );
-	void spielGefundenAbbruch();
-	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
-	void setAdmin( int accountId );
-	void kick();
-	void reset();
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-	int getGruppeId() const;
-	int getKarteId() const;
-	// Reference ounting
-	GruppeFenster *getThis();
-	GruppeFenster *release();
+    // Konstruktor
+    GruppeFenster();
+    // Destruktor
+    ~GruppeFenster();
+    // nicht constant
+    void setGruppeId( int id );
+    void setSichtbar( bool sichtbar );
+    void chatNachricht( const char *nachricht );
+    void neuerSpieler( int accountId );
+    void spielerVerlässt( int accountId );
+    void neueEinladung( int accountId );
+    void einladungEntfernt( int accountId );
+    void einladungAbgelehnt( int accountId );
+    void setSpielerHinzufügen( bool sh );
+    void setAngemeldet( bool angemeldet );
+    void spielGefunden();
+    void verbleibendeZeit( int sekunden );
+    void spielGefundenAbbruch();
+    void zurückInWarteschlange( int stunden, int minuten, int sekunden );
+    void setAdmin( int accountId );
+    void kick();
+    void reset();
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
+    // constant
+    int getGruppeId() const;
+    int getKarteId() const;
 };
 
 #endif

+ 20 - 60
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.cpp

@@ -17,15 +17,15 @@ void KarteAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVa
 {
     if( !p )
         return;
-    ( (KarteDaten*)p )->ksgsAktion( parameter, retVal );
+    ( (KarteDaten *)p )->ksgsAktion( parameter, retVal );
 }
 
 
 KarteDaten::Loader::Loader( KarteDaten *kd, int aktion )
+    : Thread()
 {
     this->aktion = aktion;
     this->kd = kd;
-    ref = 2;
     start();
 }
 
@@ -35,11 +35,11 @@ void KarteDaten::Loader::thread()
     {
         kd->geladen = 0;
         if( kd->hintergrund )
-            kd->hintergrund = kd->hintergrund->release();
+            kd->hintergrund = (Bild *)kd->hintergrund->release();
         if( kd->beschreibung )
         {
-            kd->beschreibung->zurücksetzen();
-            kd->beschreibung = dynamic_cast<KSGScriptObj*>(kd->beschreibung->release());
+            kd->beschreibung->reset();
+            kd->beschreibung = (KSGScriptObj *)kd->beschreibung->release();
         }
         kd->rend = 1;
         if( kd->ksgs )
@@ -56,7 +56,7 @@ void KarteDaten::Loader::thread()
         if( aktion == 1 )
         {
             if( !kd->hintergrund )
-                kd->hintergrund = mapReader->getKartenTitelBild( kd->schrift );
+                kd->hintergrund = mapReader->getKartenTitelBild();
             if( !kd->geladen )
                 kd->geladen = 1;
             kd->rend = 1;
@@ -67,8 +67,8 @@ void KarteDaten::Loader::thread()
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Beschreibung nicht gefunden." ), new Text( "Ok" ) );
             if( kd->beschreibung )
             {
-                kd->beschreibung->zurücksetzen();
-                kd->beschreibung = dynamic_cast<KSGScriptObj*>(kd->beschreibung->release());
+                kd->beschreibung->reset();
+                kd->beschreibung = (KSGScriptObj *)kd->beschreibung->release();
             }
             if( !kd->ksgs )
                 kd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
@@ -78,11 +78,11 @@ void KarteDaten::Loader::thread()
                 if( getKSGScript )
                 {
                     kd->beschreibung = getKSGScript();
-                    kd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                    kd->beschreibung->setSchriftZ( kd->schrift->getThis() );
+                    kd->beschreibung->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+                    kd->beschreibung->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
                     kd->beschreibung->setSize( 578, 428 );
-                    kd->beschreibung->setRückrufParam( kd );
-                    kd->beschreibung->setRückrufFunktion( KarteAuswahlKSGSAktion );
+                    kd->beschreibung->setCallbackParam( kd );
+                    kd->beschreibung->setCallbackFunktion( KarteAuswahlKSGSAktion );
                     Text *pf = mapReader->getKartePfad();
                     *pf += "beschreibung.ksgs";
                     kd->beschreibung->setScriptDatei( pf );
@@ -129,16 +129,8 @@ void KarteDaten::Loader::thread()
     if( !kd->erlaubt )
         kd->updateErlaubt();
     kd->rend = 1;
-    release();
 }
 
-KarteDaten::Loader *KarteDaten::Loader::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
-};
-
 int KarteDaten::Loader::getAction() const
 {
     return aktion;
@@ -146,7 +138,8 @@ int KarteDaten::Loader::getAction() const
 
 // Inhalt der KarteDaten Klasse aus KarteAuswahl.h
 // Konstruktor
-KarteDaten::KarteDaten( Schrift *zSchrift, int id )
+KarteDaten::KarteDaten( int id )
+    : ReferenceCounter()
 {
     hintergrund = 0;
     beschreibung = 0;
@@ -159,7 +152,6 @@ KarteDaten::KarteDaten( Schrift *zSchrift, int id )
     ausgewählt = 0;
     pos = Punkt( 0, 500 );
     gr = Punkt( 200, 100 );
-    schrift = zSchrift->getThis();
     karteId = id;
     geladen = 0;
     auswahl = new AlphaFeld();
@@ -171,7 +163,6 @@ KarteDaten::KarteDaten( Schrift *zSchrift, int id )
     erlaubt = 0;
     tAlpha = 0;
     alpha = 0;
-    ref = 1;
     loader = new Loader( this, 1 );
 }
 
@@ -181,13 +172,11 @@ KarteDaten::~KarteDaten()
     if( loader && loader->isRunning() )
         loader->warteAufThread( INT_MAX );
     loader->release();
-    if( schrift )
-        schrift->release();
     if( hintergrund )
         hintergrund->release();
     if( beschreibung )
     {
-        beschreibung->zurücksetzen();
+        beschreibung->reset();
         beschreibung->release();
     }
     if( ksgs )
@@ -345,7 +334,7 @@ bool KarteDaten::tick( double tickVal )
         beschreibung->unlock();
     }
     this->tickVal += tickVal * 500;
-    int val = ( int ) this->tickVal;
+    int val = (int)this->tickVal;
     if( val < 1 )
     {
         bool ret = rend;
@@ -500,27 +489,11 @@ bool KarteDaten::istausgew
     return ausgewählt;
 }
 
-// Reference Counting
-KarteDaten *KarteDaten::getThis()
-{
-    ref++;
-    return this;
-}
-
-KarteDaten *KarteDaten::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der KarteAuswahlFenster Klasse aus KarteAuswahl.h
 // Konstruktor
-KarteAuswahlFenster::KarteAuswahlFenster( Schrift *zSchrift )
+KarteAuswahlFenster::KarteAuswahlFenster()
 {
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     rahmen = new LRahmen();
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
@@ -541,8 +514,6 @@ KarteAuswahlFenster::KarteAuswahlFenster( Schrift *zSchrift )
 // Destruktor
 KarteAuswahlFenster::~KarteAuswahlFenster()
 {
-    if( schrift )
-        schrift->release();
     if( rahmen )
         rahmen->release();
     if( members )
@@ -622,7 +593,7 @@ void KarteAuswahlFenster::thread()
         }
         if( !gefunden )
         {
-            KarteDaten *tmp = new KarteDaten( schrift, liste->hat( i ) ? liste->get( i ) : 0 );
+            KarteDaten *tmp = new KarteDaten( liste->hat( i ) ? liste->get( i ) : 0 );
             members->add( tmp, anzahl );
             anzahl++;
         }
@@ -645,7 +616,7 @@ bool KarteAuswahlFenster::tick( double tickVal )
     for( int i = 0; i < anzahl; i++ )
         rend |= members->z( i )->tick( tickVal );
     this->tickVal += tickVal * 750;
-    int val = ( int )this->tickVal;
+    int val = (int)this->tickVal;
     if( val < 1 )
     {
         bool ret = rend;
@@ -796,15 +767,4 @@ bool KarteAuswahlFenster::hatAuswahl() const
 KarteDaten *KarteAuswahlFenster::getAuswahl() const
 {
     return members->get( auswahl );
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *KarteAuswahlFenster::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        ende();
-    }
-    return Thread::release();
 }

+ 4 - 13
KSGClient/NachLogin/Spiele/Karte Auswahl/KarteAuswahl.h

@@ -11,23 +11,21 @@
 using namespace Framework;
 using namespace KSGScript;
 
-class KarteDaten
+class KarteDaten : public virtual ReferenceCounter
 {
 private:
     class Loader : public Thread
     {
     private:
-        KarteDaten * kd;
+        KarteDaten *kd;
         int aktion;
     public:
         Loader( KarteDaten *kd, int aktion );
         void thread() override;
-        Loader *release();
         int getAction() const;
     };
     Loader *loader;
     int karteId;
-    Schrift *schrift;
     Bild *hintergrund;
     HINSTANCE ksgs;
     KSGScriptObj *beschreibung;
@@ -44,12 +42,11 @@ private:
     bool rend;
     unsigned char tAlpha;
     unsigned char alpha;
-    int ref;
     friend Loader;
 
 public:
     // Konstruktor
-    KarteDaten( Schrift *zSchrift, int id );
+    KarteDaten( int id );
     // Destruktor
     ~KarteDaten();
     // nicht constant
@@ -65,9 +62,6 @@ public:
     // constant
     int getKarteId() const;
     bool istausgewählt() const;
-    // Reference Counting
-    KarteDaten *getThis();
-    KarteDaten *release();
 };
 
 class KarteAuswahlFenster : public Thread
@@ -77,7 +71,6 @@ private:
     int auswahl;
     RCArray< KarteDaten > *members;
     LRahmen *rahmen;
-    Schrift *schrift;
     TextRenderer *tr;
     double tickVal;
     int animation;
@@ -90,7 +83,7 @@ private:
 
 public:
     // Konstruktor
-    KarteAuswahlFenster( Schrift *zSchrift );
+    KarteAuswahlFenster();
     // Destruktor
     ~KarteAuswahlFenster();
     // nicht constant
@@ -109,8 +102,6 @@ public:
     int getAnzahlAufSeite() const;
     bool hatAuswahl() const;
     KarteDaten *getAuswahl() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 #endif

+ 60 - 100
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.cpp

@@ -19,12 +19,12 @@ void SpielAuswahlKSGSAktion( void *p, RCArray< KSGSVariable > *parameter, KSGSVa
     ( (SpielDaten *)p )->ksgsAktion( parameter, retVal );
 }
 
-SpielDaten::Loader::Loader( SpielDaten * sd, int aktion )
+SpielDaten::Loader::Loader( SpielDaten *sd, int aktion )
+    : Thread()
 {
     this->sd = sd;
     this->aktion = aktion;
     beenden = 0;
-    ref = 2;
     start();
 }
 
@@ -38,7 +38,7 @@ void SpielDaten::Loader::thread()
     Text *pfad = new Text( "data/spiele/" );
     pfad->append( sd->name->getText() );
     pfad->append( "/data/game.ini" );
-    if( !DateiExistiert( pfad->getThis() ) )
+    if( !DateiExistiert( pfad->getText() ) )
     {
         if( !aktion )
         {
@@ -46,16 +46,16 @@ void SpielDaten::Loader::thread()
                 sd->aAnimation->setSichtbar( 0 );
             sd->geladen = 0;
             sd->ausgewählt = 0;
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( sd->aAnimation )
                 sd->aAnimation = (Animation2D *)sd->aAnimation->release();
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             if( sd->hintergrund )
-                sd->hintergrund = sd->hintergrund->release();
+                sd->hintergrund = (Bild *)sd->hintergrund->release();
             if( sd->beschreibung )
             {
-                sd->beschreibung->zurücksetzen();
-                sd->beschreibung = dynamic_cast<KSGScriptObj *>( sd->beschreibung->release() );
+                sd->beschreibung->reset();
+                sd->beschreibung = (KSGScriptObj *)sd->beschreibung->release();
             }
             if( sd->ksgs )
             {
@@ -122,8 +122,8 @@ void SpielDaten::Loader::thread()
             {
                 if( sd->beschreibung )
                 {
-                    sd->beschreibung->zurücksetzen();
-                    sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
+                    sd->beschreibung->reset();
+                    sd->beschreibung = (KSGScriptObj *)sd->beschreibung->release();
                 }
                 if( !sd->ksgs )
                     sd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
@@ -133,18 +133,18 @@ void SpielDaten::Loader::thread()
                     if( getKSGScript )
                     {
                         sd->beschreibung = getKSGScript();
-                        sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                        sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
+                        sd->beschreibung->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+                        sd->beschreibung->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
                         sd->beschreibung->setSize( 578, 428 );
-                        sd->beschreibung->setRückrufParam( sd );
-                        sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
+                        sd->beschreibung->setCallbackParam( sd );
+                        sd->beschreibung->setCallbackFunktion( SpielAuswahlKSGSAktion );
                         sd->beschreibung->setScriptDatei( "data/script/SpielNichtAktuell.ksgs" );
                     }
                     else
                     {
                         nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                       new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                                      "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                                "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                       new Text( "Ok" ), 0 );
                     }
                 }
@@ -156,7 +156,7 @@ void SpielDaten::Loader::thread()
                 }
                 if( sd->beschreibung )
                     sd->geladen = 2;
-                if( sd->beschreibung &&sd->ksgs &&sd->ausgewählt )
+                if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
                     sd->beschreibung->neuLaden();
             }
         }
@@ -173,16 +173,16 @@ void SpielDaten::Loader::thread()
             sd->aAnimation->setSichtbar( 0 );
         sd->geladen = 0;
         sd->ausgewählt = 0;
-        hauptScreen->lock();
+        uiFactory.initParam.bildschirm->lock();
         if( sd->aAnimation )
             sd->aAnimation = (Animation2D *)sd->aAnimation->release();
-        hauptScreen->unlock();
+        uiFactory.initParam.bildschirm->unlock();
         if( sd->hintergrund )
-            sd->hintergrund = sd->hintergrund->release();
+            sd->hintergrund = (Bild *)sd->hintergrund->release();
         if( sd->beschreibung )
         {
-            sd->beschreibung->zurücksetzen();
-            sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
+            sd->beschreibung->reset();
+            sd->beschreibung = (KSGScriptObj *)sd->beschreibung->release();
         }
         if( sd->ksgs )
         {
@@ -214,7 +214,7 @@ void SpielDaten::Loader::thread()
             if( !sd->hintergrund )
             {
                 LTDBDatei *bildDatei = new LTDBDatei();
-                bildDatei->setDatei( pf->getThis() );
+                bildDatei->setDatei( dynamic_cast<Text *>( pf->getThis() ) );
                 bildDatei->leseDaten( 0 );
                 sd->hintergrund = bildDatei->laden( 0, bildDatei->zBildListe()->get( 0 ) );
                 bildDatei->release();
@@ -228,10 +228,10 @@ void SpielDaten::Loader::thread()
         pf->insert( 0, "/data/" );
         pf->insert( 0, sd->name->getText() );
         pf->insert( 0, "data/spiele/" );
-        Datei * idDatei = new Datei();
+        Datei *idDatei = new Datei();
         idDatei->setDatei( pf->getText() );
         idDatei->open( Datei::Style::lesen );
-        idDatei->lese( (char *)& sd->spielId, 4 );
+        idDatei->lese( (char *)&sd->spielId, 4 );
         idDatei->close();
         idDatei->release();
         pf->release();
@@ -249,17 +249,17 @@ void SpielDaten::Loader::thread()
             if( !pf->hat( ".ltdb/" ) )
             {
                 LTDBDatei *add = new LTDBDatei();
-                add->setDatei( pf->getThis() );
+                add->setDatei( dynamic_cast<Text *>( pf->getThis() ) );
                 add->leseDaten( 0 );
                 Animation2DData *ad = new Animation2DData();
                 ad->ladeAnimation( add );
                 ad->setWiederhohlend( 1 );
                 ad->setFPS( 30 );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 if( sd->aAnimation )
                     sd->aAnimation = (Animation2D *)sd->aAnimation->release();
                 sd->aAnimation = new Animation2D();
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
                 sd->aAnimation->setSize( 200, 100 );
                 sd->aAnimation->setPosition( 0, 0 );
                 sd->aAnimation->setAnimationDataZ( ad );
@@ -272,8 +272,8 @@ void SpielDaten::Loader::thread()
             pf->insert( 0, "data/spiele/" );
             if( sd->beschreibung )
             {
-                sd->beschreibung->zurücksetzen();
-                sd->beschreibung = dynamic_cast<KSGScriptObj*>(sd->beschreibung->release());
+                sd->beschreibung->reset();
+                sd->beschreibung = (KSGScriptObj *)sd->beschreibung->release();
             }
             if( !sd->ksgs )
                 sd->ksgs = Framework::getDLLRegister()->ladeDLL( "KSGScript.dll", "data/bin/KSGScript.dll" );
@@ -283,18 +283,18 @@ void SpielDaten::Loader::thread()
                 if( getKSGScript )
                 {
                     sd->beschreibung = getKSGScript();
-                    sd->beschreibung->setBildschirmZ( hauptScreen->getThis() );
-                    sd->beschreibung->setSchriftZ( sd->schrift->getThis() );
+                    sd->beschreibung->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+                    sd->beschreibung->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
                     sd->beschreibung->setSize( 578, 428 );
-                    sd->beschreibung->setRückrufParam( sd );
-                    sd->beschreibung->setRückrufFunktion( SpielAuswahlKSGSAktion );
+                    sd->beschreibung->setCallbackParam( sd );
+                    sd->beschreibung->setCallbackFunktion( SpielAuswahlKSGSAktion );
                     sd->beschreibung->setScriptDatei( pf->getText() );
                 }
                 else
                 {
                     nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                                   new Text( "Der Einstiegspunkt '" KSGS_START_FUNKTION "' in der DLL-Datei "
-                                                                  "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
+                                                                            "'data/bin/KSGScript.dll' konnte nicht gefunden werden." ),
                                                                   new Text( "Ok" ), 0 );
                 }
             }
@@ -307,7 +307,7 @@ void SpielDaten::Loader::thread()
             pf->release();
             if( sd->beschreibung )
                 sd->geladen = 2;
-            if( sd->beschreibung &&sd->ksgs &&sd->ausgewählt )
+            if( sd->beschreibung && sd->ksgs && sd->ausgewählt )
                 sd->beschreibung->neuLaden();
             sd->rend = 1;
         }
@@ -318,14 +318,6 @@ void SpielDaten::Loader::thread()
     if( !sd->erlaubt )
         sd->updateErlaubt();
     sd->rend = 1;
-    release();
-}
-
-SpielDaten::Loader *SpielDaten::Loader::release()
-{
-    if( !--ref )
-        delete this;
-    return 0;
 }
 
 int SpielDaten::Loader::getAktion() const
@@ -335,7 +327,8 @@ int SpielDaten::Loader::getAktion() const
 
 // Inhalt der SpielDaten Klasse aus SpielAuswahl.h
 // Konstruktor
-SpielDaten::SpielDaten( Schrift * zSchrift, const char *name, int id )
+SpielDaten::SpielDaten( const char *name, int id )
+    : ReferenceCounter()
 {
     this->name = new Text( name );
     hintergrund = 0;
@@ -350,8 +343,7 @@ SpielDaten::SpielDaten( Schrift * zSchrift, const char *name, int id )
     ausgewählt = 0;
     pos = Punkt( 0, 500 );
     gr = Punkt( 200, 100 );
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     spielId = id;
     geladen = 0;
     erlaubt = 0;
@@ -361,7 +353,6 @@ SpielDaten::SpielDaten( Schrift * zSchrift, const char *name, int id )
     auswahl->setSize( 200, 100 );
     ladenBild = 0;
     rend = 0;
-    ref = 1;
     alpha = 0;
     tAlpha = 0;
     loader = new Loader( this, 1 );
@@ -370,11 +361,9 @@ SpielDaten::SpielDaten( Schrift * zSchrift, const char *name, int id )
 // Destruktor
 SpielDaten::~SpielDaten()
 {
-    if( loader &&loader->isRunning() )
+    if( loader && loader->isRunning() )
         loader->warteAufThread( INT_MAX );
     loader->release();
-    if( schrift )
-        schrift->release();
     name->release();
     if( hintergrund )
         hintergrund->release();
@@ -382,7 +371,7 @@ SpielDaten::~SpielDaten()
         aAnimation->release();
     if( beschreibung )
     {
-        beschreibung->zurücksetzen();
+        beschreibung->reset();
         beschreibung->release();
     }
     if( ksgs )
@@ -396,7 +385,7 @@ SpielDaten::~SpielDaten()
 }
 
 // nicht constant
-void SpielDaten::ksgsAktion( RCArray< KSGSVariable > * parameter, KSGSVariable * *retVal )
+void SpielDaten::ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal )
 {}
 
 void SpielDaten::setSichtbar( bool sichtbar )
@@ -409,10 +398,10 @@ void SpielDaten::setSichtbar( bool sichtbar )
         setAuswahl( 0 );
         auswahl->setFarbe( auswahl->getFarbe() & 0xFFFFFF );
     }
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     if( loader->getAktion() == ( sichtbar ? 2 : 0 ) )
     {
-        hauptScreen->unlock();
+        uiFactory.initParam.bildschirm->unlock();
         rend = 1;
         return;
     }
@@ -420,26 +409,26 @@ void SpielDaten::setSichtbar( bool sichtbar )
     Loader *altLoader = loader;
     loader = new Loader( this, sichtbar ? 2 : 0 );
     altLoader->release();
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
     rend = 1;
 }
 
 void SpielDaten::setSichtbar()
 {
     animation |= 1;
-    if( ausgewählt &&geladen == 2 )
+    if( ausgewählt && geladen == 2 )
     {
         animation |= 0x4;
         beschreibung->setPosition( beschreibung->getX(), 0 );
     }
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     if( geladen != 2 && loader->getAktion() != 2 )
     {
         Loader *altLoader = loader;
         loader = new Loader( this, 2 );
         altLoader->release();
     }
-    hauptScreen->unlock();
+    uiFactory.initParam.bildschirm->unlock();
     rend = 1;
 }
 
@@ -452,7 +441,7 @@ void SpielDaten::setAuswahl( bool auswahl )
     {
         if( aAnimation )
             aAnimation->setSichtbar( 1 );
-        if( beschreibung &&ksgs )
+        if( beschreibung && ksgs )
             beschreibung->neuLaden();
         animation |= 0x4;
     }
@@ -487,9 +476,9 @@ void SpielDaten::updateErlaubt()
         Text msg = "Das Spiel '";
         msg += name->getText();
         msg += "' muss aktualisiert werden.";
-        nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( schrift, new Text( "Update" ), msg.getThis(), dgId, []()
+        nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( new Text( "Update" ), dynamic_cast<Text *>( msg.getThis() ), dgId, []()
         {
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->updateErlaubt();
         } ) );
     }
@@ -620,7 +609,7 @@ bool SpielDaten::tick( double tickVal )
     return ret;
 }
 
-void SpielDaten::doPublicMausEreignis( MausEreignis & me )
+void SpielDaten::doPublicMausEreignis( MausEreignis &me )
 {
     if( !erlaubt && ausgewählt )
     {
@@ -632,7 +621,7 @@ void SpielDaten::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void SpielDaten::render( Bild & zRObj )
+void SpielDaten::render( Bild &zRObj )
 {
     int x = pos.x;
     int y = pos.y;
@@ -643,12 +632,12 @@ void SpielDaten::render( Bild & zRObj )
     zRObj.setAlpha( tAlpha );
     rahmen->setSize( br, hö );
     int rbr = rahmen->getRBreite();
-    if( geladen &&hintergrund && ( !( ausgewählt &&geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
+    if( geladen && hintergrund && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
         zRObj.drawBild( rbr, rbr, br - rbr * 2, hö - rbr * 2, *hintergrund );
     if( aAnimation )
         aAnimation->render( zRObj );
     rahmen->render( zRObj );
-    if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt &&geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
+    if( auswahl && ( ( auswahl->getFarbe() >> 24 ) & 0xFF ) && ( !( ausgewählt && geladen == 2 && aAnimation ) || !aAnimation->istSichtbar() ) )
     {
         auswahl->setPosition( rbr, rbr );
         auswahl->setSize( br - rbr * 2, hö - rbr * 2 );
@@ -670,7 +659,7 @@ void SpielDaten::render( Bild & zRObj )
         beschreibung->render( zRObj );
         zRObj.releaseAlpha();
     }
-    if( ausgewählt &&geladen != 2 && ladeAnimation->zAnimationData() )
+    if( ausgewählt && geladen != 2 && ladeAnimation->zAnimationData() )
     {
         ladenBild++;
         if( ladenBild >= ladeAnimation->zAnimationData()->getBildAnzahl() )
@@ -703,28 +692,12 @@ bool SpielDaten::istErlaubt() const
     return erlaubt;
 }
 
-// Reference Counting
-SpielDaten *SpielDaten::getThis()
-{
-    ref++;
-    return this;
-}
-
-SpielDaten *SpielDaten::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der SpielAuswahl Klasse aus SpielAuswahl.h
 // Konstruktor
-SpielAuswahlFenster::SpielAuswahlFenster( Schrift * zSchrift )
+SpielAuswahlFenster::SpielAuswahlFenster()
     : Thread()
 {
-    schrift = zSchrift->getThis();
-    tr = new TextRenderer( schrift->getThis() );
+    tr = new TextRenderer( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
     rahmen = new LRahmen();
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
@@ -745,8 +718,6 @@ SpielAuswahlFenster::SpielAuswahlFenster( Schrift * zSchrift )
 // Destruktor
 SpielAuswahlFenster::~SpielAuswahlFenster()
 {
-    if( schrift )
-        schrift->release();
     if( rahmen )
         rahmen->release();
     if( members )
@@ -821,7 +792,7 @@ void SpielAuswahlFenster::thread()
             }
             if( !gefunden )
             {
-                SpielDaten *tmp = new SpielDaten( schrift, name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
+                SpielDaten *tmp = new SpielDaten( name->getText(), liste->hat( i ) ? liste->get( i ) : 0 );
                 members->add( tmp, anzahl );
                 anzahl++;
             }
@@ -890,7 +861,7 @@ bool SpielAuswahlFenster::tick( double tickVal )
     return ret;
 }
 
-void SpielAuswahlFenster::doPublicMausEreignis( MausEreignis & me )
+void SpielAuswahlFenster::doPublicMausEreignis( MausEreignis &me )
 {
     if( pos.x != 10 )
         return;
@@ -935,7 +906,7 @@ void SpielAuswahlFenster::doPublicMausEreignis( MausEreignis & me )
     me.my += pos.y;
 }
 
-void SpielAuswahlFenster::render( Bild & zrObj )
+void SpielAuswahlFenster::render( Bild &zrObj )
 {
     int x = pos.x;
     int y = pos.y;
@@ -1005,15 +976,4 @@ SpielDaten *SpielAuswahlFenster::zAuswahl() const
 bool SpielAuswahlFenster::istAuswahlErlubt() const
 {
     return auswahl != -1 && members->z( auswahl )->istErlaubt();
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *SpielAuswahlFenster::release()
-{
-    if( ref == 2 && run )
-    {
-        warteAufThread( 5000 );
-        ende();
-    }
-    return Thread::release();
 }

+ 4 - 13
KSGClient/NachLogin/Spiele/Spiel Auswahl/SpielAuswahl.h

@@ -14,20 +14,19 @@ using namespace KSGScript;
 
 class SpielDaten; // aus dieser Datei
 
-class SpielDaten
+class SpielDaten : public virtual ReferenceCounter
 {
 private:
     class Loader : public Thread
     {
     private:
-        SpielDaten * sd;
+        SpielDaten *sd;
         bool beenden;
         int aktion;
     public:
         Loader( SpielDaten *sd, int aktion );
         void setBeenden();
         void thread() override;
-        Loader *release();
         int getAktion() const;
     };
     Loader *loader;
@@ -35,7 +34,6 @@ private:
     Text *name;
     Bild *hintergrund;
     Animation2D *aAnimation;
-    Schrift *schrift;
     TextRenderer *tr;
     KSGScriptObj *beschreibung;
     HINSTANCE ksgs;
@@ -52,11 +50,10 @@ private:
     bool erlaubt;
     unsigned char tAlpha;
     unsigned char alpha;
-    int ref;
 
 public:
     // Konstruktor
-    SpielDaten( Schrift *zSchrift, const char *name, int id );
+    SpielDaten( const char *name, int id );
     // Destruktor
     ~SpielDaten();
     // nicht constant
@@ -74,9 +71,6 @@ public:
     bool istausgewählt() const;
     Text *zName() const;
     bool istErlaubt() const;
-    // Reference Counting
-    SpielDaten *getThis();
-    SpielDaten *release();
 };
 
 class SpielAuswahlFenster : public Thread
@@ -86,7 +80,6 @@ private:
     int auswahl;
     RCArray< SpielDaten > *members;
     LRahmen *rahmen;
-    Schrift *schrift;
     TextRenderer *tr;
     double tickVal;
     int animation;
@@ -98,7 +91,7 @@ private:
 
 public:
     // Konstruktor
-    SpielAuswahlFenster( Schrift *zSchrift );
+    SpielAuswahlFenster();
     // Destruktor
     ~SpielAuswahlFenster();
     // nicht constant
@@ -118,8 +111,6 @@ public:
     SpielDaten *getAuswahl() const;
     SpielDaten *zAuswahl() const;
     bool istAuswahlErlubt() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 #endif

+ 654 - 649
KSGClient/NachLogin/Spiele/Spiele.cpp

@@ -9,819 +9,824 @@
 
 // Inhalt der Spiele Klasse aus Spiele.h
 // Konstruktor
-Spiele::Spiele( Schrift *zSchrift, Fenster *zNachLoginFenster, int x )
-	: Zeichnung()
-{
-	bildschirmGröße = hauptScreen->getBackBufferSize();
-	pos = Punkt( x, 67 );
-	gr = Punkt( 102, 32 );
-	LTDBDatei *spielenBilder = new LTDBDatei();
-	spielenBilder->setDatei( new Text( "data/client/bilder/spielen.ltdb" ) );
-	spielenBilder->leseDaten( 0 );
-	rahmen = new LRahmen();
-	rahmen->setFarbe( 0xFFFFFFFF );
-	rahmen->setSize( 102, 32 );
-	spielAuswahl = new SpielAuswahlFenster( zSchrift );
-	karteAuswahl = new KarteAuswahlFenster( zSchrift );
-	anmeldung = new AngemeldetFenster( zSchrift );
-	gruppe = new GruppeFenster( zSchrift );
-	teamAuswahl = new TeamAuswahl( zSchrift );
-	statistik = new SpielStatistik( zSchrift );
-	oben = initKnopf( 380, 450, 40, 15, 0, 0, "" );
-	oben->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	oben->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "oben.png" ) ) );
-	initToolTip( oben, "Nach oben umblättern.", zSchrift, hauptScreen );
-	links = initKnopf( 360, 450, 15, 40, 0, 0, "" );
-	links->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	links->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "links.png" ) ) );
-	initToolTip( links, "Zurück.", zSchrift, hauptScreen );
-	unten = initKnopf( 380, 475, 40, 15, 0, 0, "" );
-	unten->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	unten->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "unten.png" ) ) );
-	initToolTip( unten, "Nach unten umblättern.", zSchrift, hauptScreen );
-	rechts = initKnopf( 425, 450, 15, 40, 0, 0, "" );
-	rechts->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	rechts->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "rechts.png" ) ) );
-	initToolTip( rechts, "Weiter.", zSchrift, hauptScreen );
-	spielenBilder->release();
-	alpha = 0;
-	ladenAlpha = 0;
-	ladenJetzt = 0;
-	animation = 0;
-	sichtbar = 0;
-	tickVal = 0;
-	tickVal2 = 0;
-	jetzt = 0;
-	prozent1 = 0;
-	prozent2 = 0;
-	prozent3 = 0;
-	prozent4 = 0;
-	prozent5 = 0;
-	prozent6 = 0;
-	spielGefundenB = 0;
-	begPos = Punkt( 0, 0 );
-	begGröße = Punkt( 0, 0 );
-	größe1 = Punkt( 102, 32 );
-	pos1 = Punkt( x, 67 );
-	größe2 = Punkt( 800, 500 );
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	größe3 = Punkt( 950, 550 );
-	pos3 = bildschirmGröße / 2 - größe3 / 2;
-	größe4 = Punkt( 700, 600 );
-	pos4 = bildschirmGröße / 2 - größe4 / 2;
-	zNachLoginFenster->addMember( getThis() );
+Spiele::Spiele( Fenster *zNachLoginFenster, int x )
+    : Zeichnung()
+{
+    bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    pos = Punkt( x, 67 );
+    gr = Punkt( 102, 32 );
+    LTDBDatei *spielenBilder = new LTDBDatei();
+    spielenBilder->setDatei( new Text( "data/client/bilder/spielen.ltdb" ) );
+    spielenBilder->leseDaten( 0 );
+    rahmen = new LRahmen();
+    rahmen->setFarbe( 0xFFFFFFFF );
+    rahmen->setSize( 102, 32 );
+    spielAuswahl = new SpielAuswahlFenster();
+    karteAuswahl = new KarteAuswahlFenster();
+    anmeldung = new AngemeldetFenster();
+    gruppe = new GruppeFenster();
+    teamAuswahl = new TeamAuswahl();
+    statistik = new SpielStatistik();
+    oben = initKnopf( 380, 450, 40, 15, 0, "" );
+    oben->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    oben->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "oben.png" ) ) );
+    initToolTip( oben, "Nach oben umblättern." );
+    links = initKnopf( 360, 450, 15, 40, 0, "" );
+    links->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    links->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "links.png" ) ) );
+    initToolTip( links, "Zurück." );
+    unten = initKnopf( 380, 475, 40, 15, 0, "" );
+    unten->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    unten->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "unten.png" ) ) );
+    initToolTip( unten, "Nach unten umblättern." );
+    rechts = initKnopf( 425, 450, 15, 40, 0, "" );
+    rechts->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    rechts->setHintergrundBildZ( spielenBilder->laden( 0, new Text( "rechts.png" ) ) );
+    initToolTip( rechts, "Weiter." );
+    spielenBilder->release();
+    alpha = 0;
+    ladenAlpha = 0;
+    ladenJetzt = 0;
+    animation = 0;
+    sichtbar = 0;
+    tickVal = 0;
+    tickVal2 = 0;
+    jetzt = 0;
+    prozent1 = 0;
+    prozent2 = 0;
+    prozent3 = 0;
+    prozent4 = 0;
+    prozent5 = 0;
+    prozent6 = 0;
+    spielGefundenB = 0;
+    begPos = Punkt( 0, 0 );
+    begGröße = Punkt( 0, 0 );
+    größe1 = Punkt( 102, 32 );
+    pos1 = Punkt( x, 67 );
+    größe2 = Punkt( 800, 500 );
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    größe3 = Punkt( 950, 550 );
+    pos3 = bildschirmGröße / 2 - größe3 / 2;
+    größe4 = Punkt( 700, 600 );
+    pos4 = bildschirmGröße / 2 - größe4 / 2;
+    getThis();
+    zNachLoginFenster->addMember( this );
 }
 
 // Destruktor
 Spiele::~Spiele()
 {
-	rahmen->release();
-	spielAuswahl->release();
-	karteAuswahl->release();
-	anmeldung->release();
-	gruppe->release();
-	teamAuswahl->release();
-	statistik->release();
-	oben->release();
-	links->release();
-	unten->release();
-	rechts->release();
+    rahmen->release();
+    spielAuswahl->warteAufThread( 10000 );
+    spielAuswahl->ende();
+    spielAuswahl->release();
+    karteAuswahl->warteAufThread( 10000 );
+    karteAuswahl->ende();
+    karteAuswahl->release();
+    anmeldung->release();
+    gruppe->release();
+    teamAuswahl->release();
+    statistik->release();
+    oben->release();
+    links->release();
+    unten->release();
+    rechts->release();
 }
 
 // nicht constant
 void Spiele::setSichtbar( bool sicht )
 {
-	begPos = pos;
-	begGröße = gr;
-	animation |= ( sicht ? 0x1 : 0x2 );
-	updateErlaubt();
-	rend = 1;
+    begPos = pos;
+    begGröße = gr;
+    animation |= ( sicht ? 0x1 : 0x2 );
+    updateErlaubt();
+    rend = 1;
 }
 
 void Spiele::updateErlaubt()
 {
-	if( sichtbar )
-	{
-		if( jetzt == 1 )
-			spielAuswahl->updateListe();
-		if( jetzt == 2 )
-			karteAuswahl->updateListe();
-	}
+    if( sichtbar )
+    {
+        if( jetzt == 1 )
+            spielAuswahl->updateListe();
+        if( jetzt == 2 )
+            karteAuswahl->updateListe();
+    }
 }
 
 void Spiele::anmelden( int karteId )
 {
-	if( anmeldung->setKarteId( karteId ) )
-	{
-		karteAuswahl->setSichtbar( 0 );
-		anmeldung->setSichtbar( 1 );
-		jetzt = 3;
-	}
+    if( anmeldung->setKarteId( karteId ) )
+    {
+        karteAuswahl->setSichtbar( 0 );
+        anmeldung->setSichtbar( 1 );
+        jetzt = 3;
+    }
 }
 
 void Spiele::anmeldungAbbrechen()
 {
-	anmeldung->setSichtbar( 0 );
-	spielAuswahl->setSichtbar( 1 );
-	jetzt = 1;
+    anmeldung->setSichtbar( 0 );
+    spielAuswahl->setSichtbar( 1 );
+    jetzt = 1;
 }
 
 void Spiele::gruppeBetreten( int gruppeId )
 {
-	begPos = pos;
-	begGröße = gr;
-	größe2 = größe3;
-	pos2 = pos3;
-	gruppe->setGruppeId( gruppeId );
-	gruppe->neuerSpieler( loginClient->getAccountId() );
-	animation |= 0x4;
-	spielGefundenB = 0;
+    begPos = pos;
+    begGröße = gr;
+    größe2 = größe3;
+    pos2 = pos3;
+    gruppe->setGruppeId( gruppeId );
+    gruppe->neuerSpieler( loginClient->getAccountId() );
+    animation |= 0x4;
+    spielGefundenB = 0;
 }
 
 void Spiele::gruppeVerlassen()
 {
-	begPos = pos;
-	begGröße = gr;
-	größe2.x = 800;
-	größe2.y = 500;
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	animation |= 0x8;
+    begPos = pos;
+    begGröße = gr;
+    größe2.x = 800;
+    größe2.y = 500;
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    animation |= 0x8;
 }
 
 void Spiele::spielerBetrittGruppe( int gruppeId, int accountId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->neuerSpieler( accountId );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->neuerSpieler( accountId );
 }
 
 void Spiele::spielerVerlässtGruppe( int gruppeId, int accountId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->spielerVerlässt( accountId );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->spielerVerlässt( accountId );
 }
 
 void Spiele::gruppeNachricht( int gruppeId, char *nachricht )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->chatNachricht( nachricht );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->chatNachricht( nachricht );
 }
 
 void Spiele::gruppeAnmelden( int gruppeId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->setAngemeldet( 1 );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->setAngemeldet( 1 );
 }
 
 void Spiele::gruppeAbmelden( int gruppeId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->setAngemeldet( 0 );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->setAngemeldet( 0 );
 }
 
 void Spiele::setGruppeSpielStarten( int gruppeId, bool spielStarten )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->setSpielerHinzufügen( !spielStarten );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->setSpielerHinzufügen( !spielStarten );
 }
 
 void Spiele::setGruppeAdmin( int gruppeId, int admin )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->setAdmin( admin );
-	nachLogin->zFreundesListe()->zeigeEinladeKnopf( admin == loginClient->getAccountId() );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->setAdmin( admin );
+    nachLogin->zFreundesListe()->zeigeEinladeKnopf( admin == loginClient->getAccountId() );
 }
 
 void Spiele::kickAusGruppe( int gruppeId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-	{
-		gruppe->kick();
-		gruppeVerlassen();
-	}
+    if( gruppe->getGruppeId() == gruppeId )
+    {
+        gruppe->kick();
+        gruppeVerlassen();
+    }
 }
 
 void Spiele::gruppeEinladungNeu( int gruppeId, int accountId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->neueEinladung( accountId );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->neueEinladung( accountId );
 }
 
 void Spiele::gruppeEinladungAbgebrochen( int gruppeId, int accountId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->einladungEntfernt( accountId );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->einladungEntfernt( accountId );
 }
 
 void Spiele::gruppeEinadungAbgelehnt( int gruppeId, int accountId )
 {
-	if( gruppe->getGruppeId() == gruppeId )
-		gruppe->einladungAbgelehnt( accountId );
+    if( gruppe->getGruppeId() == gruppeId )
+        gruppe->einladungAbgelehnt( accountId );
 }
 
 void Spiele::spielGefunden( int karteId )
 {
-	MausEreignis me;
-	me.id = ME_RLinks;
-	hauptScreen->lock();
-	nachLogin->zTitelLeiste()->druckSpielen( me );
-	hauptScreen->unlock();
-	if( jetzt == 3 )
-		anmeldung->setSpielGefunden();
-	else if( jetzt == 4 )
-		gruppe->spielGefunden();
-	else
-		spielGefundenB = 1;
+    MausEreignis me;
+    me.id = ME_RLinks;
+    uiFactory.initParam.bildschirm->lock();
+    nachLogin->zTitelLeiste()->druckSpielen( me );
+    uiFactory.initParam.bildschirm->unlock();
+    if( jetzt == 3 )
+        anmeldung->setSpielGefunden();
+    else if( jetzt == 4 )
+        gruppe->spielGefunden();
+    else
+        spielGefundenB = 1;
 }
 
 void Spiele::spielGefundenZeitVerbleibend( int sekunden )
 {
-	if( jetzt == 3 )
-		anmeldung->setVerbleibendeZeit( sekunden );
-	if( jetzt == 4 )
-		gruppe->verbleibendeZeit( sekunden );
-	if( jetzt == 5 )
-		teamAuswahl->verbleibendeZeit( sekunden );
+    if( jetzt == 3 )
+        anmeldung->setVerbleibendeZeit( sekunden );
+    if( jetzt == 4 )
+        gruppe->verbleibendeZeit( sekunden );
+    if( jetzt == 5 )
+        teamAuswahl->verbleibendeZeit( sekunden );
 }
 
 void Spiele::spielGefundenAbbruch()
 {
-	if( jetzt == 3 )
-		anmeldung->spielGefundenAbbruch();
-	if( jetzt == 4 )
-		gruppe->spielGefundenAbbruch();
+    if( jetzt == 3 )
+        anmeldung->spielGefundenAbbruch();
+    if( jetzt == 4 )
+        gruppe->spielGefundenAbbruch();
 }
 
 void Spiele::zurückInWarteschlange( int stunden, int minuten, int sekunden )
 {
-	if( jetzt == 3 )
-		anmeldung->zurückInWarteschlange( stunden, minuten, sekunden );
-	if( jetzt == 4 )
-		gruppe->zurückInWarteschlange( stunden, minuten, sekunden );
+    if( jetzt == 3 )
+        anmeldung->zurückInWarteschlange( stunden, minuten, sekunden );
+    if( jetzt == 4 )
+        gruppe->zurückInWarteschlange( stunden, minuten, sekunden );
 }
 
 void Spiele::teamAuswahlBetreten()
 {
-	begPos = pos;
-	begGröße = gr;
-	größe2 = größe4;
-	pos2 = pos4;
-	animation |= 0x10;
+    begPos = pos;
+    begGröße = gr;
+    größe2 = größe4;
+    pos2 = pos4;
+    animation |= 0x10;
 }
 
 void Spiele::teamAuswahlInit( SpielerTeamStruktur *sts )
 {
-	int karteId = 0;
-	if( jetzt == 3 )
-		karteId = anmeldung->getKarteId();
-	if( jetzt == 4 )
-		karteId = gruppe->getKarteId();
-	teamAuswahl->setKarteId( karteId );
-	teamAuswahl->initSTS( sts );
+    int karteId = 0;
+    if( jetzt == 3 )
+        karteId = anmeldung->getKarteId();
+    if( jetzt == 4 )
+        karteId = gruppe->getKarteId();
+    teamAuswahl->setKarteId( karteId );
+    teamAuswahl->initSTS( sts );
 }
 
 void Spiele::teamAuswahlAddSpieler( int accountId )
 {
-	teamAuswahl->addSpieler( accountId );
+    teamAuswahl->addSpieler( accountId );
 }
 
 void Spiele::teamAuswahlRemoveSpieler( int accountId )
 {
-	teamAuswahl->removeSpieler( accountId );
+    teamAuswahl->removeSpieler( accountId );
 }
 
 void Spiele::teamAuswahlSpielerWehseltTeam( int accountId, int spielerNummer )
 {
-	teamAuswahl->setSpielerNummer( accountId, spielerNummer );
+    teamAuswahl->setSpielerNummer( accountId, spielerNummer );
 }
 
 void Spiele::teamAuswahlChatNachricht( char *nachricht )
 {
-	teamAuswahl->addNachricht( nachricht );
+    teamAuswahl->addNachricht( nachricht );
 }
 
 void Spiele::teamAuswahlAbbrechen()
 {
-	begPos = pos;
-	begGröße = gr;
-	größe2.x = 800;
-	größe2.y = 500;
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	animation |= 0x20;
+    begPos = pos;
+    begGröße = gr;
+    größe2.x = 800;
+    größe2.y = 500;
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    animation |= 0x20;
 }
 
 void Spiele::statistikNachricht( int län, char *bytes )
 {
-	statistik->nachricht( län, bytes );
+    statistik->nachricht( län, bytes );
 }
 
 void Spiele::ladeSpielStatistik( int karteId )
 {
-	pos = pos1;
-	gr = größe1;
-	größe2 = Punkt( 800, 500 );
-	pos2 = bildschirmGröße / 2 - größe2 / 2;
-	teamAuswahl->setSichtbar( 0, 1 );
-	animation = 0;
-	sichtbar = 0;
-	alpha = 0;
-	jetzt = 6;
-	statistik->setSpielArt( infoClient->getSpielId( karteId ) );
-	setSichtbar( 1 );
+    pos = pos1;
+    gr = größe1;
+    größe2 = Punkt( 800, 500 );
+    pos2 = bildschirmGröße / 2 - größe2 / 2;
+    teamAuswahl->setSichtbar( 0, 1 );
+    animation = 0;
+    sichtbar = 0;
+    alpha = 0;
+    jetzt = 6;
+    statistik->setSpielArt( infoClient->getSpielId( karteId ) );
+    setSichtbar( 1 );
 }
 
 bool Spiele::tick( double tickVal )
 {
-	rend |= spielAuswahl->tick( tickVal );
-	rend |= karteAuswahl->tick( tickVal );
-	rend |= anmeldung->tick( tickVal );
-	rend |= gruppe->tick( tickVal );
-	rend |= teamAuswahl->tick( tickVal );
-	rend |= statistik->tick( tickVal );
-	rend |= oben->tick( tickVal );
-	rend |= rechts->tick( tickVal );
-	rend |= unten->tick( tickVal );
-	rend |= links->tick( tickVal );
-	if( jetzt == 6 && !statistik->istSichtbar() )
-	{
-		spielAuswahl->setSichtbar( 1 );
-		jetzt = 1;
-		statistik->reset();
-	}
-	tickVal2 += tickVal;
-	if( tickVal2 >= 1 / 60.0 )
-	{
-		tickVal2 -= 1 / 60.0;
-		if( ladenAlpha && ladeAnimation->zAnimationData() )
-		{
-			rend = 1;
-			ladenJetzt++;
-			if( ladenJetzt >= ladeAnimation->zAnimationData()->getBildAnzahl() )
-				ladenJetzt = 0;
-		}
-	}
-	this->tickVal += tickVal * 150;
-	int val = ( int )this->tickVal;
-	if( val < 1 )
-	{
-		bool ret = rend;
-		rend = 0;
-		return ret;
-	}
-	this->tickVal -= val;
-	if( ( animation | 0x1 ) == animation ) // Einblenden
-	{
-		if( prozent1 != 100 )
-		{
-			prozent1 += val;
-			if( prozent1 >= 100 )
-			{
-				prozent1 = 100;
-				if( !jetzt )
-				{
-					spielAuswahl->setSichtbar( 1 );
-					jetzt = 1;
-				}
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
-		}
-		else if( alpha != 255 )
-		{
-			alpha += val * 2;
-			if( alpha >= 255 || ( animation | 0x2 ) == animation )
-			{
-				alpha = 255;
-				animation &= ~0x1;
-				sichtbar = 1;
-				prozent1 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x2 ) == animation ) // ausblenden
-	{
-		if( alpha != 0 )
-		{
-			alpha -= val * 2;
-			if( alpha < 0 )
-				alpha = 0;
-		}
-		else
-		{
-			prozent2 += val;
-			if( prozent2 > 100 )
-				prozent2 = 100;
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
-			if( prozent2 == 100 )
-			{
-				prozent2 = 0;
-				animation &= ~0x2;
-				sichtbar = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x4 ) == animation ) // Gruppe betreten
-	{
-		if( ladenAlpha < 255 && !prozent3 )
-		{
-			alpha -= val * 3;
-			if( alpha < 0 )
-				alpha = 0;
-			ladenAlpha += val * 3;
-			if( ladenAlpha >= 255 )
-			{
-				ladenAlpha = 255;
-				if( jetzt == 1 )
-					spielAuswahl->setSichtbar( 0 );
-				if( jetzt == 2 )
-					karteAuswahl->setSichtbar( 0 );
-				if( jetzt == 6 )
-					statistik->verlassen();
-			}
-		}
-		else if( ladenAlpha == 255 && prozent3 != 100 )
-		{
-			prozent3 += val;
-			if( prozent3 >= 100 )
-			{
-				prozent3 = 100;
-				gruppe->setSichtbar( 1 );
-				jetzt = 4;
-				if( spielGefundenB )
-				{
-					spielGefundenB = 0;
-					gruppe->spielGefunden();
-				}
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos3 - begPos ) / 100.0 ) * prozent3 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe3 - begGröße ) / 100.0 ) * prozent3 );
-		}
-		else if( prozent3 == 100 )
-		{
-			alpha += val * 3;
-			if( alpha > 255 )
-				alpha = 255;
-			ladenAlpha -= val * 3;
-			if( ladenAlpha <= 0 )
-			{
-				ladenAlpha = 0;
-				animation &= ~0x4;
-				prozent3 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x8 ) == animation ) // Gruppe Verlassen
-	{
-		if( ladenAlpha < 255 && prozent4 == 0 )
-		{
-			alpha -= val * 3;
-			if( alpha < 0 )
-				alpha = 0;
-			ladenAlpha += val * 3;
-			if( ladenAlpha >= 255 )
-			{
-				ladenAlpha = 255;
-				gruppe->setSichtbar( 0 );
-			}
-		}
-		else if( ladenAlpha == 255 && prozent4 != 100 )
-		{
-			prozent4 += val;
-			if( prozent4 >= 100 )
-			{
-				prozent4 = 100;
-				spielAuswahl->setSichtbar( 1 );
-				jetzt = 1;
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent4 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent4 );
-		}
-		else if( prozent4 == 100 )
-		{
-			alpha += val * 3;
-			if( alpha > 255 )
-				alpha = 255;
-			ladenAlpha -= val * 3;
-			if( ladenAlpha <= 0 )
-			{
-				ladenAlpha = 0;
-				animation &= ~0x8;
-				prozent4 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x10 ) == animation ) // Team Auswahl betreten
-	{
-		if( ladenAlpha < 255 && !prozent5 )
-		{
-			alpha -= val * 3;
-			if( alpha < 0 )
-				alpha = 0;
-			ladenAlpha += val * 3;
-			if( ladenAlpha >= 255 )
-			{
-				ladenAlpha = 255;
-				if( jetzt == 1 )
-					spielAuswahl->setSichtbar( 0 );
-				if( jetzt == 2 )
-					karteAuswahl->setSichtbar( 0 );
-			}
-		}
-		else if( ladenAlpha == 255 && prozent5 != 100 )
-		{
-			prozent5 += val;
-			if( prozent5 >= 100 )
-			{
-				prozent5 = 100;
-				gruppe->setSichtbar( 0 );
-				anmeldung->setSichtbar( 0 );
-				teamAuswahl->setSichtbar( 1 );
-				jetzt = 5;
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos4 - begPos ) / 100.0 ) * prozent5 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe4 - begGröße ) / 100.0 ) * prozent5 );
-		}
-		else if( prozent5 == 100 )
-		{
-			alpha += val * 3;
-			if( alpha > 255 )
-				alpha = 255;
-			ladenAlpha -= val * 3;
-			if( ladenAlpha <= 0 )
-			{
-				ladenAlpha = 0;
-				animation &= ~0x10;
-				prozent5 = 0;
-			}
-		}
-		rend = 1;
-	}
-	if( ( animation | 0x20 ) == animation ) // Team Auswahl Verlassen
-	{
-		if( ladenAlpha < 255 && prozent6 == 0 )
-		{
-			alpha -= val * 3;
-			if( alpha < 0 )
-				alpha = 0;
-			ladenAlpha += val * 3;
-			if( ladenAlpha >= 255 )
-			{
-				ladenAlpha = 255;
-				teamAuswahl->setSichtbar( 0 );
-			}
-		}
-		else if( ladenAlpha == 255 && prozent6 != 100 )
-		{
-			prozent6 += val;
-			if( prozent6 >= 100 )
-			{
-				prozent6 = 100;
-				spielAuswahl->setSichtbar( 1 );
-				jetzt = 1;
-			}
-			pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent6 );
-			gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent6 );
-		}
-		else if( prozent6 == 100 )
-		{
-			alpha += val * 3;
-			if( alpha > 255 )
-				alpha = 255;
-			ladenAlpha -= val * 3;
-			if( ladenAlpha <= 0 )
-			{
-				ladenAlpha = 0;
-				animation &= ~0x20;
-				prozent6 = 0;
-			}
-		}
-		rend = 1;
-	}
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    rend |= spielAuswahl->tick( tickVal );
+    rend |= karteAuswahl->tick( tickVal );
+    rend |= anmeldung->tick( tickVal );
+    rend |= gruppe->tick( tickVal );
+    rend |= teamAuswahl->tick( tickVal );
+    rend |= statistik->tick( tickVal );
+    rend |= oben->tick( tickVal );
+    rend |= rechts->tick( tickVal );
+    rend |= unten->tick( tickVal );
+    rend |= links->tick( tickVal );
+    if( jetzt == 6 && !statistik->istSichtbar() )
+    {
+        spielAuswahl->setSichtbar( 1 );
+        jetzt = 1;
+        statistik->reset();
+    }
+    tickVal2 += tickVal;
+    if( tickVal2 >= 1 / 60.0 )
+    {
+        tickVal2 -= 1 / 60.0;
+        if( ladenAlpha && ladeAnimation->zAnimationData() )
+        {
+            rend = 1;
+            ladenJetzt++;
+            if( ladenJetzt >= ladeAnimation->zAnimationData()->getBildAnzahl() )
+                ladenJetzt = 0;
+        }
+    }
+    this->tickVal += tickVal * 150;
+    int val = (int)this->tickVal;
+    if( val < 1 )
+    {
+        bool ret = rend;
+        rend = 0;
+        return ret;
+    }
+    this->tickVal -= val;
+    if( ( animation | 0x1 ) == animation ) // Einblenden
+    {
+        if( prozent1 != 100 )
+        {
+            prozent1 += val;
+            if( prozent1 >= 100 )
+            {
+                prozent1 = 100;
+                if( !jetzt )
+                {
+                    spielAuswahl->setSichtbar( 1 );
+                    jetzt = 1;
+                }
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent1 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent1 );
+        }
+        else if( alpha != 255 )
+        {
+            alpha += val * 2;
+            if( alpha >= 255 || ( animation | 0x2 ) == animation )
+            {
+                alpha = 255;
+                animation &= ~0x1;
+                sichtbar = 1;
+                prozent1 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x2 ) == animation ) // ausblenden
+    {
+        if( alpha != 0 )
+        {
+            alpha -= val * 2;
+            if( alpha < 0 )
+                alpha = 0;
+        }
+        else
+        {
+            prozent2 += val;
+            if( prozent2 > 100 )
+                prozent2 = 100;
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos1 - begPos ) / 100.0 ) * prozent2 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe1 - begGröße ) / 100.0 ) * prozent2 );
+            if( prozent2 == 100 )
+            {
+                prozent2 = 0;
+                animation &= ~0x2;
+                sichtbar = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x4 ) == animation ) // Gruppe betreten
+    {
+        if( ladenAlpha < 255 && !prozent3 )
+        {
+            alpha -= val * 3;
+            if( alpha < 0 )
+                alpha = 0;
+            ladenAlpha += val * 3;
+            if( ladenAlpha >= 255 )
+            {
+                ladenAlpha = 255;
+                if( jetzt == 1 )
+                    spielAuswahl->setSichtbar( 0 );
+                if( jetzt == 2 )
+                    karteAuswahl->setSichtbar( 0 );
+                if( jetzt == 6 )
+                    statistik->verlassen();
+            }
+        }
+        else if( ladenAlpha == 255 && prozent3 != 100 )
+        {
+            prozent3 += val;
+            if( prozent3 >= 100 )
+            {
+                prozent3 = 100;
+                gruppe->setSichtbar( 1 );
+                jetzt = 4;
+                if( spielGefundenB )
+                {
+                    spielGefundenB = 0;
+                    gruppe->spielGefunden();
+                }
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos3 - begPos ) / 100.0 ) * prozent3 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe3 - begGröße ) / 100.0 ) * prozent3 );
+        }
+        else if( prozent3 == 100 )
+        {
+            alpha += val * 3;
+            if( alpha > 255 )
+                alpha = 255;
+            ladenAlpha -= val * 3;
+            if( ladenAlpha <= 0 )
+            {
+                ladenAlpha = 0;
+                animation &= ~0x4;
+                prozent3 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x8 ) == animation ) // Gruppe Verlassen
+    {
+        if( ladenAlpha < 255 && prozent4 == 0 )
+        {
+            alpha -= val * 3;
+            if( alpha < 0 )
+                alpha = 0;
+            ladenAlpha += val * 3;
+            if( ladenAlpha >= 255 )
+            {
+                ladenAlpha = 255;
+                gruppe->setSichtbar( 0 );
+            }
+        }
+        else if( ladenAlpha == 255 && prozent4 != 100 )
+        {
+            prozent4 += val;
+            if( prozent4 >= 100 )
+            {
+                prozent4 = 100;
+                spielAuswahl->setSichtbar( 1 );
+                jetzt = 1;
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent4 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent4 );
+        }
+        else if( prozent4 == 100 )
+        {
+            alpha += val * 3;
+            if( alpha > 255 )
+                alpha = 255;
+            ladenAlpha -= val * 3;
+            if( ladenAlpha <= 0 )
+            {
+                ladenAlpha = 0;
+                animation &= ~0x8;
+                prozent4 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x10 ) == animation ) // Team Auswahl betreten
+    {
+        if( ladenAlpha < 255 && !prozent5 )
+        {
+            alpha -= val * 3;
+            if( alpha < 0 )
+                alpha = 0;
+            ladenAlpha += val * 3;
+            if( ladenAlpha >= 255 )
+            {
+                ladenAlpha = 255;
+                if( jetzt == 1 )
+                    spielAuswahl->setSichtbar( 0 );
+                if( jetzt == 2 )
+                    karteAuswahl->setSichtbar( 0 );
+            }
+        }
+        else if( ladenAlpha == 255 && prozent5 != 100 )
+        {
+            prozent5 += val;
+            if( prozent5 >= 100 )
+            {
+                prozent5 = 100;
+                gruppe->setSichtbar( 0 );
+                anmeldung->setSichtbar( 0 );
+                teamAuswahl->setSichtbar( 1 );
+                jetzt = 5;
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos4 - begPos ) / 100.0 ) * prozent5 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe4 - begGröße ) / 100.0 ) * prozent5 );
+        }
+        else if( prozent5 == 100 )
+        {
+            alpha += val * 3;
+            if( alpha > 255 )
+                alpha = 255;
+            ladenAlpha -= val * 3;
+            if( ladenAlpha <= 0 )
+            {
+                ladenAlpha = 0;
+                animation &= ~0x10;
+                prozent5 = 0;
+            }
+        }
+        rend = 1;
+    }
+    if( ( animation | 0x20 ) == animation ) // Team Auswahl Verlassen
+    {
+        if( ladenAlpha < 255 && prozent6 == 0 )
+        {
+            alpha -= val * 3;
+            if( alpha < 0 )
+                alpha = 0;
+            ladenAlpha += val * 3;
+            if( ladenAlpha >= 255 )
+            {
+                ladenAlpha = 255;
+                teamAuswahl->setSichtbar( 0 );
+            }
+        }
+        else if( ladenAlpha == 255 && prozent6 != 100 )
+        {
+            prozent6 += val;
+            if( prozent6 >= 100 )
+            {
+                prozent6 = 100;
+                spielAuswahl->setSichtbar( 1 );
+                jetzt = 1;
+            }
+            pos = begPos + (Punkt)( ( ( Vec2< double > )( pos2 - begPos ) / 100.0 ) * prozent6 );
+            gr = begGröße + (Punkt)( ( ( Vec2< double > )( größe2 - begGröße ) / 100.0 ) * prozent6 );
+        }
+        else if( prozent6 == 100 )
+        {
+            alpha += val * 3;
+            if( alpha > 255 )
+                alpha = 255;
+            ladenAlpha -= val * 3;
+            if( ladenAlpha <= 0 )
+            {
+                ladenAlpha = 0;
+                animation &= ~0x20;
+                prozent6 = 0;
+            }
+        }
+        rend = 1;
+    }
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void Spiele::doPublicMausEreignis( MausEreignis &me )
 {
-	if( !sichtbar )
-		return;
-	if( animation )
-		return;
-	int mx = me.mx;
-	int my = me.my;
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	int ak = 0;
-	bool tmp = me.verarbeitet;
-	oben->doPublicMausEreignis( me );
-	ak = me.verarbeitet ? 1 : 0;
-	links->doPublicMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 2 : ak;
-	unten->doPublicMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 3 : ak;
-	rechts->doPublicMausEreignis( me );
-	ak = me.verarbeitet && !ak ? 4 : ak;
-	if( tmp )
-		ak = 0;
-	switch( jetzt )
-	{
-	case 1: // Spiel Auswahl
-		if( spielAuswahl )
-		{
-			spielAuswahl->doPublicMausEreignis( me );
-			if( spielAuswahl->hatAuswahl() && spielAuswahl->istAuswahlErlubt() )
-				rechts->addStyle( Knopf::Style::Erlaubt );
-			else
-				rechts->removeStyle( Knopf::Style::Erlaubt );
-			if( !spielAuswahl->getSeite() )
-				oben->removeStyle( Knopf::Style::Erlaubt );
-			else
-				oben->addStyle( Knopf::Style::Erlaubt );
-			if( spielAuswahl->getSeite() < spielAuswahl->getSeiteAnzahl() - 1 )
-				unten->addStyle( Knopf::Style::Erlaubt );
-			else
-				unten->removeStyle( Knopf::Style::Erlaubt );
-			links->removeStyle( Knopf::Style::Erlaubt );
-			if( me.id != ME_RLinks )
-				break;
-			switch( ak )
-			{
-			case 1: // oben Klick
-				spielAuswahl->blättern( 1 );
-				break;
-			case 3: // unten Klick
-				spielAuswahl->blättern( 0 );
-				break;
-			case 4: // rehts Klick
-				if( rechts->hatStyle( Knopf::Style::Erlaubt ) )
-				{
-					karteAuswahl->setSpielId( spielAuswahl->zAuswahl()->getSpielId() );
-					spielAuswahl->setSichtbar( 0 );
-					karteAuswahl->setSichtbar( 1 );
-					jetzt = 2;
-				}
-				break;
-			}
-		}
-		break;
-	case 2: // Karten Auswahl
-		if( karteAuswahl )
-		{
-			karteAuswahl->doPublicMausEreignis( me );
-			rechts->removeStyle( Knopf::Style::Erlaubt );
-			if( !karteAuswahl->getSeite() )
-				oben->removeStyle( Knopf::Style::Erlaubt );
-			else
-				oben->addStyle( Knopf::Style::Erlaubt );
-			if( karteAuswahl->getSeite() < karteAuswahl->getSeiteAnzahl() - 1 )
-				unten->addStyle( Knopf::Style::Erlaubt );
-			else
-				unten->removeStyle( Knopf::Style::Erlaubt );
-			links->addStyle( Knopf::Style::Erlaubt );
-			if( me.id != ME_RLinks )
-				break;
-			switch( ak )
-			{
-			case 1: // oben Klick
-				karteAuswahl->blättern( 1 );
-				break;
-			case 2: // links Klick
-				karteAuswahl->setSichtbar( 0 );
-				spielAuswahl->setSichtbar( 1 );
-				jetzt = 1;
-				break;
-			case 3: // unten Klick
-				karteAuswahl->blättern( 0 );
-				break;
-			}
-		}
-		break;
-	case 3: // Anmeldung
-		anmeldung->doPublicMausEreignis( me );
-		break;
-	case 4: // Gruppe
-		gruppe->doPublicMausEreignis( me );
-		break;
-	case 5: // TeamAuswahl
-		teamAuswahl->doPublicMausEreignis( me );
-		break;
-	case 6:
-		statistik->doPublicMausEreignis( me );
-		break;
-	}
-	me.mx = mx;
-	me.my = my;
+    if( !sichtbar )
+        return;
+    if( animation )
+        return;
+    int mx = me.mx;
+    int my = me.my;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    int ak = 0;
+    bool tmp = me.verarbeitet;
+    oben->doPublicMausEreignis( me );
+    ak = me.verarbeitet ? 1 : 0;
+    links->doPublicMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 2 : ak;
+    unten->doPublicMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 3 : ak;
+    rechts->doPublicMausEreignis( me );
+    ak = me.verarbeitet && !ak ? 4 : ak;
+    if( tmp )
+        ak = 0;
+    switch( jetzt )
+    {
+    case 1: // Spiel Auswahl
+        if( spielAuswahl )
+        {
+            spielAuswahl->doPublicMausEreignis( me );
+            if( spielAuswahl->hatAuswahl() && spielAuswahl->istAuswahlErlubt() )
+                rechts->addStyle( Knopf::Style::Erlaubt );
+            else
+                rechts->removeStyle( Knopf::Style::Erlaubt );
+            if( !spielAuswahl->getSeite() )
+                oben->removeStyle( Knopf::Style::Erlaubt );
+            else
+                oben->addStyle( Knopf::Style::Erlaubt );
+            if( spielAuswahl->getSeite() < spielAuswahl->getSeiteAnzahl() - 1 )
+                unten->addStyle( Knopf::Style::Erlaubt );
+            else
+                unten->removeStyle( Knopf::Style::Erlaubt );
+            links->removeStyle( Knopf::Style::Erlaubt );
+            if( me.id != ME_RLinks )
+                break;
+            switch( ak )
+            {
+            case 1: // oben Klick
+                spielAuswahl->blättern( 1 );
+                break;
+            case 3: // unten Klick
+                spielAuswahl->blättern( 0 );
+                break;
+            case 4: // rehts Klick
+                if( rechts->hatStyle( Knopf::Style::Erlaubt ) )
+                {
+                    karteAuswahl->setSpielId( spielAuswahl->zAuswahl()->getSpielId() );
+                    spielAuswahl->setSichtbar( 0 );
+                    karteAuswahl->setSichtbar( 1 );
+                    jetzt = 2;
+                }
+                break;
+            }
+        }
+        break;
+    case 2: // Karten Auswahl
+        if( karteAuswahl )
+        {
+            karteAuswahl->doPublicMausEreignis( me );
+            rechts->removeStyle( Knopf::Style::Erlaubt );
+            if( !karteAuswahl->getSeite() )
+                oben->removeStyle( Knopf::Style::Erlaubt );
+            else
+                oben->addStyle( Knopf::Style::Erlaubt );
+            if( karteAuswahl->getSeite() < karteAuswahl->getSeiteAnzahl() - 1 )
+                unten->addStyle( Knopf::Style::Erlaubt );
+            else
+                unten->removeStyle( Knopf::Style::Erlaubt );
+            links->addStyle( Knopf::Style::Erlaubt );
+            if( me.id != ME_RLinks )
+                break;
+            switch( ak )
+            {
+            case 1: // oben Klick
+                karteAuswahl->blättern( 1 );
+                break;
+            case 2: // links Klick
+                karteAuswahl->setSichtbar( 0 );
+                spielAuswahl->setSichtbar( 1 );
+                jetzt = 1;
+                break;
+            case 3: // unten Klick
+                karteAuswahl->blättern( 0 );
+                break;
+            }
+        }
+        break;
+    case 3: // Anmeldung
+        anmeldung->doPublicMausEreignis( me );
+        break;
+    case 4: // Gruppe
+        gruppe->doPublicMausEreignis( me );
+        break;
+    case 5: // TeamAuswahl
+        teamAuswahl->doPublicMausEreignis( me );
+        break;
+    case 6:
+        statistik->doPublicMausEreignis( me );
+        break;
+    }
+    me.mx = mx;
+    me.my = my;
 }
 
 void Spiele::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( !sichtbar )
-		return;
-	switch( jetzt )
-	{
-	case 1:
+    if( !sichtbar )
+        return;
+    switch( jetzt )
+    {
+    case 1:
 
-		break;
-	case 2:
+        break;
+    case 2:
 
-		break;
-	case 3:
+        break;
+    case 3:
 
-		break;
-	case 4:
-		gruppe->doTastaturEreignis( te );
-		break;
-	case 5:
-		teamAuswahl->doTastaturEreignis( te );
-		break;
-	case 6:
-		statistik->doTastaturEreignis( te );
-	}
+        break;
+    case 4:
+        gruppe->doTastaturEreignis( te );
+        break;
+    case 5:
+        teamAuswahl->doTastaturEreignis( te );
+        break;
+    case 6:
+        statistik->doTastaturEreignis( te );
+    }
 }
 
 void Spiele::render( Bild &zRObj )
 {
-	if( pos == pos1 )
-		return;
-	int x = pos.x;
-	int y = pos.y;
-	int br = gr.x;
-	int hö = gr.y;
-	if( !zRObj.setDrawOptions( x, y, br, hö ) )
-		return;
-	rahmen->setSize( br, hö );
-	rahmen->render( zRObj );
-	int rbr = rahmen->getRBreite();
-	zRObj.setAlpha( (unsigned char)alpha );
-	if( jetzt == 1 || jetzt == 2 )
-	{
-		oben->render( zRObj );
-		links->render( zRObj );
-		unten->render( zRObj );
-		rechts->render( zRObj );
-	}
-	if( !zRObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
-	{
-		zRObj.releaseDrawOptions();
-		zRObj.releaseAlpha();
-		return;
-	}
-	if( jetzt != 4 && jetzt != 5 )
-	{
-		spielAuswahl->render( zRObj );
-		karteAuswahl->render( zRObj );
-		anmeldung->render( zRObj );
-	}
-	if( jetzt != 5 )
-		gruppe->render( zRObj );
-	teamAuswahl->render( zRObj );
-	statistik->render( zRObj );
-	zRObj.releaseDrawOptions();
-	zRObj.releaseAlpha();
-	if( ladenAlpha && ladeAnimation->zAnimationData() )
-	{
-		zRObj.setAlpha( ladenAlpha );
-		zRObj.drawBild( br / 2 - 25, hö / 2 - 25, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenJetzt ) );
-		zRObj.releaseAlpha();
-	}
-	zRObj.releaseDrawOptions();
+    if( pos == pos1 )
+        return;
+    int x = pos.x;
+    int y = pos.y;
+    int br = gr.x;
+    int hö = gr.y;
+    if( !zRObj.setDrawOptions( x, y, br, hö ) )
+        return;
+    rahmen->setSize( br, hö );
+    rahmen->render( zRObj );
+    int rbr = rahmen->getRBreite();
+    zRObj.setAlpha( (unsigned char)alpha );
+    if( jetzt == 1 || jetzt == 2 )
+    {
+        oben->render( zRObj );
+        links->render( zRObj );
+        unten->render( zRObj );
+        rechts->render( zRObj );
+    }
+    if( !zRObj.setDrawOptions( rbr, rbr, br - rbr * 2, hö - rbr * 2 ) )
+    {
+        zRObj.releaseDrawOptions();
+        zRObj.releaseAlpha();
+        return;
+    }
+    if( jetzt != 4 && jetzt != 5 )
+    {
+        spielAuswahl->render( zRObj );
+        karteAuswahl->render( zRObj );
+        anmeldung->render( zRObj );
+    }
+    if( jetzt != 5 )
+        gruppe->render( zRObj );
+    teamAuswahl->render( zRObj );
+    statistik->render( zRObj );
+    zRObj.releaseDrawOptions();
+    zRObj.releaseAlpha();
+    if( ladenAlpha && ladeAnimation->zAnimationData() )
+    {
+        zRObj.setAlpha( ladenAlpha );
+        zRObj.drawBild( br / 2 - 25, hö / 2 - 25, 50, 50, *ladeAnimation->zAnimationData()->zBild( ladenJetzt ) );
+        zRObj.releaseAlpha();
+    }
+    zRObj.releaseDrawOptions();
 }
 
 // constant
 bool Spiele::istAnimiert() const
 {
-	return animation != 0;
+    return animation != 0;
 }
 
 bool Spiele::istSichtbar() const
 {
-	return sichtbar || prozent1 != 0;
+    return sichtbar || prozent1 != 0;
 }
 
 int Spiele::getKarteId() const
 {
-	if( jetzt == 3 )
-		return anmeldung->getKarteId();
-	if( jetzt == 4 )
-		return gruppe->getKarteId();
-	if( jetzt == 5 )
-		return teamAuswahl->getKarteId();
-	return 0;
+    if( jetzt == 3 )
+        return anmeldung->getKarteId();
+    if( jetzt == 4 )
+        return gruppe->getKarteId();
+    if( jetzt == 5 )
+        return teamAuswahl->getKarteId();
+    return 0;
 }
 
 int Spiele::getGruppeId() const
 {
-	return gruppe->getGruppeId();
+    return gruppe->getGruppeId();
 }
 
 SpielerTeamStruktur *Spiele::getSTS() const
 {
-	if( jetzt == 5 )
-		return teamAuswahl->getSTS();
-	return 0;
+    if( jetzt == 5 )
+        return teamAuswahl->getSTS();
+    return 0;
 }

+ 84 - 84
KSGClient/NachLogin/Spiele/Spiele.h

@@ -16,97 +16,97 @@ using namespace Framework;
 
 namespace SpieleAnimation
 {
-	const int einfahren = 1;
-	const int ausblenden = 2;
+    const int einfahren = 1;
+    const int ausblenden = 2;
 }
 
 class Spiele : public Zeichnung
 {
 private:
-	int animation;
-	Punkt begPos;
-	Punkt begGröße;
-	Punkt pos1;
-	Punkt größe1;
-	Punkt pos2;
-	Punkt größe2;
-	Punkt pos3;
-	Punkt größe3;
-	Punkt pos4;
-	Punkt größe4;
-	Punkt bildschirmGröße;
-	LRahmen *rahmen;
-	SpielAuswahlFenster *spielAuswahl;
-	KarteAuswahlFenster *karteAuswahl;
-	AngemeldetFenster *anmeldung;
-	GruppeFenster *gruppe;
-	TeamAuswahl *teamAuswahl;
-	SpielStatistik *statistik;
-	Knopf *oben;
-	Knopf *links;
-	Knopf *unten;
-	Knopf *rechts;
-	int alpha;
-	int ladenJetzt;
-	int ladenAlpha;
-	bool sichtbar;
-	int jetzt;
-	int prozent1;
-	int prozent2;
-	int prozent3;
-	int prozent4;
-	int prozent5;
-	int prozent6;
-	double tickVal;
-	double tickVal2;
-	bool spielGefundenB;
+    int animation;
+    Punkt begPos;
+    Punkt begGröße;
+    Punkt pos1;
+    Punkt größe1;
+    Punkt pos2;
+    Punkt größe2;
+    Punkt pos3;
+    Punkt größe3;
+    Punkt pos4;
+    Punkt größe4;
+    Punkt bildschirmGröße;
+    LRahmen *rahmen;
+    SpielAuswahlFenster *spielAuswahl;
+    KarteAuswahlFenster *karteAuswahl;
+    AngemeldetFenster *anmeldung;
+    GruppeFenster *gruppe;
+    TeamAuswahl *teamAuswahl;
+    SpielStatistik *statistik;
+    Knopf *oben;
+    Knopf *links;
+    Knopf *unten;
+    Knopf *rechts;
+    int alpha;
+    int ladenJetzt;
+    int ladenAlpha;
+    bool sichtbar;
+    int jetzt;
+    int prozent1;
+    int prozent2;
+    int prozent3;
+    int prozent4;
+    int prozent5;
+    int prozent6;
+    double tickVal;
+    double tickVal2;
+    bool spielGefundenB;
 
 public:
-	// Konstruktor
-	Spiele( Schrift *zSchrift, Fenster *zNachLoginFenster, int x );
-	// Destruktor
-	~Spiele();
-	// nicht constant
-	void setSichtbar( bool sicht );
-	void updateErlaubt();
-	void anmelden( int karteId );
-	void anmeldungAbbrechen();
-	void gruppeBetreten( int gruppeId );
-	void gruppeVerlassen();
-	void spielerBetrittGruppe( int gruppeId, int accountId );
-	void spielerVerlässtGruppe( int gruppeId, int accountId );
-	void gruppeNachricht( int gruppeId, char *nachricht );
-	void gruppeAnmelden( int gruppeId );
-	void gruppeAbmelden( int gruppeId );
-	void setGruppeSpielStarten( int gruppeId, bool spielStarten );
-	void setGruppeAdmin( int gruppeId, int admin );
-	void kickAusGruppe( int gruppeId );
-	void gruppeEinladungNeu( int gruppeId, int accountId );
-	void gruppeEinadungAbgelehnt( int gruppeId, int accountId );
-	void gruppeEinladungAbgebrochen( int gruppeId, int accountId );
-	void spielGefunden( int karteId );
-	void spielGefundenZeitVerbleibend( int sekunden );
-	void spielGefundenAbbruch();
-	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
-	void teamAuswahlBetreten();
-	void teamAuswahlInit( SpielerTeamStruktur *sts );
-	void teamAuswahlAddSpieler( int accountId );
-	void teamAuswahlRemoveSpieler( int accountId );
-	void teamAuswahlSpielerWehseltTeam( int accountId, int spielerNummer );
-	void teamAuswahlChatNachricht( char *nachricht );
-	void teamAuswahlAbbrechen();
-	void statistikNachricht( int län, char *bytes );
-	void ladeSpielStatistik( int karteId );
-	bool tick( double tickVal ) override;
-	void doPublicMausEreignis( MausEreignis &me ) override;
-	void doTastaturEreignis( TastaturEreignis &te ) override;
-	void render( Bild &zRObj ) override;
-	// constant
-	bool istAnimiert() const;
-	bool istSichtbar() const;
-	int getKarteId() const;
-	int getGruppeId() const;
-	SpielerTeamStruktur *getSTS() const;
+    // Konstruktor
+    Spiele( Fenster *zNachLoginFenster, int x );
+    // Destruktor
+    ~Spiele();
+    // nicht constant
+    void setSichtbar( bool sicht );
+    void updateErlaubt();
+    void anmelden( int karteId );
+    void anmeldungAbbrechen();
+    void gruppeBetreten( int gruppeId );
+    void gruppeVerlassen();
+    void spielerBetrittGruppe( int gruppeId, int accountId );
+    void spielerVerlässtGruppe( int gruppeId, int accountId );
+    void gruppeNachricht( int gruppeId, char *nachricht );
+    void gruppeAnmelden( int gruppeId );
+    void gruppeAbmelden( int gruppeId );
+    void setGruppeSpielStarten( int gruppeId, bool spielStarten );
+    void setGruppeAdmin( int gruppeId, int admin );
+    void kickAusGruppe( int gruppeId );
+    void gruppeEinladungNeu( int gruppeId, int accountId );
+    void gruppeEinadungAbgelehnt( int gruppeId, int accountId );
+    void gruppeEinladungAbgebrochen( int gruppeId, int accountId );
+    void spielGefunden( int karteId );
+    void spielGefundenZeitVerbleibend( int sekunden );
+    void spielGefundenAbbruch();
+    void zurückInWarteschlange( int stunden, int minuten, int sekunden );
+    void teamAuswahlBetreten();
+    void teamAuswahlInit( SpielerTeamStruktur *sts );
+    void teamAuswahlAddSpieler( int accountId );
+    void teamAuswahlRemoveSpieler( int accountId );
+    void teamAuswahlSpielerWehseltTeam( int accountId, int spielerNummer );
+    void teamAuswahlChatNachricht( char *nachricht );
+    void teamAuswahlAbbrechen();
+    void statistikNachricht( int län, char *bytes );
+    void ladeSpielStatistik( int karteId );
+    bool tick( double tickVal ) override;
+    void doPublicMausEreignis( MausEreignis &me ) override;
+    void doTastaturEreignis( TastaturEreignis &te ) override;
+    void render( Bild &zRObj ) override;
+    // constant
+    bool istAnimiert() const;
+    bool istSichtbar() const;
+    int getKarteId() const;
+    int getGruppeId() const;
+    SpielerTeamStruktur *getSTS() const;
 };
 
 #endif

+ 159 - 177
KSGClient/NachLogin/Spiele/Statistik/SpielStatistik.cpp

@@ -2,268 +2,250 @@
 #include <Punkt.h>
 #include "../../../Global/Variablen.h"
 
-typedef SpielStatistikV* ( *GetStatistikKlasse )( void );
+typedef SpielStatistikV *( *GetStatistikKlasse )( void );
 
 // Inhalt der SpielStatistik Klasse aus SpielStatistik.h
 // Konstruktor
-SpielStatistik::SpielStatistik( Schrift *zSchrift )
-	: pos( 10, 10 ),
-	  gr( 780, 480 )
-{
-	stat = 0;
-	spielDll = 0;
-	la = (Animation2D*)ladeAnimation->dublizieren();
-	la->setPosition( 365, 215 );
-	la->setSichtbar( 0 );
-	schrift = zSchrift->getThis();
-	tickVal = 0;
-	sichtbar = 0;
-	alpha = 0;
-	spielArt = 0;
-	rend = 0;
-	ref = 1;
+SpielStatistik::SpielStatistik()
+    : ReferenceCounter(),
+    pos( 10, 10 ),
+    gr( 780, 480 )
+{
+    stat = 0;
+    spielDll = 0;
+    la = (Animation2D *)ladeAnimation->dublizieren();
+    la->setPosition( 365, 215 );
+    la->setSichtbar( 0 );
+    tickVal = 0;
+    sichtbar = 0;
+    alpha = 0;
+    spielArt = 0;
+    rend = 0;
 }
 
 // Destruktor
 SpielStatistik::~SpielStatistik()
 {
-	if( stat )
-		stat->release();
-	if( spielDll )
-		FreeLibrary( spielDll );
-	la->release();
-	schrift->release();
+    if( stat )
+        stat->release();
+    if( spielDll )
+        FreeLibrary( spielDll );
+    la->release();
 }
 
 // nicht constant
 void SpielStatistik::setSpielArt( int spielArt )
 {
-	if( this->spielArt )
-		return;
-	this->spielArt = spielArt;
-	la->setSichtbar( 1 );
-	Text *name = infoClient->getSpielName( spielArt );
-	if( !name )
-	{
-		this->spielArt = 0;
-		la->setSichtbar( 0 );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
-		return;
-	}
-	Text *pfad = new Text( "data/spiele/" );
-	pfad->append( name->getText() );
-	pfad->append( "/bin/" );
-	pfad->append( name );
-	pfad->append( ".dll" );
-	spielDll = LoadLibrary( pfad->getText() );
-	pfad->release();
-	if( !spielDll )
-	{
-		this->spielArt = 0;
-		la->setSichtbar( 0 );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
-		return;
-	}
-	GetStatistikKlasse gsk = (GetStatistikKlasse)GetProcAddress( spielDll, "GetStatistikKlasse" );
-	if( !gsk )
-	{
-		FreeLibrary( spielDll );
-		this->spielArt = 0;
-		la->setSichtbar( 0 );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
-		return;
-	}
-	stat = gsk();
-	if( !stat )
-	{
-		FreeLibrary( spielDll );
-		this->spielArt = 0;
-		la->setSichtbar( 0 );
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
-		return;
-	}
-	stat->setAccountId( loginClient->getAccountId() );
-	stat->setBilder( bilder );
-	stat->setRückrufFunktionen( spielStatistikAddNachrichtF, spielStatistikAddChatF, spielStatistikAddFreundF, spielStatistikAccountAnsehenF, spielStatistikIstFreundF, this );
-	stat->setSchrift( schrift->getThis() );
-	stat->setBildschirm( hauptScreen );
-	stat->setKlients( infoClient->getThis(), spielClient->getThis() );
-	stat->bereit();
+    if( this->spielArt )
+        return;
+    this->spielArt = spielArt;
+    la->setSichtbar( 1 );
+    Text *name = infoClient->getSpielName( spielArt );
+    if( !name )
+    {
+        this->spielArt = 0;
+        la->setSichtbar( 0 );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
+        return;
+    }
+    Text *pfad = new Text( "data/spiele/" );
+    pfad->append( name->getText() );
+    pfad->append( "/bin/" );
+    pfad->append( name );
+    pfad->append( ".dll" );
+    spielDll = LoadLibrary( pfad->getText() );
+    pfad->release();
+    if( !spielDll )
+    {
+        this->spielArt = 0;
+        la->setSichtbar( 0 );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
+        return;
+    }
+    GetStatistikKlasse gsk = (GetStatistikKlasse)GetProcAddress( spielDll, "GetStatistikKlasse" );
+    if( !gsk )
+    {
+        FreeLibrary( spielDll );
+        this->spielArt = 0;
+        la->setSichtbar( 0 );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
+        return;
+    }
+    stat = gsk();
+    if( !stat )
+    {
+        FreeLibrary( spielDll );
+        this->spielArt = 0;
+        la->setSichtbar( 0 );
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Spiel Statistik konnte nicht geladen werden." ), new Text( "Ok" ) );
+        return;
+    }
+    stat->setAccountId( loginClient->getAccountId() );
+    stat->setBilder( bilder );
+    stat->setRückrufFunktionen( spielStatistikAddNachrichtF, spielStatistikAddChatF, spielStatistikAddFreundF, spielStatistikAccountAnsehenF, spielStatistikIstFreundF, this );
+    stat->setUIFactory( uiFactory );
+    stat->setKlients( dynamic_cast<KSGClient::InformationServerClient *>( infoClient->getThis() ), dynamic_cast<KSGClient::SpielServerClient *>( spielClient->getThis() ) );
+    stat->bereit();
 }
 
 void SpielStatistik::nachricht( int län, char *bytes )
 {
-	if( stat )
-		stat->nachricht( län, bytes );
+    if( stat )
+        stat->nachricht( län, bytes );
 }
 
 void SpielStatistik::reset()
 {
-	spielArt = 0;
-	la->setSichtbar( 0 );
-	sichtbar = 0;
-	alpha = 0;
-	stat = stat->release();
-	FreeLibrary( spielDll );
-	spielDll = 0;
+    spielArt = 0;
+    la->setSichtbar( 0 );
+    sichtbar = 0;
+    alpha = 0;
+    stat = (SpielStatistikV *)stat->release();
+    FreeLibrary( spielDll );
+    spielDll = 0;
 }
 
 void SpielStatistik::doPublicMausEreignis( MausEreignis &me )
 {
-	me.mx -= pos.x;
-	me.my -= pos.y;
-	if( stat )
-		stat->doPublicMausEreignis( me );
-	me.mx += pos.x;
-	me.my += pos.y;
+    me.mx -= pos.x;
+    me.my -= pos.y;
+    if( stat )
+        stat->doPublicMausEreignis( me );
+    me.mx += pos.x;
+    me.my += pos.y;
 }
 
 void SpielStatistik::doTastaturEreignis( TastaturEreignis &te )
 {
-	if( stat )
-		stat->doTastaturEreignis( te );
+    if( stat )
+        stat->doTastaturEreignis( te );
 }
 
 bool SpielStatistik::tick( double zeit )
 {
-	if( stat && stat->getStatus() == 1 )
-	{
-		sichtbar = 1;
-		la->setSichtbar( 0 );
-	}
-	else
-		sichtbar = 0;
-	tickVal += zeit * 250;
-	int val = (int)tickVal;
-	if( val > 10 )
-		val = 10;
-	tickVal -= val;
-	if( val )
-	{
-		if( sichtbar && alpha != 255 )
-		{
-			if( alpha + val > 255 )
-				alpha = 255;
-			else
-				alpha += val;
-			rend = 1;
-		}
-		if( !sichtbar && alpha != 0 )
-		{
-			if( alpha - val < 0 )
-				alpha = 0;
-			else
-				alpha -= val;
-			rend = 1;
-		}
-	}
-	if( stat && sichtbar )
-		rend |= stat->tick( zeit );
-	rend |= la->tick( zeit );
-	bool ret = rend;
-	rend = 0;
-	return ret;
+    if( stat && stat->getStatus() == 1 )
+    {
+        sichtbar = 1;
+        la->setSichtbar( 0 );
+    }
+    else
+        sichtbar = 0;
+    tickVal += zeit * 250;
+    int val = (int)tickVal;
+    if( val > 10 )
+        val = 10;
+    tickVal -= val;
+    if( val )
+    {
+        if( sichtbar && alpha != 255 )
+        {
+            if( alpha + val > 255 )
+                alpha = 255;
+            else
+                alpha += val;
+            rend = 1;
+        }
+        if( !sichtbar && alpha != 0 )
+        {
+            if( alpha - val < 0 )
+                alpha = 0;
+            else
+                alpha -= val;
+            rend = 1;
+        }
+    }
+    if( stat && sichtbar )
+        rend |= stat->tick( zeit );
+    rend |= la->tick( zeit );
+    bool ret = rend;
+    rend = 0;
+    return ret;
 }
 
 void SpielStatistik::render( Bild &zRObj )
 {
-	if( !zRObj.setDrawOptions( pos, gr ) )
-		return;
-	la->render( zRObj );
-	zRObj.setAlpha( alpha );
-	if( stat )
-		stat->render( zRObj );
-	zRObj.releaseAlpha();
-	zRObj.releaseDrawOptions();
+    if( !zRObj.setDrawOptions( pos, gr ) )
+        return;
+    la->render( zRObj );
+    zRObj.setAlpha( alpha );
+    if( stat )
+        stat->render( zRObj );
+    zRObj.releaseAlpha();
+    zRObj.releaseDrawOptions();
 }
 
 void SpielStatistik::addNachrichtF( Text *t, Text *n, Text *rp, Text *rn )
 {
-	nachLogin->zNachrichtenListe()->addNachricht( t, n, rp, rn );
+    nachLogin->zNachrichtenListe()->addNachricht( t, n, rp, rn );
 }
 
 void SpielStatistik::addChatF( int acc )
 {
-	nachLogin->zChatLeiste()->addChat( acc, 0 );
+    nachLogin->zChatLeiste()->addChat( acc, 0 );
 }
 
 void SpielStatistik::addFreundF( int acc )
 {
-	if( !chatClient->freundesAnfrage( acc ) )
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Freundesanfrage konnte nicht gesendet werden." ), new Text( "Ok" ) );
-	else
-		nachLogin->zNachrichtenListe()->addNachricht( new Text( "Freundesanfrage" ), new Text( "Es wurde eine Freundesanfrage an den Spieler gesendet." ), new Text( "Ok" ) );
+    if( !chatClient->freundesAnfrage( acc ) )
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( "Die Freundesanfrage konnte nicht gesendet werden." ), new Text( "Ok" ) );
+    else
+        nachLogin->zNachrichtenListe()->addNachricht( new Text( "Freundesanfrage" ), new Text( "Es wurde eine Freundesanfrage an den Spieler gesendet." ), new Text( "Ok" ) );
 }
 
 void SpielStatistik::accountAnsehenF( int acc )
 {
-	if( nachLogin->zAccountAnsehenFenster()->setSpielerDetails( acc, 2 ) )
-	{
-		MausEreignis me = { ME_RLinks, 0, 0, 0, 1 };
-		nachLogin->zTitelLeiste()->druckAccountAnsehen( me );
-	}
+    if( nachLogin->zAccountAnsehenFenster()->setSpielerDetails( acc, 2 ) )
+    {
+        MausEreignis me = { ME_RLinks, 0, 0, 0, 1 };
+        nachLogin->zTitelLeiste()->druckAccountAnsehen( me );
+    }
 }
 
 bool SpielStatistik::istFreundF( int acc )
 {
-	return nachLogin->zFreundesListe()->istFreund( acc );
+    return nachLogin->zFreundesListe()->istFreund( acc );
 }
 
 void SpielStatistik::verlassen()
 {
-	if( stat )
-	    stat->verlassen();
+    if( stat )
+        stat->verlassen();
 }
 
 // constant
 bool SpielStatistik::istSichtbar()
 {
-	return sichtbar || alpha || la->istSichtbar();
-}
-
-// Reference Counting
-SpielStatistik *SpielStatistik::getThis()
-{
-	ref++;
-	return this;
-}
-
-SpielStatistik *SpielStatistik::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return sichtbar || alpha || la->istSichtbar();
 }
 
 // Rückruf Funktionen
 void spielStatistikAddNachrichtF( void *p, Text *t, Text *n, Text *rp, Text *rn )
 {
-	if( p )
-		( (SpielStatistik*)p )->addNachrichtF( t, n, rp, rn );
+    if( p )
+        ( (SpielStatistik *)p )->addNachrichtF( t, n, rp, rn );
 }
 
 void spielStatistikAddChatF( void *p, int acc )
 {
-	if( p )
-		( (SpielStatistik*)p )->addChatF( acc );
+    if( p )
+        ( (SpielStatistik *)p )->addChatF( acc );
 }
 
 void spielStatistikAddFreundF( void *p, int acc )
 {
-	if( p )
-		( (SpielStatistik*)p )->addFreundF( acc );
+    if( p )
+        ( (SpielStatistik *)p )->addFreundF( acc );
 }
 
 void spielStatistikAccountAnsehenF( void *p, int acc )
 {
-	if( p )
-		( (SpielStatistik*)p )->accountAnsehenF( acc );
+    if( p )
+        ( (SpielStatistik *)p )->accountAnsehenF( acc );
 }
 
 bool spielStatistikIstFreundF( void *p, int acc )
 {
-	if( p )
-		return ( (SpielStatistik*)p )->istFreundF( acc );
-	return 0;
+    if( p )
+        return ( (SpielStatistik *)p )->istFreundF( acc );
+    return 0;
 }

+ 31 - 36
KSGClient/NachLogin/Spiele/Statistik/SpielStatistik.h

@@ -4,46 +4,41 @@
 #include <SpielStatistikV.h>
 #include <Animation.h>
 
-class SpielStatistik
+class SpielStatistik : public virtual ReferenceCounter
 {
 private:
-	SpielStatistikV *stat;
-	Punkt pos;
-	Punkt gr;
-	HINSTANCE spielDll;
-	Animation2D *la;
-	Schrift *schrift;
-	double tickVal;
-	bool sichtbar;
-	unsigned char alpha;
-	int spielArt;
-	bool rend;
-	int ref;
+    SpielStatistikV *stat;
+    Punkt pos;
+    Punkt gr;
+    HINSTANCE spielDll;
+    Animation2D *la;
+    double tickVal;
+    bool sichtbar;
+    unsigned char alpha;
+    int spielArt;
+    bool rend;
 
 public:
-	// Konstruktor
-	SpielStatistik( Schrift *zSchrift );
-	// Destruktor
-	~SpielStatistik();
-	// nicht constant
-	void setSpielArt( int spielArt );
-	void nachricht( int län, char *bytes );
-	void reset();
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	bool tick( double zeit );
-	void render( Bild &zRObj );
-	void addNachrichtF( Text *t, Text *n, Text *rp, Text *rn );
-	void addChatF( int acc );
-	void addFreundF( int acc );
-	void accountAnsehenF( int acc );
-	bool istFreundF( int acc );
-	void verlassen();
-	// constant
-	bool istSichtbar();
-	// Reference Counting
-	SpielStatistik *getThis();
-	SpielStatistik *release();
+    // Konstruktor
+    SpielStatistik();
+    // Destruktor
+    ~SpielStatistik();
+    // nicht constant
+    void setSpielArt( int spielArt );
+    void nachricht( int län, char *bytes );
+    void reset();
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    bool tick( double zeit );
+    void render( Bild &zRObj );
+    void addNachrichtF( Text *t, Text *n, Text *rp, Text *rn );
+    void addChatF( int acc );
+    void addFreundF( int acc );
+    void accountAnsehenF( int acc );
+    bool istFreundF( int acc );
+    void verlassen();
+    // constant
+    bool istSichtbar();
 };
 
 // Rückruf Funktionen

+ 61 - 166
KSGClient/NachLogin/Spiele/Team Auswahl/TeamAuswahl.cpp

@@ -8,39 +8,34 @@
 
 // Inhalt der TeamAuswahlListeSpieler Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahlListeSpieler::TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, Schrift *zSchrift, int accountId, int karteId )
+TeamAuswahlListeSpieler::TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, int accountId, int karteId )
+    : ReferenceCounter()
 {
     this->accountId = accountId;
     Text *n = infoClient->getSpielerName( accountId );
-    name = initTextFeld( 1, 1, 99, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
+    name = initTextFeld( 1, 1, 99, 20, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
     n->release();
     if( accountId == loginClient->getAccountId() )
     {
-        teamAuswahl = new AuswahlBox();
+        teamAuswahl = uiFactory.createAuswahlBox( uiFactory.initParam );
         teamAuswahl->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MultiStyled | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund );
-        teamAuswahl->setRahmenFarbe( 0xFFFFFFFF );
-        teamAuswahl->setRahmenBreite( 1 );
         teamAuswahl->setPosition( 100, 1 );
         teamAuswahl->setSize( 150, 20 );
-        teamAuswahl->setMaxAuskappHeight( 100 );
-        teamAuswahl->setSchriftZ( zSchrift->getThis() );
-        teamAuswahl->setHintergrundFarbe( 0xFF000000 );
-        teamAuswahl->setMausEreignis( _ret1ME );
         teamAuswahl->setEventParam( this );
         teamAuswahl->setEventAktion( TeamAuswahlListeSpielerTeamAuswahlE );
     }
     else
-        team = initTextFeld( 100, 1, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+        team = initTextFeld( 100, 1, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "" );
     Array< int > *statistik = new Array< int >();
     infoClient->getSpielStatistik( accountId, infoClient->getSpielId( karteId ), statistik );
-    punkte = initTextFeld( 250, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Punkte: " );
+    punkte = initTextFeld( 250, 1, 80, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Punkte: " );
     punkte->zText()->append( statistik->hat( 3 ) ? statistik->get( 3 ) : 0 );
-    spiele = initTextFeld( 330, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " );
+    spiele = initTextFeld( 330, 1, 80, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " );
     spiele->zText()->append( statistik->hat( 0 ) ? statistik->get( 0 ) : 0 );
-    gewonnen = initTextFeld( 410, 1, 90, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " );
+    gewonnen = initTextFeld( 410, 1, 90, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " );
     gewonnen->zText()->append( statistik->hat( 1 ) ? statistik->get( 1 ) : 0 );
     statistik->release();
-    farbe = initTextFeld( 500, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Farbe:" );
+    farbe = initTextFeld( 500, 1, 50, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Farbe:" );
     spielerFarbe = 0;
     rahmen = new LRahmen();
     rahmen->setSize( 581, 22 );
@@ -49,7 +44,6 @@ TeamAuswahlListeSpieler::TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, Schr
     teamName = new Text( "" );
     this->sts = sts;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -76,7 +70,7 @@ void TeamAuswahlListeSpieler::disable()
         teamAuswahl->removeStyle( AuswahlBox::Style::Erlaubt );
 }
 
-void TeamAuswahlListeSpieler::spielerTeamAuswahlE( AuswahlBox * obj, int p1, int p2 )
+void TeamAuswahlListeSpieler::spielerTeamAuswahlE( AuswahlBox *obj, int p1, int p2 )
 {
     Text *tmpTeamName = obj->zEintragText( p2 );
     if( !tmpTeamName->istGleich( teamName->getText() ) )
@@ -114,13 +108,13 @@ void TeamAuswahlListeSpieler::setFarbe( int farbe )
     rend = 1;
 }
 
-void TeamAuswahlListeSpieler::setTeam( Text * zName )
+void TeamAuswahlListeSpieler::setTeam( Text *zName )
 {
     teamName->setText( zName->getText() );
     rend = 1;
 }
 
-void TeamAuswahlListeSpieler::setTeamErlaubt( Text * zName, bool erlaubt, int teamFarbe )
+void TeamAuswahlListeSpieler::setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe )
 {
     if( accountId != loginClient->getAccountId() )
         return;
@@ -162,13 +156,13 @@ bool TeamAuswahlListeSpieler::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahlListeSpieler::doPublicMausEreignis( MausEreignis & me )
+void TeamAuswahlListeSpieler::doPublicMausEreignis( MausEreignis &me )
 {
     if( accountId == loginClient->getAccountId() )
         teamAuswahl->doPublicMausEreignis( me );
 }
 
-void TeamAuswahlListeSpieler::render( int yOff, Bild & zRObj )
+void TeamAuswahlListeSpieler::render( int yOff, Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 0, yOff, 581, 22 ) )
         return;
@@ -192,31 +186,17 @@ int TeamAuswahlListeSpieler::getAccountId() const
     return accountId;
 }
 
-// Reference Counting
-TeamAuswahlListeSpieler *TeamAuswahlListeSpieler::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahlListeSpieler *TeamAuswahlListeSpieler::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der TeamAuswahlListeTeam Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahlListeTeam::TeamAuswahlListeTeam( Schrift * zSchrift )
+TeamAuswahlListeTeam::TeamAuswahlListeTeam()
+    : ReferenceCounter()
 {
     maxSpieler = 0;
     jetztSpieler = 0;
     team = 0;
-    name = initTextFeld( 0, 0, 300, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team: " );
-    mjSpieler = initTextFeld( 300, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler: 0/0" );
-    farbe = initTextFeld( 450, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe:" );
+    name = initTextFeld( 0, 0, 300, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team: " );
+    mjSpieler = initTextFeld( 300, 0, 150, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler: 0/0" );
+    farbe = initTextFeld( 450, 0, 100, 20, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe:" );
     teamFarbe = 0;
     spieler = new RCArray< TeamAuswahlListeSpieler >();
     rahmen = new LRahmen();
@@ -232,7 +212,6 @@ TeamAuswahlListeTeam::TeamAuswahlListeTeam( Schrift * zSchrift )
     tickVal = 0;
     höhe = 22;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -260,7 +239,7 @@ void TeamAuswahlListeTeam::setMaxSpieler( int maxSpieler )
     rend = 1;
 }
 
-void TeamAuswahlListeTeam::setName( Text * name )
+void TeamAuswahlListeTeam::setName( Text *name )
 {
     teamName->setText( name->getText() );
     name->release();
@@ -280,7 +259,7 @@ void TeamAuswahlListeTeam::setTeam( int team )
     rend = 1;
 }
 
-void TeamAuswahlListeTeam::addSpieler( TeamAuswahlListeSpieler * spieler )
+void TeamAuswahlListeTeam::addSpieler( TeamAuswahlListeSpieler *spieler )
 {
     if( !jetztSpieler )
         höhe++;
@@ -308,7 +287,7 @@ void TeamAuswahlListeTeam::removeSpieler( int accountId )
         höhe = 22;
 }
 
-void TeamAuswahlListeTeam::setTeamErlaubt( Text * zName, bool erlaubt, int teamFarbe )
+void TeamAuswahlListeTeam::setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe )
 {
     for( int i = 0; i < jetztSpieler; i++ )
         spieler->z( i )->setTeamErlaubt( zName, erlaubt, teamFarbe );
@@ -351,7 +330,7 @@ bool TeamAuswahlListeTeam::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahlListeTeam::doPublicMausEreignis( MausEreignis & me )
+void TeamAuswahlListeTeam::doPublicMausEreignis( MausEreignis &me )
 {
     int tmpX = me.mx;
     int tmpY = me.my;
@@ -366,7 +345,7 @@ void TeamAuswahlListeTeam::doPublicMausEreignis( MausEreignis & me )
     me.my = tmpY;
 }
 
-void TeamAuswahlListeTeam::render( int yOff, Bild & zRObj )
+void TeamAuswahlListeTeam::render( int yOff, Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 50, yOff, 583, rahmen->getHeight() + 1 ) )
         return;
@@ -439,24 +418,10 @@ TeamAuswahlListeSpieler *TeamAuswahlListeTeam::zSpielerDaten( int accountId ) co
     return 0;
 }
 
-// Reference Counting
-TeamAuswahlListeTeam *TeamAuswahlListeTeam::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahlListeTeam *TeamAuswahlListeTeam::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der TeamAuswahlListe Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahlListe::TeamAuswahlListe( Schrift * zSchrift, SpielerTeamStruktur * sts, int karteId )
+TeamAuswahlListe::TeamAuswahlListe( SpielerTeamStruktur *sts, int karteId )
+    : ReferenceCounter()
 {
     rahmen = new LRahmen();
     rahmen->setSize( 698, 398 );
@@ -466,14 +431,14 @@ TeamAuswahlListe::TeamAuswahlListe( Schrift * zSchrift, SpielerTeamStruktur * st
     scroll->update( 0, 396 );
     scroll->setKlickScroll( 7 );
     teams = new RCArray< TeamAuswahlListeTeam >();
-    TeamAuswahlListeTeam *zufall = new TeamAuswahlListeTeam( zSchrift );
+    TeamAuswahlListeTeam *zufall = new TeamAuswahlListeTeam();
     zufall->setTeam( 0 );
     zufall->setName( new Text( "Zufällig" ) );
     zufall->setMaxSpieler( sts->spielerAnzahl );
     teams->set( zufall, 0 );
     for( int i = 0; i < sts->teamAnzahl; i++ )
     {
-        TeamAuswahlListeTeam *tmp = new TeamAuswahlListeTeam( zSchrift );
+        TeamAuswahlListeTeam *tmp = new TeamAuswahlListeTeam();
         tmp->setTeam( i );
         tmp->setName( sts->teamName->get( i ) );
         tmp->setFarbe( sts->teamFarbe->hat( i ) ? sts->teamFarbe->get( i ) : 0 );
@@ -481,11 +446,9 @@ TeamAuswahlListe::TeamAuswahlListe( Schrift * zSchrift, SpielerTeamStruktur * st
         teams->set( tmp, i + 1 );
     }
     teamAnzahl = 1 + sts->teamAnzahl;
-    schrift = zSchrift->getThis();
     this->karteId = karteId;
     this->sts = sts;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -494,7 +457,6 @@ TeamAuswahlListe::~TeamAuswahlListe()
     rahmen->release();
     scroll->release();
     teams->release();
-    schrift->release();
     sts->release();
 }
 
@@ -568,7 +530,7 @@ void TeamAuswahlListe::setTeamVonSpieler( int accountId, int spielerNummer )
 
 void TeamAuswahlListe::addSpieler( int accountId )
 {
-    TeamAuswahlListeSpieler *tmp = new TeamAuswahlListeSpieler( sts->getThis(), schrift, accountId, karteId );
+    TeamAuswahlListeSpieler *tmp = new TeamAuswahlListeSpieler( sts->getThis(), accountId, karteId );
     for( int i = 0; i < teamAnzahl; i++ )
     {
         if( teams->z( i )->istPlatzFrei() )
@@ -615,7 +577,7 @@ bool TeamAuswahlListe::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahlListe::doPublicMausEreignis( MausEreignis & me )
+void TeamAuswahlListe::doPublicMausEreignis( MausEreignis &me )
 {
     int tmpX = me.mx;
     int tmpY = me.my;
@@ -635,7 +597,7 @@ void TeamAuswahlListe::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void TeamAuswahlListe::render( Bild & zRObj )
+void TeamAuswahlListe::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 0, 0, 698, 398 ) )
         return;
@@ -664,34 +626,17 @@ void TeamAuswahlListe::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// constant
-
-// Reference Counting
-TeamAuswahlListe *TeamAuswahlListe::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahlListe *TeamAuswahlListe::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der TeamAuswahlTimer Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahlTimer::TeamAuswahlTimer( Schrift * zSchrift )
+TeamAuswahlTimer::TeamAuswahlTimer()
+    : ReferenceCounter()
 {
-    zeit = initTextFeld( 0, 0, 200, 200, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
-    bestätigen = initKnopf( 65, 170, 70, 20, zSchrift, Knopf::Style::Sichtbar, "Fertig" );
+    zeit = initTextFeld( 0, 0, 200, 200, TextFeld::Style::Text | TextFeld::Style::Center, "" );
+    bestätigen = initKnopf( 65, 170, 70, 20, Knopf::Style::Sichtbar, "Fertig" );
     time = 0;
     maxTime = 0;
     grad = 0;
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -711,11 +656,11 @@ void TeamAuswahlTimer::setVerbleibendeZeit( int sekunden )
     time = sekunden;
 }
 
-bool TeamAuswahlTimer::doPublicMausEreignis( MausEreignis & me )
+bool TeamAuswahlTimer::doPublicMausEreignis( MausEreignis &me )
 {
     bool vera = me.verarbeitet;
     bestätigen->doPublicMausEreignis( me );
-    if( !vera && me.verarbeitet &&me.id == ME_RLinks )
+    if( !vera && me.verarbeitet && me.id == ME_RLinks )
     {
         if( spielClient->spielErstelltTeamFertig() )
         {
@@ -739,7 +684,7 @@ bool TeamAuswahlTimer::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahlTimer::render( Bild & zRObj )
+void TeamAuswahlTimer::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 498, 398, 200, 200 ) )
         return;
@@ -762,31 +707,17 @@ int TeamAuswahlTimer::getZeit() const
     return time;
 }
 
-// Reference Counting
-TeamAuswahlTimer *TeamAuswahlTimer::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahlTimer *TeamAuswahlTimer::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der TeamAuswahlChat Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahlChat::TeamAuswahlChat( Schrift * zSchrift )
+TeamAuswahlChat::TeamAuswahlChat()
+    : ReferenceCounter()
 {
-    nachricht = initTextFeld( 2, 178, 472, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+    nachricht = initTextFeld( 2, 178, 472, 20, TextFeld::Style::TextFeld, "" );
     Bild *sendenBild = bilder->get( "data/client/bilder/chat.ltdb/senden.png" );
-    senden = initKnopf( 476, 178, 20, 20, 0, 0, "" );
+    senden = initKnopf( 476, 178, 20, 20, 0, "" );
     senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
     senden->setHintergrundBildZ( sendenBild );
-    verlauf = initTextFeld( 2, 2, 494, 174, zSchrift, TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt, "" );
+    verlauf = initTextFeld( 2, 2, 494, 174, TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt, "" );
     verlauf->updateVScroll();
     verlauf->setVertikalKlickScroll( 5 );
     rahmen = new LRahmen();
@@ -794,7 +725,6 @@ TeamAuswahlChat::TeamAuswahlChat( Schrift * zSchrift )
     rahmen->setFarbe( 0xFFFFFFFF );
     rahmen->setRamenBreite( 1 );
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -824,7 +754,7 @@ bool TeamAuswahlChat::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahlChat::doPublicMausEreignis( MausEreignis & me )
+void TeamAuswahlChat::doPublicMausEreignis( MausEreignis &me )
 {
     verlauf->doPublicMausEreignis( me );
     nachricht->doPublicMausEreignis( me );
@@ -844,7 +774,7 @@ void TeamAuswahlChat::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void TeamAuswahlChat::doTastaturEreignis( TastaturEreignis & te )
+void TeamAuswahlChat::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ver = !te.verarbeitet;
     nachricht->doTastaturEreignis( te );
@@ -862,7 +792,7 @@ void TeamAuswahlChat::doTastaturEreignis( TastaturEreignis & te )
     }
 }
 
-void TeamAuswahlChat::render( Bild & zRObj )
+void TeamAuswahlChat::render( Bild &zRObj )
 {
     if( !zRObj.setDrawOptions( 0, 398, 498, 200 ) )
         return;
@@ -873,26 +803,10 @@ void TeamAuswahlChat::render( Bild & zRObj )
     zRObj.releaseDrawOptions();
 }
 
-// constant
-
-// Reference Counting
-TeamAuswahlChat *TeamAuswahlChat::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahlChat *TeamAuswahlChat::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Inhalt der TeamAuswahl Klasse aus TeamAuswahl.h
 // Konstruktor
-TeamAuswahl::TeamAuswahl( Schrift * zSchrift )
+TeamAuswahl::TeamAuswahl()
+    : ReferenceCounter()
 {
     tickVal = 0;
     animation = 0;
@@ -903,9 +817,7 @@ TeamAuswahl::TeamAuswahl( Schrift * zSchrift )
     chat = 0;
     timer = 0;
     liste = 0;
-    schrift = zSchrift->getThis();
     rend = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -921,8 +833,6 @@ TeamAuswahl::~TeamAuswahl()
         liste->release();
     if( sts )
         sts->release();
-    if( schrift )
-        schrift->release();
 }
 
 // nicht constant
@@ -946,22 +856,22 @@ void TeamAuswahl::setSichtbar( bool sichtbar, bool sofort )
     rend = 1;
 }
 
-void TeamAuswahl::initSTS( SpielerTeamStruktur * sts )
+void TeamAuswahl::initSTS( SpielerTeamStruktur *sts )
 {
-    hauptScreen->lock();
+    uiFactory.initParam.bildschirm->lock();
     if( this->sts )
         this->sts->release();
     this->sts = sts;
     if( chat )
-        chat = chat->release();
+        chat = (TeamAuswahlChat *)chat->release();
     if( timer )
-        timer = timer->release();
+        timer = (TeamAuswahlTimer *)timer->release();
     if( liste )
-        liste = liste->release();
-    chat = new TeamAuswahlChat( schrift );
-    timer = new TeamAuswahlTimer( schrift );
-    liste = new TeamAuswahlListe( schrift, sts->getThis(), karteId );
-    hauptScreen->unlock();
+        liste = (TeamAuswahlListe *)liste->release();
+    chat = new TeamAuswahlChat();
+    timer = new TeamAuswahlTimer();
+    liste = new TeamAuswahlListe( sts->getThis(), karteId );
+    uiFactory.initParam.bildschirm->unlock();
     rend = 1;
 }
 
@@ -1043,7 +953,7 @@ bool TeamAuswahl::tick( double tickVal )
     return ret;
 }
 
-void TeamAuswahl::doPublicMausEreignis( MausEreignis & me )
+void TeamAuswahl::doPublicMausEreignis( MausEreignis &me )
 {
     if( !alpha )
         return;
@@ -1061,7 +971,7 @@ void TeamAuswahl::doPublicMausEreignis( MausEreignis & me )
     }
 }
 
-void TeamAuswahl::doTastaturEreignis( TastaturEreignis & te )
+void TeamAuswahl::doTastaturEreignis( TastaturEreignis &te )
 {
     if( !alpha )
         return;
@@ -1069,7 +979,7 @@ void TeamAuswahl::doTastaturEreignis( TastaturEreignis & te )
         chat->doTastaturEreignis( te );
 }
 
-void TeamAuswahl::render( Bild & zRObj )
+void TeamAuswahl::render( Bild &zRObj )
 {
     if( !alpha )
         return;
@@ -1102,23 +1012,8 @@ SpielerTeamStruktur *TeamAuswahl::getSTS() const
     return sts->getThis();
 }
 
-// Reference Counting
-TeamAuswahl *TeamAuswahl::getThis()
-{
-    ref++;
-    return this;
-}
-
-TeamAuswahl *TeamAuswahl::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Event Aktionen
-void TeamAuswahlListeSpielerTeamAuswahlE( void *p, AuswahlBox * obj, int p1, int p2 )
+void TeamAuswahlListeSpielerTeamAuswahlE( void *p, AuswahlBox *obj, int p1, int p2 )
 {
     if( !p )
         return;

+ 154 - 184
KSGClient/NachLogin/Spiele/Team Auswahl/TeamAuswahl.h

@@ -13,224 +13,194 @@
 
 using namespace Framework;
 
-class TeamAuswahlListeSpieler
+class TeamAuswahlListeSpieler : public virtual ReferenceCounter
 {
 private:
-	int accountId;
-	TextFeld *name;
-	AuswahlBox *teamAuswahl;
-	TextFeld *team;
-	TextFeld *punkte;
-	TextFeld *spiele;
-	TextFeld *gewonnen;
-	TextFeld *farbe;
-	int spielerFarbe;
-	LRahmen *rahmen;
-	Text *teamName;
-	SpielerTeamStruktur *sts;
-	bool rend;
-	int ref;
+    int accountId;
+    TextFeld *name;
+    AuswahlBox *teamAuswahl;
+    TextFeld *team;
+    TextFeld *punkte;
+    TextFeld *spiele;
+    TextFeld *gewonnen;
+    TextFeld *farbe;
+    int spielerFarbe;
+    LRahmen *rahmen;
+    Text *teamName;
+    SpielerTeamStruktur *sts;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, Schrift *zSchrift, int accountId, int karteId );
-	// Destruktor
-	~TeamAuswahlListeSpieler();
-	// nicht constant
-	void disable();
-	void spielerTeamAuswahlE( AuswahlBox *obj, int p1, int p2 );
-	void setFarbe( int farbe );
-	void setTeam( Text *zName );
-	void setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int yOff, Bild &zRObj );
-	// constant
-	int getAccountId() const;
-	// Reference Counting
-	TeamAuswahlListeSpieler *getThis();
-	TeamAuswahlListeSpieler *release();
+    // Konstruktor
+    TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, int accountId, int karteId );
+    // Destruktor
+    ~TeamAuswahlListeSpieler();
+    // nicht constant
+    void disable();
+    void spielerTeamAuswahlE( AuswahlBox *obj, int p1, int p2 );
+    void setFarbe( int farbe );
+    void setTeam( Text *zName );
+    void setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int yOff, Bild &zRObj );
+    // constant
+    int getAccountId() const;
 };
 
-class TeamAuswahlListeTeam
+class TeamAuswahlListeTeam : public virtual ReferenceCounter
 {
 private:
-	int maxSpieler;
-	int jetztSpieler;
-	int team;
-	TextFeld *name;
-	TextFeld *mjSpieler;
-	TextFeld *farbe;
-	int teamFarbe;
-	RCArray< TeamAuswahlListeSpieler > *spieler;
-	LRahmen *rahmen;
-	AlphaFeld *titelAf;
-	Text *teamName;
-	double tickVal;
-	int höhe;
-	bool rend;
-	int ref;
+    int maxSpieler;
+    int jetztSpieler;
+    int team;
+    TextFeld *name;
+    TextFeld *mjSpieler;
+    TextFeld *farbe;
+    int teamFarbe;
+    RCArray< TeamAuswahlListeSpieler > *spieler;
+    LRahmen *rahmen;
+    AlphaFeld *titelAf;
+    Text *teamName;
+    double tickVal;
+    int höhe;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahlListeTeam( Schrift *zSchrift );
-	// Destruktor
-	~TeamAuswahlListeTeam();
-	// nicht constant
-	void disable();
-	void setMaxSpieler( int maxSpieler );
-	void setName( Text *name );
-	void setFarbe( int farbe );
-	void setTeam( int team );
-	void addSpieler( TeamAuswahlListeSpieler *spieler );
-	void removeSpieler( int accountId );
-	void setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( int yOff, Bild &zRObj );
-	// constant
-	int getTeamNummer() const;
-	int getHeight() const;
-	bool istPlatzFrei() const;
-	int getMaxSpieler() const;
-	Text *zName() const;
-	TeamAuswahlListeSpieler *getSpielerDaten( int accountId ) const;
-	TeamAuswahlListeSpieler *zSpielerDaten( int accountId ) const;
-	// Reference Counting
-	TeamAuswahlListeTeam *getThis();
-	TeamAuswahlListeTeam *release();
+    // Konstruktor
+    TeamAuswahlListeTeam();
+    // Destruktor
+    ~TeamAuswahlListeTeam();
+    // nicht constant
+    void disable();
+    void setMaxSpieler( int maxSpieler );
+    void setName( Text *name );
+    void setFarbe( int farbe );
+    void setTeam( int team );
+    void addSpieler( TeamAuswahlListeSpieler *spieler );
+    void removeSpieler( int accountId );
+    void setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( int yOff, Bild &zRObj );
+    // constant
+    int getTeamNummer() const;
+    int getHeight() const;
+    bool istPlatzFrei() const;
+    int getMaxSpieler() const;
+    Text *zName() const;
+    TeamAuswahlListeSpieler *getSpielerDaten( int accountId ) const;
+    TeamAuswahlListeSpieler *zSpielerDaten( int accountId ) const;
 };
 
-class TeamAuswahlListe
+class TeamAuswahlListe : public virtual ReferenceCounter
 {
 private:
-	LRahmen *rahmen;
-	VScrollBar *scroll;
-	RCArray< TeamAuswahlListeTeam > *teams;
-	Schrift *schrift;
-	SpielerTeamStruktur *sts;
-	int teamAnzahl;
-	int karteId;
-	bool rend;
-	int ref;
+    LRahmen *rahmen;
+    VScrollBar *scroll;
+    RCArray< TeamAuswahlListeTeam > *teams;
+    SpielerTeamStruktur *sts;
+    int teamAnzahl;
+    int karteId;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahlListe( Schrift *zSchrift, SpielerTeamStruktur *sts, int karteId );
-	// Destruktor
-	~TeamAuswahlListe();
-	// nicht constant
-	void disable();
-	void setTeamVonSpieler( int accountId, int spielerNummer );
-	void addSpieler( int accountId );
-	void removeSpieler( int accountId );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	TeamAuswahlListe *getThis();
-	TeamAuswahlListe *release();
+    // Konstruktor
+    TeamAuswahlListe( SpielerTeamStruktur *sts, int karteId );
+    // Destruktor
+    ~TeamAuswahlListe();
+    // nicht constant
+    void disable();
+    void setTeamVonSpieler( int accountId, int spielerNummer );
+    void addSpieler( int accountId );
+    void removeSpieler( int accountId );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void render( Bild &zRObj );
 };
 
-class TeamAuswahlTimer
+class TeamAuswahlTimer : public virtual ReferenceCounter
 {
 private:
-	TextFeld *zeit;
-	Knopf *bestätigen;
-	int time;
-	int maxTime;
-	double grad;
-	bool rend;
-	int ref;
+    TextFeld *zeit;
+    Knopf *bestätigen;
+    int time;
+    int maxTime;
+    double grad;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahlTimer( Schrift *zSchrift );
-	// Destruktor
-	~TeamAuswahlTimer();
-	// nicht constant
-	void setVerbleibendeZeit( int sekunden );
-	bool doPublicMausEreignis( MausEreignis &me );
-	bool tick( double tickVal );
-	void render( Bild &zRObj );
-	// constant
-	int getZeit() const;
-	// Reference Counting
-	TeamAuswahlTimer *getThis();
-	TeamAuswahlTimer *release();
+    // Konstruktor
+    TeamAuswahlTimer();
+    // Destruktor
+    ~TeamAuswahlTimer();
+    // nicht constant
+    void setVerbleibendeZeit( int sekunden );
+    bool doPublicMausEreignis( MausEreignis &me );
+    bool tick( double tickVal );
+    void render( Bild &zRObj );
+    // constant
+    int getZeit() const;
 };
 
-class TeamAuswahlChat
+class TeamAuswahlChat : public virtual ReferenceCounter
 {
 private:
-	TextFeld *nachricht;
-	Knopf *senden;
-	TextFeld *verlauf;
-	LRahmen *rahmen;
-	bool rend;
-	int ref;
+    TextFeld *nachricht;
+    Knopf *senden;
+    TextFeld *verlauf;
+    LRahmen *rahmen;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahlChat( Schrift *zSchrift );
-	// Destruktor
-	~TeamAuswahlChat();
-	// nicht constant
-	void addNachricht( char *nachricht );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-
-	// Reference Counting
-	TeamAuswahlChat *getThis();
-	TeamAuswahlChat *release();
+    // Konstruktor
+    TeamAuswahlChat();
+    // Destruktor
+    ~TeamAuswahlChat();
+    // nicht constant
+    void addNachricht( char *nachricht );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
 };
 
-class TeamAuswahl
+class TeamAuswahl : public virtual ReferenceCounter
 {
 private:
-	double tickVal;
-	int animation;
-	bool sichtbar;
-	int karteId;
-	unsigned char alpha;
-	SpielerTeamStruktur *sts;
-	TeamAuswahlChat *chat;
-	TeamAuswahlTimer *timer;
-	TeamAuswahlListe *liste;
-	Schrift *schrift;
-	bool rend;
-	int ref;
+    double tickVal;
+    int animation;
+    bool sichtbar;
+    int karteId;
+    unsigned char alpha;
+    SpielerTeamStruktur *sts;
+    TeamAuswahlChat *chat;
+    TeamAuswahlTimer *timer;
+    TeamAuswahlListe *liste;
+    bool rend;
 
 public:
-	// Konstruktor
-	TeamAuswahl( Schrift *zSchrift );
-	// Destruktor
-	~TeamAuswahl();
-	// nicht constant
-	void setKarteId( int karteId );
-	void setSichtbar( bool sichtbar, bool sofort = 0 );
-	void initSTS( SpielerTeamStruktur *sts );
-	void addSpieler( int accountId );
-	void setSpielerNummer( int accountId, int sNummer );
-	void removeSpieler( int accountId );
-	void verbleibendeZeit( int sekunden );
-	void addNachricht( char *nachricht );
-	bool tick( double tickVal );
-	void doPublicMausEreignis( MausEreignis &me );
-	void doTastaturEreignis( TastaturEreignis &te );
-	void render( Bild &zRObj );
-	// constant
-	bool istSichtbar() const;
-	int getKarteId() const;
-	SpielerTeamStruktur *getSTS() const;
-	// Reference Counting
-	TeamAuswahl *getThis();
-	TeamAuswahl *release();
+    // Konstruktor
+    TeamAuswahl();
+    // Destruktor
+    ~TeamAuswahl();
+    // nicht constant
+    void setKarteId( int karteId );
+    void setSichtbar( bool sichtbar, bool sofort = 0 );
+    void initSTS( SpielerTeamStruktur *sts );
+    void addSpieler( int accountId );
+    void setSpielerNummer( int accountId, int sNummer );
+    void removeSpieler( int accountId );
+    void verbleibendeZeit( int sekunden );
+    void addNachricht( char *nachricht );
+    bool tick( double tickVal );
+    void doPublicMausEreignis( MausEreignis &me );
+    void doTastaturEreignis( TastaturEreignis &te );
+    void render( Bild &zRObj );
+    // constant
+    bool istSichtbar() const;
+    int getKarteId() const;
+    SpielerTeamStruktur *getSTS() const;
 };
 
 // Event Aktionen

+ 64 - 72
KSGClient/NachLogin/Titel/TitelLeiste.cpp

@@ -8,7 +8,7 @@
 
 // Inhalt der TitelLeisten Klasse aus Titelleiste.h
 // Konstruktor
-TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
+TitelLeiste::TitelLeiste( Fenster *zNachLogin )
     : Thread()
 {
     Bild *goldB = bilder->get( "data/bilder/system.ltdb/gold.jpg" );
@@ -23,16 +23,16 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
     bilder->leseDaten( 0 );
     logoutBild = bilder->laden( 0, new Text( "logout.png" ) );
     Bild *hintergrund = bilder->laden( 0, new Text( "titelleiste.jpg" ) );
-    bilder = bilder->release();
-    Punkt bgr = hauptScreen->getBackBufferSize();
-    version = initTextFeld( 1, 1, 200, 12, zSchrift, TextFeld::Style::Text | TextFeld::Style::Sichtbar, "client version: " );
+    bilder->release();
+    Punkt bgr = uiFactory.initParam.bildschirm->getBackBufferSize();
+    version = initTextFeld( 1, 1, 200, 12, TextFeld::Style::Text | TextFeld::Style::Sichtbar, "client version: " );
     Datei *vDat = new Datei();
     vDat->setDatei( new Text( "data/version" ) );
     vDat->open( Datei::Style::lesen );
     char clientVersion[ 4 ] = { 0, 0, 0, 0 };
     vDat->lese( clientVersion, 4 );
     vDat->close();
-    vDat = vDat->release();
+    vDat->release();
     version->zText()->append( (int)clientVersion[ 3 ] );
     version->zText()->append( "." );
     version->zText()->append( (int)clientVersion[ 2 ] );
@@ -40,61 +40,61 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
     version->zText()->append( (int)clientVersion[ 1 ] );
     version->zText()->append( "." );
     version->zText()->append( (int)clientVersion[ 0 ] );
-    close = initKnopf( bgr.x - 23, -1, 22, 22, 0, 0, "" );
+    close = initKnopf( bgr.x - 23, -1, 22, 22, 0, "" );
     close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer | Knopf::Style::HAlpha | Knopf::Style::Rahmen );
     close->setRahmenFarbe( 0xFFFFFFFF );
     close->setRahmenBreite( 1 );
-    close->setHintergrundBildZ( closeBild->getThis() );
-    initToolTip( close, "Kolja-Strohm Games Client beenden.", zSchrift, hauptScreen );
+    close->setHintergrundBildZ( dynamic_cast<Bild *>( closeBild->getThis() ) );
+    initToolTip( close, "Kolja-Strohm Games Client beenden." );
     close->setMausEreignisParameter( this );
     close->setMausEreignis( titelLeisteSchließenME );
-    einstellungen = initKnopf( bgr.x - 44, -1, 22, 22, 0, 0, "" );
+    einstellungen = initKnopf( bgr.x - 44, -1, 22, 22, 0, "" );
     einstellungen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer | Knopf::Style::HAlpha | Knopf::Style::Rahmen );
     einstellungen->setRahmenFarbe( 0xFFFFFFFF );
     einstellungen->setRahmenBreite( 1 );
-    einstellungen->setHintergrundBildZ( einstellungenBild->getThis() );
+    einstellungen->setHintergrundBildZ( dynamic_cast<Bild *>( einstellungenBild->getThis() ) );
     einstellungen->setMausEreignisParameter( this );
     einstellungen->setMausEreignis( titelLeisteEinstellungenME );
-    initToolTip( einstellungen, "Einstellungen ändern.", zSchrift, hauptScreen );
-    logout = initKnopf( bgr.x - 65, -1, 22, 22, 0, 0, "" );
+    initToolTip( einstellungen, "Einstellungen ändern." );
+    logout = initKnopf( bgr.x - 65, -1, 22, 22, 0, "" );
     logout->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBuffer | Knopf::Style::HAlpha | Knopf::Style::Rahmen );
     logout->setRahmenFarbe( 0xFFFFFFFF );
     logout->setRahmenBreite( 1 );
-    logout->setHintergrundBildZ( logoutBild->getThis() );
+    logout->setHintergrundBildZ( dynamic_cast<Bild *>( logoutBild->getThis() ) );
     logout->setMausEreignisParameter( this );
     logout->setMausEreignis( titelLeisteLogoutME );
-    initToolTip( logout, "Ausloggen.", zSchrift, hauptScreen );
-    news = initKnopf( bgr.x - 103, 67, 102, 32, zSchrift, Knopf::Style::Sichtbar, "Information" );
+    initToolTip( logout, "Ausloggen." );
+    news = initKnopf( bgr.x - 103, 67, 102, 32, Knopf::Style::Sichtbar, "Information" );
     news->setRahmenFarbe( 0xFFFFFFFF );
     news->setRahmenBreite( 1 );
     news->setMausEreignisParameter( this );
     news->setMausEreignis( titelLeisteNewsME );
-    miniGames = initKnopf( bgr.x - 204, 67, 102, 32, zSchrift, Knopf::Style::Sichtbar, "Mini Games" );
+    miniGames = initKnopf( bgr.x - 204, 67, 102, 32, Knopf::Style::Sichtbar, "Mini Games" );
     miniGames->setRahmenFarbe( 0xFFFFFFFF );
     miniGames->setRahmenBreite( 1 );
     miniGames->setMausEreignisParameter( this );
     miniGames->setMausEreignis( titelLeisteMiniGamesME );
-    accountAnsehen = initKnopf( bgr.x - 305, 67, 102, 32, zSchrift, Knopf::Style::Sichtbar, "Account" );
+    accountAnsehen = initKnopf( bgr.x - 305, 67, 102, 32, Knopf::Style::Sichtbar, "Account" );
     accountAnsehen->setRahmenFarbe( 0xFFFFFFFF );
     accountAnsehen->setRahmenBreite( 1 );
     accountAnsehen->setMausEreignisParameter( this );
     accountAnsehen->setMausEreignis( titelLeisteAccountAnsehenME );
-    shop = initKnopf( bgr.x - 406, 67, 102, 32, zSchrift, Knopf::Style::Sichtbar, "Shop" );
+    shop = initKnopf( bgr.x - 406, 67, 102, 32, Knopf::Style::Sichtbar, "Shop" );
     shop->setRahmenFarbe( 0xFFFFFFFF );
     shop->setRahmenBreite( 1 );
     shop->setMausEreignisParameter( this );
     shop->setMausEreignis( titelLeisteShopME );
-    spielen = initKnopf( bgr.x - 507, 67, 102, 32, zSchrift, Knopf::Style::Sichtbar, "Spielen" );
+    spielen = initKnopf( bgr.x - 507, 67, 102, 32, Knopf::Style::Sichtbar, "Spielen" );
     spielen->setRahmenFarbe( 0xFFFFFFFF );
     spielen->setRahmenBreite( 1 );
     spielen->setMausEreignisParameter( this );
     spielen->setMausEreignis( titelLeisteSpielenME );
-    editor = initKnopf( bgr.x - 507, 35, 102, 32, zSchrift, 0, "Editor" );
+    editor = initKnopf( bgr.x - 507, 35, 102, 32, 0, "Editor" );
     editor->setRahmenFarbe( 0xFFFFFFFF );
     editor->setRahmenBreite( 1 );
     editor->setMausEreignisParameter( this );
     editor->setMausEreignis( titelLeisteEditorME );
-    info = initTextFeld( 200, 11, 300, 76, zSchrift, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrzeilig | TextFeld::Style::Rahmen, "Wilkommen bei Kolja-Strohm Games!\nViel Spaß beim spielen." );
+    info = initTextFeld( 200, 11, 300, 76, TextFeld::Style::Sichtbar | TextFeld::Style::Mehrzeilig | TextFeld::Style::Rahmen, "Wilkommen bei Kolja-Strohm Games!\nViel Spaß beim spielen." );
     info->setRahmenFarbe( 0xFFFFFFFF );
     int minus = bgr.x / 2 - 254;
     if( minus < 511 )
@@ -111,21 +111,21 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
     fenster->setRFarbe( 0xFFFFFFFF );
     fenster->setSize( bgr.x, 100 );
     fenster->setKBgBildZ( hintergrund );
-    fenster->addMember( close->getThis() );
-    fenster->addMember( einstellungen->getThis() );
-    fenster->addMember( logout->getThis() );
-    fenster->addMember( accountAnsehen->getThis() );
-    fenster->addMember( spielen->getThis() );
-    fenster->addMember( editor->getThis() );
-    fenster->addMember( miniGames->getThis() );
-    fenster->addMember( news->getThis() );
-    fenster->addMember( shop->getThis() );
-    fenster->addMember( info->getThis() );
-    fenster->addMember( version->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( close->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( einstellungen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( logout->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( accountAnsehen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( spielen->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( editor->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( miniGames->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( news->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( shop->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( info->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( version->getThis() ) );
 
-    kupfer = initTextFeld( fenster->getBreite() - 40, 70, 10, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
-    silber = initTextFeld( kupfer->getX() - 40, 70, 10, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
-    gold = initTextFeld( silber->getX() - 40, 70, 10, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
+    kupfer = initTextFeld( fenster->getBreite() - 40, 70, 10, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
+    silber = initTextFeld( kupfer->getX() - 40, 70, 10, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
+    gold = initTextFeld( silber->getX() - 40, 70, 10, 20, TextFeld::Style::Text | TextFeld::Style::Center, "0" );
     goldBild = new BildZ();
     goldBild->setStyle( BildZ::Style::Sichtbar );
     goldBild->setBildZ( goldB );
@@ -142,13 +142,13 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
     kupferBild->setSize( 20, 20 );
     kupferBild->setPosition( kupfer->getX() + kupfer->getBreite(), 70 );
 
-    fenster->addMember( gold->getThis() );
-    fenster->addMember( silber->getThis() );
-    fenster->addMember( kupfer->getThis() );
-    fenster->addMember( goldBild->getThis() );
-    fenster->addMember( silberBild->getThis() );
-    fenster->addMember( kupferBild->getThis() );
-    zNachLogin->addMember( fenster->getThis() );
+    fenster->addMember( dynamic_cast<Zeichnung *>( gold->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( silber->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( kupfer->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( goldBild->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( silberBild->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( kupferBild->getThis() ) );
+    zNachLogin->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
     next = new Array< int >();
     nextAnzahl = 0;
     rend = 0;
@@ -159,11 +159,11 @@ TitelLeiste::TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift )
 TitelLeiste::~TitelLeiste()
 {
     if( closeBild )
-        closeBild = closeBild->release();
+        closeBild->release();
     if( einstellungenBild )
-        einstellungenBild = einstellungenBild->release();
+        einstellungenBild->release();
     if( logoutBild )
-        logoutBild = logoutBild->release();
+        logoutBild->release();
     if( close )
         close = (Knopf *)close->release();
     if( einstellungen )
@@ -189,7 +189,7 @@ TitelLeiste::~TitelLeiste()
     if( fenster )
         fenster = (Fenster *)fenster->release();
     if( next )
-        next = next->release();
+        next->release();
     goldBild->release();
     silberBild->release();
     kupferBild->release();
@@ -223,7 +223,7 @@ void TitelLeiste::setImVideo( bool imVideo ) // aktiviert oder deaktiviert Kn
     shop->setStyle( Knopf::Style::Erlaubt, !imVideo );
 }
 
-bool TitelLeiste::druckSchließen( MausEreignis & me ) // Schließen wurde gedrückt
+bool TitelLeiste::druckSchließen( MausEreignis &me ) // Schließen wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -231,7 +231,7 @@ bool TitelLeiste::druckSchlie
                                                       new Text( "Ja" ), new Text( "Nein" ), []()
         {
             nachLogin->zChatLeiste()->removeAll();
-            if( loginClient &&loginClient->verbinde() )
+            if( loginClient && loginClient->verbinde() )
             {
                 loginClient->logout();
                 loginClient->trenne( 1 );
@@ -242,14 +242,14 @@ bool TitelLeiste::druckSchlie
     return 1;
 }
 
-bool TitelLeiste::druckEinstellungen( MausEreignis & me ) // Einstellungen wurde gedrückt
+bool TitelLeiste::druckEinstellungen( MausEreignis &me ) // Einstellungen wurde gedrückt
 {
     if( me.id == ME_RLinks )
         nachLogin->zEinstellungen()->setSichtbar();
     return 1;
 }
 
-bool TitelLeiste::druckLogout( MausEreignis & me ) // Logout wurde gedrückt
+bool TitelLeiste::druckLogout( MausEreignis &me ) // Logout wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -262,7 +262,7 @@ bool TitelLeiste::druckLogout( MausEreignis & me ) // Logout wurde gedr
     return 1;
 }
 
-bool TitelLeiste::druckSpielen( MausEreignis & me ) // Spielen wurde gedrückt
+bool TitelLeiste::druckSpielen( MausEreignis &me ) // Spielen wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -274,7 +274,7 @@ bool TitelLeiste::druckSpielen( MausEreignis & me ) // Spielen wurde gedr
     return 1;
 }
 
-bool TitelLeiste::druckAccountAnsehen( MausEreignis & me ) // AccountAnsehen wurde gedrückt
+bool TitelLeiste::druckAccountAnsehen( MausEreignis &me ) // AccountAnsehen wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -286,7 +286,7 @@ bool TitelLeiste::druckAccountAnsehen( MausEreignis & me ) // AccountAnsehen wur
     return 1;
 }
 
-bool TitelLeiste::druckMiniGames( MausEreignis & me ) // MiniGames wurde gedrückt
+bool TitelLeiste::druckMiniGames( MausEreignis &me ) // MiniGames wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -298,7 +298,7 @@ bool TitelLeiste::druckMiniGames( MausEreignis & me ) // MiniGames wurde gedr
     return 1;
 }
 
-bool TitelLeiste::druckNews( MausEreignis & me ) // News wurde gedrückt
+bool TitelLeiste::druckNews( MausEreignis &me ) // News wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -310,7 +310,7 @@ bool TitelLeiste::druckNews( MausEreignis & me ) // News wurde gedr
     return 1;
 }
 
-bool TitelLeiste::druckShop( MausEreignis & me ) // Spielen wurde gedrückt
+bool TitelLeiste::druckShop( MausEreignis &me ) // Spielen wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -322,7 +322,7 @@ bool TitelLeiste::druckShop( MausEreignis & me ) // Spielen wurde gedr
     return 1;
 }
 
-bool TitelLeiste::druckEditor( MausEreignis & me ) // Spielen wurde gedrückt
+bool TitelLeiste::druckEditor( MausEreignis &me ) // Spielen wurde gedrückt
 {
     if( me.id == ME_RLinks )
     {
@@ -344,22 +344,22 @@ void TitelLeiste::thread()
             Text *infoTxt = new Text( "" );
             int typ = 0;
             bool b = infoClient->getInformationText( infoTxt, &typ );
-            if( b &&infoTxt->getLength() )
-                info->setText( infoTxt->getThis() );
-            infoTxt = infoTxt->release();
+            if( b && infoTxt->getLength() )
+                info->setText( dynamic_cast<Text *>( infoTxt->getThis() ) );
+            infoTxt = (Text *)infoTxt->release();
             int k = infoClient->getKupfer();
             int s = k / 100;
             int g = s / 100;
             s = s % 100;
             k = k % 100;
-            Text * gt = new Text();
+            Text *gt = new Text();
             gt->append( g );
-            Text * st = new Text();
+            Text *st = new Text();
             st->append( s );
-            Text * kt = new Text();
+            Text *kt = new Text();
             kt->append( k );
-            Schrift * schrift = gold->zSchrift();
-            TextRenderer rd( schrift->getThis() );
+            Schrift *schrift = gold->zSchrift();
+            TextRenderer rd( dynamic_cast<Schrift *>( schrift->getThis() ) );
             rd.setSchriftSize( 12 );
             int gtbr = rd.getTextBreite( gt->getText() );
             int stbr = rd.getTextBreite( st->getText() );
@@ -663,14 +663,6 @@ int TitelLeiste::getSpielenX() const
     return spielen->getX();
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *TitelLeiste::release()
-{
-    if( ref == 2 && run )
-        ende();
-    return Thread::release();
-}
-
 // Ereignisse
 bool titelLeisteSchließenME( void *p, void *obj, MausEreignis me )
 {

+ 45 - 47
KSGClient/NachLogin/Titel/TitelLeiste.h

@@ -12,55 +12,53 @@ using namespace Framework;
 class TitelLeiste : public Thread
 {
 private:
-	Knopf *close;
-	Knopf *einstellungen;
-	Knopf *logout;
-	Knopf *accountAnsehen;
-	Knopf *spielen;
-	Knopf *miniGames;
-	Knopf *news;
-	Knopf *shop;
-	Knopf *editor;
-	Bild *closeBild;
-	Bild *einstellungenBild;
-	Bild *logoutBild;
-	TextFeld *info;
-	TextFeld *version;
-	Fenster *fenster;
-	Array< int > *next;
-	Critical cs;
-	BildZ *goldBild;
-	BildZ *silberBild;
-	BildZ *kupferBild;
-	TextFeld *gold;
-	TextFeld *silber;
-	TextFeld *kupfer;
-	int nextAnzahl;
-	bool rend;
+    Knopf *close;
+    Knopf *einstellungen;
+    Knopf *logout;
+    Knopf *accountAnsehen;
+    Knopf *spielen;
+    Knopf *miniGames;
+    Knopf *news;
+    Knopf *shop;
+    Knopf *editor;
+    Bild *closeBild;
+    Bild *einstellungenBild;
+    Bild *logoutBild;
+    TextFeld *info;
+    TextFeld *version;
+    Fenster *fenster;
+    Array< int > *next;
+    Critical cs;
+    BildZ *goldBild;
+    BildZ *silberBild;
+    BildZ *kupferBild;
+    TextFeld *gold;
+    TextFeld *silber;
+    TextFeld *kupfer;
+    int nextAnzahl;
+    bool rend;
 
 public:
-	// Konstruktor
-	TitelLeiste( Fenster *zNachLogin, Schrift *zSchrift );
-	// Destruktor
-	~TitelLeiste();
-	// nicht constant
-	void setImSpiel( bool imSpiel ); // aktiviert oder deaktiviert Knöpfe
-	void setImVideo( bool imVideo ); // aktiviert oder deaktiviert Knöpfe
-	bool druckSchließen( MausEreignis &me ); // Schließen wurde gedrückt
-	bool druckEinstellungen( MausEreignis &me ); // Einstellungen wurde gedrückt
-	bool druckLogout( MausEreignis &me ); // Logout wurde gedrückt
-	bool druckAccountAnsehen( MausEreignis &me ); // AccountAnsehen wurde gedrückt
-	bool druckSpielen( MausEreignis &me ); // Spielen wurde gedrückt
-	bool druckMiniGames( MausEreignis &me ); // MiniGames wurde gedrückt
-	bool druckNews( MausEreignis &me ); // News wurde gedrückt
-	bool druckShop( MausEreignis &me ); // Shop wurde gedrückt
-	bool druckEditor( MausEreignis &me ); // Shop wurde gedrückt
-	void thread(); // aktualisierungs Thread
-	bool tick(); // tick
-	// constant
-	int getSpielenX() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    TitelLeiste( Fenster *zNachLogin );
+    // Destruktor
+    ~TitelLeiste();
+    // nicht constant
+    void setImSpiel( bool imSpiel ); // aktiviert oder deaktiviert Knöpfe
+    void setImVideo( bool imVideo ); // aktiviert oder deaktiviert Knöpfe
+    bool druckSchließen( MausEreignis &me ); // Schließen wurde gedrückt
+    bool druckEinstellungen( MausEreignis &me ); // Einstellungen wurde gedrückt
+    bool druckLogout( MausEreignis &me ); // Logout wurde gedrückt
+    bool druckAccountAnsehen( MausEreignis &me ); // AccountAnsehen wurde gedrückt
+    bool druckSpielen( MausEreignis &me ); // Spielen wurde gedrückt
+    bool druckMiniGames( MausEreignis &me ); // MiniGames wurde gedrückt
+    bool druckNews( MausEreignis &me ); // News wurde gedrückt
+    bool druckShop( MausEreignis &me ); // Shop wurde gedrückt
+    bool druckEditor( MausEreignis &me ); // Shop wurde gedrückt
+    void thread(); // aktualisierungs Thread
+    bool tick(); // tick
+    // constant
+    int getSpielenX() const;
 };
 
 // Ereignisse

+ 44 - 75
KSGClient/NachLogin/Update/Update.cpp

@@ -4,13 +4,13 @@
 
 // Inhalt der UpdateGUI klasse aus UpdateGUI.h
 // Konstruktor
-Update::Update( Schrift *zSchrift, FBalken *fb, int dg, std::function< void(bool) > after )
-	: Thread()
+Update::Update( FBalken *fb, int dg, std::function< void( bool ) > after )
+    : Thread()
 {
-	p = 0;
+    p = 0;
     this->fb = fb;
     updateAbbrechen = 0;
-	this->dg = dg;
+    this->dg = dg;
     this->after = after;
 }
 
@@ -19,8 +19,8 @@ Update::~Update()
 {
     if( fb )
         fb->release();
-	if( p )
-		p->release();
+    if( p )
+        p->release();
 }
 
 // nicht constant
@@ -44,15 +44,15 @@ void Update::herunterladen()
 
 void Update::thread()
 {
-	int dgId = dg;
-	Text err;
-	if( !p->update( dgId, &updateAbbrechen, (FBalken*)fb->getThis(), 0, &err ) )
-	{
+    int dgId = dg;
+    Text err;
+    if( !p->update( dgId, &updateAbbrechen, dynamic_cast<FBalken *>( fb->getThis() ), 0, &err ) )
+    {
         updateAbbrechen = 1;
-		if( nachLogin && nachLogin->zNachrichtenListe() )
-			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err.getThis(), new Text( "Ok" ) );
-	}
-	run = 0;
+        if( nachLogin && nachLogin->zNachrichtenListe() )
+            nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), dynamic_cast<Text *>( err.getThis() ), new Text( "Ok" ) );
+    }
+    run = 0;
 }
 
 void Update::threadEnd()
@@ -68,37 +68,21 @@ int Update::getDateiGruppe() const
     return dg;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *Update::release()
-{
-    if( ref == 2 && run )
-    {
-        updateAbbrechen = 1;
-        warteAufThread( 5000 );
-        if( isRunning() )
-        {
-            ende();
-            after( 0 );
-        }
-    }
-    return Thread::release();
-}
-
 
 // inhalt der UpdateHandler Klasse aus UpdateGUI.h
 // Konstruktor
 UpdateHandler::UpdateHandler()
+    : ReferenceCounter()
 {
-	patcher = new Patcher();
-	updates = new RCArray< Update >();
-	ref = 1;
+    patcher = new Patcher();
+    updates = new RCArray< Update >();
 }
 
 // Destruktor
 UpdateHandler::~UpdateHandler()
 {
-	updates->release();
-	patcher->release();
+    updates->release();
+    patcher->release();
 }
 
 // privat
@@ -123,7 +107,7 @@ bool UpdateHandler::add( Update *update )
         return 0;
     }
     int anz = updates->getEintragAnzahl();
-    update->setPatcher( patcher->getThis() );
+    update->setPatcher( dynamic_cast<Patcher *>( patcher->getThis() ) );
     updates->add( update );
     unlock();
     return 1;
@@ -131,47 +115,32 @@ bool UpdateHandler::add( Update *update )
 
 void UpdateHandler::remove( int dg )
 {
-	lock();
-	int anz = updates->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( updates->z( i )->getDateiGruppe() == dg )
-		{
-			updates->remove( i );
-			break;
-		}
-	}
-	unlock();
+    lock();
+    int anz = updates->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( updates->z( i )->getDateiGruppe() == dg )
+        {
+            updates->remove( i );
+            break;
+        }
+    }
+    unlock();
 }
 
 bool UpdateHandler::hat( int dg )
 {
-	lock();
-	bool ret = 0;
-	int anz = updates->getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( updates->z( i )->getDateiGruppe() == dg )
-		{
-			ret = 1;
-			break;
-		}
-	}
-	unlock();
-	return ret;
-}
-
-// Reference Counting
-UpdateHandler *UpdateHandler::getThis()
-{
-	ref++;
-	return this;
-}
-
-UpdateHandler *UpdateHandler::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    lock();
+    bool ret = 0;
+    int anz = updates->getEintragAnzahl();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( updates->z( i )->getDateiGruppe() == dg )
+        {
+            ret = 1;
+            break;
+        }
+    }
+    unlock();
+    return ret;
 }

+ 26 - 32
KSGClient/NachLogin/Update/Update.h

@@ -11,50 +11,44 @@ using namespace Framework;
 class Update : public Thread
 {
 private:
-	Patcher *p;
+    Patcher *p;
     FBalken *fb;
-	bool updateAbbrechen;
-	int dg;
-    std::function< void(bool) > after;
+    bool updateAbbrechen;
+    int dg;
+    std::function< void( bool ) > after;
 
 public:
-	// Konstruktor
-    Update( Schrift *zSchrift, FBalken *fb, int dg, std::function< void(bool) > after = [](bool b){} );
-	// Destruktor
-	~Update();
-	// nicht constant
+    // Konstruktor
+    Update( FBalken *fb, int dg, std::function< void( bool ) > after = []( bool b ) {} );
+    // Destruktor
+    ~Update();
+    // nicht constant
     void setPatcher( Patcher *p );
     void abbrechen();
     void herunterladen();
-	void thread() override;
+    void thread() override;
     void threadEnd() override;
-	// constant
+    // constant
     int getDateiGruppe() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
-class UpdateHandler
+class UpdateHandler : public virtual ReferenceCounter
 {
 private:
-	Patcher *patcher;
-	RCArray< Update > *updates;
-	Critical cs;
-	int ref;
-	// privat
-	void lock();
-	void unlock();
+    Patcher *patcher;
+    RCArray< Update > *updates;
+    Critical cs;
+    // privat
+    void lock();
+    void unlock();
 
 public:
-	// Konstruktor
-	UpdateHandler();
-	// Destruktor
-	~UpdateHandler();
-	// nicht constant
-	bool add( Update *update );
-	void remove( int dg = 0 );
-	bool hat( int dg = 0 );
-	// Reference Counting
-	UpdateHandler *getThis();
-	UpdateHandler *release();
+    // Konstruktor
+    UpdateHandler();
+    // Destruktor
+    ~UpdateHandler();
+    // nicht constant
+    bool add( Update *update );
+    void remove( int dg = 0 );
+    bool hat( int dg = 0 );
 };

+ 83 - 83
KSGClient/Netzwerk/ChatMessageProcessor.cpp

@@ -26,27 +26,27 @@ void ChatMessageProcessor::thread()
             break;
         case 2: // Server Ausgelastet
             aktion = 1;
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            if( nachLogin && nachLogin->zNachrichtenListe() )
             {
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Server Ausgelastet" ),
                                                               new Text( "Der Chat Server ist derzeit ausgelastet. Es wird versucht auf einen anderen Server auszuweichen." ),
                                                               new Text( "Ok" ), 0 );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 3: // Fehler
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
-                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg.message.getThis(), new Text( "Ok" ), 0 );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zNachrichtenListe() )
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), dynamic_cast<Text *>( msg.message.getThis() ), new Text( "Ok" ), 0 );
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 4: // Chat Nachricht
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            if( nachLogin && nachLogin->zChatLeiste() )
             {
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zChatLeiste()->chatNachricht( msg.account, msg.message );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 5: // Spiel Einladung
@@ -66,8 +66,8 @@ void ChatMessageProcessor::thread()
                 nachricht->append( karte );
                 int gruppeId = msg.gruppe;
                 int vonAccount = msg.account;
-                hauptScreen->lock();
-                nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), [ gruppeId, vonAccount ]()
+                uiFactory.initParam.bildschirm->lock();
+                nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ), [gruppeId, vonAccount]()
                 {
                     if( 1 )
                     {
@@ -93,7 +93,7 @@ void ChatMessageProcessor::thread()
                             }
                         }
                         dgt->release();
-                        std::function< void() > ja = [ gruppeId ]()
+                        std::function< void() > ja = [gruppeId]()
                         {
                             MausEreignis me;
                             me.verarbeitet = 0;
@@ -147,7 +147,7 @@ void ChatMessageProcessor::thread()
                             Text msg = "Das Spiel '";
                             msg.append( infoClient->getSpielName( spielArt ) );
                             msg += "' muss aktualisiert werden.";
-                            nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( nachLogin->zNachrichtenListe()->zSchrift(), new Text( "Update" ), msg.getThis(), dgSId, ja, [ gruppeId ]()
+                            nachLogin->zNachrichtenListe()->addNachricht( new SpielUpdateNachricht( new Text( "Update" ), dynamic_cast<Text *>( msg.getThis() ), dgSId, ja, [gruppeId]()
                             {
                                 if( !anmeldungClient )
                                     anmeldungClient = mainClient->createAnmeldungServerClient();
@@ -163,7 +163,7 @@ void ChatMessageProcessor::thread()
                             ja();
                         }
                     }
-                }, [ gruppeId ]()
+                }, [gruppeId]()
                 {
                     if( !anmeldungClient )
                         anmeldungClient = mainClient->createAnmeldungServerClient();
@@ -173,26 +173,26 @@ void ChatMessageProcessor::thread()
                         anmeldungClient->trenne( 0 );
                     }
                 } );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 6: // Account Status ändert sich
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zNachrichtenListe() )
                 nachLogin->zFreundesListe()->setStatus( msg.account, msg.message );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 7: // Account Name ändert sich
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zNachrichtenListe() )
                 nachLogin->zFreundesListe()->setName( msg.account, msg.message );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 8: // kein Freund mehr
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zNachrichtenListe() )
                 nachLogin->zFreundesListe()->removeMember( msg.account );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 9: // Freundesanfrage
             if( nachLogin && nachLogin->zNachrichtenListe() )
@@ -202,41 +202,41 @@ void ChatMessageProcessor::thread()
                 nachricht->append( infoClient->getSpielerName( msg.account ) );
                 nachricht->append( " möchte sich mit dir befreunden." );
                 int accountId = msg.account;
-                hauptScreen->lock();
-                if( nachLogin &&nachLogin->zNachrichtenListe() )
+                uiFactory.initParam.bildschirm->lock();
+                if( nachLogin && nachLogin->zNachrichtenListe() )
                 {
                     nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "annehmen" ), new Text( "ablehnen" ),
-                                                                  [ accountId ]()
+                                                                  [accountId]()
                     {
                         chatClient->freundesAnfrageBeantworten( accountId, 1 );
-                    }, [ accountId ]()
+                    }, [accountId]()
                     {
                         chatClient->freundesAnfrageBeantworten( accountId, 0 );
                     } );
                 }
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 0xA: // Neuer Freund
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zNachrichtenListe() )
                 nachLogin->zFreundesListe()->addMember( msg.account );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0xB: // Freundesanfrage abgelehnt
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            if( nachLogin && nachLogin->zNachrichtenListe() )
             {
                 Text *titel = new Text( "Freundeseinladung Abgelehnt" );
                 Text *nachricht = new Text( "" );
                 nachricht->append( infoClient->getSpielerName( msg.account ) );
                 nachricht->append( " hat deine Freundesanfrage abgelehnt." );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 0xC: // Einladung zum Chatroom
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            if( nachLogin && nachLogin->zNachrichtenListe() )
             {
                 Text *titel = new Text( "Chatroom Einladung" );
                 Text *nachricht = new Text( "" );
@@ -247,18 +247,18 @@ void ChatMessageProcessor::thread()
                 int chatroomId = msg.chatroom;
                 int vonAccount = msg.account;
                 nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "betreten" ), new Text( "ablehnen" ),
-                                                              [ chatroomId, vonAccount ]()
+                                                              [chatroomId, vonAccount]()
                 {
                     nachLogin->zChatLeiste()->addChat( 0, chatroomId );
                     chatClient->chatroomBetreten( chatroomId );
-                }, [ chatroomId, vonAccount ]()
+                }, [chatroomId, vonAccount]()
                 {
                     chatClient->chatroomEinladungAblehnen( vonAccount, chatroomId );
                 } );
             }
             break;
         case 0xD: // Einladung zum Chatroom abgelehnt
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            if( nachLogin && nachLogin->zNachrichtenListe() )
             {
                 Text *titel = new Text( "Chatroom Einladung Abgelehnt" );
                 Text *nachricht = new Text( "" );
@@ -266,28 +266,28 @@ void ChatMessageProcessor::thread()
                 nachricht->append( " möchte dem Chatroom '" );
                 nachricht->append( infoClient->getChatroomName( msg.chatroom ) );
                 nachricht->append( "' nicht beitreten." );
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zNachrichtenListe()->addNachricht( titel, nachricht, new Text( "Ok" ), 0 );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         case 0xE: // Spieler betritt Chatroom
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zChatLeiste() )
                 nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.account );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0xF: // Chatroom Nachricht
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zChatLeiste() )
                 nachLogin->zChatLeiste()->chatroomNachricht( msg.chatroom, msg.account, msg.message );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x10: // Spieler verlässt Chatroom
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zChatLeiste() )
                 nachLogin->zChatLeiste()->removeSpieler( msg.chatroom, msg.account );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x11: // Freunde
         {
@@ -300,9 +300,9 @@ void ChatMessageProcessor::thread()
                     {
                         Sleep( 50 );
                     }
-                    hauptScreen->lock();
+                    uiFactory.initParam.bildschirm->lock();
                     nachLogin->zFreundesListe()->addMember( msg.ids.get( i ) );
-                    hauptScreen->unlock();
+                    uiFactory.initParam.bildschirm->unlock();
                 }
             }
             break;
@@ -312,98 +312,98 @@ void ChatMessageProcessor::thread()
             char anzahl = msg.ids.getEintragAnzahl();
             for( char i = 0; i < anzahl; i++ )
             {
-                hauptScreen->lock();
-                if( nachLogin &&nachLogin->zChatLeiste() )
+                uiFactory.initParam.bildschirm->lock();
+                if( nachLogin && nachLogin->zChatLeiste() )
                     nachLogin->zChatLeiste()->addSpieler( msg.chatroom, msg.ids.get( i ) );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         }
         case 0x13: // Freund online
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zFreundesListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zFreundesListe() )
                 nachLogin->zFreundesListe()->setOnline( msg.account, 1 );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x14: // Freund offline
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zFreundesListe() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zFreundesListe() )
                 nachLogin->zFreundesListe()->setOnline( msg.account, 0 );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x15: // Chatroom Admin
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zChatLeiste() )
                 nachLogin->zChatLeiste()->setChatroomAdmin( msg.chatroom );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x16: // Chatroom Kick
-            hauptScreen->lock();
-            if( nachLogin &&nachLogin->zChatLeiste() )
+            uiFactory.initParam.bildschirm->lock();
+            if( nachLogin && nachLogin->zChatLeiste() )
                 nachLogin->zChatLeiste()->removeChat( 0, msg.chatroom );
-            hauptScreen->unlock();
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 0x17: // Spieler betritt Gruppe
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->spielerBetrittGruppe( msg.gruppe, msg.account );
             break;
         case 0x18: // Spieler verlässt Gruppe
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->spielerVerlässtGruppe( msg.gruppe, msg.account );
             break;
         case 0x19: // gruppe Nachricht
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeNachricht( msg.gruppe, msg.message );
             break;
         case 0x1A: // gruppe Angemeldet
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeAnmelden( msg.gruppe );
             break;
         case 0x1B: // gruppe Abgemeldet
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeAbmelden( msg.gruppe );
             break;
         case 0x1C: // gruppe Spiel starten
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->setGruppeSpielStarten( msg.gruppe, msg.account == 1 );
             break;
         case 0x1D: // kick aus Gruppe
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->kickAusGruppe( msg.gruppe );
             break;
         case 0x1E: // gruppe Admin
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->setGruppeAdmin( msg.gruppe, msg.account );
             break;
         case 0x1F: // gruppe Einladung abgelehnt
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeEinadungAbgelehnt( msg.gruppe, msg.account );
             break;
         case 0x20: // SpielServer Verbindungs Anfrage
             if( smProcessor )
                 smProcessor = (SpielMessageProcessor *)smProcessor->release();
             if( spielClient )
-                spielClient = spielClient->release();
+                spielClient = (KSGClient::SpielServerClient *)spielClient->release();
             spielClient = msg.client;
             spielClient->verbinde();
             smProcessor = new SpielMessageProcessor();
             break;
         case 0x21: // Gruppe Einladung abgebrochen
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeEinladungAbgebrochen( msg.gruppe, msg.account );
             break;
         case 0x22: // Gruppe Einladung hinzufügen
-            if( nachLogin &&nachLogin->zSpielenFenster() )
+            if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->gruppeEinladungNeu( msg.gruppe, msg.account );
             break;
         default: // Unbekannte Servernachricht
-            if( nachLogin &&nachLogin->zNachrichtenListe() )
+            if( nachLogin && nachLogin->zNachrichtenListe() )
             {
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
                                                               new Text( "Ok" ), 0 );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         }

+ 20 - 20
KSGClient/Netzwerk/KSGServer.cpp

@@ -11,7 +11,7 @@ char *getMainServerIp()
     dat.setDatei( "data/tmp/m.ip" );
     dat.open( Datei::Style::lesen );
     unsigned char len = 0;
-    dat.lese( (char*)&len, 1 );
+    dat.lese( (char *)&len, 1 );
     char *ip = new char[ len + 1 ];
     ip[ len ] = 0;
     dat.lese( ip, len );
@@ -25,33 +25,33 @@ unsigned short getMainServerPort()
     d.setDatei( "data/tmp/m.port" );
     d.open( Datei::Style::lesen );
     int port = 0;
-    d.lese( (char*)&port, 4 );
+    d.lese( (char *)&port, 4 );
     d.close();
     return port;
 }
 
 unsigned int getKlientId()
 {
-	Datei *dat = new Datei();
-	dat->setDatei( "data/tmp/k.id" );
-	dat->open( Datei::Style::lesen );
-	unsigned int ret = 0;
-	dat->lese( (char*)&ret, 4 );
-	dat->close();
-	dat = dat->release();
-	return ret;
+    Datei *dat = new Datei();
+    dat->setDatei( "data/tmp/k.id" );
+    dat->open( Datei::Style::lesen );
+    unsigned int ret = 0;
+    dat->lese( (char *)&ret, 4 );
+    dat->close();
+    dat->release();
+    return ret;
 }
 
 char getSchlüssel( char **schlüssel )
 {
-	char län = 0;
-	Datei *dat = new Datei();
-	dat->setDatei( "data/tmp/crypt.key" );
-	dat->open( Datei::Style::lesen );
-	dat->lese( &län, 1 );
-	*schlüssel = new char[ län ];
-	dat->lese( *schlüssel, län );
-	dat->close();
-	dat = dat->release();
-	return län;
+    char län = 0;
+    Datei *dat = new Datei();
+    dat->setDatei( "data/tmp/crypt.key" );
+    dat->open( Datei::Style::lesen );
+    dat->lese( &län, 1 );
+    *schlüssel = new char[ län ];
+    dat->lese( *schlüssel, län );
+    dat->close();
+    dat->release();
+    return län;
 }

+ 2 - 17
KSGClient/Netzwerk/Patcher.cpp

@@ -3,16 +3,16 @@
 #include "../Global/Variablen.h"
 #include <Globals.h>
 
-typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient* );
+typedef UpdaterV *( *GetUpdater )( KSGClient::PatchServerClient * );
 
 // Inhalt der Patcher Klasse aus Patcher.h
 // Konstruktor
 Patcher::Patcher()
+    : ReferenceCounter()
 {
     updater = 0;
     updateDll = 0;
     läuft = 0;
-    ref = 1;
 }
 
 // Destruktor
@@ -98,19 +98,4 @@ bool Patcher::l
 int Patcher::getDownload() const
 {
     return updater ? updater->getDownload() : 0;
-}
-
-// Reference Counting
-Patcher *Patcher::getThis()
-{
-    ref++;
-    return this;
-}
-
-Patcher *Patcher::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 13 - 17
KSGClient/Netzwerk/Patcher.h

@@ -9,27 +9,23 @@
 
 using namespace Framework;
 
-class Patcher
+class Patcher : public virtual ReferenceCounter
 {
 private:
-	HMODULE updateDll;
-	UpdaterV *updater;
-	bool läuft;
-	int ref;
+    HMODULE updateDll;
+    UpdaterV *updater;
+    bool läuft;
 
 public:
-	// Konstruktor
-	Patcher();
-	// Destruktor
-	~Patcher();
-	// nicht constant
-	bool update( int dateiGruppe, bool *abbruch, FBalken *fortschritt, TextFeld *status, Text *zError );
-	// constant
-	bool läuftPatch() const;
-	int getDownload() const;
-	// Reference Counting
-	Patcher *getThis();
-	Patcher *release();
+    // Konstruktor
+    Patcher();
+    // Destruktor
+    ~Patcher();
+    // nicht constant
+    bool update( int dateiGruppe, bool *abbruch, FBalken *fortschritt, TextFeld *status, Text *zError );
+    // constant
+    bool läuftPatch() const;
+    int getDownload() const;
 };
 
 #endif

+ 7 - 7
KSGClient/Netzwerk/SpielMessageProcessor.cpp

@@ -24,15 +24,15 @@ void SpielMessageProcessor::thread()
             break;
         case 2: // SpielErstellt abbruch
             if( nachLogin && nachLogin->zNachrichtenListe() )
-                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Spiel Abgebrochen" ), msg.message.getThis(), new Text( "Ok" ), 0 );
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Spiel Abgebrochen" ), dynamic_cast<Text *>( msg.message.getThis() ), new Text( "Ok" ), 0 );
             if( nachLogin && nachLogin->zSpielenFenster() )
                 nachLogin->zSpielenFenster()->spielGefundenAbbruch();
             break;
         case 3: // Fehler
-            hauptScreen->lock();
+            uiFactory.initParam.bildschirm->lock();
             if( nachLogin && nachLogin->zNachrichtenListe() )
-                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), msg.message.getThis(), new Text( "Ok" ), 0 );
-            hauptScreen->unlock();
+                nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), dynamic_cast<Text *>( msg.message.getThis() ), new Text( "Ok" ), 0 );
+            uiFactory.initParam.bildschirm->unlock();
             break;
         case 4: // zurück in Warteschlange
             if( nachLogin && nachLogin->zSpielenFenster() )
@@ -44,7 +44,7 @@ void SpielMessageProcessor::thread()
             break;
         case 6: // SpielErstellt Initialisierung
             if( nachLogin && nachLogin->zSpielenFenster() )
-                nachLogin->zSpielenFenster()->teamAuswahlInit( (SpielerTeamStruktur*)msg.sts );
+                nachLogin->zSpielenFenster()->teamAuswahlInit( (SpielerTeamStruktur *)msg.sts );
             else
                 msg.sts->release();
             msg.sts = new SpielerTeamStruktur();
@@ -101,11 +101,11 @@ void SpielMessageProcessor::thread()
         default: // Unbekannte Servernachricht
             if( nachLogin && nachLogin->zNachrichtenListe() )
             {
-                hauptScreen->lock();
+                uiFactory.initParam.bildschirm->lock();
                 nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
                                                               new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
                                                               new Text( "Ok" ), 0 );
-                hauptScreen->unlock();
+                uiFactory.initParam.bildschirm->unlock();
             }
             break;
         }

+ 13 - 14
KSGClient/Start/Start.cpp

@@ -36,7 +36,7 @@ bool fensterTE( void *p, void *f, TastaturEreignis te )
 int KSGStart Framework::Start( Startparam p )
 {
     Network::Start( 50 );
-    
+
     if( !DateiExistiert( "data/user_options.ini" ) )
     {
         userOptions = new InitDatei( "data/default_options.ini" );
@@ -76,16 +76,16 @@ int KSGStart Framework::Start( Startparam p )
     fenster->setVSchließAktion( fensterVS );
     Bildschirm *bildschirm = 0;
     if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX9" ) )
-        bildschirm = new Bildschirm3D( fenster->getThis(), DIRECTX9 );
+        bildschirm = new Bildschirm3D( dynamic_cast<WFenster *>( fenster->getThis() ), DIRECTX9 );
     else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX11" ) )
-        bildschirm = new Bildschirm3D( fenster->getThis(), DIRECTX11 );
+        bildschirm = new Bildschirm3D( dynamic_cast<WFenster *>( fenster->getThis() ), DIRECTX11 );
     else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX12" ) )
-        bildschirm = new Bildschirm3D( fenster->getThis(), DIRECTX12 );
+        bildschirm = new Bildschirm3D( dynamic_cast<WFenster *>( fenster->getThis() ), DIRECTX12 );
     else
-        bildschirm = new Bildschirm3D( fenster->getThis() );
+        bildschirm = new Bildschirm3D( dynamic_cast<WFenster *>( fenster->getThis() ) );
     if( userOptions->wertExistiert( "ScreenWidth" ) && userOptions->wertExistiert( "ScreenHeight" ) )
         bildschirm->setBackBufferSize( *userOptions->zWert( "ScreenWidth" ), *userOptions->zWert( "ScreenHeight" ) );
-    fenster->setBildschirm( bildschirm->getThis() );
+    fenster->setBildschirm( dynamic_cast<Bildschirm *>( bildschirm->getThis() ) );
     fenster->setAnzeigeModus( 1 );
     fenster->setFokus();
     bildschirm->update();
@@ -96,14 +96,13 @@ int KSGStart Framework::Start( Startparam p )
     schriftDatei->setPfad( new Text( "data/schriften/normal.ltds" ) );
     schriftDatei->leseDaten();
     Schrift *schrift = schriftDatei->ladeSchrift();
-    schriftDatei = schriftDatei->release();
-
-    Render *render = new Render( schrift->getThis() );
-    render->setBildschirm( bildschirm->getThis() );
+    schriftDatei = (LTDSDatei *)schriftDatei->release();
 
     Framework::logLine( "Globale Variablen werden initialisiert..." );
     initVariables( schrift, bildschirm );
 
+    Render *render = new Render();
+
     Framework::logLine( "Zeichen Thread wird gestartet..." );
     render->start();
 
@@ -112,19 +111,19 @@ int KSGStart Framework::Start( Startparam p )
 
     Framework::logLine( "Zeichen Thread wird beendet..." );
     render->beenden();
-    render = (Render*)render->release();
+    render = (Render *)render->release();
 
     bildschirm->removeMember( vorLogin->zFenster() );
     bildschirm->removeMember( nachLogin );
 
     Framework::logLine( "Speicher wird freigegeben..." );
     releaseVariables();
-    schrift = schrift->release();
+    schrift = (Schrift *)schrift->release();
 
-    bildschirm = bildschirm->release();
+    bildschirm = (Bildschirm *)bildschirm->release();
     fenster->setBildschirm( 0 );
     fenster->zerstören();
-    fenster = fenster->release();
+    fenster = (WFenster *)fenster->release();
 
     Network::Exit();
 

+ 52 - 82
KSGClient/VorLogin/Account verwalten/EMail.cpp

@@ -7,43 +7,43 @@
 
 // Inhalt der EMailÄndern Klasse aus EMail.h
 // Konstruktor
-EMailÄndern::EMailÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster )
+EMailÄndern::EMailÄndern( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    eMailÄndern = initKnopf( 10, 210, 130, 30, zSchrift, Knopf::Style::Sichtbar, "E-Mail ändern" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    eMailÄndern = initKnopf( 10, 210, 130, 30, Knopf::Style::Sichtbar, "E-Mail ändern" );
     eMailÄndern->setMausEreignisParameter( this );
     eMailÄndern->setMausEreignis( eMailÄndernEMailÄndernME );
-    initToolTip( eMailÄndern, "Account E-Mail Adresse ändern.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( eMailÄndern->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 100, 250, 200, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "E-Mail ändern" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( eMailÄndern, "Account E-Mail Adresse ändern." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( eMailÄndern->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 100, 250, 200, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "E-Mail ändern" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( eMailÄndernNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( eMailÄndernPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    geheimnis = initTextFeld( 20, 80, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    geheimnis = initTextFeld( 20, 80, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( eMailÄndernGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    nEMail = initTextFeld( 20, 110, 208, 20, zSchrift, TextFeld::Style::TextFeld, "neue E-Mail Adresse" );
+    initToolTip( geheimnis, "Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    nEMail = initTextFeld( 20, 110, 208, 20, TextFeld::Style::TextFeld, "neue E-Mail Adresse" );
     nEMail->setTastaturEreignisParameter( this );
     nEMail->setTastaturEreignis( eMailÄndernNEMailTE );
-    initToolTip( nEMail, "Neue E-Mail Adresse.", zSchrift, hauptScreen );
-    fenster->addMember( nEMail->getThis() );
-    weiter = initKnopf( 74, 140, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( nEMail, "Neue E-Mail Adresse." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nEMail->getThis() ) );
+    weiter = initKnopf( 74, 140, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( eMailÄndernWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -70,7 +70,7 @@ EMail
 // Privat
 void EMailÄndern::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
@@ -134,7 +134,7 @@ bool EMail
         eMailÄndern->setRahmenBreite( 3 );
         eMailÄndern->setAlphaFeldFarbe( 0xFF000000 );
         eMailÄndern->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 200 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -238,7 +238,7 @@ bool EMail
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 200 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -266,56 +266,41 @@ void EMail
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-EMailÄndern * EMailÄndern::getThis()
-{
-    ref++;
-    return this;
-}
-
-EMailÄndern *EMailÄndern::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der EMailVergessen Klasse aus EMail.h
 // Konstruktor
-EMailVergessen::EMailVergessen( Schrift * zSchrift, Fenster * zVorLoginFenster )
+EMailVergessen::EMailVergessen( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    eMailVergessen = initKnopf( 10, 410, 130, 30, zSchrift, Knopf::Style::Sichtbar, "E-Mail vergessen" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    eMailVergessen = initKnopf( 10, 410, 130, 30, Knopf::Style::Sichtbar, "E-Mail vergessen" );
     eMailVergessen->setMausEreignisParameter( this );
     eMailVergessen->setMausEreignis( eMailVergessenEMailVergessenME );
-    initToolTip( eMailVergessen, "Account E-Mail Adresse anzeigen.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( eMailVergessen->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 85, 250, 170, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "E-Mail vergessen" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( eMailVergessen, "Account E-Mail Adresse anzeigen." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( eMailVergessen->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 85, 250, 170, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "E-Mail vergessen" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( eMailVergessenNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( eMailVergessenPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    geheimnis = initTextFeld( 20, 80, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    geheimnis = initTextFeld( 20, 80, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( eMailVergessenGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    weiter = initKnopf( 74, 110, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( geheimnis, "Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    weiter = initKnopf( 74, 110, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( eMailVergessenWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -340,7 +325,7 @@ EMailVergessen::~EMailVergessen()
 // Privat
 void EMailVergessen::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
@@ -403,7 +388,7 @@ bool EMailVergessen::eMailVergessenME( void *obj, MausEreignis me ) // MausEreig
         eMailVergessen->setRahmenBreite( 3 );
         eMailVergessen->setAlphaFeldFarbe( 0xFF000000 );
         eMailVergessen->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 170 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 85 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -487,7 +472,7 @@ bool EMailVergessen::weiterME( void *obj, MausEreignis me ) // MausEreignis im K
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 170 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 85 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -512,7 +497,7 @@ void EMailVergessen::setReturn( bool ret, char *eMail ) // Setzt den Returnwert
         nachricht->append( eMail );
         nachricht->append( "'." );
         zeigeNachricht( nachricht->getText() );
-        nachricht = nachricht->release();
+        nachricht = (Text *)nachricht->release();
     }
     else if( lastError.getLength() )
         zeigeNachricht( lastError );
@@ -521,21 +506,6 @@ void EMailVergessen::setReturn( bool ret, char *eMail ) // Setzt den Returnwert
     delete eMail;
 }
 
-// Reference Counting
-EMailVergessen *EMailVergessen::getThis()
-{
-    ref++;
-    return this;
-}
-
-EMailVergessen *EMailVergessen::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // messages
 bool eMailÄndernEMailÄndernME( void *p, void *obj, MausEreignis me )

+ 44 - 52
KSGClient/VorLogin/Account verwalten/EMail.h

@@ -10,68 +10,60 @@
 
 using namespace Framework;
 
-class EMailÄndern
+class EMailÄndern : public virtual ReferenceCounter
 {
 private:
-	Knopf *eMailÄndern;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *geheimnis;
-	TextFeld *nEMail;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *eMailÄndern;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *geheimnis;
+    TextFeld *nEMail;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	EMailÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~EMailÄndern();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool eMailÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf eMailÄndern
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool nEMailTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld nEMail
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setReturn( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	EMailÄndern *getThis();
-	EMailÄndern *release();
+    // Konstruktor
+    EMailÄndern( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~EMailÄndern();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool eMailÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf eMailÄndern
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool nEMailTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld nEMail
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setReturn( bool ret ); // Setzt den Returnwert
 };
 
-class EMailVergessen
+class EMailVergessen : public virtual ReferenceCounter
 {
 private:
-	Knopf *eMailVergessen;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *geheimnis;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *eMailVergessen;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *geheimnis;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	EMailVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~EMailVergessen();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool eMailVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf eMailVergessen
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setReturn( bool ret, char *eMail ); // Setzt den Returnwert
-	// Reference Counting
-	EMailVergessen *getThis();
-	EMailVergessen *release();
+    // Konstruktor
+    EMailVergessen( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~EMailVergessen();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool eMailVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf eMailVergessen
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setReturn( bool ret, char *eMail ); // Setzt den Returnwert
 };
 
 // messages

+ 48 - 78
KSGClient/VorLogin/Account verwalten/Geheimnis.cpp

@@ -7,43 +7,43 @@
 
 // Inhalt der GeheimnisÄndern Klasse aus Geheimnis.h
 // Konstruktor
-GeheimnisÄndern::GeheimnisÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster )
+GeheimnisÄndern::GeheimnisÄndern( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    geheimnisÄndern = initKnopf( 10, 250, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Geheimnis ändern" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    geheimnisÄndern = initKnopf( 10, 250, 130, 30, Knopf::Style::Sichtbar, "Geheimnis ändern" );
     geheimnisÄndern->setMausEreignisParameter( this );
     geheimnisÄndern->setMausEreignis( geheimnisÄndernGeheimnisÄndernME );
-    initToolTip( geheimnisÄndern, "Account Geheimnis ändern.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( geheimnisÄndern->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 100, 250, 200, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis ändern" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( geheimnisÄndern, "Account Geheimnis ändern." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( geheimnisÄndern->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 100, 250, 200, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis ändern" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( geheimnisÄndernNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( geheimnisÄndernPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    geheimnis = initTextFeld( 20, 80, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    geheimnis = initTextFeld( 20, 80, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( geheimnisÄndernGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimni.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    nGeheimnis = initTextFeld( 20, 110, 208, 20, zSchrift, TextFeld::Style::TextFeld, "neues Geheimnis" );
+    initToolTip( geheimnis, "Account Geheimni." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    nGeheimnis = initTextFeld( 20, 110, 208, 20, TextFeld::Style::TextFeld, "neues Geheimnis" );
     nGeheimnis->setTastaturEreignisParameter( this );
     nGeheimnis->setTastaturEreignis( geheimnisÄndernNGeheimnisTE );
-    initToolTip( nGeheimnis, "Neues Account Geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( nGeheimnis->getThis() );
-    weiter = initKnopf( 74, 140, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( nGeheimnis, "Neues Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nGeheimnis->getThis() ) );
+    weiter = initKnopf( 74, 140, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( geheimnisÄndernWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -70,7 +70,7 @@ Geheimnis
 // Privat
 void GeheimnisÄndern::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
@@ -134,7 +134,7 @@ bool Geheimnis
         geheimnisÄndern->setRahmenBreite( 3 );
         geheimnisÄndern->setAlphaFeldFarbe( 0xFF000000 );
         geheimnisÄndern->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 200 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -236,7 +236,7 @@ bool Geheimnis
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 200 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 100 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -264,51 +264,36 @@ void Geheimnis
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-GeheimnisÄndern * GeheimnisÄndern::getThis()
-{
-    ref++;
-    return 0;
-}
-
-GeheimnisÄndern *GeheimnisÄndern::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der GeheimnisVergessen Klasse aus Geheimnis.h
 // Konstruktor
-GeheimnisVergessen::GeheimnisVergessen( Schrift * zSchrift, Fenster * zVorLoginFenster )
+GeheimnisVergessen::GeheimnisVergessen( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    geheimnisVergessen = initKnopf( 10, 370, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Geheimnis vergessen" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    geheimnisVergessen = initKnopf( 10, 370, 130, 30, Knopf::Style::Sichtbar, "Geheimnis vergessen" );
     geheimnisVergessen->setMausEreignisParameter( this );
     geheimnisVergessen->setMausEreignis( geheimnisVergessenGeheimnisVergessenME );
-    initToolTip( geheimnisVergessen, "Account Geheimnis per E-Mail senden.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( geheimnisVergessen->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis vergessen" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( geheimnisVergessen, "Account Geheimnis per E-Mail senden." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( geheimnisVergessen->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Geheimnis vergessen" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( geheimnisVergessenNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( geheimnisVergessenPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    weiter = initKnopf( 74, 80, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    weiter = initKnopf( 74, 80, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( geheimnisVergessenWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -331,7 +316,7 @@ GeheimnisVergessen::~GeheimnisVergessen()
 // Privat
 void GeheimnisVergessen::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     fenster->setSize( 250, 150 );
@@ -393,7 +378,7 @@ bool GeheimnisVergessen::geheimnisVergessenME( void *obj, MausEreignis me ) // M
         geheimnisVergessen->setRahmenBreite( 3 );
         geheimnisVergessen->setAlphaFeldFarbe( 0xFF000000 );
         geheimnisVergessen->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 140 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -457,7 +442,7 @@ bool GeheimnisVergessen::weiterME( void *obj, MausEreignis me ) // MausEreignis
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 140 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -483,21 +468,6 @@ void GeheimnisVergessen::setResult( bool ret ) // Setzt den Returnwert
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-GeheimnisVergessen * GeheimnisVergessen::getThis()
-{
-    ref++;
-    return this;
-}
-
-GeheimnisVergessen *GeheimnisVergessen::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // messages
 bool geheimnisÄndernGeheimnisÄndernME( void *p, void *obj, MausEreignis me )

+ 42 - 50
KSGClient/VorLogin/Account verwalten/Geheimnis.h

@@ -10,66 +10,58 @@
 
 using namespace Framework;
 
-class GeheimnisÄndern
+class GeheimnisÄndern : public virtual ReferenceCounter
 {
 private:
-	Knopf *geheimnisÄndern;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *geheimnis;
-	TextFeld *nGeheimnis;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *geheimnisÄndern;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *geheimnis;
+    TextFeld *nGeheimnis;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	GeheimnisÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~GeheimnisÄndern();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool geheimnisÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf geheimnisÄndern
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool nGeheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld nGeheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setResult( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	GeheimnisÄndern *getThis();
-	GeheimnisÄndern *release();
+    // Konstruktor
+    GeheimnisÄndern( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~GeheimnisÄndern();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool geheimnisÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf geheimnisÄndern
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool nGeheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld nGeheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setResult( bool ret ); // Setzt den Returnwert
 };
 
-class GeheimnisVergessen
+class GeheimnisVergessen : public virtual ReferenceCounter
 {
 private:
-	Knopf *geheimnisVergessen;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *geheimnisVergessen;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	GeheimnisVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~GeheimnisVergessen();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool geheimnisVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf geheimnisVergessen
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setResult( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	GeheimnisVergessen *getThis();
-	GeheimnisVergessen *release();
+    // Konstruktor
+    GeheimnisVergessen( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~GeheimnisVergessen();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool geheimnisVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf geheimnisVergessen
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setResult( bool ret ); // Setzt den Returnwert
 };
 
 // messages

+ 21 - 36
KSGClient/VorLogin/Account verwalten/Name.cpp

@@ -7,33 +7,33 @@
 
 // Inhalt der NameVergessen Klasse aus Name.h
 // Konstruktor
-NameVergessen::NameVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster )
+NameVergessen::NameVergessen( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    nameVergessen = initKnopf( 10, 290, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Name vergessen" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    nameVergessen = initKnopf( 10, 290, 130, 30, Knopf::Style::Sichtbar, "Name vergessen" );
     nameVergessen->setMausEreignisParameter( this );
     nameVergessen->setMausEreignis( nameVergessenNameVergessenME );
-    initToolTip( nameVergessen, "Accoutnt Name per E-MAil senden.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( nameVergessen->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Name vergessen" );
-    passwort = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( nameVergessen, "Accoutnt Name per E-MAil senden." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( nameVergessen->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Name vergessen" );
+    passwort = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( nameVergessenPasswortTE );
-    initToolTip( passwort, "Accoutnt Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    geheimnis = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( passwort, "Accoutnt Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    geheimnis = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( nameVergessenGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    weiter = initKnopf( 74, 80, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( geheimnis, "Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    weiter = initKnopf( 74, 80, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( nameVergessenWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -56,7 +56,7 @@ NameVergessen::~NameVergessen()
 // Privat
 void NameVergessen::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
     fenster->setSize( 250, 150 );
@@ -118,7 +118,7 @@ bool NameVergessen::nameVergessenME( void *obj, MausEreignis me ) // MausEreigni
         nameVergessen->setRahmenBreite( 3 );
         nameVergessen->setAlphaFeldFarbe( 0xFF000000 );
         nameVergessen->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 140 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -182,7 +182,7 @@ bool NameVergessen::weiterME( void *obj, MausEreignis me ) // MausEreignis im Kn
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 140 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -208,21 +208,6 @@ void NameVergessen::setResult( bool ret ) // Setzt den Returnwert
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-NameVergessen * NameVergessen::getThis()
-{
-    ref++;
-    return this;
-}
-
-NameVergessen *NameVergessen::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // messages
 bool nameVergessenNameVergessenME( void *p, void *obj, MausEreignis me )

+ 19 - 23
KSGClient/VorLogin/Account verwalten/Name.h

@@ -9,33 +9,29 @@
 
 using namespace Framework;
 
-class NameVergessen
+class NameVergessen : public virtual ReferenceCounter
 {
 private:
-	Knopf *nameVergessen;
-	Fenster *fenster;
-	TextFeld *passwort;
-	TextFeld *geheimnis;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *nameVergessen;
+    Fenster *fenster;
+    TextFeld *passwort;
+    TextFeld *geheimnis;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	NameVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~NameVergessen();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool nameVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf nameVergessen
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setResult( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	NameVergessen *getThis();
-	NameVergessen *release();
+    // Konstruktor
+    NameVergessen( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~NameVergessen();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool nameVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf nameVergessen
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setResult( bool ret ); // Setzt den Returnwert
 };
 
 // messages

+ 51 - 81
KSGClient/VorLogin/Account verwalten/Passwort.cpp

@@ -7,48 +7,48 @@
 
 // Inhalt der PasswortÄndern Klasse aus Passwort.h
 // Konstruktor
-PasswortÄndern::PasswortÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster )
+PasswortÄndern::PasswortÄndern( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    passwortÄndern = initKnopf( 10, 170, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Passwort ändern" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    passwortÄndern = initKnopf( 10, 170, 130, 30, Knopf::Style::Sichtbar, "Passwort ändern" );
     passwortÄndern->setMausEreignisParameter( this );
     passwortÄndern->setMausEreignis( passwortÄndernPasswortÄndernME );
-    initToolTip( passwortÄndern, "Account Passwort ändern.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( passwortÄndern->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 115, 250, 230, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Passwort ändern" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( passwortÄndern, "Account Passwort ändern." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( passwortÄndern->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 115, 250, 230, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Passwort ändern" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( passwortÄndernNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( passwortÄndernPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    neuPasswort = initTextFeld( 20, 80, 208, 20, zSchrift, TextFeld::Style::TextFeld, "neues Passwort" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    neuPasswort = initTextFeld( 20, 80, 208, 20, TextFeld::Style::TextFeld, "neues Passwort" );
     neuPasswort->setTastaturEreignisParameter( this );
     neuPasswort->setTastaturEreignis( passwortÄndernNeuPasswortTE );
-    initToolTip( neuPasswort, "Neues Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( neuPasswort->getThis() );
-    neuPasswort2 = initTextFeld( 20, 110, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort wiederholen" );
+    initToolTip( neuPasswort, "Neues Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuPasswort->getThis() ) );
+    neuPasswort2 = initTextFeld( 20, 110, 208, 20, TextFeld::Style::TextFeld, "Passwort wiederholen" );
     neuPasswort2->setTastaturEreignisParameter( this );
     neuPasswort2->setTastaturEreignis( passwortÄndernNeuPasswort2TE );
-    initToolTip( neuPasswort2, "Neues Passwort Wiederhohlen.", zSchrift, hauptScreen );
-    fenster->addMember( neuPasswort2->getThis() );
-    geheimnis = initTextFeld( 20, 140, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( neuPasswort2, "Neues Passwort Wiederhohlen." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( neuPasswort2->getThis() ) );
+    geheimnis = initTextFeld( 20, 140, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( passwortÄndernGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    weiter = initKnopf( 74, 170, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( geheimnis, "Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    weiter = initKnopf( 74, 170, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( passwortÄndernWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -77,7 +77,7 @@ Passwort
 // Privat
 void PasswortÄndern::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     neuPasswort->removeStyle( TextFeld::Style::Sichtbar );
@@ -142,7 +142,7 @@ bool Passwort
         passwortÄndern->setRahmenBreite( 3 );
         passwortÄndern->setAlphaFeldFarbe( 0xFF000000 );
         passwortÄndern->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 230 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 115 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -266,7 +266,7 @@ bool Passwort
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 230 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 115 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -295,51 +295,36 @@ void Passwort
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-PasswortÄndern * PasswortÄndern::getThis()
-{
-    ref++;
-    return this;
-}
-
-PasswortÄndern *PasswortÄndern::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Inhalt der PasswortVergessen Klasse aus Passwort.h
 // Konstruktor
-PasswortVergessen::PasswortVergessen( Schrift * zSchrift, Fenster * zVorLoginFenster )
+PasswortVergessen::PasswortVergessen( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
-    passwortVergessen = initKnopf( 10, 330, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Passwort vergessen" );
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
+    passwortVergessen = initKnopf( 10, 330, 130, 30, Knopf::Style::Sichtbar, "Passwort vergessen" );
     passwortVergessen->setMausEreignisParameter( this );
     passwortVergessen->setMausEreignis( passwortVergessenPasswortVergessenME );
-    initToolTip( passwortVergessen, "Account Passwort per E-Mail senden.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( passwortVergessen->getThis() );
-    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Passwort vergessen" );
-    name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
+    initToolTip( passwortVergessen, "Account Passwort per E-Mail senden." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( passwortVergessen->getThis() ) );
+    fenster = initFenster( bildschirmmitte.x - 125, bildschirmmitte.y - 70, 250, 140, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Passwort vergessen" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( passwortVergessenNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    geheimnis = initTextFeld( 20, 50, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimis" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    geheimnis = initTextFeld( 20, 50, 208, 20, TextFeld::Style::TextFeld, "Geheimis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( passwortVergessenGeheimnisTE );
-    initToolTip( geheimnis, "Account geheimnis.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    weiter = initKnopf( 74, 80, 100, 20, zSchrift, Knopf::Style::Sichtbar, "weiter" );
+    initToolTip( geheimnis, "Account geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    weiter = initKnopf( 74, 80, 100, 20, Knopf::Style::Sichtbar, "weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( passwortVergessenWeiterME );
-    nachricht = initTextFeld( 0, 5, 255, 150, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-    fenster->addMember( nachricht->getThis() );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    nachricht = initTextFeld( 0, 5, 255, 150, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor
@@ -362,7 +347,7 @@ PasswortVergessen::~PasswortVergessen()
 // Privat
 void PasswortVergessen::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
     fenster->setSize( 250, 150 );
@@ -424,7 +409,7 @@ bool PasswortVergessen::passwortVergessenME( void *obj, MausEreignis me ) // Mau
         passwortVergessen->setRahmenBreite( 3 );
         passwortVergessen->setAlphaFeldFarbe( 0xFF000000 );
         passwortVergessen->setAlphaFeldStrength( 20 );
-        Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+        Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
         fenster->setSize( 255, 140 );
         fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
         fenster->addStyle( Fenster::Style::Sichtbar );
@@ -488,7 +473,7 @@ bool PasswortVergessen::weiterME( void *obj, MausEreignis me ) // MausEreignis i
         }
         else
         {
-            Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+            Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
             fenster->setSize( 255, 140 );
             fenster->setPosition( bildschirmmitte.x - 125, bildschirmmitte.y - 70 );
             fenster->addStyle( Fenster::Style::Sichtbar );
@@ -514,21 +499,6 @@ void PasswortVergessen::setResult( bool ret ) // Setzt den Returnwert
         zeigeNachricht( "Es ist ein Unbekannter Fehler aufgetreten." );
 }
 
-// Reference Counting
-PasswortVergessen * PasswortVergessen::getThis()
-{
-    ref++;
-    return this;
-}
-
-PasswortVergessen *PasswortVergessen::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // messages
 bool passwortÄndernPasswortÄndernME( void *p, void *obj, MausEreignis me )
 {

+ 44 - 52
KSGClient/VorLogin/Account verwalten/Passwort.h

@@ -12,68 +12,60 @@
 
 using namespace Framework;
 
-class PasswortÄndern
+class PasswortÄndern : public virtual ReferenceCounter
 {
 private:
-	Knopf *passwortÄndern;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *neuPasswort;
-	TextFeld *neuPasswort2;
-	TextFeld *geheimnis;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *passwortÄndern;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *neuPasswort;
+    TextFeld *neuPasswort2;
+    TextFeld *geheimnis;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	PasswortÄndern( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~PasswortÄndern();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool passwortÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf passwortVergessen
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool neuPasswortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld neuPasswort
-	bool neuPasswort2TE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld neuPasswort2
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setResult( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	PasswortÄndern *getThis();
-	PasswortÄndern *release();
+    // Konstruktor
+    PasswortÄndern( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~PasswortÄndern();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool passwortÄndernME( void *obj, MausEreignis me ); // MausEreignis im Knopf passwortVergessen
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool neuPasswortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld neuPasswort
+    bool neuPasswort2TE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld neuPasswort2
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setResult( bool ret ); // Setzt den Returnwert
 };
 
-class PasswortVergessen
+class PasswortVergessen : public virtual ReferenceCounter
 {
 private:
-	Knopf *passwortVergessen;
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *geheimnis;
-	Knopf *weiter;
-	TextFeld *nachricht;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Knopf *passwortVergessen;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *geheimnis;
+    Knopf *weiter;
+    TextFeld *nachricht;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor
-	PasswortVergessen( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor
-	~PasswortVergessen();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool passwortVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf passwortVergessen
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	void setResult( bool ret ); // Setzt den Returnwert
-	// Reference Counting
-	PasswortVergessen *getThis();
-	PasswortVergessen *release();
+    // Konstruktor
+    PasswortVergessen( Fenster *zVorLoginFenster );
+    // Destruktor
+    ~PasswortVergessen();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool passwortVergessenME( void *obj, MausEreignis me ); // MausEreignis im Knopf passwortVergessen
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    void setResult( bool ret ); // Setzt den Returnwert
 };
 
 // messages

+ 41 - 80
KSGClient/VorLogin/Account verwalten/Registrierung.cpp

@@ -8,53 +8,46 @@
 
 // Inhalt der Registrierung Klasse aus Registrierung.h
 // Konstruktor 
-Registrierung::Registrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
+Registrierung::Registrierung( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmGröße = hauptScreen->getBackBufferSize();
-    registrierung = initKnopf( 10, 90, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Registrieren" );
+    Punkt bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    registrierung = initKnopf( 10, 90, 130, 30, Knopf::Style::Sichtbar, "Registrieren" );
     registrierung->setMausEreignisParameter( this );
     registrierung->setMausEreignis( registrierungRegistrierungME );
-    initToolTip( registrierung, "Account erstellen.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( registrierung->getThis() );
-    fenster = initFenster( bildschirmGröße.x / 2 - 175, bildschirmGröße.y / 2 - 131, 350, 262, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Account erstellen" );
-    name = initTextFeld( 74, 20, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Name" );
+    initToolTip( registrierung, "Account erstellen." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( registrierung->getThis() ) );
+    fenster = initFenster( bildschirmGröße.x / 2 - 175, bildschirmGröße.y / 2 - 131, 350, 262, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Account erstellen" );
+    name = initTextFeld( 74, 20, 200, 20, TextFeld::Style::TextFeld, "Account Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( registrierungNameTE );
-    initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 74, 50, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Passwort" );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 74, 50, 200, 20, TextFeld::Style::TextFeld, "Account Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( registrierungPasswortTE );
-    initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    passwort2 = initTextFeld( 74, 80, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort wiederholen" );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    passwort2 = initTextFeld( 74, 80, 200, 20, TextFeld::Style::TextFeld, "Passwort wiederholen" );
     passwort2->setTastaturEreignisParameter( this );
     passwort2->setTastaturEreignis( registrierungPasswort2TE );
-    initToolTip( passwort2, "Account Passwort wiederhohlen.", zSchrift, hauptScreen );
-    fenster->addMember( passwort2->getThis() );
-    geheimnis = initTextFeld( 10, 110, 328, 20, zSchrift, TextFeld::Style::TextFeld, "Account Geheimnis" );
+    initToolTip( passwort2, "Account Passwort wiederhohlen." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort2->getThis() ) );
+    geheimnis = initTextFeld( 10, 110, 328, 20, TextFeld::Style::TextFeld, "Account Geheimnis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( registrierungGeheimnisTE );
-    initToolTip( geheimnis, "Gib etwas ein, was nur du jederzeit weißt.\n(zweites sicherheitspasswort Passwort)", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    eMail = initTextFeld( 74, 140, 200, 20, zSchrift, TextFeld::Style::TextFeld, "E-Mail Addresse" );
+    initToolTip( geheimnis, "Gib etwas ein, was nur du jederzeit weißt.\n(zweites sicherheitspasswort Passwort)" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    eMail = initTextFeld( 74, 140, 200, 20, TextFeld::Style::TextFeld, "E-Mail Addresse" );
     eMail->setTastaturEreignisParameter( this );
     eMail->setTastaturEreignis( registrierungEMailTE );
-    initToolTip( eMail, "E-Mail Addresse.", zSchrift, hauptScreen );
-    fenster->addMember( eMail->getThis() );
-    geburtsdatum = initTextFeld( 40, 170, 85, 20, zSchrift, TextFeld::Style::Text, "Geburtsdatum:" );
-    fenster->addMember( geburtsdatum->getThis() );
-    text = initTextFeld( 0, 5, 250, 150, zSchrift, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
-    fenster->addMember( text->getThis() );
-    gbdTag = new AuswahlBox();
-    gbdTag->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund );
-    gbdTag->setPosition( 130, 167 );
-    gbdTag->setSize( 50, 20 );
-    gbdTag->setMaxAuskappHeight( 100 );
-    gbdTag->setSchriftZ( zSchrift->getThis() );
-    gbdTag->setRahmenFarbe( 0xFFFFFFFF );
-    gbdTag->setHintergrundFarbe( 0xFF000000 );
-    gbdTag->setMausEreignis( _ret1ME );
+    initToolTip( eMail, "E-Mail Addresse." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( eMail->getThis() ) );
+    geburtsdatum = initTextFeld( 40, 170, 85, 20, TextFeld::Style::Text, "Geburtsdatum:" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geburtsdatum->getThis() ) );
+    text = initTextFeld( 0, 5, 250, 150, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( text->getThis() ) );
+    gbdTag = initAuswahlBox( 130, 167, 50, 20, AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund, {} );
     gbdTag->addEintrag( "Tag" );
     for( int i = 0; i < 31; i++ )
     {
@@ -62,15 +55,7 @@ Registrierung::Registrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
         txt->append( i + 1 );
         gbdTag->addEintrag( txt );
     }
-    gbdMonat = new AuswahlBox();
-    gbdMonat->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund );
-    gbdMonat->setPosition( 185, 167 );
-    gbdMonat->setSize( 65, 20 );
-    gbdMonat->setMaxAuskappHeight( 100 );
-    gbdMonat->setSchriftZ( zSchrift->getThis() );
-    gbdMonat->setRahmenFarbe( 0xFFFFFFFF );
-    gbdMonat->setHintergrundFarbe( 0xFF000000 );
-    gbdMonat->setMausEreignis( _ret1ME );
+    gbdMonat = initAuswahlBox( 185, 167, 65, 20, AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund, {} );
     gbdMonat->addEintrag( "Monat" );
     for( int i = 0; i < 12; i++ )
     {
@@ -78,15 +63,7 @@ Registrierung::Registrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
         txt->append( i + 1 );
         gbdMonat->addEintrag( txt );
     }
-    gbdJahr = new AuswahlBox();
-    gbdJahr->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund );
-    gbdJahr->setPosition( 255, 167 );
-    gbdJahr->setSize( 55, 20 );
-    gbdJahr->setMaxAuskappHeight( 100 );
-    gbdJahr->setSchriftZ( zSchrift->getThis() );
-    gbdJahr->setRahmenFarbe( 0xFFFFFFFF );
-    gbdJahr->setHintergrundFarbe( 0xFF000000 );
-    gbdJahr->setMausEreignis( _ret1ME );
+    gbdJahr = initAuswahlBox( 255, 176, 55, 20, AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::MaxHeight | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund, {} );
     gbdJahr->addEintrag( "Jahr" );
     for( int i = 2013; i > 1913; i-- )
     {
@@ -94,15 +71,14 @@ Registrierung::Registrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
         txt->append( i + 1 );
         gbdJahr->addEintrag( txt );
     }
-    weiter = initKnopf( 124, 200, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Weiter" );
+    weiter = initKnopf( 124, 200, 100, 20, Knopf::Style::Sichtbar, "Weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( registrierungWeiterME );
-    fenster->addMember( weiter->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    fenster->addMember( gbdTag->getThis() );
-    fenster->addMember( gbdMonat->getThis() );
-    fenster->addMember( gbdJahr->getThis() );
-    ref = 1;
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( gbdTag->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( gbdMonat->getThis() ) );
+    fenster->addMember( dynamic_cast<Zeichnung *>( gbdJahr->getThis() ) );
 }
 
 // Destruktor 
@@ -139,7 +115,7 @@ Registrierung::~Registrierung()
 // Privat
 void Registrierung::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     passwort2->removeStyle( TextFeld::Style::Sichtbar );
@@ -284,7 +260,7 @@ bool Registrierung::weiterME( void *obj, MausEreignis me ) // MausEreignis im Kn
 {
     if( me.id == ME_RLinks )
     {
-        Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+        Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
         if( fenster->zTitel()->istGleich( "Erfolg" ) )
         {
             text->removeStyle( TextFeld::Style::Sichtbar );
@@ -343,7 +319,7 @@ bool Registrierung::weiterME( void *obj, MausEreignis me ) // MausEreignis im Kn
                         zeigeNachricht( "Bitte gebe deine E-Mail Addresse ein. Diese benötigen wir, um dir den Bestätigungscode für deinen Account zu senden." );
                     return 1;
                 }
-                Datum * gebDat = new Datum();
+                Datum *gebDat = new Datum();
                 gebDat->setDatum( 1, 1, 1 );
                 bool ok = 1;
                 do
@@ -367,7 +343,7 @@ bool Registrierung::weiterME( void *obj, MausEreignis me ) // MausEreignis im Kn
                     new AktionsThread( 15, name->zText()->getText(), passwort->zText()->getText(), geheimnis->zText()->getText(), eMail->zText()->getText(), gebDat->getThis() );
                 else
                     zeigeNachricht( "Bitte gebe ein gültiges Geburtsdatum an." );
-                gebDat = gebDat->release();
+                gebDat = (Datum *)gebDat->release();
             }
             else
                 zeigeNachricht( "Das wiederhohlte Passwort stimmt nicht mit dem Passwort überein." );
@@ -386,7 +362,7 @@ bool Registrierung::registrierungME( void *obj, MausEreignis me ) // MausEreigni
         registrierung->setAlphaFeldFarbe( 0xFF000000 );
         registrierung->setAlphaFeldStrength( 20 );
 
-        Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+        Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
         text->removeStyle( TextFeld::Style::Sichtbar );
         weiter->setPosition( 124, 200 );
         weiter->setText( "Weiter" );
@@ -410,7 +386,7 @@ bool Registrierung::registrierungME( void *obj, MausEreignis me ) // MausEreigni
 
 void Registrierung::setWeiterReturn( bool ret ) // setzt den Weiter Returnwert
 {
-    Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+    Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     if( ret )
     {
         name->removeStyle( TextFeld::Style::Sichtbar );
@@ -434,21 +410,6 @@ void Registrierung::setWeiterReturn( bool ret ) // setzt den Weiter Returnwert
         zeigeNachricht( lastError );
 }
 
-// Reference Counting
-Registrierung *Registrierung::getThis()
-{
-    ref++;
-    return this;
-}
-
-Registrierung *Registrierung::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Ereignisse
 bool registrierungNameTE( void *p, void *obj, TastaturEreignis te )
 {

+ 28 - 32
KSGClient/VorLogin/Account verwalten/Registrierung.h

@@ -13,43 +13,39 @@
 
 using namespace Framework;
 
-class Registrierung
+class Registrierung : public virtual ReferenceCounter
 {
 private:
-	Fenster *fenster;
-	TextFeld *text;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *passwort2;
-	TextFeld *geheimnis;
-	TextFeld *eMail;
-	TextFeld *geburtsdatum;
-	AuswahlBox *gbdJahr;
-	AuswahlBox *gbdMonat;
-	AuswahlBox *gbdTag;
-	Knopf *weiter;
+    Fenster *fenster;
+    TextFeld *text;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *passwort2;
+    TextFeld *geheimnis;
+    TextFeld *eMail;
+    TextFeld *geburtsdatum;
+    AuswahlBox *gbdJahr;
+    AuswahlBox *gbdMonat;
+    AuswahlBox *gbdTag;
+    Knopf *weiter;
     Knopf *registrierung;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor 
-	Registrierung( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor 
-	~Registrierung();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool passwort2TE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort2
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool eMailTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld eMail
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	bool registrierungME( void *obj, MausEreignis me ); // MausEreignis im Knopf registrierung
-	void setWeiterReturn( bool ret ); // setzt den Weiter Returnwert
-	// Reference Counting
-	Registrierung *getThis();
-	Registrierung *release();
+    // Konstruktor 
+    Registrierung( Fenster *zVorLoginFenster );
+    // Destruktor 
+    ~Registrierung();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopf wurde gedrückt
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool passwort2TE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort2
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool eMailTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld eMail
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    bool registrierungME( void *obj, MausEreignis me ); // MausEreignis im Knopf registrierung
+    void setWeiterReturn( bool ret ); // setzt den Weiter Returnwert
 };
 
 bool registrierungNameTE( void *p, void *obj, TastaturEreignis te );

+ 25 - 40
KSGClient/VorLogin/Account verwalten/Unregistrierung.cpp

@@ -7,38 +7,38 @@
 
 // Inhalt der Unregistrierung Klasse aus Unregistrierung.h
 // Konstruktor 
-Unregistrierung::Unregistrierung( Schrift *zSchrift, Fenster *zVorLoginFenster )
+Unregistrierung::Unregistrierung( Fenster *zVorLoginFenster )
+    : ReferenceCounter()
 {
-    Punkt bildschirmGröße = hauptScreen->getBackBufferSize();
-    unregistrierung = initKnopf( 10, 130, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Account remove" );
+    Punkt bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    unregistrierung = initKnopf( 10, 130, 130, 30, Knopf::Style::Sichtbar, "Account remove" );
     unregistrierung->setMausEreignisParameter( this );
     unregistrierung->setMausEreignis( unregistrierungUnregistrierungME );
-    initToolTip( unregistrierung, "Account für alle Zeiten entfernen.", zSchrift, hauptScreen );
-    zVorLoginFenster->addMember( unregistrierung->getThis() );
-    fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 85, 250, 170, zSchrift, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Account remove" );
-    name = initTextFeld( 24, 20, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Name" );
+    initToolTip( unregistrierung, "Account für alle Zeiten entfernen." );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( unregistrierung->getThis() ) );
+    fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 85, 250, 170, Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Account remove" );
+    name = initTextFeld( 24, 20, 200, 20, TextFeld::Style::TextFeld, "Account Name" );
     name->setTastaturEreignisParameter( this );
     name->setTastaturEreignis( unregistrierungNameTE );
-    initToolTip( name, "Account Name eingeben.", zSchrift, hauptScreen );
-    fenster->addMember( name->getThis() );
-    passwort = initTextFeld( 24, 50, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Passwort" );
+    initToolTip( name, "Account Name eingeben." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 24, 50, 200, 20, TextFeld::Style::TextFeld, "Account Passwort" );
     passwort->setTastaturEreignisParameter( this );
     passwort->setTastaturEreignis( unregistrierungPasswortTE );
-    initToolTip( passwort, "Account Passwort eingeben.", zSchrift, hauptScreen );
-    fenster->addMember( passwort->getThis() );
-    geheimnis = initTextFeld( 24, 80, 200, 20, zSchrift, TextFeld::Style::TextFeld, "Account Geheimnis" );
+    initToolTip( passwort, "Account Passwort eingeben." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    geheimnis = initTextFeld( 24, 80, 200, 20, TextFeld::Style::TextFeld, "Account Geheimnis" );
     geheimnis->setTastaturEreignisParameter( this );
     geheimnis->setTastaturEreignis( unregistrierungGeheimnisTE );
-    initToolTip( geheimnis, "Account Geheimnis eingeben.", zSchrift, hauptScreen );
-    fenster->addMember( geheimnis->getThis() );
-    weiter = initKnopf( 74, 110, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Weiter" );
+    initToolTip( geheimnis, "Account Geheimnis eingeben." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    weiter = initKnopf( 74, 110, 100, 20, Knopf::Style::Sichtbar, "Weiter" );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( unregistrierungWeiterME );
-    fenster->addMember( weiter->getThis() );
-    text = initTextFeld( 0, 5, 250, 170, zSchrift, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
-    fenster->addMember( text->getThis() );
-    zVorLoginFenster->addMember( fenster->getThis() );
-    ref = 1;
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    text = initTextFeld( 0, 5, 250, 170, TextFeld::Style::Mehrzeilig | TextFeld::Style::HCenter, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( text->getThis() ) );
+    zVorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
 }
 
 // Destruktor 
@@ -63,7 +63,7 @@ Unregistrierung::~Unregistrierung()
 // Privat
 void Unregistrierung::zeigeNachricht( const char *txt )
 {
-    Punkt bildschirmmitte = hauptScreen->getBackBufferSize() / 2;
+    Punkt bildschirmmitte = uiFactory.initParam.bildschirm->getBackBufferSize() / 2;
     name->removeStyle( TextFeld::Style::Sichtbar );
     passwort->removeStyle( TextFeld::Style::Sichtbar );
     geheimnis->removeStyle( TextFeld::Style::Sichtbar );
@@ -172,7 +172,7 @@ bool Unregistrierung::weiterME( void *obj, MausEreignis me ) // MausEreignis im
 {
     if( me.id == ME_RLinks )
     {
-        Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+        Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
         if( weiter->zText()->istGleich( "Ok" ) )
         {
             text->removeStyle( TextFeld::Style::Sichtbar );
@@ -250,7 +250,7 @@ bool Unregistrierung::unregistrierungME( void *obj, MausEreignis me ) // MausEre
         weiter->setText( "Weiter" );
         fenster->setTitel( "Account remove" );
         fenster->setSize( 250, 170 );
-        Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+        Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
         fenster->setPosition( bildchirmGröße.x / 2 - 125, bildchirmGröße.y / 2 - 85 );
         name->addStyle( TextFeld::Style::Sichtbar );
         passwort->addStyle( TextFeld::Style::Sichtbar );
@@ -263,7 +263,7 @@ bool Unregistrierung::unregistrierungME( void *obj, MausEreignis me ) // MausEre
 
 void Unregistrierung::setWeiterReturn( bool ret ) // setzt den Weiter Returnwert
 {
-    Punkt bildchirmGröße = hauptScreen->getBackBufferSize();
+    Punkt bildchirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
     if( ret )
     {
         name->removeStyle( TextFeld::Style::Sichtbar );
@@ -289,21 +289,6 @@ void Unregistrierung::setFertigReturn( bool ret ) // setzt den Fertig Returnwert
         zeigeNachricht( lastError );
 }
 
-// Reference Counting
-Unregistrierung *Unregistrierung::getThis()
-{
-    ref++;
-    return this;
-}
-
-Unregistrierung *Unregistrierung::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Ereignisse
 bool unregistrierungNameTE( void *p, void *obj, TastaturEreignis te )

+ 22 - 26
KSGClient/VorLogin/Account verwalten/Unregistrierung.h

@@ -12,36 +12,32 @@
 using namespace Framework;
 using namespace Network;
 
-class Unregistrierung
+class Unregistrierung : public virtual ReferenceCounter
 {
 private:
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	TextFeld *geheimnis;
-	Knopf *weiter;
-	TextFeld *text;
-	Knopf *unregistrierung;
-	int ref;
-	void zeigeNachricht( const char *txt );
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    TextFeld *geheimnis;
+    Knopf *weiter;
+    TextFeld *text;
+    Knopf *unregistrierung;
+    void zeigeNachricht( const char *txt );
 
 public:
-	// Konstruktor 
-	Unregistrierung( Schrift *zSchrift, Fenster *zVorLoginFenster );
-	// Destruktor 
-	~Unregistrierung();
-	// Knopfdruck
-	void druckFremdKnopf(); // Ein anderer Knopfwurde gedrückt
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	bool unregistrierungME( void *obj, MausEreignis me ); // MausEreignis im Knopf unregistrierung
-	void setWeiterReturn( bool ret ); // setzt den Weiter Returnwert
-	void setFertigReturn( bool ret ); // setzt den Fertig Returnwert
-	// Reference Counting
-	Unregistrierung *getThis();
-	Unregistrierung *release();
+    // Konstruktor 
+    Unregistrierung( Fenster *zVorLoginFenster );
+    // Destruktor 
+    ~Unregistrierung();
+    // Knopfdruck
+    void druckFremdKnopf(); // Ein anderer Knopfwurde gedrückt
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    bool unregistrierungME( void *obj, MausEreignis me ); // MausEreignis im Knopf unregistrierung
+    void setWeiterReturn( bool ret ); // setzt den Weiter Returnwert
+    void setFertigReturn( bool ret ); // setzt den Fertig Returnwert
 };
 
 // Ereignisse

+ 303 - 318
KSGClient/VorLogin/Login/Login.cpp

@@ -7,400 +7,385 @@
 
 // Inhalt der Login Klasse aus Login.h
 // Konstruktor 
-Login::Login( Schrift *zSchrift, Fenster *vorLoginFenster )
+Login::Login( Fenster *vorLoginFenster )
+    : ReferenceCounter()
 {
-	Punkt bildschirmGröße = hauptScreen->getBackBufferSize();
-	login = initKnopf( 10, 50, 130, 30, zSchrift, Knopf::Style::Sichtbar, "Login" );
-	login->setMausEreignisParameter( this );
-	login->setMausEreignis( loginLoginME );
-	initToolTip( login, "Einloggen.", zSchrift, hauptScreen );
-	vorLoginFenster->addMember( login->getThis() );
-	fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 75, 250, 150, zSchrift, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Login" );
-	name = initTextFeld( 20, 20, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Name" );
-	name->setTastaturEreignisParameter( this );
-	name->setTastaturEreignis( loginNameTE );
-	initToolTip( name, "Account Name.", zSchrift, hauptScreen );
-	fenster->addMember( name->getThis() );
-	passwort = initTextFeld( 20, 55, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Passwort" );
-	passwort->setTastaturEreignisParameter( this );
-	passwort->setTastaturEreignis( loginPasswortTE );
-	initToolTip( passwort, "Account Passwort.", zSchrift, hauptScreen );
-	fenster->addMember( passwort->getThis() );
-	weiter = initKnopf( 75, 90, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Login" );
-	weiter->setMausEreignisParameter( this );
-	weiter->setMausEreignis( loginWeiterME );
-	fenster->addMember( weiter->getThis() );
-	nachricht = initTextFeld( 5, 5, 238, 90, zSchrift, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
-	fenster->addMember( nachricht->getThis() );
-	geheimnis = initTextFeld( 20, 55, 208, 20, zSchrift, TextFeld::Style::TextFeld, "Geheimnis" );
-	geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-	geheimnis->setTastaturEreignisParameter( this );
-	geheimnis->setTastaturEreignis( loginGeheimnisTE );
-	initToolTip( geheimnis, "Account Geheimnis.", zSchrift, hauptScreen );
-	fenster->addMember( geheimnis->getThis() );
-	abbrechen = initKnopf( 10, 98, 100, 20, zSchrift, 0, "Abbrechen" );
-	abbrechen->setMausEreignisParameter( this );
-	abbrechen->setMausEreignis( loginAbbrechenME );
-	fenster->addMember( abbrechen->getThis() );
-	ok = initKnopf( 138, 98, 100, 20, zSchrift, 0, "Ok" );
-	ok->setMausEreignisParameter( this );
-	ok->setMausEreignis( loginOkME );
-	fenster->addMember( ok->getThis() );
-	vorLoginFenster->addMember( fenster->getThis() );
-	MausEreignis me;
-	me.id = ME_RLinks;
-	loginME( 0, me );
-	ref = 1;
+    Punkt bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
+    login = initKnopf( 10, 50, 130, 30, Knopf::Style::Sichtbar, "Login" );
+    login->setMausEreignisParameter( this );
+    login->setMausEreignis( loginLoginME );
+    initToolTip( login, "Einloggen." );
+    vorLoginFenster->addMember( dynamic_cast<Zeichnung *>( login->getThis() ) );
+    fenster = initFenster( bildschirmGröße.x / 2 - 125, bildschirmGröße.y / 2 - 75, 250, 150, Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered, "Login" );
+    name = initTextFeld( 20, 20, 208, 20, TextFeld::Style::TextFeld, "Name" );
+    name->setTastaturEreignisParameter( this );
+    name->setTastaturEreignis( loginNameTE );
+    initToolTip( name, "Account Name." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+    passwort = initTextFeld( 20, 55, 208, 20, TextFeld::Style::TextFeld, "Passwort" );
+    passwort->setTastaturEreignisParameter( this );
+    passwort->setTastaturEreignis( loginPasswortTE );
+    initToolTip( passwort, "Account Passwort." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+    weiter = initKnopf( 75, 90, 100, 20, Knopf::Style::Sichtbar, "Login" );
+    weiter->setMausEreignisParameter( this );
+    weiter->setMausEreignis( loginWeiterME );
+    fenster->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
+    nachricht = initTextFeld( 5, 5, 238, 90, TextFeld::Style::HCenter | TextFeld::Style::Mehrzeilig, "" );
+    fenster->addMember( dynamic_cast<Zeichnung *>( nachricht->getThis() ) );
+    geheimnis = initTextFeld( 20, 55, 208, 20, TextFeld::Style::TextFeld, "Geheimnis" );
+    geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+    geheimnis->setTastaturEreignisParameter( this );
+    geheimnis->setTastaturEreignis( loginGeheimnisTE );
+    initToolTip( geheimnis, "Account Geheimnis." );
+    fenster->addMember( dynamic_cast<Zeichnung *>( geheimnis->getThis() ) );
+    abbrechen = initKnopf( 10, 98, 100, 20, 0, "Abbrechen" );
+    abbrechen->setMausEreignisParameter( this );
+    abbrechen->setMausEreignis( loginAbbrechenME );
+    fenster->addMember( dynamic_cast<Zeichnung *>( abbrechen->getThis() ) );
+    ok = initKnopf( 138, 98, 100, 20, 0, "Ok" );
+    ok->setMausEreignisParameter( this );
+    ok->setMausEreignis( loginOkME );
+    fenster->addMember( dynamic_cast<Zeichnung *>( ok->getThis() ) );
+    vorLoginFenster->addMember( dynamic_cast<Zeichnung *>( fenster->getThis() ) );
+    MausEreignis me;
+    me.id = ME_RLinks;
+    loginME( 0, me );
 }
 
 // Destruktor 
 Login::~Login()
 {
-	if( fenster )
-		fenster = (Fenster *)fenster->release();
-	if( name )
-		name = (TextFeld *)name->release();
-	if( passwort )
-		passwort = (TextFeld *)passwort->release();
-	if( nachricht )
-		nachricht = (TextFeld *)nachricht->release();
-	if( geheimnis )
-		geheimnis = (TextFeld *)geheimnis->release();
-	if( weiter )
-		weiter = (Knopf *)weiter->release();
-	if( abbrechen )
-		abbrechen = (Knopf *)abbrechen->release();
-	if( ok )
-		ok = (Knopf *)ok->release();
-	if( login )
-		login = (Knopf *)login->release();
+    if( fenster )
+        fenster = (Fenster *)fenster->release();
+    if( name )
+        name = (TextFeld *)name->release();
+    if( passwort )
+        passwort = (TextFeld *)passwort->release();
+    if( nachricht )
+        nachricht = (TextFeld *)nachricht->release();
+    if( geheimnis )
+        geheimnis = (TextFeld *)geheimnis->release();
+    if( weiter )
+        weiter = (Knopf *)weiter->release();
+    if( abbrechen )
+        abbrechen = (Knopf *)abbrechen->release();
+    if( ok )
+        ok = (Knopf *)ok->release();
+    if( login )
+        login = (Knopf *)login->release();
 }
 
 // Knopfdruck
 void Login::druckFremdKnopf() // Ein anderer Bereich des Programms wurde ausgewählt
 {
-	fenster->removeStyle( Fenster::Style::Sichtbar );
-	login->setRahmenBreite( 2 );
-	login->setAlphaFeldFarbe( 0x5500FF00 );
-	login->setAlphaFeldStrength( -5 );
+    fenster->removeStyle( Fenster::Style::Sichtbar );
+    login->setRahmenBreite( 2 );
+    login->setAlphaFeldFarbe( 0x5500FF00 );
+    login->setAlphaFeldStrength( -5 );
 }
 
 bool Login::nameTE( void *obj, TastaturEreignis te ) // Tastaturereignis im Textfeld name
 {
-	if( te.id == TE_Press && te.taste == T_Enter )
-		return 0;
-	if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
-	{
-		name->removeStyle( TextFeld::Style::Fokus );
-		passwort->addStyle( TextFeld::Style::Fokus );
-		passwort->setAuswahl( 0, passwort->zText()->getLength() );
-	}
-	if( name->zText()->getLength() >= 25 && istSchreibbar( te.taste ) )
-		return 0;
-	return 1;
+    if( te.id == TE_Press && te.taste == T_Enter )
+        return 0;
+    if( te.id == TE_Release && ( te.taste == T_Enter || te.taste == T_Tab ) )
+    {
+        name->removeStyle( TextFeld::Style::Fokus );
+        passwort->addStyle( TextFeld::Style::Fokus );
+        passwort->setAuswahl( 0, passwort->zText()->getLength() );
+    }
+    if( name->zText()->getLength() >= 25 && istSchreibbar( te.taste ) )
+        return 0;
+    return 1;
 }
 
 bool Login::passwortTE( void *obj, TastaturEreignis te ) // TastaturEreignis im Textfeld passwort
 {
-	if( te.id == TE_Press )
-		passwort->setSchowChar( '*' );
-	if( te.id == TE_Press && te.taste == T_Enter )
-		return 0;
-	if( te.id == TE_Release && te.taste == T_Enter )
-	{
-		passwort->removeStyle( TextFeld::Style::Fokus );
-		MausEreignis me;
-		me.id = ME_RLinks;
-		weiterME( 0, me );
-	}
-	if( passwort->zText()->getLength() >= 25 && istSchreibbar( te.taste ) )
-		return 0;
-	return 1;
+    if( te.id == TE_Press )
+        passwort->setSchowChar( '*' );
+    if( te.id == TE_Press && te.taste == T_Enter )
+        return 0;
+    if( te.id == TE_Release && te.taste == T_Enter )
+    {
+        passwort->removeStyle( TextFeld::Style::Fokus );
+        MausEreignis me;
+        me.id = ME_RLinks;
+        weiterME( 0, me );
+    }
+    if( passwort->zText()->getLength() >= 25 && istSchreibbar( te.taste ) )
+        return 0;
+    return 1;
 }
 
 bool Login::geheimnisTE( void *obj, TastaturEreignis te ) // TastaturEreignis im Textfeld geheimnis
 {
-	if( te.id == TE_Press && te.taste == T_Enter )
-		return 0;
-	if( te.id == TE_Press )
-		geheimnis->setSchowChar( '*' );
-	if( te.id == TE_Release && te.taste == T_Enter )
-	{
-		geheimnis->removeStyle( TextFeld::Style::Fokus );
-		MausEreignis me;
-		me.id = ME_RLinks;
-		okME( 0, me );
-	}
-	if( geheimnis->zText()->getLength() >= 50 && istSchreibbar( te.taste ) )
-		return 0;
-	return 1;
+    if( te.id == TE_Press && te.taste == T_Enter )
+        return 0;
+    if( te.id == TE_Press )
+        geheimnis->setSchowChar( '*' );
+    if( te.id == TE_Release && te.taste == T_Enter )
+    {
+        geheimnis->removeStyle( TextFeld::Style::Fokus );
+        MausEreignis me;
+        me.id = ME_RLinks;
+        okME( 0, me );
+    }
+    if( geheimnis->zText()->getLength() >= 50 && istSchreibbar( te.taste ) )
+        return 0;
+    return 1;
 }
 
 bool Login::weiterME( void *obj, MausEreignis me ) // MausEreignis im Knopf weiter
 {
-	if( me.id == ME_RLinks )
-	{
-		if( name->zText()->getLength() == 0 )
-		{
-			name->removeStyle( TextFeld::Style::Sichtbar );
-			passwort->removeStyle( TextFeld::Style::Sichtbar );
-			weiter->removeStyle( Knopf::Style::Sichtbar );
-			nachricht->setText( "Bitte trage deinen Accountnamen\nein." );
-			nachricht->addStyle( TextFeld::Style::Sichtbar );
-			ok->addStyle( Knopf::Style::Sichtbar );
-			return 1;
-		}
-		if( passwort->zText()->getLength() == 0 )
-		{
-			name->removeStyle( TextFeld::Style::Sichtbar );
-			passwort->removeStyle( TextFeld::Style::Sichtbar );
-			weiter->removeStyle( Knopf::Style::Sichtbar );
-			nachricht->setText( "Bitte trage dein Passwort ein." );
-			nachricht->addStyle( TextFeld::Style::Sichtbar );
-			ok->addStyle( Knopf::Style::Sichtbar );
-			return 1;
-		}
-		new AktionsThread( 1, name->zText()->getText(), passwort->zText()->getText(), 0, 0, 0 );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        if( name->zText()->getLength() == 0 )
+        {
+            name->removeStyle( TextFeld::Style::Sichtbar );
+            passwort->removeStyle( TextFeld::Style::Sichtbar );
+            weiter->removeStyle( Knopf::Style::Sichtbar );
+            nachricht->setText( "Bitte trage deinen Accountnamen\nein." );
+            nachricht->addStyle( TextFeld::Style::Sichtbar );
+            ok->addStyle( Knopf::Style::Sichtbar );
+            return 1;
+        }
+        if( passwort->zText()->getLength() == 0 )
+        {
+            name->removeStyle( TextFeld::Style::Sichtbar );
+            passwort->removeStyle( TextFeld::Style::Sichtbar );
+            weiter->removeStyle( Knopf::Style::Sichtbar );
+            nachricht->setText( "Bitte trage dein Passwort ein." );
+            nachricht->addStyle( TextFeld::Style::Sichtbar );
+            ok->addStyle( Knopf::Style::Sichtbar );
+            return 1;
+        }
+        new AktionsThread( 1, name->zText()->getText(), passwort->zText()->getText(), 0, 0, 0 );
+    }
+    return 1;
 }
 
 bool Login::okME( void *obj, MausEreignis me ) // MausEreignis im Knopf ok
 {
-	if( me.id == ME_RLinks )
-	{
-		if( geheimnis->hatStyle( TextFeld::Style::Sichtbar ) )
-			new AktionsThread( 3, name->zText()->getText(), passwort->zText()->getText(), geheimnis->zText()->getText(), 0, 0 );
-		else
-		{
-			nachricht->removeStyle( TextFeld::Style::Sichtbar );
-			geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-			ok->removeStyle( Knopf::Style::Sichtbar );
-			abbrechen->removeStyle( Knopf::Style::Sichtbar );
-			name->addStyle( TextFeld::Style::Sichtbar );
-			passwort->addStyle( TextFeld::Style::Sichtbar );
-			weiter->addStyle( TextFeld::Style::Sichtbar );
-			name->addStyle( TextFeld::Style::Fokus );
-			name->setAuswahl( 0, name->zText()->getLength() );
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        if( geheimnis->hatStyle( TextFeld::Style::Sichtbar ) )
+            new AktionsThread( 3, name->zText()->getText(), passwort->zText()->getText(), geheimnis->zText()->getText(), 0, 0 );
+        else
+        {
+            nachricht->removeStyle( TextFeld::Style::Sichtbar );
+            geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+            ok->removeStyle( Knopf::Style::Sichtbar );
+            abbrechen->removeStyle( Knopf::Style::Sichtbar );
+            name->addStyle( TextFeld::Style::Sichtbar );
+            passwort->addStyle( TextFeld::Style::Sichtbar );
+            weiter->addStyle( TextFeld::Style::Sichtbar );
+            name->addStyle( TextFeld::Style::Fokus );
+            name->setAuswahl( 0, name->zText()->getLength() );
+        }
+    }
+    return 1;
 }
 
 bool Login::abbrechenME( void *obj, MausEreignis me ) // MausEreignis im Knopf abbrechen
 {
-	if( me.id == ME_RLinks )
-	{
-		nachricht->removeStyle( TextFeld::Style::Sichtbar );
-		geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-		ok->removeStyle( Knopf::Style::Sichtbar );
-		abbrechen->removeStyle( Knopf::Style::Sichtbar );
-		name->addStyle( TextFeld::Style::Sichtbar );
-		passwort->addStyle( TextFeld::Style::Sichtbar );
-		weiter->addStyle( TextFeld::Style::Sichtbar );
-		name->addStyle( TextFeld::Style::Fokus );
-		name->setAuswahl( 0, name->zText()->getLength() );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        nachricht->removeStyle( TextFeld::Style::Sichtbar );
+        geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+        ok->removeStyle( Knopf::Style::Sichtbar );
+        abbrechen->removeStyle( Knopf::Style::Sichtbar );
+        name->addStyle( TextFeld::Style::Sichtbar );
+        passwort->addStyle( TextFeld::Style::Sichtbar );
+        weiter->addStyle( TextFeld::Style::Sichtbar );
+        name->addStyle( TextFeld::Style::Fokus );
+        name->setAuswahl( 0, name->zText()->getLength() );
+    }
+    return 1;
 }
 
 bool Login::loginME( void *obj, MausEreignis me ) // MausEreignis im Knopf login
 {
-	if( me.id == ME_RLinks )
-	{
-		vorLogin->setLogin( 1 );
+    if( me.id == ME_RLinks )
+    {
+        vorLogin->setLogin( 1 );
 
-		nachricht->removeStyle( TextFeld::Style::Sichtbar );
-		geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-		ok->removeStyle( Knopf::Style::Sichtbar );
-		abbrechen->removeStyle( Knopf::Style::Sichtbar );
-		fenster->addStyle( Fenster::Style::Sichtbar );
-		name->addStyle( TextFeld::Style::Sichtbar );
-		passwort->addStyle( TextFeld::Style::Sichtbar );
-		weiter->addStyle( TextFeld::Style::Sichtbar );
+        nachricht->removeStyle( TextFeld::Style::Sichtbar );
+        geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+        ok->removeStyle( Knopf::Style::Sichtbar );
+        abbrechen->removeStyle( Knopf::Style::Sichtbar );
+        fenster->addStyle( Fenster::Style::Sichtbar );
+        name->addStyle( TextFeld::Style::Sichtbar );
+        passwort->addStyle( TextFeld::Style::Sichtbar );
+        weiter->addStyle( TextFeld::Style::Sichtbar );
 
-		login->setRahmenBreite( 3 );
-		login->setAlphaFeldFarbe( 0xFF000000 );
-		login->setAlphaFeldStrength( 20 );
-		name->addStyle( TextFeld::Style::Fokus );
-		name->setAuswahl( 0, name->zText()->getLength() );
-	}
-	return 1;
+        login->setRahmenBreite( 3 );
+        login->setAlphaFeldFarbe( 0xFF000000 );
+        login->setAlphaFeldStrength( 20 );
+        name->addStyle( TextFeld::Style::Fokus );
+        name->setAuswahl( 0, name->zText()->getLength() );
+    }
+    return 1;
 }
 
 void Login::setLoginReturn( int ret ) // setzt den Returnwert vom login
 {
-	if( ret == 1 )
-		new AktionsThread( 2, 0, 0, 0, 0, 0 );
-	else if( ret == 2 )
-	{
-		name->removeStyle( TextFeld::Style::Sichtbar );
-		passwort->removeStyle( TextFeld::Style::Sichtbar );
-		weiter->removeStyle( Knopf::Style::Sichtbar );
-		nachricht->setText( "Der Account ist bereits online.\nGebe dein Account Geheimnis ein,\num den anderen Benutzer zu kicken." );
-		nachricht->addStyle( TextFeld::Style::Sichtbar );
-		geheimnis->addStyle( TextFeld::Style::Sichtbar );
-		ok->addStyle( Knopf::Style::Sichtbar );
-		abbrechen->addStyle( Knopf::Style::Sichtbar );
-		geheimnis->addStyle( TextFeld::Style::Fokus );
-		geheimnis->setAuswahl( 0, geheimnis->zText()->getLength() );
-	}
-	else if( !ret && lastError.getLength() )
-	{
-		name->removeStyle( TextFeld::Style::Sichtbar );
-		passwort->removeStyle( TextFeld::Style::Sichtbar );
-		weiter->removeStyle( Knopf::Style::Sichtbar );
-		nachricht->setText( lastError );
-		if( nachricht->zText()->getLength() > 30 )
-		{
-			int pos = -1;
-			bool set = 0;
-			int lastp = 0;
-			for( int i = 20; i < nachricht->zText()->getLength(); )
-			{
-				char *tmp = &nachricht->zText()->getText()[ i ];
-				while( *tmp != ' ' && i < nachricht->zText()->getLength() )
-				{
-					tmp++;
-					i++;
-					if( i - 30 >= lastp )
-					{
-						if( set )
-						{
-							lastp = pos;
-							set = 0;
-							nachricht->zText()->getText()[ pos ] = '\n';
-						}
-						else
-							lastp += 5;
-					}
-				}
-				if( i < nachricht->zText()->getLength() )
-				{
-					pos = i;
-					set = 1;
-					tmp++;
-					i++;
-				}
-			}
-		}
-		nachricht->addStyle( TextFeld::Style::Sichtbar );
-		ok->addStyle( Knopf::Style::Sichtbar );
-	}
+    if( ret == 1 )
+        new AktionsThread( 2, 0, 0, 0, 0, 0 );
+    else if( ret == 2 )
+    {
+        name->removeStyle( TextFeld::Style::Sichtbar );
+        passwort->removeStyle( TextFeld::Style::Sichtbar );
+        weiter->removeStyle( Knopf::Style::Sichtbar );
+        nachricht->setText( "Der Account ist bereits online.\nGebe dein Account Geheimnis ein,\num den anderen Benutzer zu kicken." );
+        nachricht->addStyle( TextFeld::Style::Sichtbar );
+        geheimnis->addStyle( TextFeld::Style::Sichtbar );
+        ok->addStyle( Knopf::Style::Sichtbar );
+        abbrechen->addStyle( Knopf::Style::Sichtbar );
+        geheimnis->addStyle( TextFeld::Style::Fokus );
+        geheimnis->setAuswahl( 0, geheimnis->zText()->getLength() );
+    }
+    else if( !ret && lastError.getLength() )
+    {
+        name->removeStyle( TextFeld::Style::Sichtbar );
+        passwort->removeStyle( TextFeld::Style::Sichtbar );
+        weiter->removeStyle( Knopf::Style::Sichtbar );
+        nachricht->setText( lastError );
+        if( nachricht->zText()->getLength() > 30 )
+        {
+            int pos = -1;
+            bool set = 0;
+            int lastp = 0;
+            for( int i = 20; i < nachricht->zText()->getLength(); )
+            {
+                char *tmp = &nachricht->zText()->getText()[ i ];
+                while( *tmp != ' ' && i < nachricht->zText()->getLength() )
+                {
+                    tmp++;
+                    i++;
+                    if( i - 30 >= lastp )
+                    {
+                        if( set )
+                        {
+                            lastp = pos;
+                            set = 0;
+                            nachricht->zText()->getText()[ pos ] = '\n';
+                        }
+                        else
+                            lastp += 5;
+                    }
+                }
+                if( i < nachricht->zText()->getLength() )
+                {
+                    pos = i;
+                    set = 1;
+                    tmp++;
+                    i++;
+                }
+            }
+        }
+        nachricht->addStyle( TextFeld::Style::Sichtbar );
+        ok->addStyle( Knopf::Style::Sichtbar );
+    }
 }
 
 void Login::setKickReturn( int ret ) // setzt den returnwert vom kick
 {
-	if( ret == 1 )
-		new AktionsThread( 2, 0, 0, 0, 0, 0 );
-	else if( ret == 2 )
-	{
-		nachricht->setText( lastError );
-		if( nachricht->zText()->getLength() > 30 )
-		{
-			int pos = -1;
-			bool set = 0;
-			int lastp = 0;
-			for( int i = 20; i < nachricht->zText()->getLength(); )
-			{
-				char *tmp = &nachricht->zText()->getText()[ i ];
-				while( *tmp != ' ' && i < nachricht->zText()->getLength() )
-				{
-					tmp++;
-					i++;
-					if( i - 30 >= lastp )
-					{
-						if( set )
-						{
-							lastp = pos;
-							set = 0;
-							nachricht->zText()->getText()[ pos ] = '\n';
-						}
-						else
-							lastp += 5;
-					}
-				}
-				if( i < nachricht->zText()->getLength() )
-				{
-					pos = i;
-					set = 1;
-					tmp++;
-					i++;
-				}
-			}
-		}
-		geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-		abbrechen->removeStyle( Knopf::Style::Sichtbar );
-	}
-	else if( !ret )
-	{
-		nachricht->setText( "Das Geheimnis stimmt nicht mit dem des Accounts\nüberein. Achte auf Groß - und Kleinschreibung." );
-		geheimnis->removeStyle( TextFeld::Style::Sichtbar );
-		abbrechen->removeStyle( Knopf::Style::Sichtbar );
-	}
-}
-
-// Reference Counting
-Login *Login::getThis()
-{
-	ref++;
-	return this;
-}
-
-Login *Login::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    if( ret == 1 )
+        new AktionsThread( 2, 0, 0, 0, 0, 0 );
+    else if( ret == 2 )
+    {
+        nachricht->setText( lastError );
+        if( nachricht->zText()->getLength() > 30 )
+        {
+            int pos = -1;
+            bool set = 0;
+            int lastp = 0;
+            for( int i = 20; i < nachricht->zText()->getLength(); )
+            {
+                char *tmp = &nachricht->zText()->getText()[ i ];
+                while( *tmp != ' ' && i < nachricht->zText()->getLength() )
+                {
+                    tmp++;
+                    i++;
+                    if( i - 30 >= lastp )
+                    {
+                        if( set )
+                        {
+                            lastp = pos;
+                            set = 0;
+                            nachricht->zText()->getText()[ pos ] = '\n';
+                        }
+                        else
+                            lastp += 5;
+                    }
+                }
+                if( i < nachricht->zText()->getLength() )
+                {
+                    pos = i;
+                    set = 1;
+                    tmp++;
+                    i++;
+                }
+            }
+        }
+        geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+        abbrechen->removeStyle( Knopf::Style::Sichtbar );
+    }
+    else if( !ret )
+    {
+        nachricht->setText( "Das Geheimnis stimmt nicht mit dem des Accounts\nüberein. Achte auf Groß - und Kleinschreibung." );
+        geheimnis->removeStyle( TextFeld::Style::Sichtbar );
+        abbrechen->removeStyle( Knopf::Style::Sichtbar );
+    }
 }
 
 // Ereignisse
 bool loginNameTE( void *p, void *obj, TastaturEreignis te )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->nameTE( obj, te );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->nameTE( obj, te );
 }
 
 bool loginPasswortTE( void *p, void *obj, TastaturEreignis te )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->passwortTE( obj, te );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->passwortTE( obj, te );
 }
 
 bool loginGeheimnisTE( void *p, void *obj, TastaturEreignis te )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->geheimnisTE( obj, te );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->geheimnisTE( obj, te );
 }
 
 bool loginWeiterME( void *p, void *obj, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->weiterME( obj, me );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->weiterME( obj, me );
 }
 
 bool loginAbbrechenME( void *p, void *obj, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->abbrechenME( obj, me );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->abbrechenME( obj, me );
 }
 
 bool loginOkME( void *p, void *obj, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->okME( obj, me );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->okME( obj, me );
 }
 
 bool loginLoginME( void *p, void *obj, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->loginME( obj, me );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->loginME( obj, me );
 }

+ 25 - 29
KSGClient/VorLogin/Login/Login.h

@@ -13,39 +13,35 @@
 using namespace Framework;
 using namespace Network;
 
-class Login
+class Login : public virtual ReferenceCounter
 {
 private:
-	Fenster *fenster;
-	TextFeld *name;
-	TextFeld *passwort;
-	Knopf *weiter;
-	Knopf *login;
-	TextFeld *nachricht;
-	TextFeld *geheimnis;
-	Knopf *ok;
-	Knopf *abbrechen;
-	int ref;
+    Fenster *fenster;
+    TextFeld *name;
+    TextFeld *passwort;
+    Knopf *weiter;
+    Knopf *login;
+    TextFeld *nachricht;
+    TextFeld *geheimnis;
+    Knopf *ok;
+    Knopf *abbrechen;
 
 public:
-	// Konstruktor 
-	Login( Schrift *zSchrift, Fenster *vorLoginFenster );
-	// Destruktor 
-	~Login();
-	// Knopfdruck
-	void Login::druckFremdKnopf(); // Ein anderer Bereich des Programms wurde ausgewählt
-	bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
-	bool passwortTE( void *obj, TastaturEreignis te ); // TastaturEreignis im Textfeld passwort
-	bool geheimnisTE( void *obj, TastaturEreignis te ); // TastaturEreignis im Textfeld geheimnis
-	bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
-	bool okME( void *obj, MausEreignis me ); // MausEreignis im Knopf ok
-	bool abbrechenME( void *obj, MausEreignis me ); // MausEreignis im Knopf abbrechen
-	bool loginME( void *obj, MausEreignis me ); // MausEreignis im Knopf login
-	void setLoginReturn( int ret ); // setzt den Returnwert vom login
-	void setKickReturn( int ret ); // setzt den returnwert vom kick
-	// Reference Counting
-	Login *getThis();
-	Login *release();
+    // Konstruktor 
+    Login( Fenster *vorLoginFenster );
+    // Destruktor 
+    ~Login();
+    // Knopfdruck
+    void Login::druckFremdKnopf(); // Ein anderer Bereich des Programms wurde ausgewählt
+    bool nameTE( void *obj, TastaturEreignis te ); // Tastaturereignis im Textfeld name
+    bool passwortTE( void *obj, TastaturEreignis te ); // TastaturEreignis im Textfeld passwort
+    bool geheimnisTE( void *obj, TastaturEreignis te ); // TastaturEreignis im Textfeld geheimnis
+    bool weiterME( void *obj, MausEreignis me ); // MausEreignis im Knopf weiter
+    bool okME( void *obj, MausEreignis me ); // MausEreignis im Knopf ok
+    bool abbrechenME( void *obj, MausEreignis me ); // MausEreignis im Knopf abbrechen
+    bool loginME( void *obj, MausEreignis me ); // MausEreignis im Knopf login
+    void setLoginReturn( int ret ); // setzt den Returnwert vom login
+    void setKickReturn( int ret ); // setzt den returnwert vom kick
 };
 
 bool loginNameTE( void *p, void *obj, TastaturEreignis te );

+ 44 - 68
KSGClient/VorLogin/VorLogin.cpp

@@ -1,14 +1,12 @@
 #include "VorLogin.h"
 #include "..\Global\Initialisierung.h"
+#include "..\Global\Variablen.h"
 
 // Inhalt der VorLogin Klasse aus VorLogin.h
 // Konstruktor 
-VorLogin::VorLogin( Schrift *zSchrift, Bildschirm *zBildschirm )
+VorLogin::VorLogin()
+    : ReferenceCounter()
 {
-    if( zSchrift )
-        schrift = zSchrift->getThis();
-    if( zBildschirm )
-        bildschirm = zBildschirm->getThis();
     fenster = 0;
     beenden = 0;
     login = 0;
@@ -21,7 +19,6 @@ VorLogin::VorLogin( Schrift *zSchrift, Bildschirm *zBildschirm )
     passwortVergessen = 0;
     registrierung = 0;
     unregistrierung = 0;
-    ref = 1;
 }
 
 // Destruktor 
@@ -29,10 +26,6 @@ VorLogin::~VorLogin()
 {
     if( fenster )
         setSichtbar( 0 );
-    if( schrift )
-        schrift = schrift->release();
-    if( bildschirm )
-        bildschirm = bildschirm->release();
 }
 
 // nicht constant
@@ -42,56 +35,54 @@ void VorLogin::setSichtbar( bool s ) // Setzt die Sichtbarkeit der VorLogin Ober
     {
         if( fenster )
             setSichtbar( 0 );
-        fenster = new Fenster();
+        fenster = uiFactory.createFenster( uiFactory.initParam );
         fenster->addStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
-        fenster->setSize( bildschirm->getBackBufferSize() );
+        fenster->setSize( uiFactory.initParam.bildschirm->getBackBufferSize() );
         fenster->setPosition( 0, 0 );
-        beenden = initKnopf( 10, 10, 130, 30, schrift, Knopf::Style::Sichtbar, "Beenden" );
+        beenden = initKnopf( 10, 10, 130, 30, Knopf::Style::Sichtbar, "Beenden" );
         beenden->setMausEreignis( VorLoginBeendenME );
-        initToolTip( beenden, "Beendet den Kolja-Strohm Games Client.", schrift, bildschirm );
-        fenster->addMember( beenden->getThis() );
-        login = new Login( schrift, fenster );
-        eMailÄndern = new EMailÄndern( schrift, fenster );
-        eMailVergessen = new EMailVergessen( schrift, fenster );
-        geheimnisÄndern = new GeheimnisÄndern( schrift, fenster );
-        geheimnisVergessen = new GeheimnisVergessen( schrift, fenster );
-        nameVergessen = new NameVergessen( schrift, fenster );
-        passwortÄndern = new PasswortÄndern( schrift, fenster );
-        passwortVergessen = new PasswortVergessen( schrift, fenster );
-        registrierung = new Registrierung( schrift, fenster );
-        unregistrierung = new Unregistrierung( schrift, fenster );
-        bildschirm->addMember( fenster->getThis() );
+        initToolTip( beenden, "Beendet den Kolja-Strohm Games Client." );
+        fenster->addMember( beenden );
+        login = new Login( fenster );
+        eMailÄndern = new EMailÄndern( fenster );
+        eMailVergessen = new EMailVergessen( fenster );
+        geheimnisÄndern = new GeheimnisÄndern( fenster );
+        geheimnisVergessen = new GeheimnisVergessen( fenster );
+        nameVergessen = new NameVergessen( fenster );
+        passwortÄndern = new PasswortÄndern( fenster );
+        passwortVergessen = new PasswortVergessen( fenster );
+        registrierung = new Registrierung( fenster );
+        unregistrierung = new Unregistrierung( fenster );
+        uiFactory.initParam.bildschirm->addMember( fenster );
     }
     else
     {
-        bildschirm->lock();
-        if( bildschirm )
-            bildschirm->removeMember( fenster );
-        if( beenden )
-            beenden = (Knopf *)beenden->release();
+        uiFactory.initParam.bildschirm->lock();
+        if( uiFactory.initParam.bildschirm )
+            uiFactory.initParam.bildschirm->removeMember( fenster );
         if( login )
-            login = login->release();
+            login = (Login *)login->release();
         if( eMailÄndern )
-            eMailÄndern = eMailÄndern->release();
+            eMailÄndern = (EMailÄndern *)eMailÄndern->release();
         if( eMailVergessen )
-            eMailVergessen = eMailVergessen->release();
+            eMailVergessen = (EMailVergessen *)eMailVergessen->release();
         if( geheimnisÄndern )
-            geheimnisÄndern = geheimnisÄndern->release();
+            geheimnisÄndern = (GeheimnisÄndern *)geheimnisÄndern->release();
         if( geheimnisVergessen )
-            geheimnisVergessen = geheimnisVergessen->release();
+            geheimnisVergessen = (GeheimnisVergessen *)geheimnisVergessen->release();
         if( nameVergessen )
-            nameVergessen = nameVergessen->release();
+            nameVergessen = (NameVergessen *)nameVergessen->release();
         if( passwortÄndern )
-            passwortÄndern = passwortÄndern->release();
+            passwortÄndern = (PasswortÄndern *)passwortÄndern->release();
         if( passwortVergessen )
-            passwortVergessen = passwortVergessen->release();
+            passwortVergessen = (PasswortVergessen *)passwortVergessen->release();
         if( registrierung )
-            registrierung = registrierung->release();
+            registrierung = (Registrierung *)registrierung->release();
         if( unregistrierung )
-            unregistrierung = unregistrierung->release();
+            unregistrierung = (Unregistrierung *)unregistrierung->release();
         if( fenster )
             fenster = (Fenster *)fenster->release();
-        bildschirm->unlock();
+        uiFactory.initParam.bildschirm->unlock();
     }
 }
 
@@ -324,9 +315,9 @@ void VorLogin::setUnregistrierung() // macht Unregistrierung Oberfl
 }
 
 // constant
-Login * VorLogin::getLogin() const // gibt die Login Oberfläche zurück
+Login *VorLogin::getLogin() const // gibt die Login Oberfläche zurück
 {
-    return login ? login->getThis() : 0;
+    return login ? dynamic_cast<Login *>( login->getThis() ) : 0;
 }
 
 Login *VorLogin::zLogin() const
@@ -336,7 +327,7 @@ Login *VorLogin::zLogin() const
 
 EMailÄndern *VorLogin::getEMailÄndern() const // gibt die EMailÄndern Oberfläche zurück
 {
-    return eMailÄndern ? eMailÄndern->getThis() : 0;
+    return eMailÄndern ? dynamic_cast<EMailÄndern *>( eMailÄndern->getThis() ) : 0;
 }
 
 EMailÄndern *VorLogin::zEMailÄndern() const
@@ -346,7 +337,7 @@ EMail
 
 EMailVergessen *VorLogin::getEMailVergessen() const // gibt die EMailVergessen Oberfläche zurück
 {
-    return eMailVergessen ? eMailVergessen->getThis() : 0;
+    return eMailVergessen ? dynamic_cast<EMailVergessen *>( eMailVergessen->getThis() ) : 0;
 }
 
 EMailVergessen *VorLogin::zEMailVergessen() const
@@ -356,7 +347,7 @@ EMailVergessen *VorLogin::zEMailVergessen() const
 
 GeheimnisÄndern *VorLogin::getGeheimnisÄndern() const // gibt die GeheimnisÄndern Oberfläche zurück
 {
-    return geheimnisÄndern ? geheimnisÄndern->getThis() : 0;
+    return geheimnisÄndern ? dynamic_cast<GeheimnisÄndern *>( geheimnisÄndern->getThis() ) : 0;
 }
 
 GeheimnisÄndern *VorLogin::zGeheimnisÄndern() const
@@ -366,7 +357,7 @@ Geheimnis
 
 GeheimnisVergessen *VorLogin::getGeheimnisVergessen() const // gibt die GeheimnisVergessen Oberfläche zurück
 {
-    return geheimnisVergessen ? geheimnisVergessen->getThis() : 0;
+    return geheimnisVergessen ? dynamic_cast<GeheimnisVergessen *>( geheimnisVergessen->getThis() ) : 0;
 }
 
 GeheimnisVergessen *VorLogin::zGeheimnisVergessen() const
@@ -376,7 +367,7 @@ GeheimnisVergessen *VorLogin::zGeheimnisVergessen() const
 
 NameVergessen *VorLogin::getNameVergessen() const // gibt die NameVergessen Oberfläche zurück
 {
-    return nameVergessen ? nameVergessen->getThis() : 0;
+    return nameVergessen ? dynamic_cast<NameVergessen *>( nameVergessen->getThis() ) : 0;
 }
 
 NameVergessen *VorLogin::zNameVergessen() const
@@ -386,7 +377,7 @@ NameVergessen *VorLogin::zNameVergessen() const
 
 PasswortÄndern *VorLogin::getPasswortÄndern() const // gibt die PasswortÄndern Oberfläche zurück
 {
-    return passwortÄndern ? passwortÄndern->getThis() : 0;
+    return passwortÄndern ? dynamic_cast<PasswortÄndern *>( passwortÄndern->getThis() ) : 0;
 }
 
 PasswortÄndern *VorLogin::zPasswortÄndern() const
@@ -396,7 +387,7 @@ Passwort
 
 PasswortVergessen *VorLogin::getPasswortVergessen() const // gibt die PasswortVergessen Oberfläche zurück
 {
-    return passwortVergessen ? passwortVergessen->getThis() : 0;
+    return passwortVergessen ? dynamic_cast<PasswortVergessen *>( passwortVergessen->getThis() ) : 0;
 }
 
 PasswortVergessen *VorLogin::zPasswortVergessen() const
@@ -406,7 +397,7 @@ PasswortVergessen *VorLogin::zPasswortVergessen() const
 
 Registrierung *VorLogin::getRegistrierung() const // gibt die Registrierung Oberfläche zurück
 {
-    return registrierung ? registrierung->getThis() : 0;
+    return registrierung ? dynamic_cast<Registrierung *>( registrierung->getThis() ) : 0;
 }
 
 Registrierung *VorLogin::zRegistrierung() const
@@ -416,7 +407,7 @@ Registrierung *VorLogin::zRegistrierung() const
 
 Unregistrierung *VorLogin::getUnregistrierung() const // gibt die Unregistrierung Oberfläche zurück
 {
-    return unregistrierung ? unregistrierung->getThis() : 0;
+    return unregistrierung ? dynamic_cast<Unregistrierung *>( unregistrierung->getThis() ) : 0;
 }
 
 Unregistrierung *VorLogin::zUnregistrierung() const
@@ -429,21 +420,6 @@ Fenster *VorLogin::zFenster() const
     return fenster;
 }
 
-// Reference Counting
-VorLogin *VorLogin::getThis()
-{
-    ref++;
-    return this;
-}
-
-VorLogin *VorLogin::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 // Ereignisse
 bool VorLoginBeendenME( void *p, void *obj, MausEreignis me )
 {

+ 51 - 57
KSGClient/VorLogin/VorLogin.h

@@ -10,67 +10,61 @@
 #include "Account verwalten\Registrierung.h"
 #include "Account verwalten\Unregistrierung.h"
 
-class VorLogin
+class VorLogin : public virtual ReferenceCounter
 {
 private:
-	Knopf				*beenden;
-	Login				*login;
-	EMailÄndern			*eMailÄndern;
-	EMailVergessen		*eMailVergessen;
-	GeheimnisÄndern		*geheimnisÄndern;
-	GeheimnisVergessen	*geheimnisVergessen;
-	NameVergessen		*nameVergessen;
-	PasswortÄndern		*passwortÄndern;
-	PasswortVergessen	*passwortVergessen;
-	Registrierung		*registrierung;
-	Unregistrierung		*unregistrierung;
-	Schrift				*schrift;
-	Bildschirm			*bildschirm;
-	Fenster             *fenster;
-	int ref;
+    Knopf *beenden;
+    Login *login;
+    EMailÄndern *eMailÄndern;
+    EMailVergessen *eMailVergessen;
+    GeheimnisÄndern *geheimnisÄndern;
+    GeheimnisVergessen *geheimnisVergessen;
+    NameVergessen *nameVergessen;
+    PasswortÄndern *passwortÄndern;
+    PasswortVergessen *passwortVergessen;
+    Registrierung *registrierung;
+    Unregistrierung *unregistrierung;
+    Fenster *fenster;
 
 public:
-	// Konstruktor 
-	VorLogin( Schrift *zSchrift, Bildschirm *zBildschirm );
-	// Destruktor 
-	~VorLogin();
-	// nicht constant
-	void setSichtbar( bool s ); // Setzt die Sichtbarkeit der VorLogin Oberfräche
-	void setLogin( bool knopfPress ); // macht Login Oberfläche sichtbar
-	void setEMailÄndern(); // macht EMailÄndern Oberfläche sichtbar
-	void setEMailVergessen(); // macht EMailVergessen Oberfläche sichtbar
-	void setGeheimnisÄndern(); // macht GeheimnisÄndern Oberfläche sichtbar
-	void setGeheilnisVergessen(); // macht GeheimnisVergessen Oberfläche sichtbar
-	void setNameVergessen(); // macht NameVergessen Oberfläche sichtbar
-	void setPasswortÄndern(); // macht PasswortÄndern Oberfläche sichtbar
-	void setPasswortVergessen(); // macht passwortVergessen Oberfläche sichtbar
-	void setRegistrierung(); // macht Registrierung Oberfläche sichtbar
-	void setUnregistrierung(); // macht Unregistrierung Oberfläche sichtbar
-	// constant
-	Login *getLogin() const; // gibt die Login Oberfläche zurück
-	Login *zLogin() const;
-	EMailÄndern *getEMailÄndern() const; // gibt die EMailÄndern Oberfläche zurück
-	EMailÄndern *zEMailÄndern() const;
-	EMailVergessen *getEMailVergessen() const; // gibt die EMailVergessen Oberfläche zurück
-	EMailVergessen *zEMailVergessen() const;
-	GeheimnisÄndern *getGeheimnisÄndern() const; // gibt die GeheimnisÄndern Oberfläche zurück
-	GeheimnisÄndern *zGeheimnisÄndern() const;
-	GeheimnisVergessen *getGeheimnisVergessen() const; // gibt die GeheimnisVergessen Oberfläche zurück
-	GeheimnisVergessen *zGeheimnisVergessen() const;
-	NameVergessen *getNameVergessen() const; // gibt die NameVergessen Oberfläche zurück
-	NameVergessen *zNameVergessen() const;
-	PasswortÄndern *getPasswortÄndern() const; // gibt die PasswortÄndern Oberfläche zurück
-	PasswortÄndern *zPasswortÄndern() const;
-	PasswortVergessen *getPasswortVergessen() const; // gibt die PasswortVergessen Oberfläche zurück
-	PasswortVergessen *zPasswortVergessen() const;
-	Registrierung *getRegistrierung() const; // gibt die Registrierung Oberfläche zurück
-	Registrierung *zRegistrierung() const;
-	Unregistrierung *getUnregistrierung() const; // gibt die Unregistrierung Oberfläche zurück
-	Unregistrierung *zUnregistrierung() const;
-	Fenster *zFenster() const;
-	// Reference Counting
-	VorLogin *getThis();
-	VorLogin *release();
+    // Konstruktor 
+    VorLogin();
+    // Destruktor 
+    ~VorLogin();
+    // nicht constant
+    void setSichtbar( bool s ); // Setzt die Sichtbarkeit der VorLogin Oberfräche
+    void setLogin( bool knopfPress ); // macht Login Oberfläche sichtbar
+    void setEMailÄndern(); // macht EMailÄndern Oberfläche sichtbar
+    void setEMailVergessen(); // macht EMailVergessen Oberfläche sichtbar
+    void setGeheimnisÄndern(); // macht GeheimnisÄndern Oberfläche sichtbar
+    void setGeheilnisVergessen(); // macht GeheimnisVergessen Oberfläche sichtbar
+    void setNameVergessen(); // macht NameVergessen Oberfläche sichtbar
+    void setPasswortÄndern(); // macht PasswortÄndern Oberfläche sichtbar
+    void setPasswortVergessen(); // macht passwortVergessen Oberfläche sichtbar
+    void setRegistrierung(); // macht Registrierung Oberfläche sichtbar
+    void setUnregistrierung(); // macht Unregistrierung Oberfläche sichtbar
+    // constant
+    Login *getLogin() const; // gibt die Login Oberfläche zurück
+    Login *zLogin() const;
+    EMailÄndern *getEMailÄndern() const; // gibt die EMailÄndern Oberfläche zurück
+    EMailÄndern *zEMailÄndern() const;
+    EMailVergessen *getEMailVergessen() const; // gibt die EMailVergessen Oberfläche zurück
+    EMailVergessen *zEMailVergessen() const;
+    GeheimnisÄndern *getGeheimnisÄndern() const; // gibt die GeheimnisÄndern Oberfläche zurück
+    GeheimnisÄndern *zGeheimnisÄndern() const;
+    GeheimnisVergessen *getGeheimnisVergessen() const; // gibt die GeheimnisVergessen Oberfläche zurück
+    GeheimnisVergessen *zGeheimnisVergessen() const;
+    NameVergessen *getNameVergessen() const; // gibt die NameVergessen Oberfläche zurück
+    NameVergessen *zNameVergessen() const;
+    PasswortÄndern *getPasswortÄndern() const; // gibt die PasswortÄndern Oberfläche zurück
+    PasswortÄndern *zPasswortÄndern() const;
+    PasswortVergessen *getPasswortVergessen() const; // gibt die PasswortVergessen Oberfläche zurück
+    PasswortVergessen *zPasswortVergessen() const;
+    Registrierung *getRegistrierung() const; // gibt die Registrierung Oberfläche zurück
+    Registrierung *zRegistrierung() const;
+    Unregistrierung *getUnregistrierung() const; // gibt die Unregistrierung Oberfläche zurück
+    Unregistrierung *zUnregistrierung() const;
+    Fenster *zFenster() const;
 };
 
 // Ereignisse