Quellcode durchsuchen

use framework reference counting

Kolja Strohm vor 3 Jahren
Ursprung
Commit
52bd6b42d2
41 geänderte Dateien mit 2259 neuen und 2465 gelöschten Zeilen
  1. 1 1
      Fertig/x64/data/Client.ini
  2. 1 1
      Fertig/x64/data/Minigames.ini
  3. 1 1
      Fertig/x64/data/Spiel_Asteroids.ini
  4. 1 1
      Fertig/x64/data/Spiel_Linie.ini
  5. 1 1
      Fertig/x64/data/Spiel_Stickman World Online.ini
  6. 2 2
      Fertig/x64/data/start/optionen.ini
  7. 2 0
      Fertig/x64/data_debug/Client.ini
  8. 2 0
      Fertig/x64/data_debug/Minigames.ini
  9. 2 0
      Fertig/x64/data_debug/Spiel_Asteroids.ini
  10. 2 0
      Fertig/x64/data_debug/Spiel_Linie.ini
  11. 2 0
      Fertig/x64/data_debug/Spiel_Stickman World Online.ini
  12. 0 0
      Fertig/x64/data_debug/bilder/icons.ltdb
  13. 0 0
      Fertig/x64/data_debug/bilder/startbg.ltdb
  14. 0 0
      Fertig/x64/data_debug/schrift/normal.ltds
  15. 0 0
      Fertig/x64/data_debug/start/ladebilder.ini
  16. 0 0
      Fertig/x64/data_debug/start/ladeschriften.ini
  17. 2 2
      Fertig/x64/data_debug/start/optionen.ini
  18. 0 2
      Fertig/x64/data_release/Client.ini
  19. 0 2
      Fertig/x64/data_release/Minigames.ini
  20. 0 2
      Fertig/x64/data_release/Spiel_Asteroids.ini
  21. 0 2
      Fertig/x64/data_release/Spiel_Linie.ini
  22. 0 2
      Fertig/x64/data_release/Spiel_Stickman World Online.ini
  23. 2 2
      SMP Headless/SMP Headless.cpp
  24. 332 332
      SMP/Netzwerk/LTSKlient.cpp
  25. 33 37
      SMP/Netzwerk/LTSKlient.h
  26. 253 268
      SMP/Netzwerk/Main/MSKlient.cpp
  27. 29 33
      SMP/Netzwerk/Main/MSKlient.h
  28. 62 77
      SMP/Netzwerk/Patch/PSKlient.cpp
  29. 9 7
      SMP/Netzwerk/Patch/PSKlient.h
  30. 6 6
      SMP/Programm/Basic/Abschnitt.cpp
  31. 12 16
      SMP/Programm/Basic/Abschnitt.h
  32. 189 221
      SMP/Programm/Login/Login.cpp
  33. 48 56
      SMP/Programm/Login/Login.h
  34. 138 154
      SMP/Programm/Programm.cpp
  35. 24 28
      SMP/Programm/Programm.h
  36. 97 133
      SMP/Programm/Server/Patch/PatchServer.cpp
  37. 0 12
      SMP/Programm/Server/Patch/PatchServer.h
  38. 790 806
      SMP/Programm/Version/Version.cpp
  39. 44 48
      SMP/Programm/Version/Version.h
  40. 130 160
      SMP/Ressourcen/Ressourcen.cpp
  41. 42 50
      SMP/Ressourcen/Ressourcen.h

+ 1 - 1
Fertig/x64/data/Client.ini

@@ -1,2 +1,2 @@
 WIN32=../../../Klient/Fertig/x32
-WIN64=../../../Klient/Fertig/Debug/x64
+WIN64=../../../Klient/Fertig/x64

+ 1 - 1
Fertig/x64/data/Minigames.ini

@@ -1,2 +1,2 @@
 WIN32=../../../Klient/Fertig/Minigames/x32
-WIN64=../../../Klient/Fertig/Debug/Minigames/x64
+WIN64=../../../Klient/Fertig/Minigames/x64

+ 1 - 1
Fertig/x64/data/Spiel_Asteroids.ini

@@ -1,2 +1,2 @@
 WIN32=../../../Klient/Fertig/Spiele/x32/Asteroids
-WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Asteroids
+WIN64=../../../Klient/Fertig/Spiele/x64/Asteroids

+ 1 - 1
Fertig/x64/data/Spiel_Linie.ini

@@ -1,2 +1,2 @@
 WIN32=../../../Klient/Fertig/Spiele/x32/Linie
-WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Linie
+WIN64=../../../Klient/Fertig/Spiele/x64/Linie

+ 1 - 1
Fertig/x64/data/Spiel_Stickman World Online.ini

@@ -1,2 +1,2 @@
 WIN32=../../../Klient/Fertig/Spiele/x32/Stickman World Online
-WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Stickman World Online
+WIN64=../../../Klient/Fertig/Spiele/x64/Stickman World Online

+ 2 - 2
Fertig/x64/data/start/optionen.ini

@@ -1,4 +1,4 @@
-DisplayMonitor=1
+DisplayMonitor=0
 LadenSchriftDatei=data/schrift/normal.ltds
 Schrift=normal
 LadenHintergrundDatei=data/bilder/startbg.ltdb
@@ -6,4 +6,4 @@ LadenHintergrundBild=bg.png
 LadeBilder=data/start/ladebilder.ini
 LadeSchriften=data/start/ladeschriften.ini
 MainServerIP=94.130.27.12
-MainServerPort=5252
+MainServerPort=4252

+ 2 - 0
Fertig/x64/data_debug/Client.ini

@@ -0,0 +1,2 @@
+WIN32=../../../Klient/Fertig/x32
+WIN64=../../../Klient/Fertig/Debug/x64

+ 2 - 0
Fertig/x64/data_debug/Minigames.ini

@@ -0,0 +1,2 @@
+WIN32=../../../Klient/Fertig/Minigames/x32
+WIN64=../../../Klient/Fertig/Debug/Minigames/x64

+ 2 - 0
Fertig/x64/data_debug/Spiel_Asteroids.ini

@@ -0,0 +1,2 @@
+WIN32=../../../Klient/Fertig/Spiele/x32/Asteroids
+WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Asteroids

+ 2 - 0
Fertig/x64/data_debug/Spiel_Linie.ini

@@ -0,0 +1,2 @@
+WIN32=../../../Klient/Fertig/Spiele/x32/Linie
+WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Linie

+ 2 - 0
Fertig/x64/data_debug/Spiel_Stickman World Online.ini

@@ -0,0 +1,2 @@
+WIN32=../../../Klient/Fertig/Spiele/x32/Stickman World Online
+WIN64=../../../Klient/Fertig/Debug/Spiele/x64/Stickman World Online

+ 0 - 0
Fertig/x64/data_release/bilder/icons.ltdb → Fertig/x64/data_debug/bilder/icons.ltdb


+ 0 - 0
Fertig/x64/data_release/bilder/startbg.ltdb → Fertig/x64/data_debug/bilder/startbg.ltdb


+ 0 - 0
Fertig/x64/data_release/schrift/normal.ltds → Fertig/x64/data_debug/schrift/normal.ltds


+ 0 - 0
Fertig/x64/data_release/start/ladebilder.ini → Fertig/x64/data_debug/start/ladebilder.ini


+ 0 - 0
Fertig/x64/data_release/start/ladeschriften.ini → Fertig/x64/data_debug/start/ladeschriften.ini


+ 2 - 2
Fertig/x64/data_release/start/optionen.ini → Fertig/x64/data_debug/start/optionen.ini

@@ -1,4 +1,4 @@
-DisplayMonitor=0
+DisplayMonitor=1
 LadenSchriftDatei=data/schrift/normal.ltds
 Schrift=normal
 LadenHintergrundDatei=data/bilder/startbg.ltdb
@@ -6,4 +6,4 @@ LadenHintergrundBild=bg.png
 LadeBilder=data/start/ladebilder.ini
 LadeSchriften=data/start/ladeschriften.ini
 MainServerIP=94.130.27.12
-MainServerPort=4252
+MainServerPort=5252

+ 0 - 2
Fertig/x64/data_release/Client.ini

@@ -1,2 +0,0 @@
-WIN32=../../../Klient/Fertig/x32
-WIN64=../../../Klient/Fertig/x64

+ 0 - 2
Fertig/x64/data_release/Minigames.ini

@@ -1,2 +0,0 @@
-WIN32=../../../Klient/Fertig/Minigames/x32
-WIN64=../../../Klient/Fertig/Minigames/x64

+ 0 - 2
Fertig/x64/data_release/Spiel_Asteroids.ini

@@ -1,2 +0,0 @@
-WIN32=../../../Klient/Fertig/Spiele/x32/Asteroids
-WIN64=../../../Klient/Fertig/Spiele/x64/Asteroids

+ 0 - 2
Fertig/x64/data_release/Spiel_Linie.ini

@@ -1,2 +0,0 @@
-WIN32=../../../Klient/Fertig/Spiele/x32/Linie
-WIN64=../../../Klient/Fertig/Spiele/x64/Linie

+ 0 - 2
Fertig/x64/data_release/Spiel_Stickman World Online.ini

@@ -1,2 +0,0 @@
-WIN32=../../../Klient/Fertig/Spiele/x32/Stickman World Online
-WIN64=../../../Klient/Fertig/Spiele/x64/Stickman World Online

+ 2 - 2
SMP Headless/SMP Headless.cpp

@@ -41,10 +41,10 @@ int main()
         std::cout << "\nFehler\n";
     }
     std::cout << "\nVersionskontrolle\n";
-    Version *v = new Version( 0, msk->getThis(), 0, account->getThis(), 0 );
+    Version *v = new Version( 0, dynamic_cast<MSKlient *>( msk->getThis() ), 0, dynamic_cast<AdminAccount *>( account->getThis() ), 0 );
     v->commitAll();
     v->release();
-    PatchServer *s = new PatchServer( 0, iD->getThis(), msk->getThis(), 0, account->getThis(), 0 );
+    PatchServer *s = new PatchServer( 0, dynamic_cast<InitDatei *>( iD->getThis() ), dynamic_cast<MSKlient *>( msk->getThis() ), 0, dynamic_cast<AdminAccount *>( account->getThis() ), 0 );
     s->setSichtbar( 1 );
     s->updateAll();
     s->release();

+ 332 - 332
SMP/Netzwerk/LTSKlient.cpp

@@ -4,421 +4,421 @@
 // Inhalt der LTSKlient Klasse aus LTSKlient.h
 // Konstruktor
 LTSKlient::LTSKlient( const char *ip, int port )
+    : ReferenceCounter()
 {
-	k = new SSLKlient();
-	fehler = new Text( "Keine Verbindung zum Server." );
-	this->ip = new Text( ip );
-	this->port = port;
-	verbunden = 0;
-	eingeloggt = 0;
-	InitializeCriticalSection( &cs );
-	ref = 1;
+    k = new SSLKlient();
+    fehler = new Text( "Keine Verbindung zum Server." );
+    this->ip = new Text( ip );
+    this->port = port;
+    verbunden = 0;
+    eingeloggt = 0;
+    InitializeCriticalSection( &cs );
 }
 
 // Destruktor
 LTSKlient::~LTSKlient()
 {
-	if( verbunden )
-		trenne();
-	k->release();
-	ip->release();
-	fehler->release();
-	DeleteCriticalSection( &cs );
+    if( verbunden )
+        trenne();
+    k->release();
+    ip->release();
+    fehler->release();
+    DeleteCriticalSection( &cs );
 }
 
 // nicht constant
 void LTSKlient::lock()
 {
-	EnterCriticalSection( &cs );
+    EnterCriticalSection( &cs );
 }
 
 void LTSKlient::unlock()
 {
-	LeaveCriticalSection( &cs );
+    LeaveCriticalSection( &cs );
 }
 
 bool LTSKlient::verbinden()
 {
-	if( verbunden )
-		return 1;
-	lock();
+    if( verbunden )
+        return 1;
+    lock();
     std::cout << "connect to " << ip->getText() << ":" << port << "\n";
-	bool b = k->verbinde( port, ip->getText() );
-	if( !b )
-	{
-		fehler->setText( "Fehler beim verbinden mit dem Server.\nPort:" );
-		fehler->append( port );
-		fehler->append( " IP:" );
-		fehler->append( ip->getText() );
-	}
-	verbunden = b;
-	eingeloggt = 0;
-	unlock();
-	return b;
+    bool b = k->verbinde( port, ip->getText() );
+    if( !b )
+    {
+        fehler->setText( "Fehler beim verbinden mit dem Server.\nPort:" );
+        fehler->append( port );
+        fehler->append( " IP:" );
+        fehler->append( ip->getText() );
+    }
+    verbunden = b;
+    eingeloggt = 0;
+    unlock();
+    return b;
 }
 
 bool LTSKlient::login( const char *name, const char *passwort )
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\1", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 1 )
-	{
-		unsigned char län = (unsigned char)textLength( name );
-		k->sende( (char*)&län, 1 );
-		if( län )
-			k->sende( name, län );
-		län = (unsigned char)textLength( passwort );
-		k->sende( (char*)&län, 1 );
-		if( län )
-			k->sende( passwort, län );
-		k->getNachricht( (char*)&res, 1 );
-	}
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während login beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	else
-	{
-		eingeloggt = 1;
-		unlock();
-		return 1;
-	}
-	unlock();
-	return 0;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\1", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 1 )
+    {
+        unsigned char län = (unsigned char)textLength( name );
+        k->sende( (char *)&län, 1 );
+        if( län )
+            k->sende( name, län );
+        län = (unsigned char)textLength( passwort );
+        k->sende( (char *)&län, 1 );
+        if( län )
+            k->sende( passwort, län );
+        k->getNachricht( (char *)&res, 1 );
+    }
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während login beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    else
+    {
+        eingeloggt = 1;
+        unlock();
+        return 1;
+    }
+    unlock();
+    return 0;
 }
 
 bool LTSKlient::logout()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\2", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während logout beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\2", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während logout beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 int LTSKlient::getStatus()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return -1;
-	lock();
-	k->sende( "\x8", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	int status = 0;
-	if( res == 1 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		if( res == 1 )
-			status = 1;
-	}
-	else if( res == 3 )
-	{
-		status = -2;
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Status Request beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return (int)res;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return -1;
+    lock();
+    k->sende( "\x8", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    int status = 0;
+    if( res == 1 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        if( res == 1 )
+            status = 1;
+    }
+    else if( res == 3 )
+    {
+        status = -2;
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Status Request beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return (int)res;
 }
 
 bool LTSKlient::stop()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\5", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Stoppen beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\5", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Stoppen beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool LTSKlient::pause()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\x9", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Pausieren beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	k->sende( "\1", 1 );
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Pausieren beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\x9", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Pausieren beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    k->sende( "\1", 1 );
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Pausieren beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool LTSKlient::fortsetzen()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\x9", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Fortsetzen beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	k->sende( "\0", 1 );
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Fortsetzen beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\x9", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Fortsetzen beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    k->sende( "\0", 1 );
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Fortsetzen beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool LTSKlient::start()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\4", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Starten beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\4", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Starten beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool LTSKlient::setMaxTasks( int maxC )
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\xA", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während SetMaxClients beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	k->sende( (char*)&maxC, 4 );
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während SetMaxClients beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\xA", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während SetMaxClients beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    k->sende( (char *)&maxC, 4 );
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während SetMaxClients beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool LTSKlient::beenden()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\6", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Beenden beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	if( res == 1 )
-	{
-		eingeloggt = 0;
-		verbunden = 0;
-	}
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\6", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Beenden beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    if( res == 1 )
+    {
+        eingeloggt = 0;
+        verbunden = 0;
+    }
+    return res == 1;
 }
 
 bool LTSKlient::terminieren()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\7", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Terminieren beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	if( res == 1 )
-	{
-		eingeloggt = 0;
-		verbunden = 0;
-	}
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\7", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Terminieren beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    if( res == 1 )
+    {
+        eingeloggt = 0;
+        verbunden = 0;
+    }
+    return res == 1;
 }
 
 bool LTSKlient::trenne()
 {
-	if( !verbunden )
-		return 1;
-	lock();
-	k->sende( "\3", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Trennen beim Server.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	eingeloggt = 0;
-	verbunden = 0;
-	k->trenne();
-	return res == 1;
+    if( !verbunden )
+        return 1;
+    lock();
+    k->sende( "\3", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Trennen beim Server.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    eingeloggt = 0;
+    verbunden = 0;
+    k->trenne();
+    return res == 1;
 }
 
 void LTSKlient::abbruch()
 {
-	if( verbunden )
-		k->trenne();
-	eingeloggt = 0;
-	verbunden = 0;
+    if( verbunden )
+        k->trenne();
+    eingeloggt = 0;
+    verbunden = 0;
 }
 
 // constant
 bool LTSKlient::istVerbunden() const
 {
-	return verbunden;
+    return verbunden;
 }
 
 bool LTSKlient::istEingeloggt() const
 {
-	return eingeloggt;
+    return eingeloggt;
 }
 
 const char *LTSKlient::getLetzterFehler() const
 {
-	return fehler->getText();
+    return fehler->getText();
 }
 
 SSLKlient *LTSKlient::zKlient() const
 {
-	return k;
+    return k;
 }

+ 33 - 37
SMP/Netzwerk/LTSKlient.h

@@ -7,47 +7,43 @@
 using namespace Network;
 using namespace Framework;
 
-class LTSKlient
+class LTSKlient : public virtual ReferenceCounter
 {
 protected:
-	SSLKlient *k;
-	CRITICAL_SECTION cs;
-	Text *fehler;
-	Text *ip;
-	int port;
-	bool verbunden;
-	bool eingeloggt;
-	int ref;
+    SSLKlient *k;
+    CRITICAL_SECTION cs;
+    Text *fehler;
+    Text *ip;
+    int port;
+    bool verbunden;
+    bool eingeloggt;
 
 public:
-	// Konstruktor
-	LTSKlient( const char *ip, int port );
-	// Destruktor
-	~LTSKlient();
-	// nicht constant
-	void lock();
-	void unlock();
-	bool verbinden();
-	bool login( const char *name, const char *passwort );
-	bool logout();
-	int getStatus();
-	bool stop();
-	bool pause();
-	bool fortsetzen();
-	bool start();
-	bool setMaxTasks( int maxC );
-	bool beenden();
-	bool terminieren();
-	bool trenne();
-	void abbruch();
-	// constant
-	bool istVerbunden() const;
-	bool istEingeloggt() const;
-	const char *getLetzterFehler() const;
-	SSLKlient *zKlient() const;
-	// Reference Counting
-	virtual LTSKlient *getThis() = 0;
-	virtual LTSKlient *release() = 0;
+    // Konstruktor
+    LTSKlient( const char *ip, int port );
+    // Destruktor
+    ~LTSKlient();
+    // nicht constant
+    void lock();
+    void unlock();
+    bool verbinden();
+    bool login( const char *name, const char *passwort );
+    bool logout();
+    int getStatus();
+    bool stop();
+    bool pause();
+    bool fortsetzen();
+    bool start();
+    bool setMaxTasks( int maxC );
+    bool beenden();
+    bool terminieren();
+    bool trenne();
+    void abbruch();
+    // constant
+    bool istVerbunden() const;
+    bool istEingeloggt() const;
+    const char *getLetzterFehler() const;
+    SSLKlient *zKlient() const;
 };
 
 #endif

+ 253 - 268
SMP/Netzwerk/Main/MSKlient.cpp

@@ -3,263 +3,263 @@
 // Inhalt der MSKlient Klasse aus MSKlient.h
 // Konstruktor
 MSKlient::MSKlient( const char *ip, int port )
+    : ReferenceCounter()
 {
-	k = new SSLKlient();
-	fehler = new Text( "Keine Verbindung zum Server." );
-	this->ip = new Text( ip );
-	this->port = port;
-	verbunden = 0;
-	eingeloggt = 0;
-	InitializeCriticalSection( &cs );
-	ref = 1;
+    k = new SSLKlient();
+    fehler = new Text( "Keine Verbindung zum Server." );
+    this->ip = new Text( ip );
+    this->port = port;
+    verbunden = 0;
+    eingeloggt = 0;
+    InitializeCriticalSection( &cs );
 }
 
 // Destruktor
 MSKlient::~MSKlient()
 {
-	if( verbunden )
-		trenne();
-	k->release();
-	ip->release();
-	fehler->release();
-	DeleteCriticalSection( &cs );
+    if( verbunden )
+        trenne();
+    k->release();
+    ip->release();
+    fehler->release();
+    DeleteCriticalSection( &cs );
 }
 
 // nicht constant
 void MSKlient::lock()
 {
-	EnterCriticalSection( &cs );
+    EnterCriticalSection( &cs );
 }
 
 void MSKlient::unlock()
 {
-	LeaveCriticalSection( &cs );
+    LeaveCriticalSection( &cs );
 }
 
 bool MSKlient::verbinden()
 {
-	if( verbunden )
-		return 1;
-	lock();
-	bool b = k->verbinde( port, ip->getText() );
-	if( !b )
-	{
-		fehler->setText( "Fehler während verbinden bei MainServer.\nPort:" );
-		fehler->append( port );
-		fehler->append( " IP:" );
-		fehler->append( ip->getText() );
-	}
-	verbunden = b;
-	eingeloggt = 0;
-	unlock();
-	return b;
+    if( verbunden )
+        return 1;
+    lock();
+    bool b = k->verbinde( port, ip->getText() );
+    if( !b )
+    {
+        fehler->setText( "Fehler während verbinden bei MainServer.\nPort:" );
+        fehler->append( port );
+        fehler->append( " IP:" );
+        fehler->append( ip->getText() );
+    }
+    verbunden = b;
+    eingeloggt = 0;
+    unlock();
+    return b;
 }
 
 bool MSKlient::login( const char *name, const char *passwort )
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\1", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 1 )
-	{
-		unsigned char län = (unsigned char)textLength( name );
-		k->sende( (char*)&län, 1 );
-		if( län )
-			k->sende( name, län );
-		län = (unsigned char)textLength( passwort );
-		k->sende( (char*)&län, 1 );
-		if( län )
-			k->sende( passwort, län );
-		k->getNachricht( (char*)&res, 1 );
-	}
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während einloggen bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	else
-	{
-		eingeloggt = 1;
-		unlock();
-		return 1;
-	}
-	unlock();
-	return 0;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\1", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 1 )
+    {
+        unsigned char län = (unsigned char)textLength( name );
+        k->sende( (char *)&län, 1 );
+        if( län )
+            k->sende( name, län );
+        län = (unsigned char)textLength( passwort );
+        k->sende( (char *)&län, 1 );
+        if( län )
+            k->sende( passwort, län );
+        k->getNachricht( (char *)&res, 1 );
+    }
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während einloggen bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    else
+    {
+        eingeloggt = 1;
+        unlock();
+        return 1;
+    }
+    unlock();
+    return 0;
 }
 
 bool MSKlient::logout()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\2", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während ausloggen bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\2", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während ausloggen bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 int MSKlient::getStatus()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return -1;
-	lock();
-	k->sende( "\x8", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	int status = 0;
-	if( res == 1 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		if( res == 1 )
-			status = 1;
-	}
-	if( res == 3 )
-	{
-		status = -2;
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Status Request bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return (int)res;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return -1;
+    lock();
+    k->sende( "\x8", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    int status = 0;
+    if( res == 1 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        if( res == 1 )
+            status = 1;
+    }
+    if( res == 3 )
+    {
+        status = -2;
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Status Request bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return (int)res;
 }
 
 bool MSKlient::pause()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\5", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Pausieren bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\5", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Pausieren bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool MSKlient::fortsetzen()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\4", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Fortsetzen bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\4", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Fortsetzen bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    return res == 1;
 }
 
 bool MSKlient::beenden()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\6", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Beenden bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	if( res == 1 )
-	{
-		eingeloggt = 0;
-		verbunden = 0;
-	}
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\6", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Beenden bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    if( res == 1 )
+    {
+        eingeloggt = 0;
+        verbunden = 0;
+    }
+    return res == 1;
 }
 
 bool MSKlient::terminieren()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\7", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Terminieren bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	if( res == 1 )
-	{
-		eingeloggt = 0;
-		verbunden = 0;
-	}
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\7", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Terminieren bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    if( res == 1 )
+    {
+        eingeloggt = 0;
+        verbunden = 0;
+    }
+    return res == 1;
 }
 
-bool MSKlient::getPatchServerListe( Array< ServerData* > *list )
+bool MSKlient::getPatchServerListe( Array< ServerData * > *list )
 {
     if( !verbunden )
         verbinden();
@@ -268,10 +268,10 @@ bool MSKlient::getPatchServerListe( Array< ServerData* > *list )
     lock();
     k->sende( "\x9", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char*)&res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 3 )
     {
-        k->getNachricht( (char*)&res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -284,21 +284,21 @@ bool MSKlient::getPatchServerListe( Array< ServerData* > *list )
     else if( res == 1 )
     {
         int anz = 0;
-        k->getNachricht( (char*)&anz, 4 );
+        k->getNachricht( (char *)&anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
             ServerData *s = new ServerData();
-            k->getNachricht( (char*)&s->id, 4 );
-            k->getNachricht( (char*)&s->port, 2 );
-            k->getNachricht( (char*)&s->adminPort, 2 );
+            k->getNachricht( (char *)&s->id, 4 );
+            k->getNachricht( (char *)&s->port, 2 );
+            k->getNachricht( (char *)&s->adminPort, 2 );
             unsigned char len = 0;
-            k->getNachricht( (char*)&len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             s->name.fillText( ' ', len );
             k->getNachricht( s->name, len );
-            k->getNachricht( (char*)&len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             s->ip.fillText( ' ', len );
             k->getNachricht( s->ip, len );
-            k->getNachricht( (char*)&len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             s->status.fillText( ' ', len );
             k->getNachricht( s->status, len );
             list->add( s );
@@ -317,29 +317,29 @@ bool MSKlient::getPatchServerDetails( int id, ServerDetails *details )
     lock();
     k->sende( "\xA", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char*)&res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
-        k->sende( (char*)&id, 4 );
-        k->getNachricht( (char*)&res, 1 );
+        k->sende( (char *)&id, 4 );
+        k->getNachricht( (char *)&res, 1 );
         if( res == 1 )
         {
             unsigned char len = 0;
-            k->getNachricht( (char*)&len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             details->name.fillText( ' ', len );
             k->getNachricht( details->name, len );
-            k->getNachricht( (char*)&len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             details->ip.fillText( ' ', len );
             k->getNachricht( details->ip, len );
-            k->getNachricht( (char*)&details->port, 2 );
-            k->getNachricht( (char*)&details->adminPort, 2 );
-            k->getNachricht( (char*)&details->tasks, 4 );
-            k->getNachricht( (char*)&details->maxTasks, 4 );
+            k->getNachricht( (char *)&details->port, 2 );
+            k->getNachricht( (char *)&details->adminPort, 2 );
+            k->getNachricht( (char *)&details->tasks, 4 );
+            k->getNachricht( (char *)&details->maxTasks, 4 );
         }
     }
     if( res == 3 )
     {
-        k->getNachricht( (char*)&res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -355,58 +355,43 @@ bool MSKlient::getPatchServerDetails( int id, ServerDetails *details )
 
 bool MSKlient::trenne()
 {
-	if( !verbunden )
-		verbinden();
-	if( !verbunden )
-		return 0;
-	lock();
-	k->sende( "\3", 1 );
-	unsigned char res = 0;
-	k->getNachricht( (char*)&res, 1 );
-	if( res == 3 )
-	{
-		k->getNachricht( (char*)&res, 1 );
-		char *txt = new char[ res + 1 ];
-		k->getNachricht( txt, res );
-		txt[ res ] = 0;
-		fehler->setText( "Fehler während Trennen bei MainServer.\nServer Rückgabe:" );
-		fehler->append( txt );
-		delete[] txt;
-	}
-	unlock();
-	eingeloggt = 0;
-	verbunden = 0;
-	k->trenne();
-	return res == 1;
+    if( !verbunden )
+        verbinden();
+    if( !verbunden )
+        return 0;
+    lock();
+    k->sende( "\3", 1 );
+    unsigned char res = 0;
+    k->getNachricht( (char *)&res, 1 );
+    if( res == 3 )
+    {
+        k->getNachricht( (char *)&res, 1 );
+        char *txt = new char[ res + 1 ];
+        k->getNachricht( txt, res );
+        txt[ res ] = 0;
+        fehler->setText( "Fehler während Trennen bei MainServer.\nServer Rückgabe:" );
+        fehler->append( txt );
+        delete[] txt;
+    }
+    unlock();
+    eingeloggt = 0;
+    verbunden = 0;
+    k->trenne();
+    return res == 1;
 }
 
 // constant
 bool MSKlient::istVerbunden() const
 {
-	return verbunden;
+    return verbunden;
 }
 
 bool MSKlient::istEingeloggt() const
 {
-	return eingeloggt;
+    return eingeloggt;
 }
 
 const char *MSKlient::getLetzterFehler() const
 {
-	return fehler->getText();
-}
-
-// Reference Counting
-MSKlient *MSKlient::getThis()
-{
-	ref++;
-	return this;
-}
-
-MSKlient *MSKlient::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return fehler->getText();
 }

+ 29 - 33
SMP/Netzwerk/Main/MSKlient.h

@@ -28,44 +28,40 @@ struct ServerDetails
     int maxTasks;
 };
 
-class MSKlient
+class MSKlient : public virtual ReferenceCounter
 {
 private:
-	SSLKlient *k;
-	CRITICAL_SECTION cs;
-	Text *fehler;
-	Text *ip;
-	int port;
-	bool verbunden;
-	bool eingeloggt;
-	int ref;
+    SSLKlient *k;
+    CRITICAL_SECTION cs;
+    Text *fehler;
+    Text *ip;
+    int port;
+    bool verbunden;
+    bool eingeloggt;
 
 public:
-	// Konstruktor
-	MSKlient( const char *ip, int port );
-	// Destruktor
-	~MSKlient();
-	// nicht constant
-	void lock();
-	void unlock();
-	bool verbinden();
-	bool login( const char *name, const char *passwort );
-	bool logout();
-	int getStatus();
-	bool pause();
-	bool fortsetzen();
-	bool beenden();
-	bool terminieren();
-    bool getPatchServerListe( Array< ServerData* > *list );
+    // Konstruktor
+    MSKlient( const char *ip, int port );
+    // Destruktor
+    ~MSKlient();
+    // nicht constant
+    void lock();
+    void unlock();
+    bool verbinden();
+    bool login( const char *name, const char *passwort );
+    bool logout();
+    int getStatus();
+    bool pause();
+    bool fortsetzen();
+    bool beenden();
+    bool terminieren();
+    bool getPatchServerListe( Array< ServerData * > *list );
     bool getPatchServerDetails( int id, ServerDetails *details );
-	bool trenne();
-	// constant
-	bool istVerbunden() const;
-	bool istEingeloggt() const;
-	const char *getLetzterFehler() const;
-	// Reference Counting
-	MSKlient *getThis();
-	MSKlient *release();
+    bool trenne();
+    // constant
+    bool istVerbunden() const;
+    bool istEingeloggt() const;
+    const char *getLetzterFehler() const;
 };
 
 #endif

+ 62 - 77
SMP/Netzwerk/Patch/PSKlient.cpp

@@ -20,10 +20,10 @@ bool PSKlient::getDateiListe( int *systemAnzahl, Array< int > *dateiAnzahl, RCAr
     lock();
     k->sende( "\xB", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -35,7 +35,7 @@ bool PSKlient::getDateiListe( int *systemAnzahl, Array< int > *dateiAnzahl, RCAr
     }
     *systemAnzahl = 0;
     int län = 0;
-    k->getNachricht( (char *)& län, 4 );
+    k->getNachricht( (char *)&län, 4 );
     while( län )
     { // System Sleife
         char *txt = new char[ län + 1 ];
@@ -45,7 +45,7 @@ bool PSKlient::getDateiListe( int *systemAnzahl, Array< int > *dateiAnzahl, RCAr
         delete[] txt;
         dateien->set( new RCArray< Text >(), *systemAnzahl );
         int dAnzahl = 0;
-        k->getNachricht( (char *)& län, 4 );
+        k->getNachricht( (char *)&län, 4 );
         while( län )
         { // Datei Schleife
             char *txt = new char[ län + 1 ];
@@ -54,11 +54,11 @@ bool PSKlient::getDateiListe( int *systemAnzahl, Array< int > *dateiAnzahl, RCAr
             dateien->z( *systemAnzahl )->set( new Text( txt ), dAnzahl );
             delete[] txt;
             dAnzahl++;
-            k->getNachricht( (char *)& län, 4 );
+            k->getNachricht( (char *)&län, 4 );
         }
         dateiAnzahl->set( dAnzahl, *systemAnzahl );
         ( *systemAnzahl )++;
-        k->getNachricht( (char *)& län, 4 );
+        k->getNachricht( (char *)&län, 4 );
     }
     unlock();
     return 1;
@@ -73,10 +73,10 @@ bool PSKlient::updateFertig()
     lock();
     k->sende( "\xC", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -99,10 +99,10 @@ bool PSKlient::updateStarten( int dateiGruppeId )
     lock();
     k->sende( "\xD", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -112,11 +112,11 @@ bool PSKlient::updateStarten( int dateiGruppeId )
         unlock();
         return 0;
     }
-    k->sende( (char *)& dateiGruppeId, 4 );
-    k->getNachricht( (char *)& res, 1 );
+    k->sende( (char *)&dateiGruppeId, 4 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -139,33 +139,33 @@ bool PSKlient::getFileGroupInfoList( Array< FileGroupInfo * > *list )
     lock();
     k->sende( "\x10", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
         int anz = 0;
-        k->getNachricht( (char *)& anz, 4 );
+        k->getNachricht( (char *)&anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
             FileGroupInfo *info = new FileGroupInfo();
-            k->getNachricht( (char *)& info->id, 4 );
+            k->getNachricht( (char *)&info->id, 4 );
             unsigned char len = 0;
-            k->getNachricht( (char *)& len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             info->name.fillText( ' ', len );
             k->getNachricht( info->name, len );
-            k->getNachricht( (char *)& len, 1 );
+            k->getNachricht( (char *)&len, 1 );
             info->status.fillText( ' ', len );
             k->getNachricht( info->status, len );
             unsigned short l = 0;
-            k->getNachricht( (char *)& l, 2 );
+            k->getNachricht( (char *)&l, 2 );
             info->path.fillText( ' ', l );
             k->getNachricht( info->path, l );
-            k->getNachricht( (char *)& info->version, 4 );
+            k->getNachricht( (char *)&info->version, 4 );
             list->add( info );
         }
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -179,7 +179,7 @@ bool PSKlient::getFileGroupInfoList( Array< FileGroupInfo * > *list )
     return 1;
 }
 
-bool PSKlient::getSystemInfoList( RCArray< ReferenceCounting< std::pair< int, Text > > > *list )
+bool PSKlient::getSystemInfoList( Array< SystemInfo > *list )
 {
     if( !verbunden )
         verbinden();
@@ -188,25 +188,25 @@ bool PSKlient::getSystemInfoList( RCArray< ReferenceCounting< std::pair< int, Te
     lock();
     k->sende( "\x11", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
         int anz = 0;
-        k->getNachricht( (char *)& anz, 4 );
+        k->getNachricht( (char *)&anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
-            ReferenceCounting< std::pair< int, Text > > *obj = new ReferenceCounting< std::pair< int, Text > >();
-            k->getNachricht( (char *)& obj->first, 4 );
+            SystemInfo info;
+            k->getNachricht( (char *)&info.id, 4 );
             unsigned char len = 0;
-            k->getNachricht( (char *)& len, 1 );
-            obj->second.fillText( ' ', len );
-            k->getNachricht( obj->second, len );
-            list->add( obj );
+            k->getNachricht( (char *)&len, 1 );
+            info.name.fillText( ' ', len );
+            k->getNachricht( info.name, len );
+            list->add( info );
         }
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -220,7 +220,7 @@ bool PSKlient::getSystemInfoList( RCArray< ReferenceCounting< std::pair< int, Te
     return 1;
 }
 
-bool PSKlient::getFileInfoList( int system, int group, RCArray< ReferenceCounting< FileInfo > > *list )
+bool PSKlient::getFileInfoList( int system, int group, Array< FileInfo > *list )
 {
     if( !verbunden )
         verbinden();
@@ -229,32 +229,32 @@ bool PSKlient::getFileInfoList( int system, int group, RCArray< ReferenceCountin
     lock();
     k->sende( "\x12", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
-        k->sende( (char *)& system, 4 );
-        k->sende( (char *)& group, 4 );
+        k->sende( (char *)&system, 4 );
+        k->sende( (char *)&group, 4 );
         int anz = 0;
-        k->getNachricht( (char *)& anz, 4 );
+        k->getNachricht( (char *)&anz, 4 );
         for( int i = 0; i < anz; i++ )
         {
-            ReferenceCounting< FileInfo > *obj = new ReferenceCounting< FileInfo >();
-            k->getNachricht( (char *)& obj->id, 4 );
+            FileInfo obj;
+            k->getNachricht( (char *)&obj.id, 4 );
             unsigned short len = 0;
-            k->getNachricht( (char *)& len, 2 );
-            obj->path.fillText( ' ', len );
-            k->getNachricht( obj->path, len );
-            k->getNachricht( (char *)& obj->version, 4 );
+            k->getNachricht( (char *)&len, 2 );
+            obj.path.fillText( ' ', len );
+            k->getNachricht( obj.path, len );
+            k->getNachricht( (char *)&obj.version, 4 );
             unsigned char l = 0;
-            k->getNachricht( (char *)& l, 1 );
-            obj->time.fillText( ' ', l );
-            k->getNachricht( obj->time, l );
+            k->getNachricht( (char *)&l, 1 );
+            obj.time.fillText( ' ', l );
+            k->getNachricht( obj.time, l );
             list->add( obj );
         }
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -277,19 +277,19 @@ bool PSKlient::getFileVersion( char *path, int system, int group, int *version )
     lock();
     k->sende( "\x13", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
         unsigned short len = textLength( path );
-        k->sende( (char *)& len, 2 );
+        k->sende( (char *)&len, 2 );
         k->sende( path, len );
-        k->sende( (char *)& group, 4 );
-        k->sende( (char *)& system, 4 );
+        k->sende( (char *)&group, 4 );
+        k->sende( (char *)&system, 4 );
         k->getNachricht( (char *)version, 4 );
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -312,30 +312,30 @@ bool PSKlient::updateFile( const char *pfad, char status, Zeit *zLetzte
     lock();
     k->sende( "\x14", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
         unsigned short len = textLength( pfad );
-        k->sende( (char *)& len, 2 );
+        k->sende( (char *)&len, 2 );
         k->sende( pfad, len );
         k->sende( &status, 1 );
         if( zLetzteÄnderung )
         {
             Text *time = zLetzteÄnderung->getZeit( "y-m-d h:i:s" );
             unsigned char l = (unsigned char)time->getLength();
-            k->sende( (char *)& l, 1 );
+            k->sende( (char *)&l, 1 );
             k->sende( time->getText(), l );
             time->release();
         }
         else
             k->sende( (char *)"\x0", 1 );
-        k->sende( (char *)& system, 4 );
-        k->sende( (char *)& gruppe, 4 );
-        k->getNachricht( (char *)& res, 1 );
+        k->sende( (char *)&system, 4 );
+        k->sende( (char *)&gruppe, 4 );
+        k->getNachricht( (char *)&res, 1 );
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -358,15 +358,15 @@ bool PSKlient::dateiGruppeUpdate( int gruppe )
     lock();
     k->sende( "\x15", 1 );
     unsigned char res = 0;
-    k->getNachricht( (char *)& res, 1 );
+    k->getNachricht( (char *)&res, 1 );
     if( res == 1 )
     {
-        k->sende( (char *)& gruppe, 4 );
-        k->getNachricht( (char *)& res, 1 );
+        k->sende( (char *)&gruppe, 4 );
+        k->getNachricht( (char *)&res, 1 );
     }
     if( res == 3 )
     {
-        k->getNachricht( (char *)& res, 1 );
+        k->getNachricht( (char *)&res, 1 );
         char *txt = new char[ res + 1 ];
         k->getNachricht( txt, res );
         txt[ res ] = 0;
@@ -386,19 +386,4 @@ void PSKlient::abbruch()
         k->trenne();
     eingeloggt = 0;
     verbunden = 0;
-}
-
-// Reference Counting
-LTSKlient *PSKlient::getThis()
-{
-    ref++;
-    return this;
-}
-
-LTSKlient *PSKlient::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
 }

+ 9 - 7
SMP/Netzwerk/Patch/PSKlient.h

@@ -4,7 +4,6 @@
 #include "../LTSKlient.h"
 #include <Array.h>
 #include <Text.h>
-#include <ReferenceCounting.h>
 #include <Zeit.h>
 
 using namespace Network;
@@ -27,6 +26,12 @@ struct FileInfo
     Text time;
 };
 
+struct SystemInfo
+{
+    int id;
+    Text name;
+};
+
 class PSKlient : public LTSKlient
 {
 public:
@@ -38,16 +43,13 @@ public:
     bool getDateiListe( int *systemAnzahl, Array< int > *dateiAnzahl, RCArray< Text > *systeme, RCArray< RCArray< Text > > *dateien );
     bool updateFertig();
     bool updateStarten( int dateiGruppeId );
-    bool getFileGroupInfoList( Array< FileGroupInfo* > *list );
-    bool getSystemInfoList( RCArray< ReferenceCounting< std::pair< int, Text > > > *list );
-    bool getFileInfoList( int system, int group, RCArray< ReferenceCounting< FileInfo > > *list );
+    bool getFileGroupInfoList( Array< FileGroupInfo * > *list );
+    bool getSystemInfoList( Array< SystemInfo > *list );
+    bool getFileInfoList( int system, int group, Array< FileInfo > *list );
     bool getFileVersion( char *path, int system, int group, int *version );
     bool updateFile( const char *pfad, char status, Zeit *zLetzteÄnderung, int system, int gruppe );
     bool dateiGruppeUpdate( int gruppe );
     void abbruch();
-    // Reference Counting
-    virtual LTSKlient *getThis();
-    virtual LTSKlient *release();
 };
 
 #endif

+ 6 - 6
SMP/Programm/Basic/Abschnitt.cpp

@@ -4,17 +4,17 @@
 // Inhalt der Abschnitt Klasse aus Abschnitt.h
 // Konstruktor
 Abschnitt::Abschnitt( Bildschirm *b )
+    : ReferenceCounter()
 {
-	this->b = b;
-	sichtbar = 0;
-	ref = 1;
+    this->b = b;
+    sichtbar = 0;
 }
 
 // Destruktor
 Abschnitt::~Abschnitt()
 {
-	if( b )
-		b->release();
+    if( b )
+        b->release();
 }
 
 int Abschnitt::getColorFromStatus( char *status )
@@ -37,5 +37,5 @@ int Abschnitt::getColorFromStatus( char *status )
 // constant
 bool Abschnitt::istSichtbar() const
 {
-	return sichtbar;
+    return sichtbar;
 }

+ 12 - 16
SMP/Programm/Basic/Abschnitt.h

@@ -5,28 +5,24 @@
 
 using namespace Framework;
 
-class Abschnitt
+class Abschnitt : public virtual ReferenceCounter
 {
 protected:
-	Bildschirm *b;
-	bool sichtbar;
-	int ref;
+    Bildschirm *b;
+    bool sichtbar;
 
     int getColorFromStatus( char *status );
 
 public:
-	// Konstruktor
-	Abschnitt( Bildschirm *b );
-	// Destruktor
-	~Abschnitt();
-	// nicht constant
-	virtual void setFenster( Fenster *f ) = 0;
-	virtual void setSichtbar( bool s ) = 0;
-	// constant
-	bool istSichtbar() const;
-	// Reference Counting
-	virtual Abschnitt *getThis() = 0;
-	virtual Abschnitt *release() = 0;
+    // Konstruktor
+    Abschnitt( Bildschirm *b );
+    // Destruktor
+    ~Abschnitt();
+    // nicht constant
+    virtual void setFenster( Fenster *f ) = 0;
+    virtual void setSichtbar( bool s ) = 0;
+    // constant
+    bool istSichtbar() const;
 };
 
 #endif

+ 189 - 221
SMP/Programm/Login/Login.cpp

@@ -8,12 +8,12 @@
 // Inhalt der AktionThread Klasse aus Login.h
 // Konstruktor
 AktionThread::AktionThread( int ak, Bildschirm *zScreen, Programm *zProg )
-	: Thread()
+    : Thread()
 {
-	this->ak = ak;
-	zB = zScreen;
-	zP = zProg;
-	start();
+    this->ak = ak;
+    zB = zScreen;
+    zP = zProg;
+    start();
 }
 
 // Destruktor
@@ -25,244 +25,227 @@ AktionThread::~AktionThread()
 // nicht constant
 void AktionThread::thread()
 {
-	zB->lock();
-	switch( ak )
-	{
-	case 0:
-		zP->removeAbschnitt( "Patch Server" );
-		zP->removeAbschnitt( "Version" );
-		break;
-	}
-	zB->unlock();
-	release();
+    zB->lock();
+    switch( ak )
+    {
+    case 0:
+        zP->removeAbschnitt( "Patch Server" );
+        zP->removeAbschnitt( "Version" );
+        break;
+    }
+    zB->unlock();
+    release();
 }
 
 
 // Inhalt der AdminAccount Klasse aus Login.h
 // Konstruktor
 AdminAccount::AdminAccount( const char *name, const char *passwort )
+    : ReferenceCounter()
 {
-	this->name = new Text( name );
-	this->passwort = new Text( passwort );
-	ref = 1;
+    this->name = new Text( name );
+    this->passwort = new Text( passwort );
 }
 
 // Destruktor
 AdminAccount::~AdminAccount()
 {
-	name->release();
-	passwort->release();
+    name->release();
+    passwort->release();
 }
 
 // nicht constant
 void AdminAccount::login( const char *name, const char *passwort )
 {
-	this->name = new Text( name );
-	this->passwort = new Text( passwort );
+    this->name = new Text( name );
+    this->passwort = new Text( passwort );
 }
 
 // constant
 Text *AdminAccount::getName() const
 {
-	return name->getThis();
+    return dynamic_cast<Text *>( name->getThis() );
 }
 
 Text *AdminAccount::zName() const
 {
-	return name;
+    return name;
 }
 
 Text *AdminAccount::getPasswort() const
 {
-	return passwort->getThis();
+    return dynamic_cast<Text *>( passwort->getThis() );
 }
 
 Text *AdminAccount::zPasswort() const
 {
-	return passwort;
-}
-
-// Reference Counting
-AdminAccount *AdminAccount::getThis()
-{
-	ref++;
-	return this;
-}
-
-AdminAccount *AdminAccount::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return passwort;
 }
 
 
 // Inhalt der Login Klasse aus Login.h
 // Konstruktor
 Login::Login( Schrift *s, Programm *zP, InitDatei *iDat, RessourceBild *resB, Bildschirm *b )
-	: Abschnitt( b )
+    : Abschnitt( b )
 {
-	account = 0;
-	fenster = 0;
-	zProg = zP;
-	iD = iDat;
-	rB = resB;
-	schrift = s;
-
-	f = new Fenster();
-	f->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered );
-	f->setRFarbe( 0xFFFFFFFF );
-	f->setRBreite( 1 );
-	f->setTitel( "Login" );
-	f->setTSchriftZ( s->getThis() );
-	f->setTSFarbe( 0xFFFFFFFF );
-	f->setTSSize( 12 );
-	f->setTAfFarbe( 0x1000FF00 );
-	f->setTAfStrength( -15 );
-	f->setTRFarbe( 0xFFFFFFFF );
-	f->setTRBreite( 1 );
-	f->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
-	f->zTTextFeld()->setSize( 0, 20 );
-	f->setSize( 300, 120 );
-
-	logout = new TextFeld();
-	logout->setStyle( TextFeld::Style::HCenter );
-	logout->setSchriftZ( s->getThis() );
-	logout->setSchriftFarbe( 0xFFFFFFFF );
-	logout->setSchriftSize( 12 );
-	logout->setText( "Möchtest du dich wirklich ausloggen?" );
-	logout->setSize( 300, 20 );
-	logout->setPosition( 0, 20 );
-	f->addMember( logout->getThis() );
-
-	name = new TextFeld();
-	name->setStyle( TextFeld::Style::TextFeld );
-	name->setSchriftZ( s->getThis() );
-	name->setSchriftFarbe( 0xFFFFFFFF );
-	name->setSchriftSize( 12 );
-	name->setAlphaFeldFarbe( 0x1000FF00 );
-	name->setAlphaFeldStrength( -5 );
-	name->setTastaturEreignisParameter( this );
-	name->setTastaturEreignis( loginNameTastaturEreignis );
-	name->setSize( 200, 20 );
-	name->setPosition( 50, 10 );
-	name->setText( "Name" );
-	name->setRahmenFarbe( 0xFFFFFFFF );
-	name->setRahmenBreite( 1 );
-	f->addMember( name->getThis() );
-
-	passwort = new TextFeld();
-	passwort->setStyle( TextFeld::Style::TextFeld );
-	passwort->setSchriftZ( s->getThis() );
-	passwort->setSchriftFarbe( 0xFFFFFFFF );
-	passwort->setSchriftSize( 12 );
-	passwort->setAlphaFeldFarbe( 0x1000FF00 );
-	passwort->setAlphaFeldStrength( -5 );
-	passwort->setTastaturEreignisParameter( this );
-	passwort->setTastaturEreignis( loginPasswortTastaturEreignis );
-	passwort->setSize( 200, 20 );
-	passwort->setPosition( 50, 40 );
-	passwort->setText( "Passwort" );
-	passwort->setRahmenFarbe( 0xFFFFFFFF );
-	passwort->setRahmenBreite( 1 );
-	f->addMember( passwort->getThis() );
-
-	login = new Knopf();
-	login->setStyle( Knopf::Style::Normal );
-	login->setText( "Login" );
-	login->setSchriftZ( s->getThis() );
-	login->setMausEreignisParameter( this );
-	login->setMausEreignis( loginLoginMausEreignis );
-	login->setSize( 150, 20 );
-	login->setPosition( 75, 70 );
-	f->addMember( login->getThis() );
-
-	ref = 1;
+    account = 0;
+    fenster = 0;
+    zProg = zP;
+    iD = iDat;
+    rB = resB;
+    schrift = s;
+
+    f = new Fenster();
+    f->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered );
+    f->setRFarbe( 0xFFFFFFFF );
+    f->setRBreite( 1 );
+    f->setTitel( "Login" );
+    f->setTSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
+    f->setTSFarbe( 0xFFFFFFFF );
+    f->setTSSize( 12 );
+    f->setTAfFarbe( 0x1000FF00 );
+    f->setTAfStrength( -15 );
+    f->setTRFarbe( 0xFFFFFFFF );
+    f->setTRBreite( 1 );
+    f->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
+    f->zTTextFeld()->setSize( 0, 20 );
+    f->setSize( 300, 120 );
+
+    logout = new TextFeld();
+    logout->setStyle( TextFeld::Style::HCenter );
+    logout->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
+    logout->setSchriftFarbe( 0xFFFFFFFF );
+    logout->setSchriftSize( 12 );
+    logout->setText( "Möchtest du dich wirklich ausloggen?" );
+    logout->setSize( 300, 20 );
+    logout->setPosition( 0, 20 );
+    f->addMember( dynamic_cast<Zeichnung *>( logout->getThis() ) );
+
+    name = new TextFeld();
+    name->setStyle( TextFeld::Style::TextFeld );
+    name->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
+    name->setSchriftFarbe( 0xFFFFFFFF );
+    name->setSchriftSize( 12 );
+    name->setAlphaFeldFarbe( 0x1000FF00 );
+    name->setAlphaFeldStrength( -5 );
+    name->setTastaturEreignisParameter( this );
+    name->setTastaturEreignis( loginNameTastaturEreignis );
+    name->setSize( 200, 20 );
+    name->setPosition( 50, 10 );
+    name->setText( "Name" );
+    name->setRahmenFarbe( 0xFFFFFFFF );
+    name->setRahmenBreite( 1 );
+    f->addMember( dynamic_cast<Zeichnung *>( name->getThis() ) );
+
+    passwort = new TextFeld();
+    passwort->setStyle( TextFeld::Style::TextFeld );
+    passwort->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
+    passwort->setSchriftFarbe( 0xFFFFFFFF );
+    passwort->setSchriftSize( 12 );
+    passwort->setAlphaFeldFarbe( 0x1000FF00 );
+    passwort->setAlphaFeldStrength( -5 );
+    passwort->setTastaturEreignisParameter( this );
+    passwort->setTastaturEreignis( loginPasswortTastaturEreignis );
+    passwort->setSize( 200, 20 );
+    passwort->setPosition( 50, 40 );
+    passwort->setText( "Passwort" );
+    passwort->setRahmenFarbe( 0xFFFFFFFF );
+    passwort->setRahmenBreite( 1 );
+    f->addMember( dynamic_cast<Zeichnung *>( passwort->getThis() ) );
+
+    login = new Knopf();
+    login->setStyle( Knopf::Style::Normal );
+    login->setText( "Login" );
+    login->setSchriftZ( dynamic_cast<Schrift *>( s->getThis() ) );
+    login->setMausEreignisParameter( this );
+    login->setMausEreignis( loginLoginMausEreignis );
+    login->setSize( 150, 20 );
+    login->setPosition( 75, 70 );
+    f->addMember( dynamic_cast<Zeichnung *>( login->getThis() ) );
 }
 
 // Destruktor
 Login::~Login()
 {
-	if( fenster )
-		fenster->release();
-	f->release();
-	name->release();
-	passwort->release();
-	login->release();
-	if( account )
-		account->release();
-	logout->release();
-	iD->release();
-	rB->release();
-	schrift->release();
+    if( fenster )
+        fenster->release();
+    f->release();
+    name->release();
+    passwort->release();
+    login->release();
+    if( account )
+        account->release();
+    logout->release();
+    iD->release();
+    rB->release();
+    schrift->release();
 }
 
 // nicht constant
 void Login::setFenster( Fenster *f )
 {
-	if( fenster )
-		fenster->release();
-	this->f->setPosition( f->getBreite() / 2 - 150, f->getHeight() / 2 - 60 );
-	fenster = f;
+    if( fenster )
+        fenster->release();
+    this->f->setPosition( f->getBreite() / 2 - 150, f->getHeight() / 2 - 60 );
+    fenster = f;
 }
 
 void Login::setSichtbar( bool s )
 {
-	sichtbar = s;
-	if( s )
-	{
-		name->addStyle( TextFeld::Style::Fokus );
-		name->setAuswahl( name->zText()->getLength(), 0 );
-		fenster->addMember( f->getThis() );
-	}
-	else
-	{
-		fenster->removeMember( f );
-	}
+    sichtbar = s;
+    if( s )
+    {
+        name->addStyle( TextFeld::Style::Fokus );
+        name->setAuswahl( name->zText()->getLength(), 0 );
+        fenster->addMember( dynamic_cast<Zeichnung *>( f->getThis() ) );
+    }
+    else
+    {
+        fenster->removeMember( f );
+    }
 }
 
 bool Login::nameTastaturEreignis( void *obj, TastaturEreignis te )
 {
-	if( te.id == TE_Release )
-	{
-		if( te.taste == T_Enter || te.taste == T_Unten || te.taste == T_Tab )
-		{
-			name->removeStyle( TextFeld::Style::Fokus );
-			passwort->addStyle( TextFeld::Style::Fokus );
-			passwort->setAuswahl( passwort->zText()->getLength(), 0 );
-		}
-	}
-	return 1;
+    if( te.id == TE_Release )
+    {
+        if( te.taste == T_Enter || te.taste == T_Unten || te.taste == T_Tab )
+        {
+            name->removeStyle( TextFeld::Style::Fokus );
+            passwort->addStyle( TextFeld::Style::Fokus );
+            passwort->setAuswahl( passwort->zText()->getLength(), 0 );
+        }
+    }
+    return 1;
 }
 
 bool Login::passwortTastaturEreignis( void *obj, TastaturEreignis te )
 {
-	passwort->setSchowChar( '*' );
-	if( te.id == TE_Release )
-	{
-		if( te.taste == T_Enter )
-		{
-			passwort->removeStyle( TextFeld::Style::Fokus );
-			MausEreignis me;
-			me.id = ME_RLinks;
-			me.mx = login->getX() + 1;
-			me.my = login->getY() + 1;
-			me.verarbeitet = 0;
-			b->lock();
-			login->doPublicMausEreignis( me );
-			b->unlock();
-		}
-	}
-	return 1;
+    passwort->setSchowChar( '*' );
+    if( te.id == TE_Release )
+    {
+        if( te.taste == T_Enter )
+        {
+            passwort->removeStyle( TextFeld::Style::Fokus );
+            MausEreignis me;
+            me.id = ME_RLinks;
+            me.mx = login->getX() + 1;
+            me.my = login->getY() + 1;
+            me.verarbeitet = 0;
+            b->lock();
+            login->doPublicMausEreignis( me );
+            b->unlock();
+        }
+    }
+    return 1;
 }
 
 bool Login::loginMausEreignis( void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( f->zTitel()->istGleich( "Login" ) )
-		{
+    if( me.id == ME_RLinks )
+    {
+        if( f->zTitel()->istGleich( "Login" ) )
+        {
             MSKlient *msk = new MSKlient( iD->zWert( "MainServerIP" )->getText(), TextZuInt( iD->zWert( "MainServerPort" )->getText(), 10 ) );
             if( msk->login( name->zText()->getText(), passwort->zText()->getText() ) )
             {
@@ -277,78 +260,63 @@ bool Login::loginMausEreignis( void *obj, MausEreignis me )
                 login->setText( "Logout" );
                 zProg->renameAbschnitt( "Login", "Logout" );
                 // Abshnitte erstellen
-                PatchServer *psA = new PatchServer( schrift->getThis(), iD->getThis(), msk->getThis(), rB->getThis(), account->getThis(), b->getThis() );
+                PatchServer *psA = new PatchServer( dynamic_cast<Schrift *>( schrift->getThis() ), dynamic_cast<InitDatei *>( iD->getThis() ), dynamic_cast<MSKlient *>( msk->getThis() ), dynamic_cast<RessourceBild *>( rB->getThis() ), dynamic_cast<AdminAccount *>( account->getThis() ), dynamic_cast<Bildschirm *>( b->getThis() ) );
                 zProg->addAbschnitt( "Patch Server", psA );
-                Version *vA = new Version( schrift->getThis(), msk->getThis(), rB->getThis(), account->getThis(), b->getThis() );
+                Version *vA = new Version( dynamic_cast<Schrift *>( schrift->getThis() ), dynamic_cast<MSKlient *>( msk->getThis() ), dynamic_cast<RessourceBild *>( rB->getThis() ), dynamic_cast<AdminAccount *>( account->getThis() ), dynamic_cast<Bildschirm *>( b->getThis() ) );
                 zProg->addAbschnitt( "Version", vA );
                 zProg->abschnittAuswählen( "Patch Server" );
             }
             else
                 WMessageBox( 0, new Text( "Fehler" ), new Text( msk->getLetzterFehler() ), MB_ICONERROR );
             msk->release();
-		}
-		else
-		{
-			new AktionThread( 0, b, zProg );
-			f->setTitel( "Login" );
-			name->addStyle( TextFeld::Style::Sichtbar );
-			passwort->addStyle( TextFeld::Style::Sichtbar );
-			logout->removeStyle( TextFeld::Style::Sichtbar );
-			login->setText( "Login" );
-			account = account->release();
-			zProg->renameAbschnitt( "Logout", "Login" );
-			name->setText( "Name" );
-			passwort->setText( "Passwort" );
-			passwort->setSchowChar( 0 );
-		}
-	}
-	return 1;
+        }
+        else
+        {
+            new AktionThread( 0, b, zProg );
+            f->setTitel( "Login" );
+            name->addStyle( TextFeld::Style::Sichtbar );
+            passwort->addStyle( TextFeld::Style::Sichtbar );
+            logout->removeStyle( TextFeld::Style::Sichtbar );
+            login->setText( "Login" );
+            account = (AdminAccount *)account->release();
+            zProg->renameAbschnitt( "Logout", "Login" );
+            name->setText( "Name" );
+            passwort->setText( "Passwort" );
+            passwort->setSchowChar( 0 );
+        }
+    }
+    return 1;
 }
 
 // constant
 AdminAccount *Login::getAccount() const
 {
-	return account ? account->getThis() : 0;
+    return account ? dynamic_cast<AdminAccount *>( account->getThis() ) : 0;
 }
 
 AdminAccount *Login::zAccount() const
 {
-	return account;
-}
-
-// Reference Counting
-Abschnitt *Login::getThis()
-{
-	ref++;
-	return this;
-}
-
-Abschnitt *Login::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return account;
 }
 
 // Ereignisse
 bool loginNameTastaturEreignis( void *p, void *obj, TastaturEreignis te )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->nameTastaturEreignis( obj, te );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->nameTastaturEreignis( obj, te );
 }
 
 bool loginPasswortTastaturEreignis( void *p, void *obj, TastaturEreignis te )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->passwortTastaturEreignis( obj, te );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->passwortTastaturEreignis( obj, te );
 }
 
 bool loginLoginMausEreignis( void *p, void *obj, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Login*)p )->loginMausEreignis( obj, me );
+    if( !p )
+        return 0;
+    return ( (Login *)p )->loginMausEreignis( obj, me );
 }

+ 48 - 56
SMP/Programm/Login/Login.h

@@ -11,77 +11,69 @@
 class AktionThread : public Thread
 {
 private:
-	Bildschirm *zB;
-	Programm *zP;
-	int ak;
+    Bildschirm *zB;
+    Programm *zP;
+    int ak;
 
 public:
-	// Konstruktor
-	AktionThread( int ak, Bildschirm *zScreen, Programm *zProg );
-	// Destruktor
-	~AktionThread();
-	// nicht constant
-	virtual void thread();
-	// constant
+    // Konstruktor
+    AktionThread( int ak, Bildschirm *zScreen, Programm *zProg );
+    // Destruktor
+    ~AktionThread();
+    // nicht constant
+    virtual void thread();
+    // constant
 };
 
-class AdminAccount
+class AdminAccount : public virtual ReferenceCounter
 {
 private:
-	Text *name;
-	Text *passwort;
-	int ref;
+    Text *name;
+    Text *passwort;
 
 public:
-	// Konstruktor
-	AdminAccount( const char *name, const char *passwort );
-	// Destruktor
-	~AdminAccount();
-	// nicht constant
-	void login( const char *name, const char *passwort );
-	// constant
-	Text *getName() const;
-	Text *zName() const;
-	Text *getPasswort() const;
-	Text *zPasswort() const;
-	// Reference Counting
-	AdminAccount *getThis();
-	AdminAccount *release();
+    // Konstruktor
+    AdminAccount( const char *name, const char *passwort );
+    // Destruktor
+    ~AdminAccount();
+    // nicht constant
+    void login( const char *name, const char *passwort );
+    // constant
+    Text *getName() const;
+    Text *zName() const;
+    Text *getPasswort() const;
+    Text *zPasswort() const;
 };
 
 class Login : public Abschnitt
 {
 private:
-	Fenster *fenster;
-	Fenster *f;
-	TextFeld *logout;
-	TextFeld *name;
-	TextFeld *passwort;
-	Knopf *login;
-	AdminAccount *account;
-	Programm *zProg;
-	Schrift *schrift;
-	InitDatei *iD;
-	RessourceBild *rB;
-	int ref;
+    Fenster *fenster;
+    Fenster *f;
+    TextFeld *logout;
+    TextFeld *name;
+    TextFeld *passwort;
+    Knopf *login;
+    AdminAccount *account;
+    Programm *zProg;
+    Schrift *schrift;
+    InitDatei *iD;
+    RessourceBild *rB;
 
 public:
-	// Konstruktor
-	Login( Schrift *s, Programm *zP, InitDatei *iDat, RessourceBild *resB, Bildschirm *b );
-	// Destruktor
-	~Login();
-	// nicht constant
-	virtual void setFenster( Fenster *f );
-	virtual void setSichtbar( bool s );
-	bool nameTastaturEreignis( void *obj, TastaturEreignis te );
-	bool passwortTastaturEreignis( void *obj, TastaturEreignis te );
-	bool loginMausEreignis( void *obj, MausEreignis me );
-	// constant
-	AdminAccount *getAccount() const;
-	AdminAccount *zAccount() const;
-	// Reference Counting
-	virtual Abschnitt *getThis();
-	virtual Abschnitt *release();
+    // Konstruktor
+    Login( Schrift *s, Programm *zP, InitDatei *iDat, RessourceBild *resB, Bildschirm *b );
+    // Destruktor
+    ~Login();
+    // nicht constant
+    virtual void setFenster( Fenster *f );
+    virtual void setSichtbar( bool s );
+    bool nameTastaturEreignis( void *obj, TastaturEreignis te );
+    bool passwortTastaturEreignis( void *obj, TastaturEreignis te );
+    bool loginMausEreignis( void *obj, MausEreignis me );
+    // constant
+    AdminAccount *getAccount() const;
+    AdminAccount *zAccount() const;
 };
 
 // Ereignisse

+ 138 - 154
SMP/Programm/Programm.cpp

@@ -5,199 +5,183 @@
 // Inhalt der Programm Klasse aus Programm.h
 // Konstruktor
 Programm::Programm( Bildschirm *b, Schrift *s )
+    : ReferenceCounter()
 {
-	bildschirm = b;
-	schrift = s;
-
-	Punkt bg = b->getBackBufferSize();
-	kFenster = new Fenster();
-	kFenster->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::VScroll );
-	kFenster->setRFarbe( 0xFFFFFFFF );
-	kFenster->setRBreite( 1 );
-	kFenster->setPosition( bg.x - 200, 0 );
-	kFenster->setSize( 200, bg.y );
-	kFenster->setVSBMax( 0 );
-	bildschirm->addMember( kFenster );
-
-	mFenster = new Fenster();
-	mFenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
-	mFenster->setSize( bg.x - 200, bg.y );
-	bildschirm->addMember( mFenster );
-
-	auswahlRahmen = new LRahmen();
-	auswahlRahmen->setPosition( 0, -30 );
-	auswahlRahmen->setSize( 182, 30 );
-	auswahlRahmen->setRamenBreite( 1 );
-	auswahlRahmen->setFarbe( 0xFFFFFFFF );
-	kFenster->addMember( auswahlRahmen );
-
-	sichtbar = -1;
-
-	name = new RCArray< Text >();
-	knopf = new RCArray< Knopf >();
-	abschnitte = new RCArray< Abschnitt >();
-
-	abschnittAnzahl = 0;
-
-	ref = 1;
+    bildschirm = b;
+    schrift = s;
+
+    Punkt bg = b->getBackBufferSize();
+    kFenster = new Fenster();
+    kFenster->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::VScroll );
+    kFenster->setRFarbe( 0xFFFFFFFF );
+    kFenster->setRBreite( 1 );
+    kFenster->setPosition( bg.x - 200, 0 );
+    kFenster->setSize( 200, bg.y );
+    kFenster->setVSBMax( 0 );
+    bildschirm->addMember( kFenster );
+
+    mFenster = new Fenster();
+    mFenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
+    mFenster->setSize( bg.x - 200, bg.y );
+    bildschirm->addMember( mFenster );
+
+    auswahlRahmen = new LRahmen();
+    auswahlRahmen->setPosition( 0, -30 );
+    auswahlRahmen->setSize( 182, 30 );
+    auswahlRahmen->setRamenBreite( 1 );
+    auswahlRahmen->setFarbe( 0xFFFFFFFF );
+    kFenster->addMember( auswahlRahmen );
+
+    sichtbar = -1;
+
+    name = new RCArray< Text >();
+    knopf = new RCArray< Knopf >();
+    abschnitte = new RCArray< Abschnitt >();
+
+    abschnittAnzahl = 0;
 }
 
 // Destruktor
 Programm::~Programm()
 {
-	bildschirm->removeMember( kFenster );
-	bildschirm->removeMember( mFenster );
-	name->release();
-	knopf->release();
-	abschnitte->release();
-	bildschirm->release();
-	schrift->release();
+    bildschirm->removeMember( kFenster );
+    bildschirm->removeMember( mFenster );
+    name->release();
+    knopf->release();
+    abschnitte->release();
+    bildschirm->release();
+    schrift->release();
 }
 
 // nicht constant
 bool Programm::addAbschnitt( const char *name, Abschnitt *abschnitt )
 {
-	bool hat = 0;
-	for( int i = 0; i < abschnittAnzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			hat = 1;
-			break;
-		}
-	}
-	if( hat )
-	{
-		abschnitt->release();
-		return 0;
-	}
-	Knopf *k = new Knopf();
-	k->setStyle( Knopf::Style::Normal );
-	k->setSize( 150, 20 );
-	k->setPosition( 16, abschnittAnzahl * 30 + 5 );
-	k->setSchriftZ( schrift->getThis() );
-	k->setText( name );
-	k->setMausEreignisParameter( this );
-	k->setMausEreignis( programmAbschnittME );
-	kFenster->addMember( k->getThis() );
-
-	this->name->add( new Text( name ), abschnittAnzahl );
-	knopf->add( k, abschnittAnzahl );
-	abschnitte->add( abschnitt, abschnittAnzahl );
-	abschnittAnzahl++;
-
-	abschnitt->setFenster( (Fenster*)mFenster->getThis() );
-
-	if( sichtbar < 0 )
-	{
-		sichtbar = 0;
-		auswahlRahmen->setPosition( 0, 0 );
-		abschnitt->setSichtbar( 1 );
-	}
-	kFenster->setVSBMax( abschnittAnzahl * 30 );
-	return 1;
+    bool hat = 0;
+    for( int i = 0; i < abschnittAnzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            hat = 1;
+            break;
+        }
+    }
+    if( hat )
+    {
+        abschnitt->release();
+        return 0;
+    }
+    Knopf *k = new Knopf();
+    k->setStyle( Knopf::Style::Normal );
+    k->setSize( 150, 20 );
+    k->setPosition( 16, abschnittAnzahl * 30 + 5 );
+    k->setSchriftZ( dynamic_cast<Schrift *>( schrift->getThis() ) );
+    k->setText( name );
+    k->setMausEreignisParameter( this );
+    k->setMausEreignis( programmAbschnittME );
+    kFenster->addMember( dynamic_cast<Zeichnung *>( k->getThis() ) );
+
+    this->name->add( new Text( name ), abschnittAnzahl );
+    knopf->add( k, abschnittAnzahl );
+    abschnitte->add( abschnitt, abschnittAnzahl );
+    abschnittAnzahl++;
+
+    abschnitt->setFenster( dynamic_cast<Fenster *>( mFenster->getThis() ) );
+
+    if( sichtbar < 0 )
+    {
+        sichtbar = 0;
+        auswahlRahmen->setPosition( 0, 0 );
+        abschnitt->setSichtbar( 1 );
+    }
+    kFenster->setVSBMax( abschnittAnzahl * 30 );
+    return 1;
 }
 
 bool Programm::removeAbschnitt( const char *name )
 {
-	for( int i = 0; i < abschnittAnzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			if( sichtbar == i )
-				abschnitte->z( i )->setSichtbar( 0 );
-			this->name->remove( i );
-			kFenster->removeMember( knopf->z( i ) );
-			knopf->remove( i );
-			abschnitte->remove( i );
-			abschnittAnzahl--;
-			if( sichtbar >= abschnittAnzahl )
-				sichtbar = abschnittAnzahl - 1;
-			if( sichtbar > i )
-				sichtbar--;
-			if( sichtbar >= 0 && !abschnitte->z( sichtbar )->istSichtbar() )
-				abschnitte->z( i )->setSichtbar( 1 );
-			auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
-			kFenster->setVSBMax( abschnittAnzahl * 30 );
-			return 1;
-		}
-	}
-	return 0;
+    for( int i = 0; i < abschnittAnzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            if( sichtbar == i )
+                abschnitte->z( i )->setSichtbar( 0 );
+            this->name->remove( i );
+            kFenster->removeMember( knopf->z( i ) );
+            knopf->remove( i );
+            abschnitte->remove( i );
+            abschnittAnzahl--;
+            if( sichtbar >= abschnittAnzahl )
+                sichtbar = abschnittAnzahl - 1;
+            if( sichtbar > i )
+                sichtbar--;
+            if( sichtbar >= 0 && !abschnitte->z( sichtbar )->istSichtbar() )
+                abschnitte->z( i )->setSichtbar( 1 );
+            auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
+            kFenster->setVSBMax( abschnittAnzahl * 30 );
+            return 1;
+        }
+    }
+    return 0;
 }
 
 bool Programm::renameAbschnitt( const char *name, const char *newName )
 {
-	for( int i = 0; i < abschnittAnzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			this->name->z( i )->setText( newName );
-			knopf->z( i )->setText( newName );
-			return 1;
-		}
-	}
-	return 0;
+    for( int i = 0; i < abschnittAnzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            this->name->z( i )->setText( newName );
+            knopf->z( i )->setText( newName );
+            return 1;
+        }
+    }
+    return 0;
 }
 
 bool Programm::abschnittAuswählen( const char *name )
 {
-	for( int i = 0; i < abschnittAnzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			if( sichtbar == i )
-				break;
-			abschnitte->z( sichtbar )->setSichtbar( 0 );
-			sichtbar = i;
-			abschnitte->z( i )->setSichtbar( 1 );
-			auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
-			return 1;
-		}
-	}
-	return 0;
+    for( int i = 0; i < abschnittAnzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            if( sichtbar == i )
+                break;
+            abschnitte->z( sichtbar )->setSichtbar( 0 );
+            sichtbar = i;
+            abschnitte->z( i )->setSichtbar( 1 );
+            auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
+            return 1;
+        }
+    }
+    return 0;
 }
 
 bool Programm::abschnittMausEreignis( void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-		abschnittAuswählen( ( (Knopf*)obj )->zText()->getText() );
-	return 1;
+    if( me.id == ME_RLinks )
+        abschnittAuswählen( ( (Knopf *)obj )->zText()->getText() );
+    return 1;
 }
 
 // constant
 Text *Programm::getSichtbarAbschnittName() const
 {
-	if( sichtbar >= abschnittAnzahl )
-		return 0;
-	return name->get( sichtbar );
+    if( sichtbar >= abschnittAnzahl )
+        return 0;
+    return name->get( sichtbar );
 }
 
 Text *Programm::zSichtbarAbschnittName() const
 {
-	if( sichtbar >= abschnittAnzahl )
-		return 0;
-	return name->z( sichtbar );
-}
-
-// Reference Counting
-Programm *Programm::getThis()
-{
-	ref++;
-	return this;
-}
-
-Programm *Programm::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    if( sichtbar >= abschnittAnzahl )
+        return 0;
+    return name->z( sichtbar );
 }
 
 // Ereignis
 bool programmAbschnittME( void *p, void *obj, MausEreignis me )
 {
-	if( p )
-		return ( (Programm*)p )->abschnittMausEreignis( obj, me );
-	return 0;
+    if( p )
+        return ( (Programm *)p )->abschnittMausEreignis( obj, me );
+    return 0;
 }

+ 24 - 28
SMP/Programm/Programm.h

@@ -12,38 +12,34 @@
 
 using namespace Framework;
 
-class Programm
+class Programm : public virtual ReferenceCounter
 {
 private:
-	Bildschirm *bildschirm;
-	Schrift *schrift;
-	Fenster *kFenster;
-	Fenster *mFenster;
-	Rahmen *auswahlRahmen;
-	RCArray< Text > *name;
-	RCArray< Knopf > *knopf;
-	RCArray< Abschnitt > *abschnitte;
-	int abschnittAnzahl;
-	int sichtbar;
-	int ref;
+    Bildschirm *bildschirm;
+    Schrift *schrift;
+    Fenster *kFenster;
+    Fenster *mFenster;
+    Rahmen *auswahlRahmen;
+    RCArray< Text > *name;
+    RCArray< Knopf > *knopf;
+    RCArray< Abschnitt > *abschnitte;
+    int abschnittAnzahl;
+    int sichtbar;
 
 public:
-	// Konstruktor
-	Programm( Bildschirm *b, Schrift *s );
-	// Destruktor
-	~Programm();
-	// nicht constant
-	bool addAbschnitt( const char *name, Abschnitt *abschnitt );
-	bool removeAbschnitt( const char *name );
-	bool renameAbschnitt( const char *name, const char *newName );
-	bool abschnittAuswählen( const char *name );
-	bool abschnittMausEreignis( void *obj, MausEreignis me );
-	// constant
-	Text *getSichtbarAbschnittName() const;
-	Text *zSichtbarAbschnittName() const;
-	// Reference Counting
-	Programm *getThis();
-	Programm *release();
+    // Konstruktor
+    Programm( Bildschirm *b, Schrift *s );
+    // Destruktor
+    ~Programm();
+    // nicht constant
+    bool addAbschnitt( const char *name, Abschnitt *abschnitt );
+    bool removeAbschnitt( const char *name );
+    bool renameAbschnitt( const char *name, const char *newName );
+    bool abschnittAuswählen( const char *name );
+    bool abschnittMausEreignis( void *obj, MausEreignis me );
+    // constant
+    Text *getSichtbarAbschnittName() const;
+    Text *zSichtbarAbschnittName() const;
 };
 
 // Ereignis

+ 97 - 133
SMP/Programm/Server/Patch/PatchServer.cpp

@@ -70,7 +70,7 @@ void PSUpdate::thread()
     }
     Array< FileGroupInfo * > fileGroupList;
     psc->getFileGroupInfoList( &fileGroupList );
-    RCArray< ReferenceCounting< std::pair< int, Text > > > systemT;
+    Array< SystemInfo > systemT;
     psc->getSystemInfoList( &systemT );
     int gAnz = fileGroupList.getEintragAnzahl();
     for( int g = 0; g < gruppeAnzahl; g++ )
@@ -91,24 +91,24 @@ void PSUpdate::thread()
         int sAnz = systemT.getEintragAnzahl();
         for( int i = 0; i < sAnz; i++ ) // Prüfen, ob Lokale Version aktuell ist
         {
-            if( !systemInit->wertExistiert( systemT.z( i )->second ) )
+            if( !systemInit->wertExistiert( systemT.get( i ).name ) )
             {
                 systemInit->release();
                 zPSA->setUpdateFertig( 1, gruppeId[ g ] );
                 cont = 1;
                 break;
             }
-            Text *pfad = new Text( systemInit->zWert( (char *)systemT.z( i )->second )->getText() );
+            Text *pfad = new Text( systemInit->zWert( (char *)systemT.get( i ).name )->getText() );
             pfad->append( "/" );
-            RCArray< ReferenceCounting< FileInfo > > dateiT;
-            psc->getFileInfoList( systemT.z( i )->first, gruppeId[ g ], &dateiT );
+            Array< FileInfo > dateiT;
+            psc->getFileInfoList( systemT.get( i ).id, gruppeId[ g ], &dateiT );
             int dAnz = dateiT.getEintragAnzahl();
             bool br = 0;
             for( int j = 0; j < dAnz; j++ )
             {
                 Text *pf = new Text( pfad->getText() );
-                pf->append( dateiT.z( j )->path.getText() );
-                if( !DateiExistiert( pf->getThis() ) )
+                pf->append( dateiT.get( j ).path.getText() );
+                if( !DateiExistiert( pf->getText() ) )
                 {
                     pfad->release();
                     pf->release();
@@ -118,13 +118,13 @@ void PSUpdate::thread()
                     br = 1;
                     break;
                 }
-                if( !DateiIstVerzeichnis( pf->getThis() ) )
+                if( !DateiIstVerzeichnis( pf->getText() ) )
                 {
                     Datei *d = new Datei();
                     d->setDatei( pf->getText() );
                     Zeit *zeit = d->getLastChange();
                     d->release();
-                    if( !zeit->istGleich( "y-m-d h:i:s", dateiT.z( j )->time.getText() ) )
+                    if( !zeit->istGleich( "y-m-d h:i:s", dateiT.get( j ).time.getText() ) )
                     {
                         zeit->release();
                         pfad->release();
@@ -199,8 +199,8 @@ void PSUpdate::thread()
                     int system = 0;
                     for( int s = 0; s < sAnz; s++ )
                     {
-                        if( systemT.z( s )->second.istGleich( systemA->z( i )->getText() ) )
-                            system = systemT.z( s )->first;
+                        if( systemT.get( s ).name.istGleich( systemA->z( i )->getText() ) )
+                            system = systemT.get( s ).id;
                     }
                     psc->getFileVersion( dateiA->z( i )->z( j )->getText(), system, gruppeId[ g ], &version );
                     psc->lock();
@@ -209,10 +209,10 @@ void PSUpdate::thread()
                     psc->zKlient()->getNachricht( &ret, 1 );
                     if( ret == 1 )
                     {
-                        psc->zKlient()->sende( (char *)& system, 4 );
-                        psc->zKlient()->sende( (char *)& version, 4 );
+                        psc->zKlient()->sende( (char *)&system, 4 );
+                        psc->zKlient()->sende( (char *)&version, 4 );
                         short län = dateiA->z( i )->z( j )->getLength();
-                        psc->zKlient()->sende( (char *)& län, 2 );
+                        psc->zKlient()->sende( (char *)&län, 2 );
                         psc->zKlient()->sende( dateiA->z( i )->z( j )->getText(), län );
                         psc->zKlient()->getNachricht( &ret, 1 );
                         if( ret == 1 )
@@ -231,7 +231,7 @@ void PSUpdate::thread()
                                 }
                                 if( län < 0 )
                                     break;
-                                psc->zKlient()->sende( (char *)& län, 2 );
+                                psc->zKlient()->sende( (char *)&län, 2 );
                                 char *buff = new char[ län ];
                                 d->lese( buff, län );
                                 psc->zKlient()->sende( buff, län );
@@ -304,18 +304,10 @@ void PSUpdate::thread()
     run = 0;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *PSUpdate::release()
-{
-    if( ref == 2 && run )
-        ende();
-    return Thread::release();
-}
-
 
 // Inhalt der PSDetails Klasse aus PatchServer.h
 // Konstruktor
-PSDetails::PSDetails( PatchServer * zPSA, MSKlient * mk )
+PSDetails::PSDetails( PatchServer *zPSA, MSKlient *mk )
     : Thread()
 {
     this->zPSA = zPSA;
@@ -343,7 +335,7 @@ void PSDetails::thread()
     {
         Text *err = new Text( "Fehler: Server Rückgabe: " );
         err->append( mk->getLetzterFehler() );
-        zPSA->setServerDetails( id, ( char * )"", ( char * )"", 0, 0, 0, 0, -2, err );
+        zPSA->setServerDetails( id, (char *)"", (char *)"", 0, 0, 0, 0, -2, err );
     }
     else
     {
@@ -365,18 +357,10 @@ void PSDetails::thread()
     run = 0;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *PSDetails::release()
-{
-    if( ref == 2 && run )
-        ende();
-    return Thread::release();
-}
-
 
 // Inhalt der PSSuche Klasse aus PatchServer.h
 // Konstruktor
-PSSuche::PSSuche( PatchServer * zPSA, MSKlient * mk )
+PSSuche::PSSuche( PatchServer *zPSA, MSKlient *mk )
     : Thread()
 {
     this->zPSA = zPSA;
@@ -442,16 +426,8 @@ void PSSuche::thread()
     run = 0;
 }
 
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *PSSuche::release()
-{
-    if( ref == 2 && run )
-        ende();
-    return Thread::release();
-}
-
 
-TextFeld *getTabellenEintrag( const char *txt, Schrift * s, int farbe )
+TextFeld *getTabellenEintrag( const char *txt, Schrift *s, int farbe )
 {
     TextFeld *tmp = new TextFeld();
     tmp->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
@@ -464,7 +440,7 @@ TextFeld *getTabellenEintrag( const char *txt, Schrift * s, int farbe )
 
 // Inhalt der PatchServer Klasse aus PatchServer.h
 // Konstruktor
-PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceBild * rb, AdminAccount * acc, Bildschirm * b )
+PatchServer::PatchServer( Schrift *s, InitDatei *d, MSKlient *msk, RessourceBild *rb, AdminAccount *acc, Bildschirm *b )
     : Abschnitt( b )
 {
     fenster = 0;
@@ -479,7 +455,7 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     f->setRFarbe( 0xFFFFFFFF );
     f->setRBreite( 1 );
     f->setTitel( "Patch Server" );
-    f->setTSchriftZ( s ? s->getThis() : 0 );
+    f->setTSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     f->setTSFarbe( 0xFFFFFFFF );
     f->setTSSize( 12 );
     f->setTAfFarbe( 0x1000FF00 );
@@ -493,17 +469,17 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     liste = new Fenster();
     liste->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt );
     liste->setSize( 490, 255 );
-    f->addMember( liste->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( liste->getThis() ) );
 
     details = new Fenster();
     details->setStyle( Fenster::Style::Erlaubt );
     details->setSize( 490, 255 );
-    f->addMember( details->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( details->getThis() ) );
 
     updateF = new Fenster();
     updateF->setStyle( Fenster::Style::Erlaubt );
     updateF->setSize( 490, 255 );
-    f->addMember( updateF->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( updateF->getThis() ) );
 
     tabelle = new ObjTabelle();
     tabelle->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::VScroll | ObjTabelle::Style::Rahmen | ObjTabelle::Style::Raster | ObjTabelle::Style::Erlaubt );
@@ -530,14 +506,14 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     tabelle->setSpaltenBreite( 6, 20 );
     tabelle->addZeile( "Überschrifft" );
     tabelle->setZeilenHeight( 0, 20 );
-    tabelle->setZeichnungZ( 0, 0, getTabellenEintrag( "Id", s ? s->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 1, 0, getTabellenEintrag( "Name", s ? s->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 2, 0, getTabellenEintrag( "Ip", s ? s->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 3, 0, getTabellenEintrag( "Port", s ? s->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 4, 0, getTabellenEintrag( "APort", s ? s->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 5, 0, getTabellenEintrag( "Status", s ? s->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 0, 0, getTabellenEintrag( "Id", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 1, 0, getTabellenEintrag( "Name", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 2, 0, getTabellenEintrag( "Ip", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 3, 0, getTabellenEintrag( "Port", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 4, 0, getTabellenEintrag( "APort", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 5, 0, getTabellenEintrag( "Status", s ? dynamic_cast<Schrift *>( s->getThis() ) : 0, 0xFFFFFFFF ) );
     tabelle->setZeichnungZ( 6, 0, 0 );
-    liste->addMember( tabelle->getThis() );
+    liste->addMember( dynamic_cast<Zeichnung *>( tabelle->getThis() ) );
 
     aktualisieren = new Knopf();
     aktualisieren->setText( "" );
@@ -547,7 +523,7 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     aktualisieren->setSize( 20, 20 );
     aktualisieren->setMausEreignisParameter( this );
     aktualisieren->setMausEreignis( patchServerAktualisierenMausEreignis );
-    f->addMember( aktualisieren->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( aktualisieren->getThis() ) );
 
     weiter = new Knopf();
     weiter->setText( "" );
@@ -557,7 +533,7 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     weiter->setSize( 20, 20 );
     weiter->setMausEreignisParameter( this );
     weiter->setMausEreignis( patchServerWeiterMausEreignis );
-    f->addMember( weiter->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
 
     zurück = new Knopf();
     zurück->setText( "" );
@@ -567,81 +543,81 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     zurück->setSize( 20, 20 );
     zurück->setMausEreignisParameter( this );
     zurück->setMausEreignis( patchServerZurückMausEreignis );
-    f->addMember( zurück->getThis() );
+    f->addMember( dynamic_cast<Zeichnung *>( zurück->getThis() ) );
 
     serverId = new TextFeld();
     serverId->setStyle( TextFeld::Style::Sichtbar );
-    serverId->setSchriftZ( s ? s->getThis() : 0 );
+    serverId->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverId->setSchriftFarbe( 0xFFFFFFFF );
     serverId->setSchriftSize( 12 );
     serverId->setText( "ID: " );
     serverId->setSize( 100, 20 );
     serverId->setPosition( 10, 10 );
-    details->addMember( serverId->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverId->getThis() ) );
 
     serverName = new TextFeld();
     serverName->setStyle( TextFeld::Style::Sichtbar );
-    serverName->setSchriftZ( s ? s->getThis() : 0 );
+    serverName->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverName->setSchriftFarbe( 0xFFFFFFFF );
     serverName->setSchriftSize( 12 );
     serverName->setText( "Name: " );
     serverName->setSize( 150, 20 );
     serverName->setPosition( 120, 10 );
-    details->addMember( serverName->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverName->getThis() ) );
 
     serverIp = new TextFeld();
     serverIp->setStyle( TextFeld::Style::Sichtbar );
-    serverIp->setSchriftZ( s ? s->getThis() : 0 );
+    serverIp->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverIp->setSchriftFarbe( 0xFFFFFFFF );
     serverIp->setSchriftSize( 12 );
     serverIp->setText( "IP: " );
     serverIp->setSize( 120, 20 );
     serverIp->setPosition( 280, 10 );
-    details->addMember( serverIp->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverIp->getThis() ) );
 
     serverPort = new TextFeld();
     serverPort->setStyle( TextFeld::Style::Sichtbar );
-    serverPort->setSchriftZ( s ? s->getThis() : 0 );
+    serverPort->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverPort->setSchriftFarbe( 0xFFFFFFFF );
     serverPort->setSchriftSize( 12 );
     serverPort->setText( "Port: " );
     serverPort->setSize( 100, 20 );
     serverPort->setPosition( 10, 40 );
-    details->addMember( serverPort->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverPort->getThis() ) );
 
     serverAPort = new TextFeld();
     serverAPort->setStyle( TextFeld::Style::Sichtbar );
-    serverAPort->setSchriftZ( s ? s->getThis() : 0 );
+    serverAPort->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverAPort->setSchriftFarbe( 0xFFFFFFFF );
     serverAPort->setSchriftSize( 12 );
     serverAPort->setText( "Admin Port: " );
     serverAPort->setSize( 200, 20 );
     serverAPort->setPosition( 120, 40 );
-    details->addMember( serverAPort->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverAPort->getThis() ) );
 
     serverClients = new TextFeld();
     serverClients->setStyle( TextFeld::Style::Sichtbar );
-    serverClients->setSchriftZ( s ? s->getThis() : 0 );
+    serverClients->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverClients->setSchriftFarbe( 0xFFFFFFFF );
     serverClients->setSchriftSize( 12 );
     serverClients->setText( "Clients: " );
     serverClients->setSize( 100, 20 );
     serverClients->setPosition( 10, 70 );
-    details->addMember( serverClients->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverClients->getThis() ) );
 
     serverMaxClients = new TextFeld();
     serverMaxClients->setStyle( TextFeld::Style::Sichtbar );
-    serverMaxClients->setSchriftZ( s ? s->getThis() : 0 );
+    serverMaxClients->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverMaxClients->setSchriftFarbe( 0xFFFFFFFF );
     serverMaxClients->setSchriftSize( 12 );
     serverMaxClients->setText( "Max Clients: " );
     serverMaxClients->setSize( 80, 20 );
     serverMaxClients->setPosition( 120, 70 );
-    details->addMember( serverMaxClients->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverMaxClients->getThis() ) );
 
     maxClients = new TextFeld();
     maxClients->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-    maxClients->setSchriftZ( s ? s->getThis() : 0 );
+    maxClients->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     maxClients->setSchriftFarbe( 0xFFFFFFFF );
     maxClients->setSchriftSize( 12 );
     maxClients->setRahmenBreite( 1 );
@@ -654,87 +630,87 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     maxClients->setMausEreignis( _ret1ME );
     maxClients->setTastaturEreignisParameter( this );
     maxClients->setTastaturEreignis( patchServerMaxClientsTastaturEreignis );
-    details->addMember( maxClients->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( maxClients->getThis() ) );
 
     serverStatus = new TextFeld();
     serverStatus->setStyle( TextFeld::Style::Sichtbar );
-    serverStatus->setSchriftZ( s ? s->getThis() : 0 );
+    serverStatus->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverStatus->setSchriftFarbe( 0xFFFFFFFF );
     serverStatus->setSchriftSize( 12 );
     serverStatus->setText( "Status: " );
     serverStatus->setSize( 150, 20 );
     serverStatus->setPosition( 10, 100 );
-    details->addMember( serverStatus->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverStatus->getThis() ) );
 
     serverFehler = new TextFeld();
     serverFehler->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Mehrzeilig );
-    serverFehler->setSchriftZ( s ? s->getThis() : 0 );
+    serverFehler->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     serverFehler->setSchriftFarbe( 0xFFFFFFFF );
     serverFehler->setSchriftSize( 12 );
     serverFehler->setText( "" );
     serverFehler->setSize( 470, 60 );
     serverFehler->setPosition( 10, 130 );
-    details->addMember( serverFehler->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( serverFehler->getThis() ) );
 
     update = new Knopf();
     update->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     update->setText( "Update" );
-    update->setSchriftZ( s ? s->getThis() : 0 );
+    update->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     update->setMausEreignisParameter( this );
     update->setMausEreignis( patchServerUpdateMausEreignis );
     update->setSize( 80, 20 );
     update->setPosition( 400, 100 );
-    details->addMember( update->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( update->getThis() ) );
 
     pausieren = new Knopf();
     pausieren->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     pausieren->setText( "Pausieren" );
-    pausieren->setSchriftZ( s ? s->getThis() : 0 );
+    pausieren->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     pausieren->setMausEreignisParameter( this );
     pausieren->setMausEreignis( patchServerPausierenMausEreignis );
     pausieren->setSize( 80, 20 );
     pausieren->setPosition( 10, 200 );
-    details->addMember( pausieren->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( pausieren->getThis() ) );
 
     stoppen = new Knopf();
     stoppen->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     stoppen->setText( "Stoppen" );
-    stoppen->setSchriftZ( s ? s->getThis() : 0 );
+    stoppen->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     stoppen->setMausEreignisParameter( this );
     stoppen->setMausEreignis( patchServerStoppenMausEreignis );
     stoppen->setSize( 80, 20 );
     stoppen->setPosition( 100, 200 );
-    details->addMember( stoppen->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( stoppen->getThis() ) );
 
     beenden = new Knopf();
     beenden->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     beenden->setText( "Beenden" );
-    beenden->setSchriftZ( s ? s->getThis() : 0 );
+    beenden->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     beenden->setMausEreignisParameter( this );
     beenden->setMausEreignis( patchServerBeendenMausEreignis );
     beenden->setSize( 80, 20 );
     beenden->setPosition( 190, 200 );
-    details->addMember( beenden->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( beenden->getThis() ) );
 
     terminieren = new Knopf();
     terminieren->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     terminieren->setText( "Terminieren" );
-    terminieren->setSchriftZ( s ? s->getThis() : 0 );
+    terminieren->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     terminieren->setMausEreignisParameter( this );
     terminieren->setMausEreignis( patchServerTerminierenMausEreignis );
     terminieren->setSize( 80, 20 );
     terminieren->setPosition( 280, 200 );
-    details->addMember( terminieren->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( terminieren->getThis() ) );
 
     setMaxClients = new Knopf();
     setMaxClients->setStyle( Knopf::Style::Normal & ~Knopf::Style::Erlaubt );
     setMaxClients->setText( "set Max Clients" );
-    setMaxClients->setSchriftZ( s ? s->getThis() : 0 );
+    setMaxClients->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     setMaxClients->setMausEreignisParameter( this );
     setMaxClients->setMausEreignis( patchServerSetMaxClientsMausEreignis );
     setMaxClients->setSize( 110, 20 );
     setMaxClients->setPosition( 370, 200 );
-    details->addMember( setMaxClients->getThis() );
+    details->addMember( dynamic_cast<Zeichnung *>( setMaxClients->getThis() ) );
 
     updateT = new ObjTabelle();
     updateT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
@@ -753,17 +729,17 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     updateT->setSpaltenBreite( 3, 0 );
     updateT->addZeile( "Titel" );
     updateT->setZeilenHeight( 0, 20 );
-    TextFeld * uTN = new TextFeld();
+    TextFeld *uTN = new TextFeld();
     uTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-    uTN->setSchriftZ( s ? s->getThis() : 0 );
+    uTN->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     uTN->setSchriftFarbe( 0xFFFFFFFF );
     uTN->setSchriftSize( 12 );
     uTN->setRahmenFarbe( 0xFFFFFFFF );
     uTN->setText( "Name" );
     updateT->setZeichnungZ( 0, 0, uTN );
-    TextFeld * uTS = new TextFeld();
+    TextFeld *uTS = new TextFeld();
     uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-    uTS->setSchriftZ( s ? s->getThis() : 0 );
+    uTS->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     uTS->setSchriftFarbe( 0xFFFFFFFF );
     uTS->setSchriftSize( 12 );
     uTS->setRahmenFarbe( 0xFFFFFFFF );
@@ -771,31 +747,36 @@ PatchServer::PatchServer( Schrift * s, InitDatei * d, MSKlient * msk, RessourceB
     updateT->setZeichnungZ( 1, 0, uTS );
     updateT->setMausEreignis( _ret1ME );
     updateT->setTastaturEreignis( _ret1TE );
-    updateF->addMember( updateT->getThis() );
+    updateF->addMember( dynamic_cast<Zeichnung *>( updateT->getThis() ) );
 
     updateStarten = new Knopf();
     updateStarten->setStyle( Knopf::Style::Normal );
     updateStarten->setText( "Start" );
-    updateStarten->setSchriftZ( s ? s->getThis() : 0 );
+    updateStarten->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
     updateStarten->setMausEreignisParameter( this );
     updateStarten->setMausEreignis( patchServerUpdateStartenMausEreignis );
     updateStarten->setSize( 80, 20 );
     updateStarten->setPosition( 205, 200 );
-    updateF->addMember( updateStarten->getThis() );
+    updateF->addMember( dynamic_cast<Zeichnung *>( updateStarten->getThis() ) );
 
     obj = new Zeichnung();
 
-    suchen = new PSSuche( this, msk->getThis() );
-    getDetails = new PSDetails( this, msk->getThis() );
-    updateTh = new PSUpdate( this, account->getThis() );
+    suchen = new PSSuche( this, dynamic_cast<MSKlient *>( msk->getThis() ) );
+    getDetails = new PSDetails( this, dynamic_cast<MSKlient *>( msk->getThis() ) );
+    updateTh = new PSUpdate( this, dynamic_cast<AdminAccount *>( account->getThis() ) );
     if( rb )
         rb->release();
-    ref = 1;
 }
 
 // Destruktor
 PatchServer::~PatchServer()
 {
+    updateTh->warteAufThread( 10000 );
+    updateTh->ende();
+    getDetails->warteAufThread( 10000 );
+    getDetails->ende();
+    suchen->warteAufThread( 10000 );
+    suchen->ende();
     delete obj;
     if( psc )
     {
@@ -844,7 +825,7 @@ PatchServer::~PatchServer()
 }
 
 // nicht constant
-void PatchServer::setFenster( Fenster * f )
+void PatchServer::setFenster( Fenster *f )
 {
     if( fenster )
         fenster->release();
@@ -867,7 +848,7 @@ void PatchServer::setSichtbar( bool s )
             suchen->start();
         }
         if( fenster )
-            fenster->addMember( f->getThis() );
+            fenster->addMember( dynamic_cast<Zeichnung *>( f->getThis() ) );
     }
     else if( fenster )
         fenster->removeMember( f );
@@ -880,17 +861,17 @@ void PatchServer::addServer( int id, char *name, char *ip, int port, int adminPo
     tabelle->addZeile( txt->getText() );
     int y = tabelle->getZeilenNummer( txt->getText() );
     tabelle->setZeilenHeight( y, 20 );
-    tabelle->setZeichnungZ( 0, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 1, y, getTabellenEintrag( name, schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
-    tabelle->setZeichnungZ( 2, y, getTabellenEintrag( ip, schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 0, y, getTabellenEintrag( txt->getText(), schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 1, y, getTabellenEintrag( name, schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 2, y, getTabellenEintrag( ip, schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, 0xFFFFFFFF ) );
     txt->setText( "" );
     txt->append( port );
-    tabelle->setZeichnungZ( 3, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 3, y, getTabellenEintrag( txt->getText(), schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, 0xFFFFFFFF ) );
     txt->setText( "" );
     txt->append( adminPort );
-    tabelle->setZeichnungZ( 4, y, getTabellenEintrag( txt->getText(), schrift ? schrift->getThis() : 0, 0xFFFFFFFF ) );
+    tabelle->setZeichnungZ( 4, y, getTabellenEintrag( txt->getText(), schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, 0xFFFFFFFF ) );
     txt->release();
-    tabelle->setZeichnungZ( 5, y, getTabellenEintrag( status, schrift ? schrift->getThis() : 0, getColorFromStatus( status ) ) );
+    tabelle->setZeichnungZ( 5, y, getTabellenEintrag( status, schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0, getColorFromStatus( status ) ) );
     KontrollKnopf *knopf = new KontrollKnopf();
     knopf->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer );
     knopf->loadData( "data/bilder/icons.ltdb" );
@@ -899,7 +880,7 @@ void PatchServer::addServer( int id, char *name, char *ip, int port, int adminPo
     tabelle->setZeichnungZ( 6, y, knopf );
 }
 
-void PatchServer::setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text * error )
+void PatchServer::setServerDetails( int id, char *name, char *ip, int port, int adminPort, int clients, int maxClients, int status, Text *error )
 {
     if( !psc )
     {
@@ -1015,7 +996,7 @@ void PatchServer::setUpdateProzent( int prozent, int gruppe )
                 fb->setFBgFarbe( 0xFF00FF00 );
                 fb->setHintergrundFarbe( 0xFFFFFFFF );
                 fb->setSFarbe( 0xFF000000 );
-                fb->setSchriftZ( schrift ? schrift->getThis() : 0 );
+                fb->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
                 fb->setSSize( 12 );
                 fb->setRahmenBreite( 1 );
                 fb->setRahmenFarbe( 0xFF55FF55 );
@@ -1023,7 +1004,7 @@ void PatchServer::setUpdateProzent( int prozent, int gruppe )
                 fb->reset();
                 fb->setAktionAnzahl( 100 );
                 updateT->setZeichnungZ( 1, i, fb );
-                updateT->setZeichnungZ( 3, i, obj->getThis() );
+                updateT->setZeichnungZ( 3, i, dynamic_cast<Zeichnung *>( obj->getThis() ) );
                 updateT->unlockZeichnung();
             }
             ( (FBalken *)updateT->zZeichnung( 1, i ) )->reset();
@@ -1058,7 +1039,7 @@ void PatchServer::setUpdateFertig( bool error, int gruppe )
                 updateT->lockZeichnung();
                 TextFeld *uTS = new TextFeld();
                 uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-                uTS->setSchriftZ( schrift ? schrift->getThis() : 0 );
+                uTS->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
                 uTS->setSchriftSize( 12 );
                 uTS->setRahmenFarbe( 0xFFFFFFFF );
                 if( error )
@@ -1132,16 +1113,16 @@ bool PatchServer::aktualisierenMausEreignis( void *o, MausEreignis me )
                     updateT->addZeile( new Text( info->id ) );
                     TextFeld *uTN = new TextFeld();
                     uTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-                    uTN->setSchriftZ( schrift ? schrift->getThis() : 0 );
+                    uTN->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
                     uTN->setSchriftFarbe( 0xFFFFFFFF );
                     uTN->setSchriftSize( 12 );
                     uTN->setRahmenFarbe( 0xFFFFFFFF );
                     uTN->setText( info->name );
                     updateT->setZeichnungZ( 0, i + 1, uTN );
-                    TextFeld * uTS = new TextFeld();
+                    TextFeld *uTS = new TextFeld();
                     uTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
                     uTS->setRahmenFarbe( 0xFFFFFFFF );
-                    uTS->setSchriftZ( schrift ? schrift->getThis() : 0 );
+                    uTS->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
                     uTS->setSchriftSize( 12 );
                     if( info->status.istGleich( "Fehlt" ) )
                         uTS->setSchriftFarbe( 0xFFFF0000 );
@@ -1541,23 +1522,6 @@ void PatchServer::updateAll()
     std::cout << "Everything is up to date!\n";
 }
 
-// constant
-
-// Reference Counting
-Abschnitt * PatchServer::getThis()
-{
-    ref++;
-    return this;
-}
-
-Abschnitt *PatchServer::release()
-{
-    ref--;
-    if( !ref )
-        delete this;
-    return 0;
-}
-
 
 // Ereignisse
 bool patchServerAktualisierenMausEreignis( void *p, void *o, MausEreignis me )

+ 0 - 12
SMP/Programm/Server/Patch/PatchServer.h

@@ -33,8 +33,6 @@ public:
     void setServer( const char *ip, unsigned short port );
     void setUpdateListe( int gAnzahl, Array< int > *gId );
     virtual void thread();
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 class PSDetails : public Thread
@@ -52,8 +50,6 @@ public:
     // nicht constant
     void setServerId( int id );
     virtual void thread();
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 class PSSuche : public Thread
@@ -69,8 +65,6 @@ public:
     ~PSSuche();
     // nicht constant
     virtual void thread();
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
 };
 
 class PatchServer : public Abschnitt
@@ -112,7 +106,6 @@ private:
     Knopf *terminieren;
     Knopf *setMaxClients;
     Zeichnung *obj;
-    int ref;
 
 public:
     // Konstruktor
@@ -140,11 +133,6 @@ public:
     bool updateStartenMausEreignis( void *o, MausEreignis me );
     bool maxClientsTastaturEreignis( void *o, TastaturEreignis te );
     void updateAll();
-    // constant
-
-    // Reference Counting
-    virtual Abschnitt *getThis();
-    virtual Abschnitt *release();
 };
 
 // Ereignisse

+ 790 - 806
SMP/Programm/Version/Version.cpp

@@ -6,15 +6,15 @@
 // Inhalt der Version Klasse aus Version.h
 // Konstruktor
 Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *acc, Bildschirm *b )
-	: Abschnitt( b )
+    : Abschnitt( b )
 {
-	fenster = 0;
-	this->msc = msc;
-	account = acc;
-	schrift = s;
+    fenster = 0;
+    this->msc = msc;
+    account = acc;
+    schrift = s;
     psc = 0;
 
-    Array< ServerData* > list;
+    Array< ServerData * > list;
     if( msc->getPatchServerListe( &list ) )
     {
         int anz = list.getEintragAnzahl();
@@ -25,7 +25,7 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
             {
                 psc = new PSKlient( server->ip, server->adminPort );
                 if( !psc->verbinden() )
-                    psc = (PSKlient*)psc->release();
+                    psc = (PSKlient *)psc->release();
             }
             delete server;
         }
@@ -34,619 +34,618 @@ Version::Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *ac
         WMessageBox( 0, new Text( "Warnung" ), new Text( "Es wurde kein erreichbarer Patch Server gefunden. Es kann keine neue Version des Clients veröffentlicht werden." ), MB_ICONERROR );
     else
         psc->login( acc->zName()->getText(), acc->zPasswort()->getText() );
-	f = new Fenster();
-	f->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered );
-	f->setRFarbe( 0xFFFFFFFF );
-	f->setRBreite( 1 );
-	f->setTitel( "Version" );
-	f->setTSchriftZ( s ? s->getThis() : 0 );
-	f->setTSFarbe( 0xFFFFFFFF );
-	f->setTSSize( 12 );
-	f->setTAfFarbe( 0x1000FF00 );
-	f->setTAfStrength( -15 );
-	f->setTRFarbe( 0xFFFFFFFF );
-	f->setTRBreite( 1 );
-	f->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
-	f->zTTextFeld()->setSize( 0, 20 );
-	f->setSize( 700, 700 );
+    f = new Fenster();
+    f->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::Titel | Fenster::Style::TitelBuffered );
+    f->setRFarbe( 0xFFFFFFFF );
+    f->setRBreite( 1 );
+    f->setTitel( "Version" );
+    f->setTSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    f->setTSFarbe( 0xFFFFFFFF );
+    f->setTSSize( 12 );
+    f->setTAfFarbe( 0x1000FF00 );
+    f->setTAfStrength( -15 );
+    f->setTRFarbe( 0xFFFFFFFF );
+    f->setTRBreite( 1 );
+    f->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
+    f->zTTextFeld()->setSize( 0, 20 );
+    f->setSize( 700, 700 );
 
-	gruppeF = new Fenster();
-	gruppeF->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt );
-	gruppeF->setSize( 680, 640 );
-	gruppeF->setPosition( 10, 10 );
-	f->addMember( gruppeF->getThis() );
+    gruppeF = new Fenster();
+    gruppeF->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt );
+    gruppeF->setSize( 680, 640 );
+    gruppeF->setPosition( 10, 10 );
+    f->addMember( dynamic_cast<Zeichnung *>( gruppeF->getThis() ) );
 
-	gruppeT = new ObjTabelle();
-	gruppeT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
-	gruppeT->setVertikalKlickScroll( 10 );
-	gruppeT->setMausEreignis( _ret1ME );
-	gruppeT->setRahmenFarbe( 0xFFFFFFFF );
-	gruppeT->setSize( 680, 600 );
-	gruppeT->addSpalte( "Name" );
-	gruppeT->addSpalte( "Pfad" );
-	gruppeT->addSpalte( "Version" );
-	gruppeT->addSpalte( "Auswahl" );
-	gruppeT->setSpaltenBreite( 0, 285 );
-	gruppeT->setSpaltenBreite( 1, 285 );
-	gruppeT->setSpaltenBreite( 2, 68 );
-	gruppeT->setSpaltenBreite( 3, 22 );
-	gruppeT->addZeile( "Titel" );
-	gruppeT->setZeilenHeight( 0, 20 );
-	TextFeld *gTN = new TextFeld();
-	gTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTN->setSchriftZ( s ? s->getThis() : 0 );
-	gTN->setSchriftFarbe( 0xFFFFFFFF );
-	gTN->setSchriftSize( 12 );
-	gTN->setRahmenFarbe( 0xFFFFFFFF );
-	gTN->setText( "Name" );
-	gruppeT->setZeichnungZ( 0, 0, gTN );
-	TextFeld *gTP = new TextFeld();
-	gTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTP->setSchriftZ( s ? s->getThis() : 0 );
-	gTP->setSchriftFarbe( 0xFFFFFFFF );
-	gTP->setSchriftSize( 12 );
-	gTP->setRahmenFarbe( 0xFFFFFFFF );
-	gTP->setText( "Pfad" );
-	gruppeT->setZeichnungZ( 1, 0, gTP );
-	TextFeld *gTV = new TextFeld();
-	gTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	gTV->setSchriftZ( s ? s->getThis() : 0 );
-	gTV->setSchriftFarbe( 0xFFFFFFFF );
-	gTV->setSchriftSize( 12 );
-	gTV->setRahmenFarbe( 0xFFFFFFFF );
-	gTV->setText( "Version" );
-	gruppeT->setZeichnungZ( 2, 0, gTV );
-	gruppeT->setMausEreignis( _ret1ME );
-	gruppeT->setTastaturEreignis( _ret1TE );
-	gruppeF->addMember( gruppeT->getThis() );
+    gruppeT = new ObjTabelle();
+    gruppeT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
+    gruppeT->setVertikalKlickScroll( 10 );
+    gruppeT->setMausEreignis( _ret1ME );
+    gruppeT->setRahmenFarbe( 0xFFFFFFFF );
+    gruppeT->setSize( 680, 600 );
+    gruppeT->addSpalte( "Name" );
+    gruppeT->addSpalte( "Pfad" );
+    gruppeT->addSpalte( "Version" );
+    gruppeT->addSpalte( "Auswahl" );
+    gruppeT->setSpaltenBreite( 0, 285 );
+    gruppeT->setSpaltenBreite( 1, 285 );
+    gruppeT->setSpaltenBreite( 2, 68 );
+    gruppeT->setSpaltenBreite( 3, 22 );
+    gruppeT->addZeile( "Titel" );
+    gruppeT->setZeilenHeight( 0, 20 );
+    TextFeld *gTN = new TextFeld();
+    gTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    gTN->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    gTN->setSchriftFarbe( 0xFFFFFFFF );
+    gTN->setSchriftSize( 12 );
+    gTN->setRahmenFarbe( 0xFFFFFFFF );
+    gTN->setText( "Name" );
+    gruppeT->setZeichnungZ( 0, 0, gTN );
+    TextFeld *gTP = new TextFeld();
+    gTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    gTP->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    gTP->setSchriftFarbe( 0xFFFFFFFF );
+    gTP->setSchriftSize( 12 );
+    gTP->setRahmenFarbe( 0xFFFFFFFF );
+    gTP->setText( "Pfad" );
+    gruppeT->setZeichnungZ( 1, 0, gTP );
+    TextFeld *gTV = new TextFeld();
+    gTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    gTV->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    gTV->setSchriftFarbe( 0xFFFFFFFF );
+    gTV->setSchriftSize( 12 );
+    gTV->setRahmenFarbe( 0xFFFFFFFF );
+    gTV->setText( "Version" );
+    gruppeT->setZeichnungZ( 2, 0, gTV );
+    gruppeT->setMausEreignis( _ret1ME );
+    gruppeT->setTastaturEreignis( _ret1TE );
+    gruppeF->addMember( dynamic_cast<Zeichnung *>( gruppeT->getThis() ) );
 
-	neuGruppeName = new TextFeld();
-	neuGruppeName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuGruppeName->setSchriftZ( s ? s->getThis() : 0 );
-	neuGruppeName->setSchriftFarbe( 0xFFFFFFFF );
-	neuGruppeName->setSchriftSize( 12 );
-	neuGruppeName->setRahmenBreite( 1 );
-	neuGruppeName->setRahmenFarbe( 0xFFFFFFFF );
-	neuGruppeName->setAlphaFeldFarbe( 0x1000FF00 );
-	neuGruppeName->setAlphaFeldStrength( -5 );
-	neuGruppeName->setSize( 285, 20 );
-	neuGruppeName->setPosition( 40, 610 );
-	neuGruppeName->setMausEreignis( _ret1ME );
-	neuGruppeName->setTastaturEreignis( _ret1TE );
-	neuGruppeName->setText( "" );
-	gruppeF->addMember( neuGruppeName->getThis() );
+    neuGruppeName = new TextFeld();
+    neuGruppeName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
+    neuGruppeName->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    neuGruppeName->setSchriftFarbe( 0xFFFFFFFF );
+    neuGruppeName->setSchriftSize( 12 );
+    neuGruppeName->setRahmenBreite( 1 );
+    neuGruppeName->setRahmenFarbe( 0xFFFFFFFF );
+    neuGruppeName->setAlphaFeldFarbe( 0x1000FF00 );
+    neuGruppeName->setAlphaFeldStrength( -5 );
+    neuGruppeName->setSize( 285, 20 );
+    neuGruppeName->setPosition( 40, 610 );
+    neuGruppeName->setMausEreignis( _ret1ME );
+    neuGruppeName->setTastaturEreignis( _ret1TE );
+    neuGruppeName->setText( "" );
+    gruppeF->addMember( dynamic_cast<Zeichnung *>( neuGruppeName->getThis() ) );
 
-	neuGruppePfad = new TextFeld();
-	neuGruppePfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuGruppePfad->setSchriftZ( s ? s->getThis() : 0 );
-	neuGruppePfad->setSchriftFarbe( 0xFFFFFFFF );
-	neuGruppePfad->setSchriftSize( 12 );
-	neuGruppePfad->setRahmenBreite( 1 );
-	neuGruppePfad->setRahmenFarbe( 0xFFFFFFFF );
-	neuGruppePfad->setAlphaFeldFarbe( 0x1000FF00 );
-	neuGruppePfad->setAlphaFeldStrength( -5 );
-	neuGruppePfad->setSize( 285, 20 );
-	neuGruppePfad->setPosition( 330, 610 );
-	neuGruppePfad->setMausEreignis( _ret1ME );
-	neuGruppePfad->setTastaturEreignis( _ret1TE );
-	neuGruppePfad->setText( "" );
-	gruppeF->addMember( neuGruppePfad->getThis() );
+    neuGruppePfad = new TextFeld();
+    neuGruppePfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
+    neuGruppePfad->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    neuGruppePfad->setSchriftFarbe( 0xFFFFFFFF );
+    neuGruppePfad->setSchriftSize( 12 );
+    neuGruppePfad->setRahmenBreite( 1 );
+    neuGruppePfad->setRahmenFarbe( 0xFFFFFFFF );
+    neuGruppePfad->setAlphaFeldFarbe( 0x1000FF00 );
+    neuGruppePfad->setAlphaFeldStrength( -5 );
+    neuGruppePfad->setSize( 285, 20 );
+    neuGruppePfad->setPosition( 330, 610 );
+    neuGruppePfad->setMausEreignis( _ret1ME );
+    neuGruppePfad->setTastaturEreignis( _ret1TE );
+    neuGruppePfad->setText( "" );
+    gruppeF->addMember( dynamic_cast<Zeichnung *>( neuGruppePfad->getThis() ) );
 
-	neuGruppeK = new Knopf();
-	neuGruppeK->setText( "" );
-	neuGruppeK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	neuGruppeK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
-	neuGruppeK->setPosition( 625, 610 );
-	neuGruppeK->setSize( 20, 20 );
-	neuGruppeK->setMausEreignisParameter( this );
-	neuGruppeK->setMausEreignis( versionNeuGruppeKMausEreignis );
-	gruppeF->addMember( neuGruppeK->getThis() );
+    neuGruppeK = new Knopf();
+    neuGruppeK->setText( "" );
+    neuGruppeK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    neuGruppeK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
+    neuGruppeK->setPosition( 625, 610 );
+    neuGruppeK->setSize( 20, 20 );
+    neuGruppeK->setMausEreignisParameter( this );
+    neuGruppeK->setMausEreignis( versionNeuGruppeKMausEreignis );
+    gruppeF->addMember( dynamic_cast<Zeichnung *>( neuGruppeK->getThis() ) );
 
-	systemF = new Fenster();
-	systemF->setStyle( Fenster::Style::Erlaubt );
-	systemF->setSize( 680, 640 );
-	systemF->setPosition( 10, 10 );
-	f->addMember( systemF->getThis() );
+    systemF = new Fenster();
+    systemF->setStyle( Fenster::Style::Erlaubt );
+    systemF->setSize( 680, 640 );
+    systemF->setPosition( 10, 10 );
+    f->addMember( dynamic_cast<Zeichnung *>( systemF->getThis() ) );
 
-	systemInit = new InitDatei();
+    systemInit = new InitDatei();
 
-	systemT = new ObjTabelle();
-	systemT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
-	systemT->setVertikalKlickScroll( 10 );
-	systemT->setMausEreignis( _ret1ME );
-	systemT->setRahmenFarbe( 0xFFFFFFFF );
-	systemT->setSize( 680, 600 );
-	systemT->addSpalte( "Name" );
-	systemT->addSpalte( "Pfad" );
-	systemT->addSpalte( "Auswahl" );
-	systemT->setSpaltenBreite( 0, 150 );
-	systemT->setSpaltenBreite( 1, 490 );
-	systemT->setSpaltenBreite( 2, 22 );
-	systemT->addZeile( "Titel" );
-	systemT->setZeilenHeight( 0, 20 );
-	TextFeld *sTN = new TextFeld();
-	sTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	sTN->setSchriftZ( s ? s->getThis() : 0 );
-	sTN->setSchriftFarbe( 0xFFFFFFFF );
-	sTN->setSchriftSize( 12 );
-	sTN->setRahmenFarbe( 0xFFFFFFFF );
-	sTN->setText( "Name" );
-	systemT->setZeichnungZ( 0, 0, sTN );
-	TextFeld *sTP = new TextFeld();
-	sTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	sTP->setSchriftZ( s ? s->getThis() : 0 );
-	sTP->setSchriftFarbe( 0xFFFFFFFF );
-	sTP->setSchriftSize( 12 );
-	sTP->setRahmenFarbe( 0xFFFFFFFF );
-	sTP->setText( "Pfad" );
-	systemT->setZeichnungZ( 1, 0, sTP );
-	systemT->setMausEreignis( _ret1ME );
-	systemT->setTastaturEreignis( _ret1TE );
-	systemF->addMember( systemT->getThis() );
+    systemT = new ObjTabelle();
+    systemT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
+    systemT->setVertikalKlickScroll( 10 );
+    systemT->setMausEreignis( _ret1ME );
+    systemT->setRahmenFarbe( 0xFFFFFFFF );
+    systemT->setSize( 680, 600 );
+    systemT->addSpalte( "Name" );
+    systemT->addSpalte( "Pfad" );
+    systemT->addSpalte( "Auswahl" );
+    systemT->setSpaltenBreite( 0, 150 );
+    systemT->setSpaltenBreite( 1, 490 );
+    systemT->setSpaltenBreite( 2, 22 );
+    systemT->addZeile( "Titel" );
+    systemT->setZeilenHeight( 0, 20 );
+    TextFeld *sTN = new TextFeld();
+    sTN->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    sTN->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    sTN->setSchriftFarbe( 0xFFFFFFFF );
+    sTN->setSchriftSize( 12 );
+    sTN->setRahmenFarbe( 0xFFFFFFFF );
+    sTN->setText( "Name" );
+    systemT->setZeichnungZ( 0, 0, sTN );
+    TextFeld *sTP = new TextFeld();
+    sTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    sTP->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    sTP->setSchriftFarbe( 0xFFFFFFFF );
+    sTP->setSchriftSize( 12 );
+    sTP->setRahmenFarbe( 0xFFFFFFFF );
+    sTP->setText( "Pfad" );
+    systemT->setZeichnungZ( 1, 0, sTP );
+    systemT->setMausEreignis( _ret1ME );
+    systemT->setTastaturEreignis( _ret1TE );
+    systemF->addMember( dynamic_cast<Zeichnung *>( systemT->getThis() ) );
 
-	neuSystemName = new TextFeld();
-	neuSystemName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	neuSystemName->setSchriftZ( s ? s->getThis() : 0 );
-	neuSystemName->setSchriftFarbe( 0xFFFFFFFF );
-	neuSystemName->setSchriftSize( 12 );
-	neuSystemName->setRahmenBreite( 1 );
-	neuSystemName->setRahmenFarbe( 0xFFFFFFFF );
-	neuSystemName->setAlphaFeldFarbe( 0x1000FF00 );
-	neuSystemName->setAlphaFeldStrength( -5 );
-	neuSystemName->setSize( 490, 20 );
-	neuSystemName->setPosition( 80, 610 );
-	neuSystemName->setMausEreignis( _ret1ME );
-	neuSystemName->setTastaturEreignis( _ret1TE );
-	neuSystemName->setText( "" );
-	systemF->addMember( neuSystemName->getThis() );
+    neuSystemName = new TextFeld();
+    neuSystemName->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
+    neuSystemName->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    neuSystemName->setSchriftFarbe( 0xFFFFFFFF );
+    neuSystemName->setSchriftSize( 12 );
+    neuSystemName->setRahmenBreite( 1 );
+    neuSystemName->setRahmenFarbe( 0xFFFFFFFF );
+    neuSystemName->setAlphaFeldFarbe( 0x1000FF00 );
+    neuSystemName->setAlphaFeldStrength( -5 );
+    neuSystemName->setSize( 490, 20 );
+    neuSystemName->setPosition( 80, 610 );
+    neuSystemName->setMausEreignis( _ret1ME );
+    neuSystemName->setTastaturEreignis( _ret1TE );
+    neuSystemName->setText( "" );
+    systemF->addMember( dynamic_cast<Zeichnung *>( neuSystemName->getThis() ) );
 
-	neuSystemK = new Knopf();
-	neuSystemK->setText( "" );
-	neuSystemK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	neuSystemK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
-	neuSystemK->setPosition( 580, 610 );
-	neuSystemK->setSize( 20, 20 );
-	neuSystemK->setMausEreignisParameter( this );
-	neuSystemK->setMausEreignis( versionNeuSystemKMausEreignis );
-	systemF->addMember( neuSystemK->getThis() );
+    neuSystemK = new Knopf();
+    neuSystemK->setText( "" );
+    neuSystemK->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    neuSystemK->setHintergrundBildZ( rb ? rb->get( "neu.png" ) : 0 );
+    neuSystemK->setPosition( 580, 610 );
+    neuSystemK->setSize( 20, 20 );
+    neuSystemK->setMausEreignisParameter( this );
+    neuSystemK->setMausEreignis( versionNeuSystemKMausEreignis );
+    systemF->addMember( dynamic_cast<Zeichnung *>( neuSystemK->getThis() ) );
 
-	dateiF = new Fenster();
-	dateiF->setStyle( Fenster::Style::Erlaubt );
-	dateiF->setSize( 680, 640 );
-	dateiF->setPosition( 10, 10 );
-	f->addMember( dateiF->getThis() );
+    dateiF = new Fenster();
+    dateiF->setStyle( Fenster::Style::Erlaubt );
+    dateiF->setSize( 680, 640 );
+    dateiF->setPosition( 10, 10 );
+    f->addMember( dynamic_cast<Zeichnung *>( dateiF->getThis() ) );
 
-	dateiT = new ObjTabelle();
-	dateiT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
-	dateiT->setVertikalKlickScroll( 10 );
-	dateiT->setMausEreignis( _ret1ME );
-	dateiT->setRahmenFarbe( 0xFFFFFFFF );
-	dateiT->setSize( 680, 600 );
-	dateiT->addSpalte( "Pfad" );
-	dateiT->addSpalte( "Version" );
-	dateiT->addSpalte( "Status" );
-	dateiT->setSpaltenBreite( 0, 510 );
-	dateiT->setSpaltenBreite( 1, 50 );
-	dateiT->setSpaltenBreite( 2, 100 );
-	dateiT->addZeile( "Titel" );
-	dateiT->setZeilenHeight( 0, 20 );
-	TextFeld *dTP = new TextFeld();
-	dTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTP->setSchriftZ( s ? s->getThis() : 0 );
-	dTP->setSchriftFarbe( 0xFFFFFFFF );
-	dTP->setSchriftSize( 12 );
-	dTP->setRahmenFarbe( 0xFFFFFFFF );
-	dTP->setText( "Pfad" );
-	dateiT->setZeichnungZ( 0, 0, dTP );
-	TextFeld *dTV = new TextFeld();
-	dTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTV->setSchriftZ( s ? s->getThis() : 0 );
-	dTV->setSchriftFarbe( 0xFFFFFFFF );
-	dTV->setSchriftSize( 12 );
-	dTV->setRahmenFarbe( 0xFFFFFFFF );
-	dTV->setText( "Version" );
-	dateiT->setZeichnungZ( 1, 0, dTV );
-	TextFeld *dTS = new TextFeld();
-	dTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-	dTS->setSchriftZ( s ? s->getThis() : 0 );
-	dTS->setSchriftFarbe( 0xFFFFFFFF );
-	dTS->setSchriftSize( 12 );
-	dTS->setRahmenFarbe( 0xFFFFFFFF );
-	dTS->setText( "Status" );
-	dateiT->setZeichnungZ( 2, 0, dTS );
-	dateiF->addMember( dateiT->getThis() );
+    dateiT = new ObjTabelle();
+    dateiT->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | ObjTabelle::Style::VScroll );
+    dateiT->setVertikalKlickScroll( 10 );
+    dateiT->setMausEreignis( _ret1ME );
+    dateiT->setRahmenFarbe( 0xFFFFFFFF );
+    dateiT->setSize( 680, 600 );
+    dateiT->addSpalte( "Pfad" );
+    dateiT->addSpalte( "Version" );
+    dateiT->addSpalte( "Status" );
+    dateiT->setSpaltenBreite( 0, 510 );
+    dateiT->setSpaltenBreite( 1, 50 );
+    dateiT->setSpaltenBreite( 2, 100 );
+    dateiT->addZeile( "Titel" );
+    dateiT->setZeilenHeight( 0, 20 );
+    TextFeld *dTP = new TextFeld();
+    dTP->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    dTP->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    dTP->setSchriftFarbe( 0xFFFFFFFF );
+    dTP->setSchriftSize( 12 );
+    dTP->setRahmenFarbe( 0xFFFFFFFF );
+    dTP->setText( "Pfad" );
+    dateiT->setZeichnungZ( 0, 0, dTP );
+    TextFeld *dTV = new TextFeld();
+    dTV->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    dTV->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    dTV->setSchriftFarbe( 0xFFFFFFFF );
+    dTV->setSchriftSize( 12 );
+    dTV->setRahmenFarbe( 0xFFFFFFFF );
+    dTV->setText( "Version" );
+    dateiT->setZeichnungZ( 1, 0, dTV );
+    TextFeld *dTS = new TextFeld();
+    dTS->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+    dTS->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    dTS->setSchriftFarbe( 0xFFFFFFFF );
+    dTS->setSchriftSize( 12 );
+    dTS->setRahmenFarbe( 0xFFFFFFFF );
+    dTS->setText( "Status" );
+    dateiT->setZeichnungZ( 2, 0, dTS );
+    dateiF->addMember( dynamic_cast<Zeichnung *>( dateiT->getThis() ) );
 
-	commit = new Knopf();
-	commit->setStyle( Knopf::Style::Normal );
-	commit->setText( "Veröffentlichen" );
-	commit->setSchriftZ( s ? s->getThis() : 0 );
-	commit->setMausEreignisParameter( this );
-	commit->setMausEreignis( versionCommitMausEreignis );
-	commit->setSize( 100, 20 );
-	commit->setPosition( 290, 610 );
-	dateiF->addMember( commit->getThis() );
+    commit = new Knopf();
+    commit->setStyle( Knopf::Style::Normal );
+    commit->setText( "Veröffentlichen" );
+    commit->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    commit->setMausEreignisParameter( this );
+    commit->setMausEreignis( versionCommitMausEreignis );
+    commit->setSize( 100, 20 );
+    commit->setPosition( 290, 610 );
+    dateiF->addMember( dynamic_cast<Zeichnung *>( commit->getThis() ) );
 
-	fehlerF = new Fenster();
-	fehlerF->setStyle( Fenster::Style::Erlaubt );
-	fehlerF->setSize( 680, 640 );
-	fehlerF->setPosition( 10, 10 );
-	f->addMember( fehlerF->getThis() );
+    fehlerF = new Fenster();
+    fehlerF->setStyle( Fenster::Style::Erlaubt );
+    fehlerF->setSize( 680, 640 );
+    fehlerF->setPosition( 10, 10 );
+    f->addMember( dynamic_cast<Zeichnung *>( fehlerF->getThis() ) );
 
-	fehlerText = new TextFeld();
-	fehlerText->setStyle( TextFeld::Style::Text );
-	fehlerText->setSchriftZ( s ? s->getThis() : 0 );
-	fehlerText->setSchriftFarbe( 0xFFFFFFFF );
-	fehlerText->setSchriftSize( 12 );
-	fehlerText->setText( "" );
-	fehlerText->setSize( 680, 650 );
-	fehlerF->addMember( fehlerText->getThis() );
+    fehlerText = new TextFeld();
+    fehlerText->setStyle( TextFeld::Style::Text );
+    fehlerText->setSchriftZ( s ? dynamic_cast<Schrift *>( s->getThis() ) : 0 );
+    fehlerText->setSchriftFarbe( 0xFFFFFFFF );
+    fehlerText->setSchriftSize( 12 );
+    fehlerText->setText( "" );
+    fehlerText->setSize( 680, 650 );
+    fehlerF->addMember( dynamic_cast<Zeichnung *>( fehlerText->getThis() ) );
 
-	zurück = new Knopf();
-	zurück->setText( "" );
-	zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	zurück->setHintergrundBildZ( rb ? rb->get( "zurück.png" ) : 0 );
-	zurück->setPosition( 295, 650 );
-	zurück->setSize( 20, 20 );
-	zurück->setMausEreignisParameter( this );
-	zurück->setMausEreignis( versionZurückMausEreignis );
-	f->addMember( zurück->getThis() );
+    zurück = new Knopf();
+    zurück->setText( "" );
+    zurück->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    zurück->setHintergrundBildZ( rb ? rb->get( "zurück.png" ) : 0 );
+    zurück->setPosition( 295, 650 );
+    zurück->setSize( 20, 20 );
+    zurück->setMausEreignisParameter( this );
+    zurück->setMausEreignis( versionZurückMausEreignis );
+    f->addMember( dynamic_cast<Zeichnung *>( zurück->getThis() ) );
 
-	aktualisieren = new Knopf();
-	aktualisieren->setText( "" );
-	aktualisieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	aktualisieren->setHintergrundBildZ( rb ? rb->get( "neuladen.png" ) : 0 );
-	aktualisieren->setPosition( 325, 650 );
-	aktualisieren->setSize( 20, 20 );
-	aktualisieren->setMausEreignisParameter( this );
-	aktualisieren->setMausEreignis( versionAktualisierenMausEreignis );
-	f->addMember( aktualisieren->getThis() );
+    aktualisieren = new Knopf();
+    aktualisieren->setText( "" );
+    aktualisieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    aktualisieren->setHintergrundBildZ( rb ? rb->get( "neuladen.png" ) : 0 );
+    aktualisieren->setPosition( 325, 650 );
+    aktualisieren->setSize( 20, 20 );
+    aktualisieren->setMausEreignisParameter( this );
+    aktualisieren->setMausEreignis( versionAktualisierenMausEreignis );
+    f->addMember( dynamic_cast<Zeichnung *>( aktualisieren->getThis() ) );
 
-	speichern = new Knopf();
-	speichern->setText( "" );
-	speichern->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	speichern->setHintergrundBildZ( rb ? rb->get( "speichern.png" ) : 0 );
-	speichern->setPosition( 355, 650 );
-	speichern->setSize( 20, 20 );
-	speichern->setMausEreignisParameter( this );
-	speichern->setMausEreignis( versionSpeichernMausEreignis );
-	f->addMember( speichern->getThis() );
+    speichern = new Knopf();
+    speichern->setText( "" );
+    speichern->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    speichern->setHintergrundBildZ( rb ? rb->get( "speichern.png" ) : 0 );
+    speichern->setPosition( 355, 650 );
+    speichern->setSize( 20, 20 );
+    speichern->setMausEreignisParameter( this );
+    speichern->setMausEreignis( versionSpeichernMausEreignis );
+    f->addMember( dynamic_cast<Zeichnung *>( speichern->getThis() ) );
 
-	weiter = new Knopf();
-	weiter->setText( "" );
-	weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
-	weiter->setHintergrundBildZ( rb ? rb->get( "weiter.png" ) : 0 );
-	weiter->setPosition( 385, 650 );
-	weiter->setSize( 20, 20 );
-	weiter->setMausEreignisParameter( this );
-	weiter->setMausEreignis( versionWeiterMausEreignis );
-	f->addMember( weiter->getThis() );
+    weiter = new Knopf();
+    weiter->setText( "" );
+    weiter->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::HAlpha | Knopf::Style::KlickBuffer );
+    weiter->setHintergrundBildZ( rb ? rb->get( "weiter.png" ) : 0 );
+    weiter->setPosition( 385, 650 );
+    weiter->setSize( 20, 20 );
+    weiter->setMausEreignisParameter( this );
+    weiter->setMausEreignis( versionWeiterMausEreignis );
+    f->addMember( dynamic_cast<Zeichnung *>( weiter->getThis() ) );
 
-	sName = new Text( "" );
-	system = 0;
+    sName = new Text( "" );
+    system = 0;
 
     if( rb )
         rb->release();
-	ref = 1;
 }
 
 // Destruktor
 Version::~Version()
 {
-	if( fenster )
-	{
-		fenster->removeMember( f );
-		fenster->release();
-	}
-	account->release();
-	msc->release();
+    if( fenster )
+    {
+        fenster->removeMember( f );
+        fenster->release();
+    }
+    account->release();
+    msc->release();
     if( psc )
         psc->release();
-	f->release();
-	gruppeF->release();
-	gruppeT->release();
-	neuGruppeName->release();
-	neuGruppePfad->release();
-	neuGruppeK->release();
-	systemF->release();
-	systemInit->release();
-	systemT->release();
-	neuSystemName->release();
-	neuSystemK->release();
-	speichern->release();
-	weiter->release();
-	dateiF->release();
-	dateiT->release();
-	commit->release();
-	aktualisieren->release();
-	fehlerF->release();
-	fehlerText->release();
-	zurück->release();
+    f->release();
+    gruppeF->release();
+    gruppeT->release();
+    neuGruppeName->release();
+    neuGruppePfad->release();
+    neuGruppeK->release();
+    systemF->release();
+    systemInit->release();
+    systemT->release();
+    neuSystemName->release();
+    neuSystemK->release();
+    speichern->release();
+    weiter->release();
+    dateiF->release();
+    dateiT->release();
+    commit->release();
+    aktualisieren->release();
+    fehlerF->release();
+    fehlerText->release();
+    zurück->release();
     if( schrift )
         schrift->release();
-	sName->release();
+    sName->release();
 }
 
 // privat
-void Version::sucheDateien( const char *pfad, RCArray< ReferenceCounting< FileInfo > > &list )
+void Version::sucheDateien( const char *pfad, Array< FileInfo > &list )
 {
-	Datei *d = new Datei();
-	d->setDatei( pfad );
-	if( d->istOrdner() )
-	{
-		RCArray< Text > *liste = d->getDateiListe();
-		int anzahl = d->getUnterdateiAnzahl();
-		for( int i = 0; i < anzahl; i++ )
-		{
-			Text *p = new Text( pfad );
-			p->append( "/" );
-			p->append( liste->z( i )->getText() );
-			sucheDateien( p->getText(), list );
-			p->release();
-		}
-		liste->release();
-	}
-	d->release();
-	Text *pf = new Text( pfad );
-	pf->remove( systemInit->zWert( sName->getText() )->getText() );
-	pf->remove( 0, 1 );
-	if( !pf->getLength() )
-	{
-		pf->release();
-		return;
-	}
-	bool gefunden = 0;
+    Datei *d = new Datei();
+    d->setDatei( pfad );
+    if( d->istOrdner() )
+    {
+        RCArray< Text > *liste = d->getDateiListe();
+        int anzahl = d->getUnterdateiAnzahl();
+        for( int i = 0; i < anzahl; i++ )
+        {
+            Text *p = new Text( pfad );
+            p->append( "/" );
+            p->append( liste->z( i )->getText() );
+            sucheDateien( p->getText(), list );
+            p->release();
+        }
+        liste->release();
+    }
+    d->release();
+    Text *pf = new Text( pfad );
+    pf->remove( systemInit->zWert( sName->getText() )->getText() );
+    pf->remove( 0, 1 );
+    if( !pf->getLength() )
+    {
+        pf->release();
+        return;
+    }
+    bool gefunden = 0;
     int anz = list.getEintragAnzahl();
-	for( int i = 0; i < anz; i++ )
-	{
-		if( pf->istGleich( list.z( i )->path ) )
-		{
-			gefunden = 1;
-			break;
-		}
-	}
-	if( !gefunden )
-	{
-		dateiT->addZeile( "0" );
-		TextFeld *pfad = new TextFeld();
-		pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-		pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
-		pfad->setSchriftFarbe( 0xFFFFFFFF );
-		pfad->setSchriftSize( 12 );
-		pfad->setRahmenFarbe( 0xFFFFFFFF );
-		pfad->setText( pf->getText() );
-		dateiT->setZeichnungZ( 0, dateiT->getZeilenAnzahl() - 1, pfad );
-		TextFeld *version = new TextFeld();
-		version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-		version->setSchriftZ( schrift ? schrift->getThis() : 0 );
-		version->setSchriftFarbe( 0xFFFFFFFF );
-		version->setSchriftSize( 12 );
-		version->setRahmenFarbe( 0xFFFFFFFF );
-		version->setText( "0" );
-		dateiT->setZeichnungZ( 1, dateiT->getZeilenAnzahl() - 1, version );
-		TextFeld *status = new TextFeld();
-		status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-		status->setSchriftZ( schrift ? schrift->getThis() : 0 );
-		status->setSchriftFarbe( 0xFFFFFFFF );
-		status->setSchriftSize( 12 );
-		status->setRahmenFarbe( 0xFFFFFFFF );
-		status->setText( "Neu" );
-		dateiT->setZeichnungZ( 2, dateiT->getZeilenAnzahl() - 1, status );
-	}
-	pf->release();
+    for( int i = 0; i < anz; i++ )
+    {
+        if( pf->istGleich( list.get( i ).path ) )
+        {
+            gefunden = 1;
+            break;
+        }
+    }
+    if( !gefunden )
+    {
+        dateiT->addZeile( "0" );
+        TextFeld *pfad = new TextFeld();
+        pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+        pfad->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+        pfad->setSchriftFarbe( 0xFFFFFFFF );
+        pfad->setSchriftSize( 12 );
+        pfad->setRahmenFarbe( 0xFFFFFFFF );
+        pfad->setText( pf->getText() );
+        dateiT->setZeichnungZ( 0, dateiT->getZeilenAnzahl() - 1, pfad );
+        TextFeld *version = new TextFeld();
+        version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+        version->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+        version->setSchriftFarbe( 0xFFFFFFFF );
+        version->setSchriftSize( 12 );
+        version->setRahmenFarbe( 0xFFFFFFFF );
+        version->setText( "0" );
+        dateiT->setZeichnungZ( 1, dateiT->getZeilenAnzahl() - 1, version );
+        TextFeld *status = new TextFeld();
+        status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+        status->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+        status->setSchriftFarbe( 0xFFFFFFFF );
+        status->setSchriftSize( 12 );
+        status->setRahmenFarbe( 0xFFFFFFFF );
+        status->setText( "Neu" );
+        dateiT->setZeichnungZ( 2, dateiT->getZeilenAnzahl() - 1, status );
+    }
+    pf->release();
 }
 
 // nicht constant
 void Version::setFenster( Fenster *f )
 {
-	if( fenster )
-		fenster->release();
-	this->f->setPosition( f->getBreite() / 2 - this->f->getBreite() / 2, f->getHeight() / 2 - this->f->getHeight() / 2 );
-	fenster = f;
+    if( fenster )
+        fenster->release();
+    this->f->setPosition( f->getBreite() / 2 - this->f->getBreite() / 2, f->getHeight() / 2 - this->f->getHeight() / 2 );
+    fenster = f;
 }
 
 void Version::setSichtbar( bool s )
 {
-	sichtbar = s;
-	if( s )
-		fenster->addMember( f->getThis() );
-	else
-		fenster->removeMember( f );
+    sichtbar = s;
+    if( s )
+        fenster->addMember( dynamic_cast<Zeichnung *>( f->getThis() ) );
+    else
+        fenster->removeMember( f );
 }
 
 bool Version::neuGruppeKMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( neuGruppeName->zText()->getLength() )
-		{
-			/*if( !pgDb->neueDateiGruppeErstellen( neuGruppeName->zText()->getText(), neuGruppePfad->zText()->getText() ) )
-			{
-				fehlerText->setText( "Es ist ein Fehler aufgetreten. Siehe in den Logdateien nach für nähere\nInformationen." );
-				gruppeF->removeStyle( Fenster::Style::Sichtbar );
-				weiter->removeStyle( Knopf::Style::Erlaubt );
-				zurück->addStyle( Knopf::Style::Erlaubt );
-				aktualisieren->removeStyle( Knopf::Style::Erlaubt );
-				speichern->removeStyle( Knopf::Style::Erlaubt );
-				fehlerF->addStyle( Fenster::Style::Sichtbar );
-			}
-			else
-			{
-				neuGruppeName->setText( "" );
-				neuGruppeName->setAuswahl( 0, 0 );
-				neuGruppePfad->setText( "" );
-				neuGruppePfad->setAuswahl( 0, 0 );
-				aktualisierenMausEreignis( 0, me );
-			}*/
+    if( me.id == ME_RLinks )
+    {
+        if( neuGruppeName->zText()->getLength() )
+        {
+            /*if( !pgDb->neueDateiGruppeErstellen( neuGruppeName->zText()->getText(), neuGruppePfad->zText()->getText() ) )
+            {
+                fehlerText->setText( "Es ist ein Fehler aufgetreten. Siehe in den Logdateien nach für nähere\nInformationen." );
+                gruppeF->removeStyle( Fenster::Style::Sichtbar );
+                weiter->removeStyle( Knopf::Style::Erlaubt );
+                zurück->addStyle( Knopf::Style::Erlaubt );
+                aktualisieren->removeStyle( Knopf::Style::Erlaubt );
+                speichern->removeStyle( Knopf::Style::Erlaubt );
+                fehlerF->addStyle( Fenster::Style::Sichtbar );
+            }
+            else
+            {
+                neuGruppeName->setText( "" );
+                neuGruppeName->setAuswahl( 0, 0 );
+                neuGruppePfad->setText( "" );
+                neuGruppePfad->setAuswahl( 0, 0 );
+                aktualisierenMausEreignis( 0, me );
+            }*/
             WMessageBox( 0, new Text( "Warnung" ), new Text( "Diese Funktion ist momentan nicht implementiert. Nehmen sie die Änderungen manuell in der Datenbank vor." ), MB_ICONERROR );
-		}
-	}
-	return 1;
+        }
+    }
+    return 1;
 }
 
 bool Version::auswahlKnopfMausEreignis( void *o, MausEreignis me )
 {
-	if( !o )
-		return 0;
-	if( me.id == ME_RLinks )
-	{
-		if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			for( int i = 1; i < gruppeT->getZeilenAnzahl(); i++ )
-				( (KontrollKnopf*)gruppeT->zZeichnung( 3, i ) )->removeStyle( KontrollKnopf::Style::Selected );
-			weiter->addStyle( Knopf::Style::Erlaubt );
-		}
-		else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
-				( (KontrollKnopf*)systemT->zZeichnung( 2, i ) )->removeStyle( KontrollKnopf::Style::Selected );
-			weiter->addStyle( Knopf::Style::Erlaubt );
-		}
-	}
-	return 1;
+    if( !o )
+        return 0;
+    if( me.id == ME_RLinks )
+    {
+        if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            for( int i = 1; i < gruppeT->getZeilenAnzahl(); i++ )
+                ( (KontrollKnopf *)gruppeT->zZeichnung( 3, i ) )->removeStyle( KontrollKnopf::Style::Selected );
+            weiter->addStyle( Knopf::Style::Erlaubt );
+        }
+        else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
+                ( (KontrollKnopf *)systemT->zZeichnung( 2, i ) )->removeStyle( KontrollKnopf::Style::Selected );
+            weiter->addStyle( Knopf::Style::Erlaubt );
+        }
+    }
+    return 1;
 }
 
 bool Version::neuSystemKMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( neuSystemName->zText()->getLength() )
-		{
-			/*if( !pgDb->neuesSystemErstellen( neuSystemName->zText()->getText() ) )
-			{
-				fehlerText->setText( "Es ist ein Fehler aufgetreten. Siehe in den Logdateien nach für nähere\nInformationen." );
-				systemF->removeStyle( Fenster::Style::Sichtbar );
-				weiter->removeStyle( Knopf::Style::Erlaubt );
-				zurück->addStyle( Knopf::Style::Erlaubt );
-				aktualisieren->removeStyle( Knopf::Style::Erlaubt );
-				speichern->removeStyle( Knopf::Style::Erlaubt );
-				fehlerF->addStyle( Fenster::Style::Sichtbar );
-			}
-			else
-			{
-				neuSystemName->setText( "" );
-				neuSystemName->setAuswahl( 0, 0 );
-				aktualisierenMausEreignis( 0, me );
-			}*/
+    if( me.id == ME_RLinks )
+    {
+        if( neuSystemName->zText()->getLength() )
+        {
+            /*if( !pgDb->neuesSystemErstellen( neuSystemName->zText()->getText() ) )
+            {
+                fehlerText->setText( "Es ist ein Fehler aufgetreten. Siehe in den Logdateien nach für nähere\nInformationen." );
+                systemF->removeStyle( Fenster::Style::Sichtbar );
+                weiter->removeStyle( Knopf::Style::Erlaubt );
+                zurück->addStyle( Knopf::Style::Erlaubt );
+                aktualisieren->removeStyle( Knopf::Style::Erlaubt );
+                speichern->removeStyle( Knopf::Style::Erlaubt );
+                fehlerF->addStyle( Fenster::Style::Sichtbar );
+            }
+            else
+            {
+                neuSystemName->setText( "" );
+                neuSystemName->setAuswahl( 0, 0 );
+                aktualisierenMausEreignis( 0, me );
+            }*/
             WMessageBox( 0, new Text( "Warnung" ), new Text( "Diese Funktion ist momentan nicht implementiert. Nehmen sie die Änderungen manuell in der Datenbank vor." ), MB_ICONERROR );
-		}
-	}
-	return 1;
+        }
+    }
+    return 1;
 }
 
 bool Version::speichernMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		systemInit->removeAlle();
-		for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
-		{
-			systemInit->addWert( ( (TextFeld*)systemT->zZeichnung( 0, i ) )->zText()->getText(),
-								 ( (TextFeld*)systemT->zZeichnung( 1, i ) )->zText()->getText() );
-			systemInit->speichern();
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        systemInit->removeAlle();
+        for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
+        {
+            systemInit->addWert( ( (TextFeld *)systemT->zZeichnung( 0, i ) )->zText()->getText(),
+                                 ( (TextFeld *)systemT->zZeichnung( 1, i ) )->zText()->getText() );
+            systemInit->speichern();
+        }
+    }
+    return 1;
 }
 
 bool Version::weiterMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			for( int i = 1; i < gruppeT->getZeilenAnzahl(); i++ )
-			{
-				if( ( (KontrollKnopf*)gruppeT->zZeichnung( 3, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
-				{
-					gruppe = TextZuInt( gruppeT->zZeilenName( i )->getText(), 10 );
-					Text *pfad = new Text( "data/" );
-					pfad->append( ( (TextFeld*)gruppeT->zZeichnung( 0, i ) )->getText() );
-					pfad->append( ".ini" );
-					systemInit->setPfad( pfad );
-					systemInit->removeAlle();
-					systemInit->laden();
-					gruppeF->removeStyle( Fenster::Style::Sichtbar );
-					systemF->addStyle( Fenster::Style::Sichtbar );
-					speichern->addStyle( Knopf::Style::Erlaubt );
-					aktualisieren->addStyle( Knopf::Style::Erlaubt );
-					weiter->removeStyle( Knopf::Style::Erlaubt );
-					zurück->addStyle( Knopf::Style::Erlaubt );
-					aktualisierenMausEreignis( 0, me );
-					return 1;
-				}
-			}
-		}
-		else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
-			{
-				if( ( (KontrollKnopf*)systemT->zZeichnung( 2, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
-				{
-					sName->setText( ( (TextFeld*)systemT->zZeichnung( 0, i ) )->zText()->getText() );
-					system = TextZuInt( systemT->zZeilenName( i )->getText(), 10 );
-					systemF->removeStyle( Fenster::Style::Sichtbar );
-					speichern->removeStyle( Knopf::Style::Erlaubt );
-					aktualisieren->removeStyle( Knopf::Style::Erlaubt );
-					weiter->removeStyle( Knopf::Style::Erlaubt );
-					zurück->addStyle( Knopf::Style::Erlaubt );
-					if( !systemInit->wertExistiert( sName->getText() ) )
-					{
-						fehlerText->setText( "Der Pfad wurde für dieses System noch nicht gesetzt." );
-						fehlerF->addStyle( Fenster::Style::Sichtbar );
-						return 1;
-					}
-					if( !DateiExistiert( systemInit->getWert( sName->getText() ) ) || !DateiIstVerzeichnis( systemInit->getWert( sName->getText() ) ) )
-					{
-						fehlerText->setText( "Unter dem angegebenem Pfad wurde keine Datei gefunden." );
-						fehlerF->addStyle( Fenster::Style::Sichtbar );
-						return 1;
-					}
-					aktualisieren->addStyle( Knopf::Style::Erlaubt );
-					dateiF->addStyle( Fenster::Style::Sichtbar );
-					aktualisierenMausEreignis( 0, me );
-					return 1;
-				}
-			}
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            for( int i = 1; i < gruppeT->getZeilenAnzahl(); i++ )
+            {
+                if( ( (KontrollKnopf *)gruppeT->zZeichnung( 3, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+                {
+                    gruppe = TextZuInt( gruppeT->zZeilenName( i )->getText(), 10 );
+                    Text *pfad = new Text( "data/" );
+                    pfad->append( ( (TextFeld *)gruppeT->zZeichnung( 0, i ) )->getText() );
+                    pfad->append( ".ini" );
+                    systemInit->setPfad( pfad );
+                    systemInit->removeAlle();
+                    systemInit->laden();
+                    gruppeF->removeStyle( Fenster::Style::Sichtbar );
+                    systemF->addStyle( Fenster::Style::Sichtbar );
+                    speichern->addStyle( Knopf::Style::Erlaubt );
+                    aktualisieren->addStyle( Knopf::Style::Erlaubt );
+                    weiter->removeStyle( Knopf::Style::Erlaubt );
+                    zurück->addStyle( Knopf::Style::Erlaubt );
+                    aktualisierenMausEreignis( 0, me );
+                    return 1;
+                }
+            }
+        }
+        else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            for( int i = 1; i < systemT->getZeilenAnzahl(); i++ )
+            {
+                if( ( (KontrollKnopf *)systemT->zZeichnung( 2, i ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+                {
+                    sName->setText( ( (TextFeld *)systemT->zZeichnung( 0, i ) )->zText()->getText() );
+                    system = TextZuInt( systemT->zZeilenName( i )->getText(), 10 );
+                    systemF->removeStyle( Fenster::Style::Sichtbar );
+                    speichern->removeStyle( Knopf::Style::Erlaubt );
+                    aktualisieren->removeStyle( Knopf::Style::Erlaubt );
+                    weiter->removeStyle( Knopf::Style::Erlaubt );
+                    zurück->addStyle( Knopf::Style::Erlaubt );
+                    if( !systemInit->wertExistiert( sName->getText() ) )
+                    {
+                        fehlerText->setText( "Der Pfad wurde für dieses System noch nicht gesetzt." );
+                        fehlerF->addStyle( Fenster::Style::Sichtbar );
+                        return 1;
+                    }
+                    if( !DateiExistiert( systemInit->getWert( sName->getText() ) ) || !DateiIstVerzeichnis( systemInit->getWert( sName->getText() ) ) )
+                    {
+                        fehlerText->setText( "Unter dem angegebenem Pfad wurde keine Datei gefunden." );
+                        fehlerF->addStyle( Fenster::Style::Sichtbar );
+                        return 1;
+                    }
+                    aktualisieren->addStyle( Knopf::Style::Erlaubt );
+                    dateiF->addStyle( Fenster::Style::Sichtbar );
+                    aktualisierenMausEreignis( 0, me );
+                    return 1;
+                }
+            }
+        }
+    }
+    return 1;
 }
 
 bool Version::commitMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		/*if( !pgDb->adminHatRecht( account->getId(), Admin_Recht::LTCUpdate ) )
-		{
-			dateiF->removeStyle( Fenster::Style::Sichtbar );
-			aktualisieren->removeStyle( Knopf::Style::Erlaubt );
-			fehlerText->setText( "Du hast keine Berechtigung für diesen Vorgang." );
-			fehlerF->addStyle( Fenster::Style::Sichtbar );
-			zurück->addStyle( Knopf::Style::Erlaubt );
-			return 1;
-		}
-		if( pgDb->sindPatchServerOnline() )
-		{
-			dateiF->removeStyle( Fenster::Style::Sichtbar );
-			aktualisieren->removeStyle( Knopf::Style::Erlaubt );
-			fehlerText->setText( "Es müssen zunächst alle Patchserver herunterfahren." );
-			fehlerF->addStyle( Fenster::Style::Sichtbar );
-			zurück->addStyle( Knopf::Style::Erlaubt );
-			return 1;
-		}*/
-		aktualisierenMausEreignis( 0, me );
-		bool gU = 0;
-		for( int i = 1; i < dateiT->getZeilenAnzahl(); i++ )
-		{
-			if( ( (TextFeld*)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Veraltet" ) )
-			{ // datei ist Veraltet
-				Text *pfad = new Text( systemInit->zWert( sName->getText() )->getText() );
-				pfad->append( "/" );
-				pfad->append( ( (TextFeld*)dateiT->zZeichnung( 0, i ) )->zText()->getText() );
-				Datei *d = new Datei();
-				d->setDatei( pfad );
-				Zeit *zeit = d->getLastChange();
-                if( !psc || !psc->updateFile( ( (TextFeld*)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 1, zeit, system, gruppe ) )
+    if( me.id == ME_RLinks )
+    {
+        /*if( !pgDb->adminHatRecht( account->getId(), Admin_Recht::LTCUpdate ) )
+        {
+            dateiF->removeStyle( Fenster::Style::Sichtbar );
+            aktualisieren->removeStyle( Knopf::Style::Erlaubt );
+            fehlerText->setText( "Du hast keine Berechtigung für diesen Vorgang." );
+            fehlerF->addStyle( Fenster::Style::Sichtbar );
+            zurück->addStyle( Knopf::Style::Erlaubt );
+            return 1;
+        }
+        if( pgDb->sindPatchServerOnline() )
+        {
+            dateiF->removeStyle( Fenster::Style::Sichtbar );
+            aktualisieren->removeStyle( Knopf::Style::Erlaubt );
+            fehlerText->setText( "Es müssen zunächst alle Patchserver herunterfahren." );
+            fehlerF->addStyle( Fenster::Style::Sichtbar );
+            zurück->addStyle( Knopf::Style::Erlaubt );
+            return 1;
+        }*/
+        aktualisierenMausEreignis( 0, me );
+        bool gU = 0;
+        for( int i = 1; i < dateiT->getZeilenAnzahl(); i++ )
+        {
+            if( ( (TextFeld *)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Veraltet" ) )
+            { // datei ist Veraltet
+                Text *pfad = new Text( systemInit->zWert( sName->getText() )->getText() );
+                pfad->append( "/" );
+                pfad->append( ( (TextFeld *)dateiT->zZeichnung( 0, i ) )->zText()->getText() );
+                Datei *d = new Datei();
+                d->setDatei( pfad );
+                Zeit *zeit = d->getLastChange();
+                if( !psc || !psc->updateFile( ( (TextFeld *)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 1, zeit, system, gruppe ) )
                 {
                     dateiF->removeStyle( Fenster::Style::Sichtbar );
                     aktualisieren->removeStyle( Knopf::Style::Erlaubt );
@@ -661,14 +660,14 @@ bool Version::commitMausEreignis( void *o, MausEreignis me )
                     d->release();
                     return 1;
                 }
-				if( zeit )
-					zeit->release();
-				d->release();
-				gU = 1;
-			}
-			else if( ( (TextFeld*)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Gelöscht" ) )
-			{ // datei ist Gelöscht
-                if( !psc || !psc->updateFile( ( (TextFeld*)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 0, 0, system, gruppe ) )
+                if( zeit )
+                    zeit->release();
+                d->release();
+                gU = 1;
+            }
+            else if( ( (TextFeld *)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Gelöscht" ) )
+            { // datei ist Gelöscht
+                if( !psc || !psc->updateFile( ( (TextFeld *)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 0, 0, system, gruppe ) )
                 {
                     dateiF->removeStyle( Fenster::Style::Sichtbar );
                     aktualisieren->removeStyle( Knopf::Style::Erlaubt );
@@ -680,17 +679,17 @@ bool Version::commitMausEreignis( void *o, MausEreignis me )
                     zurück->addStyle( Knopf::Style::Erlaubt );
                     return 1;
                 }
-				gU = 1;
-			}
-			else if( ( (TextFeld*)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Neu" ) )
-			{ // datei ist Neu
-				Text *pfad = new Text( systemInit->zWert( sName->getText() )->getText() );
-				pfad->append( "/" );
-				pfad->append( ( (TextFeld*)dateiT->zZeichnung( 0, i ) )->zText()->getText() );
-				Datei *d = new Datei();
-				d->setDatei( pfad );
-				Zeit *zeit = d->getLastChange();
-                if( !psc || !psc->updateFile( ( (TextFeld*)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 2, zeit, system, gruppe ) )
+                gU = 1;
+            }
+            else if( ( (TextFeld *)dateiT->zZeichnung( 2, i ) )->zText()->istGleich( "Neu" ) )
+            { // datei ist Neu
+                Text *pfad = new Text( systemInit->zWert( sName->getText() )->getText() );
+                pfad->append( "/" );
+                pfad->append( ( (TextFeld *)dateiT->zZeichnung( 0, i ) )->zText()->getText() );
+                Datei *d = new Datei();
+                d->setDatei( pfad );
+                Zeit *zeit = d->getLastChange();
+                if( !psc || !psc->updateFile( ( (TextFeld *)dateiT->zZeichnung( 0, i ) )->zText()->getText(), 2, zeit, system, gruppe ) )
                 {
                     dateiF->removeStyle( Fenster::Style::Sichtbar );
                     aktualisieren->removeStyle( Knopf::Style::Erlaubt );
@@ -705,12 +704,12 @@ bool Version::commitMausEreignis( void *o, MausEreignis me )
                     d->release();
                     return 1;
                 }
-				if( zeit )
-					zeit->release();
-				d->release();
-				gU = 1;
-			}
-		}
+                if( zeit )
+                    zeit->release();
+                d->release();
+                gU = 1;
+            }
+        }
         if( gU )
         {
             if( !psc || !psc->dateiGruppeUpdate( gruppe ) )
@@ -726,17 +725,17 @@ bool Version::commitMausEreignis( void *o, MausEreignis me )
                 return 1;
             }
         }
-		aktualisierenMausEreignis( 0, me );
-	}
-	return 1;
+        aktualisierenMausEreignis( 0, me );
+    }
+    return 1;
 }
 
 bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
+    if( me.id == ME_RLinks )
+    {
+        if( gruppeF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
             if( !psc )
             {
                 gruppeF->removeStyle( Fenster::Style::Sichtbar );
@@ -746,53 +745,53 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
                 zurück->addStyle( Knopf::Style::Erlaubt );
                 return 1;
             }
-			for( int i = 1; i < gruppeT->getZeilenAnzahl(); )
-				gruppeT->removeZeile( i );
-            Array< FileGroupInfo* > list;
+            for( int i = 1; i < gruppeT->getZeilenAnzahl(); )
+                gruppeT->removeZeile( i );
+            Array< FileGroupInfo * > list;
             psc->getFileGroupInfoList( &list );
             int anz = list.getEintragAnzahl();
-			for( int i = 0; i < anz; i++ )
-			{
+            for( int i = 0; i < anz; i++ )
+            {
                 FileGroupInfo *fileGroup = list.get( i );
-				Text *zeile = new Text( "" );
-				zeile->append( fileGroup->id );
-				gruppeT->addZeile( i + 1, zeile );
-				TextFeld *name = new TextFeld();
-				name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				name->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				name->setSchriftFarbe( 0xFFFFFFFF );
-				name->setSchriftSize( 12 );
-				name->setRahmenFarbe( 0xFFFFFFFF );
-				name->setText( fileGroup->name );
-				gruppeT->setZeichnungZ( 0, i + 1, name );
-				TextFeld *pfad = new TextFeld();
-				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				pfad->setSchriftFarbe( 0xFFFFFFFF );
-				pfad->setSchriftSize( 12 );
-				pfad->setRahmenFarbe( 0xFFFFFFFF );
-				pfad->setText( fileGroup->path );
-				gruppeT->setZeichnungZ( 1, i + 1, pfad );
-				TextFeld *version = new TextFeld();
-				version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				version->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				version->setSchriftFarbe( 0xFFFFFFFF );
-				version->setSchriftSize( 12 );
-				version->setRahmenFarbe( 0xFFFFFFFF );
-				version->setText( Text( fileGroup->version ) );
-				gruppeT->setZeichnungZ( 2, i + 1, version );
-				KontrollKnopf *auswahl = new KontrollKnopf();
-				auswahl->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Rahmen );
-				auswahl->loadData( "data/bilder/icons.ltdb" );
-				auswahl->setMausEreignisParameter( this );
-				auswahl->setMausEreignis( versionAuswahlKnopfMausEreignis );
-				auswahl->setRahmenFarbe( 0xFFFFFFFF );
-				gruppeT->setZeichnungZ( 3, i + 1, auswahl );
+                Text *zeile = new Text( "" );
+                zeile->append( fileGroup->id );
+                gruppeT->addZeile( i + 1, zeile );
+                TextFeld *name = new TextFeld();
+                name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                name->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                name->setSchriftFarbe( 0xFFFFFFFF );
+                name->setSchriftSize( 12 );
+                name->setRahmenFarbe( 0xFFFFFFFF );
+                name->setText( fileGroup->name );
+                gruppeT->setZeichnungZ( 0, i + 1, name );
+                TextFeld *pfad = new TextFeld();
+                pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                pfad->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                pfad->setSchriftFarbe( 0xFFFFFFFF );
+                pfad->setSchriftSize( 12 );
+                pfad->setRahmenFarbe( 0xFFFFFFFF );
+                pfad->setText( fileGroup->path );
+                gruppeT->setZeichnungZ( 1, i + 1, pfad );
+                TextFeld *version = new TextFeld();
+                version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                version->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                version->setSchriftFarbe( 0xFFFFFFFF );
+                version->setSchriftSize( 12 );
+                version->setRahmenFarbe( 0xFFFFFFFF );
+                version->setText( Text( fileGroup->version ) );
+                gruppeT->setZeichnungZ( 2, i + 1, version );
+                KontrollKnopf *auswahl = new KontrollKnopf();
+                auswahl->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Rahmen );
+                auswahl->loadData( "data/bilder/icons.ltdb" );
+                auswahl->setMausEreignisParameter( this );
+                auswahl->setMausEreignis( versionAuswahlKnopfMausEreignis );
+                auswahl->setRahmenFarbe( 0xFFFFFFFF );
+                gruppeT->setZeichnungZ( 3, i + 1, auswahl );
                 delete fileGroup;
-			}
-		}
-		else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
+            }
+        }
+        else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
             if( !psc )
             {
                 gruppeF->removeStyle( Fenster::Style::Sichtbar );
@@ -802,46 +801,46 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
                 zurück->addStyle( Knopf::Style::Erlaubt );
                 return 1;
             }
-			for( int i = 1; i < systemT->getZeilenAnzahl(); )
-				systemT->removeZeile( i );
-            RCArray< ReferenceCounting< std::pair< int, Text > > > list;
-			psc->getSystemInfoList( &list );
+            for( int i = 1; i < systemT->getZeilenAnzahl(); )
+                systemT->removeZeile( i );
+            Array< SystemInfo > list;
+            psc->getSystemInfoList( &list );
             int anz = list.getEintragAnzahl();
-			for( int i = 0; i < anz; i++ )
-			{
-                ReferenceCounting< std::pair< int, Text > > *system = list.z( i );
-				Text *zeile = new Text( "" );
-				zeile->append( system->first );
-				systemT->addZeile( i + 1, zeile );
-				TextFeld *name = new TextFeld();
-				name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				name->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				name->setSchriftFarbe( 0xFFFFFFFF );
-				name->setSchriftSize( 12 );
-				name->setRahmenFarbe( 0xFFFFFFFF );
-				name->setText( system->second );
-				systemT->setZeichnungZ( 0, i + 1, name );
-				TextFeld *pfad = new TextFeld();
-				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				pfad->setText( "" );
-				if( systemInit->wertExistiert( system->second ) )
-					pfad->setText( systemInit->zWert( (char*)system->second )->getText() );
-				pfad->setSchriftFarbe( 0xFFFFFFFF );
-				pfad->setSchriftSize( 12 );
-				pfad->setRahmenFarbe( 0xFFFFFFFF );
-				systemT->setZeichnungZ( 1, i + 1, pfad );
-				KontrollKnopf *auswahl = new KontrollKnopf();
-				auswahl->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Rahmen );
-				auswahl->loadData( "data/bilder/icons.ltdb" );
-				auswahl->setMausEreignisParameter( this );
-				auswahl->setMausEreignis( versionAuswahlKnopfMausEreignis );
-				auswahl->setRahmenFarbe( 0xFFFFFFFF );
-				systemT->setZeichnungZ( 2, i + 1, auswahl );
-			}
-		}
-		else if( dateiF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
+            for( int i = 0; i < anz; i++ )
+            {
+                SystemInfo system = list.get( i );
+                Text *zeile = new Text( "" );
+                zeile->append( system.id );
+                systemT->addZeile( i + 1, zeile );
+                TextFeld *name = new TextFeld();
+                name->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                name->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                name->setSchriftFarbe( 0xFFFFFFFF );
+                name->setSchriftSize( 12 );
+                name->setRahmenFarbe( 0xFFFFFFFF );
+                name->setText( system.name );
+                systemT->setZeichnungZ( 0, i + 1, name );
+                TextFeld *pfad = new TextFeld();
+                pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                pfad->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                pfad->setText( "" );
+                if( systemInit->wertExistiert( system.name ) )
+                    pfad->setText( systemInit->zWert( (char *)system.name )->getText() );
+                pfad->setSchriftFarbe( 0xFFFFFFFF );
+                pfad->setSchriftSize( 12 );
+                pfad->setRahmenFarbe( 0xFFFFFFFF );
+                systemT->setZeichnungZ( 1, i + 1, pfad );
+                KontrollKnopf *auswahl = new KontrollKnopf();
+                auswahl->setStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Rahmen );
+                auswahl->loadData( "data/bilder/icons.ltdb" );
+                auswahl->setMausEreignisParameter( this );
+                auswahl->setMausEreignis( versionAuswahlKnopfMausEreignis );
+                auswahl->setRahmenFarbe( 0xFFFFFFFF );
+                systemT->setZeichnungZ( 2, i + 1, auswahl );
+            }
+        }
+        else if( dateiF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
             if( !psc )
             {
                 gruppeF->removeStyle( Fenster::Style::Sichtbar );
@@ -851,116 +850,116 @@ bool Version::aktualisierenMausEreignis( void *o, MausEreignis me )
                 zurück->addStyle( Knopf::Style::Erlaubt );
                 return 1;
             }
-			for( int i = 1; i < dateiT->getZeilenAnzahl(); )
-				dateiT->removeZeile( i );
-            RCArray< ReferenceCounting< FileInfo > > list;
+            for( int i = 1; i < dateiT->getZeilenAnzahl(); )
+                dateiT->removeZeile( i );
+            Array< FileInfo > list;
             psc->getFileInfoList( system, gruppe, &list );
             int anz = list.getEintragAnzahl();
-			for( int i = 0; i < anz; i++ )
-			{
-                ReferenceCounting< FileInfo > *info = list.z( i );
-				Text *zeile = new Text( "" );
-				zeile->append( info->id );
-				dateiT->addZeile( i + 1, zeile );
-				TextFeld *pfad = new TextFeld();
-				pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
-				pfad->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				pfad->setSchriftFarbe( 0xFFFFFFFF );
-				pfad->setSchriftSize( 12 );
-				pfad->setRahmenFarbe( 0xFFFFFFFF );
-				pfad->setText( info->path );
-				dateiT->setZeichnungZ( 0, i + 1, pfad );
-				TextFeld *version = new TextFeld();
-				version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-				version->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				version->setSchriftFarbe( 0xFFFFFFFF );
-				version->setSchriftSize( 12 );
-				version->setRahmenFarbe( 0xFFFFFFFF );
-				version->setText( Text( info->version ) );
-				dateiT->setZeichnungZ( 1, i + 1, version );
-				TextFeld *status = new TextFeld();
-				status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
-				status->setSchriftZ( schrift ? schrift->getThis() : 0 );
-				status->setSchriftSize( 12 );
-				status->setRahmenFarbe( 0xFFFFFFFF );
-				status->setText( "Aktuell" );
-				status->setSchriftFarbe( 0xFF00FF00 );
-				Text *pf = new Text( systemInit->zWert( sName->getText() )->getText() );
-				if( pf->getText()[ pf->getLength() - 1 ] != '/' )
-					pf->append( "/" );
-				pf->append( (char*)info->path );
-				if( !DateiExistiert( pf->getThis() ) )
-				{
-					status->setText( "Gelöscht" );
-					status->setSchriftFarbe( 0xFFFF0000 );
-				}
-				else
-				{
-					Datei *d = new Datei();
-					d->setDatei( pf->getText() );
-					if( !d->istOrdner() )
-					{
-						Zeit *lä = d->getLastChange();
-						if( !lä->istGleich( "y-m-d h:i:s", info->time ) )
-						{
-							status->setText( "Veraltet" );
-							status->setSchriftFarbe( 0xFFFFFF00 );
-						}
-						lä->release();
-					}
-					d->release();
-				}
-				pf->release();
-				dateiT->setZeichnungZ( 2, i + 1, status );
-			}
-			sucheDateien( systemInit->zWert( sName->getText() )->getText(), list );
-		}
-	}
-	return 1;
+            for( int i = 0; i < anz; i++ )
+            {
+                FileInfo info = list.get( i );
+                Text *zeile = new Text( "" );
+                zeile->append( info.id );
+                dateiT->addZeile( i + 1, zeile );
+                TextFeld *pfad = new TextFeld();
+                pfad->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::VCenter );
+                pfad->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                pfad->setSchriftFarbe( 0xFFFFFFFF );
+                pfad->setSchriftSize( 12 );
+                pfad->setRahmenFarbe( 0xFFFFFFFF );
+                pfad->setText( info.path );
+                dateiT->setZeichnungZ( 0, i + 1, pfad );
+                TextFeld *version = new TextFeld();
+                version->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+                version->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                version->setSchriftFarbe( 0xFFFFFFFF );
+                version->setSchriftSize( 12 );
+                version->setRahmenFarbe( 0xFFFFFFFF );
+                version->setText( Text( info.version ) );
+                dateiT->setZeichnungZ( 1, i + 1, version );
+                TextFeld *status = new TextFeld();
+                status->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Rahmen | TextFeld::Style::Center );
+                status->setSchriftZ( schrift ? dynamic_cast<Schrift *>( schrift->getThis() ) : 0 );
+                status->setSchriftSize( 12 );
+                status->setRahmenFarbe( 0xFFFFFFFF );
+                status->setText( "Aktuell" );
+                status->setSchriftFarbe( 0xFF00FF00 );
+                Text *pf = new Text( systemInit->zWert( sName->getText() )->getText() );
+                if( pf->getText()[ pf->getLength() - 1 ] != '/' )
+                    pf->append( "/" );
+                pf->append( (char *)info.path );
+                if( !DateiExistiert( pf->getText() ) )
+                {
+                    status->setText( "Gelöscht" );
+                    status->setSchriftFarbe( 0xFFFF0000 );
+                }
+                else
+                {
+                    Datei *d = new Datei();
+                    d->setDatei( pf->getText() );
+                    if( !d->istOrdner() )
+                    {
+                        Zeit *lä = d->getLastChange();
+                        if( !lä->istGleich( "y-m-d h:i:s", info.time ) )
+                        {
+                            status->setText( "Veraltet" );
+                            status->setSchriftFarbe( 0xFFFFFF00 );
+                        }
+                        lä->release();
+                    }
+                    d->release();
+                }
+                pf->release();
+                dateiT->setZeichnungZ( 2, i + 1, status );
+            }
+            sucheDateien( systemInit->zWert( sName->getText() )->getText(), list );
+        }
+    }
+    return 1;
 }
 
 bool Version::zurückMausEreignis( void *o, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( fehlerF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			fehlerF->removeStyle( Fenster::Style::Sichtbar );
-			dateiF->removeStyle( Fenster::Style::Sichtbar );
-			systemF->removeStyle( Fenster::Style::Sichtbar );
-			zurück->removeStyle( Knopf::Style::Erlaubt );
-			speichern->removeStyle( Knopf::Style::Erlaubt );
-			weiter->removeStyle( Knopf::Style::Erlaubt );
-			aktualisieren->addStyle( Knopf::Style::Erlaubt );
-			gruppeF->addStyle( Fenster::Style::Sichtbar );
-			aktualisierenMausEreignis( 0, me );
-		}
-		else if( dateiF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			fehlerF->removeStyle( Fenster::Style::Sichtbar );
-			dateiF->removeStyle( Fenster::Style::Sichtbar );
-			gruppeF->removeStyle( Fenster::Style::Sichtbar );
-			weiter->removeStyle( Knopf::Style::Erlaubt );
-			zurück->addStyle( Knopf::Style::Erlaubt );
-			speichern->addStyle( Knopf::Style::Erlaubt );
-			aktualisieren->addStyle( Knopf::Style::Erlaubt );
-			systemF->addStyle( Fenster::Style::Sichtbar );
-			aktualisierenMausEreignis( 0, me );
-		}
-		else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
-		{
-			fehlerF->removeStyle( Fenster::Style::Sichtbar );
-			dateiF->removeStyle( Fenster::Style::Sichtbar );
-			systemF->removeStyle( Fenster::Style::Sichtbar );
-			zurück->removeStyle( Knopf::Style::Erlaubt );
-			speichern->removeStyle( Knopf::Style::Erlaubt );
-			weiter->removeStyle( Knopf::Style::Erlaubt );
-			aktualisieren->addStyle( Knopf::Style::Erlaubt );
-			gruppeF->addStyle( Fenster::Style::Sichtbar );
-			aktualisierenMausEreignis( 0, me );
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        if( fehlerF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            fehlerF->removeStyle( Fenster::Style::Sichtbar );
+            dateiF->removeStyle( Fenster::Style::Sichtbar );
+            systemF->removeStyle( Fenster::Style::Sichtbar );
+            zurück->removeStyle( Knopf::Style::Erlaubt );
+            speichern->removeStyle( Knopf::Style::Erlaubt );
+            weiter->removeStyle( Knopf::Style::Erlaubt );
+            aktualisieren->addStyle( Knopf::Style::Erlaubt );
+            gruppeF->addStyle( Fenster::Style::Sichtbar );
+            aktualisierenMausEreignis( 0, me );
+        }
+        else if( dateiF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            fehlerF->removeStyle( Fenster::Style::Sichtbar );
+            dateiF->removeStyle( Fenster::Style::Sichtbar );
+            gruppeF->removeStyle( Fenster::Style::Sichtbar );
+            weiter->removeStyle( Knopf::Style::Erlaubt );
+            zurück->addStyle( Knopf::Style::Erlaubt );
+            speichern->addStyle( Knopf::Style::Erlaubt );
+            aktualisieren->addStyle( Knopf::Style::Erlaubt );
+            systemF->addStyle( Fenster::Style::Sichtbar );
+            aktualisierenMausEreignis( 0, me );
+        }
+        else if( systemF->hatStyle( Fenster::Style::Sichtbar ) )
+        {
+            fehlerF->removeStyle( Fenster::Style::Sichtbar );
+            dateiF->removeStyle( Fenster::Style::Sichtbar );
+            systemF->removeStyle( Fenster::Style::Sichtbar );
+            zurück->removeStyle( Knopf::Style::Erlaubt );
+            speichern->removeStyle( Knopf::Style::Erlaubt );
+            weiter->removeStyle( Knopf::Style::Erlaubt );
+            aktualisieren->addStyle( Knopf::Style::Erlaubt );
+            gruppeF->addStyle( Fenster::Style::Sichtbar );
+            aktualisierenMausEreignis( 0, me );
+        }
+    }
+    return 1;
 }
 
 void Version::commitAll()
@@ -1010,78 +1009,63 @@ void Version::commitAll()
 // constant
 InitDatei *Version::getSystemInit() const
 {
-	return systemInit->getThis();
-}
-
-// Reference Counting
-Abschnitt *Version::getThis()
-{
-	ref++;
-	return this;
-}
-
-Abschnitt *Version::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    return dynamic_cast<InitDatei *>( systemInit->getThis() );
 }
 
 
 // Ereignisse
 bool versionNeuGruppeKMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->neuGruppeKMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->neuGruppeKMausEreignis( o, me );
 }
 
 bool versionAuswahlKnopfMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->auswahlKnopfMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->auswahlKnopfMausEreignis( o, me );
 }
 
 bool versionNeuSystemKMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->neuSystemKMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->neuSystemKMausEreignis( o, me );
 }
 
 bool versionSpeichernMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->speichernMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->speichernMausEreignis( o, me );
 }
 
 bool versionWeiterMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->weiterMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->weiterMausEreignis( o, me );
 }
 
 bool versionCommitMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->commitMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->commitMausEreignis( o, me );
 }
 
 bool versionAktualisierenMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->aktualisierenMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->aktualisierenMausEreignis( o, me );
 }
 
 bool versionZurückMausEreignis( void *p, void *o, MausEreignis me )
 {
-	if( !p )
-		return 0;
-	return ( (Version*)p )->zurückMausEreignis( o, me );
+    if( !p )
+        return 0;
+    return ( (Version *)p )->zurückMausEreignis( o, me );
 }

+ 44 - 48
SMP/Programm/Version/Version.h

@@ -13,60 +13,56 @@
 class Version : public Abschnitt
 {
 private:
-	Fenster *fenster;
-	Fenster *f;
-	AdminAccount *account;
+    Fenster *fenster;
+    Fenster *f;
+    AdminAccount *account;
     MSKlient *msc;
     PSKlient *psc;
-	Fenster *gruppeF; // Gruppen Fenster
-	ObjTabelle *gruppeT; // Tabelle mit Gruppen
-	TextFeld *neuGruppeName; // Neue Gruppe erstellen Name Textfeld
-	TextFeld *neuGruppePfad; // Neue Gruppe erstellen Pfad Textfeld
-	Knopf *neuGruppeK; // neue Gruppe erstellen Knopf
-	Fenster *systemF; // System Fenster
-	InitDatei *systemInit; // Pfad zu den Systemen
-	ObjTabelle *systemT; // Tabelle mit Systemen
-	TextFeld *neuSystemName; // Neues System erstellen Name Textfeld
-	Knopf *neuSystemK; // neues System erstellen Knopf
-	Knopf *speichern; // Pfade zu den Systemen speichern
-	Knopf *weiter;
-	Fenster *dateiF; // Datei Fenster
-	ObjTabelle *dateiT; // Tabelle mit Dateien
-	Knopf *commit; // update Knopf
-	Knopf *aktualisieren;
-	Fenster *fehlerF;
-	TextFeld *fehlerText;
-	Knopf *zurück;
-	Schrift *schrift;
-	Text *sName;
-	int system;
-	int gruppe;
-	int ref;
+    Fenster *gruppeF; // Gruppen Fenster
+    ObjTabelle *gruppeT; // Tabelle mit Gruppen
+    TextFeld *neuGruppeName; // Neue Gruppe erstellen Name Textfeld
+    TextFeld *neuGruppePfad; // Neue Gruppe erstellen Pfad Textfeld
+    Knopf *neuGruppeK; // neue Gruppe erstellen Knopf
+    Fenster *systemF; // System Fenster
+    InitDatei *systemInit; // Pfad zu den Systemen
+    ObjTabelle *systemT; // Tabelle mit Systemen
+    TextFeld *neuSystemName; // Neues System erstellen Name Textfeld
+    Knopf *neuSystemK; // neues System erstellen Knopf
+    Knopf *speichern; // Pfade zu den Systemen speichern
+    Knopf *weiter;
+    Fenster *dateiF; // Datei Fenster
+    ObjTabelle *dateiT; // Tabelle mit Dateien
+    Knopf *commit; // update Knopf
+    Knopf *aktualisieren;
+    Fenster *fehlerF;
+    TextFeld *fehlerText;
+    Knopf *zurück;
+    Schrift *schrift;
+    Text *sName;
+    int system;
+    int gruppe;
 
-	void sucheDateien( const char *pfad, RCArray< ReferenceCounting< FileInfo > > &list );
+    void sucheDateien( const char *pfad, Array< FileInfo > &list );
 
 public:
-	// Konstruktor
-	Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *acc, Bildschirm *b );
-	// Destruktor
-	~Version();
-	// nicht constant
-	virtual void setFenster( Fenster *f );
-	virtual void setSichtbar( bool s );
-	bool neuGruppeKMausEreignis( void *o, MausEreignis me );
-	bool auswahlKnopfMausEreignis( void *o, MausEreignis me );
-	bool neuSystemKMausEreignis( void *o, MausEreignis me );
-	bool speichernMausEreignis( void *o, MausEreignis me );
-	bool weiterMausEreignis( void *o, MausEreignis me );
-	bool commitMausEreignis( void *o, MausEreignis me );
-	bool aktualisierenMausEreignis( void *o, MausEreignis me );
-	bool zurückMausEreignis( void *o, MausEreignis me );
+    // Konstruktor
+    Version( Schrift *s, MSKlient *msc, RessourceBild *rb, AdminAccount *acc, Bildschirm *b );
+    // Destruktor
+    ~Version();
+    // nicht constant
+    virtual void setFenster( Fenster *f );
+    virtual void setSichtbar( bool s );
+    bool neuGruppeKMausEreignis( void *o, MausEreignis me );
+    bool auswahlKnopfMausEreignis( void *o, MausEreignis me );
+    bool neuSystemKMausEreignis( void *o, MausEreignis me );
+    bool speichernMausEreignis( void *o, MausEreignis me );
+    bool weiterMausEreignis( void *o, MausEreignis me );
+    bool commitMausEreignis( void *o, MausEreignis me );
+    bool aktualisierenMausEreignis( void *o, MausEreignis me );
+    bool zurückMausEreignis( void *o, MausEreignis me );
     void commitAll();
-	// constant
-	InitDatei *getSystemInit() const;
-	// Reference Counting
-	virtual Abschnitt *getThis();
-	virtual Abschnitt *release();
+    // constant
+    InitDatei *getSystemInit() const;
 };
 
 // Ereignisse

+ 130 - 160
SMP/Ressourcen/Ressourcen.cpp

@@ -3,274 +3,244 @@
 // Inhalt der RessourceBild Klasse aus Ressource.h
 // Konstruktor
 RessourceBild::RessourceBild()
+    : ReferenceCounter()
 {
-	name = new RCArray< Text >();
-	bild = new RCArray< Bild >();
-	anzahl = 0;
-	ref = 1;
+    name = new RCArray< Text >();
+    bild = new RCArray< Bild >();
+    anzahl = 0;
 }
 
 // Destruktor
 RessourceBild::~RessourceBild()
 {
-	name->release();
-	bild->release();
+    name->release();
+    bild->release();
 }
 
 // nicht constant
 bool RessourceBild::add( Text *name, Bild *bild )
 {
-	bool ret = add( name->getText(), bild );
-	name->release();
-	return ret;
+    bool ret = add( name->getText(), bild );
+    name->release();
+    return ret;
 }
 
 bool RessourceBild::add( const char *name, Bild *bild )
 {
-	if( hat( name ) )
-	{
-		bild->release();
-		return 0;
-	}
-	this->name->add( new Text( name ), anzahl );
-	this->bild->add( bild, anzahl );
-	anzahl++;
-	return 1;
+    if( hat( name ) )
+    {
+        bild->release();
+        return 0;
+    }
+    this->name->add( new Text( name ), anzahl );
+    this->bild->add( bild, anzahl );
+    anzahl++;
+    return 1;
 }
 
 bool RessourceBild::remove( Text *name )
 {
-	bool ret = remove( name->getText() );
-	name->release();
-	return ret;
+    bool ret = remove( name->getText() );
+    name->release();
+    return ret;
 }
 
 bool RessourceBild::remove( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			this->name->remove( i );
-			bild->remove( i );
-			anzahl--;
-			return 1;
-		}
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            this->name->remove( i );
+            bild->remove( i );
+            anzahl--;
+            return 1;
+        }
+    }
+    return 0;
 }
 
 void RessourceBild::reset()
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		name->remove( 0 );
-		bild->remove( 0 );
-	}
-	anzahl = 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        name->remove( 0 );
+        bild->remove( 0 );
+    }
+    anzahl = 0;
 }
 
 // constant
 bool RessourceBild::hat( Text *name )
 {
-	bool ret = hat( name->getText() );
-	name->release();
-	return ret;
+    bool ret = hat( name->getText() );
+    name->release();
+    return ret;
 }
 
 bool RessourceBild::hat( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return 1;
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return 1;
+    }
+    return 0;
 }
 
 Bild *RessourceBild::get( Text *name )
 {
-	Bild *ret = get( name->getText() );
-	name->release();
-	return ret;
+    Bild *ret = get( name->getText() );
+    name->release();
+    return ret;
 }
 
 Bild *RessourceBild::get( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return this->bild->get( i );
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return this->bild->get( i );
+    }
+    return 0;
 }
 
 Bild *RessourceBild::z( Text *name )
 {
-	Bild *ret = z( name->getText() );
-	name->release();
-	return ret;
+    Bild *ret = z( name->getText() );
+    name->release();
+    return ret;
 }
 
 Bild *RessourceBild::z( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return this->bild->z( i );
-	}
-	return 0;
-}
-
-// Reference Counting
-RessourceBild *RessourceBild::getThis()
-{
-	ref++;
-	return this;
-}
-
-RessourceBild *RessourceBild::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return this->bild->z( i );
+    }
+    return 0;
 }
 
 
 // Inhalt der RessourceSchrift Klasse aus Ressource.h
 // Konstruktor
 RessourceSchrift::RessourceSchrift()
+    : ReferenceCounter()
 {
-	name = new RCArray< Text >();
-	schrift = new RCArray< Schrift >();
-	anzahl = 0;
-	ref = 1;
+    name = new RCArray< Text >();
+    schrift = new RCArray< Schrift >();
+    anzahl = 0;
 }
 
 // Destruktor
 RessourceSchrift::~RessourceSchrift()
 {
-	name->release();
-	schrift->release();
+    name->release();
+    schrift->release();
 }
 
 // nicht constant
 bool RessourceSchrift::add( Text *name, Schrift *schrift )
 {
-	bool ret = add( name->getText(), schrift );
-	name->release();
-	return ret;
+    bool ret = add( name->getText(), schrift );
+    name->release();
+    return ret;
 }
 
 bool RessourceSchrift::add( const char *name, Schrift *schrift )
 {
-	if( hat( name ) )
-	{
-		schrift->release();
-		return 0;
-	}
-	this->name->add( new Text( name ), anzahl );
-	this->schrift->add( schrift, anzahl );
-	anzahl++;
-	return 1;
+    if( hat( name ) )
+    {
+        schrift->release();
+        return 0;
+    }
+    this->name->add( new Text( name ), anzahl );
+    this->schrift->add( schrift, anzahl );
+    anzahl++;
+    return 1;
 }
 
 bool RessourceSchrift::remove( Text *name )
 {
-	bool ret = remove( name->getText() );
-	name->release();
-	return ret;
+    bool ret = remove( name->getText() );
+    name->release();
+    return ret;
 }
 
 bool RessourceSchrift::remove( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-		{
-			this->name->remove( i );
-			schrift->remove( i );
-			anzahl--;
-			return 1;
-		}
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+        {
+            this->name->remove( i );
+            schrift->remove( i );
+            anzahl--;
+            return 1;
+        }
+    }
+    return 0;
 }
 
 void RessourceSchrift::reset()
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		name->remove( 0 );
-		schrift->remove( 0 );
-	}
-	anzahl = 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        name->remove( 0 );
+        schrift->remove( 0 );
+    }
+    anzahl = 0;
 }
 
 // constant
 bool RessourceSchrift::hat( Text *name )
 {
-	bool ret = hat( name->getText() );
-	name->release();
-	return ret;
+    bool ret = hat( name->getText() );
+    name->release();
+    return ret;
 }
 
 bool RessourceSchrift::hat( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return 1;
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return 1;
+    }
+    return 0;
 }
 
 Schrift *RessourceSchrift::get( Text *name )
 {
-	Schrift *ret = get( name->getText() );
-	name->release();
-	return ret;
+    Schrift *ret = get( name->getText() );
+    name->release();
+    return ret;
 }
 
 Schrift *RessourceSchrift::get( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return this->schrift->get( i );
-	}
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return this->schrift->get( i );
+    }
+    return 0;
 }
 
 Schrift *RessourceSchrift::z( Text *name )
 {
-	Schrift *ret = z( name->getText() );
-	name->release();
-	return ret;
+    Schrift *ret = z( name->getText() );
+    name->release();
+    return ret;
 }
 
 Schrift *RessourceSchrift::z( const char *name )
 {
-	for( int i = 0; i < anzahl; i++ )
-	{
-		if( this->name->z( i )->istGleich( name ) )
-			return this->schrift->z( i );
-	}
-	return 0;
-}
-
-// Reference Counting
-RessourceSchrift *RessourceSchrift::getThis()
-{
-	ref++;
-	return this;
-}
-
-RessourceSchrift *RessourceSchrift::release()
-{
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    for( int i = 0; i < anzahl; i++ )
+    {
+        if( this->name->z( i )->istGleich( name ) )
+            return this->schrift->z( i );
+    }
+    return 0;
 }

+ 42 - 50
SMP/Ressourcen/Ressourcen.h

@@ -8,66 +8,58 @@
 
 using namespace Framework;
 
-class RessourceBild
+class RessourceBild : public virtual ReferenceCounter
 {
 private:
-	RCArray< Text > *name;
-	RCArray< Bild > *bild;
-	int anzahl;
-	int ref;
+    RCArray< Text > *name;
+    RCArray< Bild > *bild;
+    int anzahl;
 
 public:
-	// Konstruktor
-	RessourceBild();
-	// Destruktor
-	~RessourceBild();
-	// nicht constant
-	bool add( Text *name, Bild *bild );
-	bool add( const char *name, Bild *bild );
-	bool remove( Text *name );
-	bool remove( const char *name );
-	void reset();
-	// constant
-	bool hat( Text *name );
-	bool hat( const char *name );
-	Bild *get( Text *name );
-	Bild *get( const char *name );
-	Bild *z( Text *name );
-	Bild *z( const char *name );
-	// Reference Counting
-	RessourceBild *getThis();
-	RessourceBild *release();
+    // Konstruktor
+    RessourceBild();
+    // Destruktor
+    ~RessourceBild();
+    // nicht constant
+    bool add( Text *name, Bild *bild );
+    bool add( const char *name, Bild *bild );
+    bool remove( Text *name );
+    bool remove( const char *name );
+    void reset();
+    // constant
+    bool hat( Text *name );
+    bool hat( const char *name );
+    Bild *get( Text *name );
+    Bild *get( const char *name );
+    Bild *z( Text *name );
+    Bild *z( const char *name );
 };
 
-class RessourceSchrift
+class RessourceSchrift : public virtual ReferenceCounter
 {
 private:
-	RCArray< Text > *name;
-	RCArray< Schrift > *schrift;
-	int anzahl;
-	int ref;
+    RCArray< Text > *name;
+    RCArray< Schrift > *schrift;
+    int anzahl;
 
 public:
-	// Konstruktor
-	RessourceSchrift();
-	// Destruktor
-	~RessourceSchrift();
-	// nicht constant
-	bool add( Text *name, Schrift *schrift );
-	bool add( const char *name, Schrift *schrift );
-	bool remove( Text *name );
-	bool remove( const char *name );
-	void reset();
-	// constant
-	bool hat( Text *name );
-	bool hat( const char *name );
-	Schrift *get( Text *name );
-	Schrift *get( const char *name );
-	Schrift *z( Text *name );
-	Schrift *z( const char *name );
-	// Reference Counting
-	RessourceSchrift *getThis();
-	RessourceSchrift *release();
+    // Konstruktor
+    RessourceSchrift();
+    // Destruktor
+    ~RessourceSchrift();
+    // nicht constant
+    bool add( Text *name, Schrift *schrift );
+    bool add( const char *name, Schrift *schrift );
+    bool remove( Text *name );
+    bool remove( const char *name );
+    void reset();
+    // constant
+    bool hat( Text *name );
+    bool hat( const char *name );
+    Schrift *get( Text *name );
+    Schrift *get( const char *name );
+    Schrift *z( Text *name );
+    Schrift *z( const char *name );
 };
 
 #endif