ソースを参照

use framework reference counting and ui initialisation

Kolja Strohm 3 年 前
コミット
d7caf3e1db
6 ファイル変更810 行追加838 行削除
  1. 118 133
      patcher/News.cpp
  2. 14 16
      patcher/News.h
  3. 0 13
      patcher/Patcher.cpp
  4. 18 20
      patcher/Patcher.h
  5. 2 2
      patcher/patcher.vcxproj
  6. 658 654
      patcher/start.cpp

+ 118 - 133
patcher/News.cpp

@@ -9,89 +9,84 @@
 
 void KSGSRückruf( void *p, RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
 {
-	if( !p )
-		return;
-	( (News*)p )->rückruf( parameter, ret );
+    if( !p )
+        return;
+    ( (News *)p )->rückruf( parameter, ret );
 }
 
 // Inhalt der News Klasse aus News.h
 // Konstruktor
-News::News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client )
+News::News( UIInit &uiFactory, KSGClient::NewsServerClient *client )
     : Thread()
 {
     this->client = client;
-	// Ladeanimation laden
-	Animation2DData *aData = new Animation2DData();
-	LTDBDatei *aDatei = new LTDBDatei();
-	aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
-	aDatei->leseDaten( 0 );
-	aData->ladeAnimation( aDatei );
-	aData->setFPS( 30 );
-	aData->setWiederhohlend( 1 );
-	aData->setTransparent( 0 );
-	laden = new Animation2D();
-	laden->setPosition( zB->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
-	laden->setSize( 50, 50 );
-	laden->setAPS( 450 );
-	laden->setAnimationDataZ( aData );
-	laden->setRahmen( 1 );
-	laden->setRahmenBreite( 1 );
-	laden->setRahmenFarbe( 0xFFFFFFFF );
-	laden->setSichtbar( 0 );
-	zB->setOnTopZeichnung( laden->getThis() );
-	// Fehler Textfeld Initialisieren
-	fehler = new TextFeld();
-	fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar );
-	fehler->setPosition( 10, 60 );
-	fehler->setSize( 480, 312 );
-	fehler->setSchriftFarbe( 0xFFFFFFFF );
-	fehler->setSchriftZ( zS->getThis() );
-	fehler->setText( "Fehler beim Laden der Seite!\n" );
-	zB->addMember( fehler->getThis() );
-	// Startwerte Initialisieren
-	screen = zB->getThis();
-	schrift = zS->getThis();
-	// DLL Datei Laden
-	ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" );
-	if( !ksgsDll )
-	{ // Error
-		fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." );
-		fehler->addStyle( TextFeld::Style::Sichtbar );
-		laden->setSichtbar( 0 );
-		screen->setOnTop( 0 );
-		run = 0;
-		return;
-	}
-	KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION );
-	if( !getKSGSZeichnung )
-	{ // Error
-		fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." );
-		fehler->addStyle( TextFeld::Style::Sichtbar );
-		laden->setSichtbar( 0 );
-		screen->setOnTop( 0 );
-		run = 0;
-		return;
-	}
-	frame = getKSGSZeichnung();
-	if( !frame )
-	{ // Error
-		fehler->addZeile( "Unbekannter Fehler." );
-		fehler->addStyle( TextFeld::Style::Sichtbar );
-		laden->setSichtbar( 0 );
-		screen->setOnTop( 0 );
-		run = 0;
-		return;
-	}
-	frame->setSchriftZ( schrift->getThis() );
-	frame->setBildschirmZ( screen->getThis() );
-	frame->setPosition( 10, 60 );
-	frame->setSize( 480, 312 );
-	frame->setRückrufParam( this );
-	frame->setRückrufFunktion( KSGSRückruf );
-	screen->addMember( frame->getThis() );
-	scriptName = new Text( "Patcher/Start" );
-	// Lade Thread starten
-	start();
+    // Ladeanimation laden
+    Animation2DData *aData = new Animation2DData();
+    LTDBDatei *aDatei = new LTDBDatei();
+    aDatei->setDatei( new Text( "data/bilder/ladeanimation.ltdb" ) );
+    aDatei->leseDaten( 0 );
+    aData->ladeAnimation( aDatei );
+    aData->setFPS( 30 );
+    aData->setWiederhohlend( 1 );
+    aData->setTransparent( 0 );
+    laden = new Animation2D();
+    laden->setPosition( uiFactory.initParam.bildschirm->getBackBufferSize() / 2 - Punkt( 25, 25 ) );
+    laden->setSize( 50, 50 );
+    laden->setAPS( 450 );
+    laden->setAnimationDataZ( aData );
+    laden->setRahmen( 1 );
+    laden->setRahmenBreite( 1 );
+    laden->setRahmenFarbe( 0xFFFFFFFF );
+    laden->setSichtbar( 0 );
+    uiFactory.initParam.bildschirm->setOnTopZeichnung( dynamic_cast<Zeichnung *>( laden->getThis() ) );
+    // Fehler Textfeld Initialisieren
+    fehler = uiFactory.createTextFeld( uiFactory.initParam );
+    fehler->setStyle( TextFeld::Style::Text & ~TextFeld::Style::Sichtbar );
+    fehler->setPosition( 10, 60 );
+    fehler->setSize( 480, 312 );
+    fehler->setText( "Fehler beim Laden der Seite!\n" );
+    uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( fehler->getThis() ) );
+    // Startwerte Initialisieren
+    this->uiFactory = uiFactory;
+    // DLL Datei Laden
+    ksgsDll = LoadLibrary( "data/bin/KSGScript.dll" );
+    if( !ksgsDll )
+    { // Error
+        fehler->addZeile( "Die DLL Datei 'data/bin/KSGScript.dll' wurde nicht gefunden." );
+        fehler->addStyle( TextFeld::Style::Sichtbar );
+        laden->setSichtbar( 0 );
+        uiFactory.initParam.bildschirm->setOnTop( 0 );
+        run = 0;
+        return;
+    }
+    KSGSGetZeichnung getKSGSZeichnung = (KSGSGetZeichnung)GetProcAddress( ksgsDll, KSGS_START_FUNKTION );
+    if( !getKSGSZeichnung )
+    { // Error
+        fehler->addZeile( "Die Funktion '" KSGS_START_FUNKTION "' wurde in der\nDLL Datei 'data/bil/KSGScript.dll' nicht gefunden." );
+        fehler->addStyle( TextFeld::Style::Sichtbar );
+        laden->setSichtbar( 0 );
+        run = 0;
+        return;
+    }
+    frame = getKSGSZeichnung();
+    if( !frame )
+    { // Error
+        fehler->addZeile( "Unbekannter Fehler." );
+        fehler->addStyle( TextFeld::Style::Sichtbar );
+        laden->setSichtbar( 0 );
+        run = 0;
+        return;
+    }
+    frame->setSchriftZ( dynamic_cast<Schrift *>( uiFactory.initParam.schrift->getThis() ) );
+    frame->setBildschirmZ( dynamic_cast<Bildschirm *>( uiFactory.initParam.bildschirm->getThis() ) );
+    frame->setPosition( 10, 60 );
+    frame->setSize( 480, 312 );
+    frame->setCallbackParam( this );
+    frame->setCallbackFunktion( KSGSRückruf );
+    uiFactory.initParam.bildschirm->addMember( dynamic_cast<Zeichnung *>( frame->getThis() ) );
+    scriptName = new Text( "Patcher/Start" );
+    // Lade Thread starten
+    start();
 }
 
 // Destruktor
@@ -104,47 +99,45 @@ News::~News()
     }
     if( frame )
     {
-        frame->zurücksetzen();
+        frame->reset();
         frame->setBildschirmZ( 0 );
-        screen->removeMember( frame );
+        uiFactory.initParam.bildschirm->removeMember( frame );
         frame->release();
     }
-	if( ksgsDll )
-		FreeLibrary( ksgsDll );
-	if( scriptName )
-		scriptName->release();
-	laden->release();
-	screen->release();
-	fehler->release();
-	schrift->release();
+    if( ksgsDll )
+        FreeLibrary( ksgsDll );
+    if( scriptName )
+        scriptName->release();
+    laden->release();
+    fehler->release();
 }
 
 // nicht constant
 void News::rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret )
 {
-	if( isRunning() )
-		return;
-	KSGSVariable *bef = parameter->z( 0 );
-	if( !bef )
-		return;
-	Text *sn = bef->getText();
-	if( !sn || !sn->getLength() )
-	{
-		if( sn )
-			sn->release();
-		return;
-	}
-	scriptName->setText( sn->getText() );
-	sn->release();
-	start();
+    if( isRunning() )
+        return;
+    KSGSVariable *bef = parameter->z( 0 );
+    if( !bef )
+        return;
+    Text *sn = bef->getText();
+    if( !sn || !sn->getLength() )
+    {
+        if( sn )
+            sn->release();
+        return;
+    }
+    scriptName->setText( sn->getText() );
+    sn->release();
+    start();
 }
 
 void News::thread()
 {
-	screen->setOnTop( 1 );
-	laden->setSichtbar( 1 );
-	frame->zurücksetzen();
-	// KSGScript Seite Herunterladen
+    uiFactory.initParam.bildschirm->setOnTop( 1 );
+    laden->setSichtbar( 1 );
+    frame->reset();
+    // KSGScript Seite Herunterladen
     if( client )
     {
         if( !client->verbinde() )
@@ -152,7 +145,7 @@ void News::thread()
             fehler->addZeile( "Fehler beim verbinden mit dem News-Server." );
             fehler->addStyle( TextFeld::Style::Sichtbar );
             laden->setSichtbar( 0 );
-            screen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             return;
         }
         if( !client->ladeSeite( scriptName->getText() ) )
@@ -161,7 +154,7 @@ void News::thread()
             fehler->addZeile( "Die Seite konnte nicht herruntergeladen werden." );
             fehler->addStyle( TextFeld::Style::Sichtbar );
             laden->setSichtbar( 0 );
-            screen->setOnTop( 0 );
+            uiFactory.initParam.bildschirm->setOnTop( 0 );
             return;
         }
         client->trenne( 0 );
@@ -171,32 +164,24 @@ void News::thread()
         fehler->addZeile( "Es steht kein News Client zur Verfügung." );
         fehler->addStyle( TextFeld::Style::Sichtbar );
         laden->setSichtbar( 0 );
-        screen->setOnTop( 0 );
+        uiFactory.initParam.bildschirm->setOnTop( 0 );
         return;
     }
-	// KSGScript Laden
-	Text *pfad = new Text( "data/tmp/news/" );
-	pfad->append( scriptName->getText() );
-	pfad->append( "/seite.ksgs" );
-	frame->setScriptDatei( pfad );
-	if( !frame->neuLaden() )
-	{ // error
-		fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
-		fehler->addStyle( TextFeld::Style::Sichtbar );
-		laden->setSichtbar( 0 );
-		screen->setOnTop( 0 );
-		run = 0;
-		return;
-	}
-	laden->setSichtbar( 0 );
-	screen->setOnTop( 0 );
-	run = 0;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *News::release()
-{
-    if( ref == 2 && run )
-        warteAufThread( INFINITE );
-    return Thread::release();
+    // KSGScript Laden
+    Text *pfad = new Text( "data/tmp/news/" );
+    pfad->append( scriptName->getText() );
+    pfad->append( "/seite.ksgs" );
+    frame->setScriptDatei( pfad );
+    if( !frame->neuLaden() )
+    { // error
+        fehler->addZeile( "Es befindet sich ein Scriptfehler auf dieser Seite." );
+        fehler->addStyle( TextFeld::Style::Sichtbar );
+        laden->setSichtbar( 0 );
+        uiFactory.initParam.bildschirm->setOnTop( 0 );
+        run = 0;
+        return;
+    }
+    laden->setSichtbar( 0 );
+    uiFactory.initParam.bildschirm->setOnTop( 0 );
+    run = 0;
 }

+ 14 - 16
patcher/News.h

@@ -6,6 +6,7 @@
 #include <Thread.h>
 #include <Klient.h>
 #include <KSGNetwork.h>
+#include <UIInitialization.h>
 
 using namespace Framework;
 using namespace KSGScript;
@@ -14,25 +15,22 @@ using namespace Network;
 class News : public Thread
 {
 private:
-	KSGScriptObj *frame;
-	HMODULE ksgsDll;
-	Text *scriptName;
-	Animation2D *laden;
-	Bildschirm *screen;
-	TextFeld *fehler;
-	Schrift *schrift;
+    KSGScriptObj *frame;
+    HMODULE ksgsDll;
+    Text *scriptName;
+    Animation2D *laden;
+    TextFeld *fehler;
+    UIInit uiFactory;
     KSGClient::NewsServerClient *client;
 
 public:
-	// Konstruktor
-	News( Bildschirm *zB, Schrift *zS, KSGClient::NewsServerClient *client );
-	// Destruktor
-	~News();
-	// nicht constant
-	void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
-	void thread();
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    News( UIInit &uiFactory, KSGClient::NewsServerClient *client );
+    // Destruktor
+    ~News();
+    // nicht constant
+    void rückruf( RCArray< KSGSVariable > *parameter, KSGSVariable **ret );
+    void thread();
 };
 
 #endif

+ 0 - 13
patcher/Patcher.cpp

@@ -180,17 +180,4 @@ void Patcher::warteAufPatch( int zeit )
 int Patcher::getDownload() const
 {
     return updater ? updater->getDownload() : 0;
-}
-
-// löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-Thread *Patcher::release()
-{
-    if( ref == 2 && run )
-    {
-        *close = 1;
-        warteAufPatch( 5000 );
-        if( run )
-            ende();
-    }
-    return Thread::release();
 }

+ 18 - 20
patcher/Patcher.h

@@ -14,28 +14,26 @@ class Patcher : public Thread
 {
 private:
     HMODULE updateDll;
-	UpdaterV *updater;
-	FBalken *fortschritt;
-	TextFeld *status;
-	Knopf *play;
-	bool *close;
-	int ret;
+    UpdaterV *updater;
+    FBalken *fortschritt;
+    TextFeld *status;
+    Knopf *play;
+    bool *close;
+    int ret;
 
 public:
-	// Konstruktor
-	Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client );
-	// Destruktor
-	~Patcher();
-	// nicht constant
-	void startPatch();
-	void thread();
-	// constant
-	bool läuftPatch() const;
-	int getReturn() const;
-	void warteAufPatch( int zeit );
-	int getDownload() const;
-    // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
-    Thread *release() override;
+    // Konstruktor
+    Patcher( FBalken *fortschritt, TextFeld *status, Knopf *play, bool *close, KSGClient::PatchServerClient *client );
+    // Destruktor
+    ~Patcher();
+    // nicht constant
+    void startPatch();
+    void thread();
+    // constant
+    bool läuftPatch() const;
+    int getReturn() const;
+    void warteAufPatch( int zeit );
+    int getDownload() const;
 };
 
 #endif

+ 2 - 2
patcher/patcher.vcxproj

@@ -22,14 +22,14 @@
     <ProjectGuid>{CBA67731-4D13-459A-BA44-543A7AFC6E04}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
     <RootNamespace>patcher</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v141</PlatformToolset>
+    <PlatformToolset>v142</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>

+ 658 - 654
patcher/start.cpp

@@ -58,418 +58,418 @@ void _frameSchlie
 
 bool _frameME( void *p, void *obj, MausEreignis me )
 {
-	return 1;
+    return 1;
 }
 
 bool _frameTE( void *p, void *obj, TastaturEreignis me )
 {
-	return 1;
+    return 1;
 }
 
 bool closeME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		_abbruch = 1;
-		PostQuitMessage( 0 );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        _abbruch = 1;
+        PostQuitMessage( 0 );
+    }
+    return 1;
 }
 
 bool minimierenME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		_frame->setAnzeigeModus( 2 );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        _frame->setAnzeigeModus( 2 );
+    }
+    return 1;
 }
 
 bool _playME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_Betritt )
-		getMaus().ladeMaus( MausId::hand );
-	if( me.id == ME_Leaves )
+    if( me.id == ME_Betritt )
+        getMaus().ladeMaus( MausId::hand );
+    if( me.id == ME_Leaves )
         getMaus().ladeMaus( MausId::normal );
     getMaus().update();
-	if( me.id == ME_RLinks )
-		PostQuitMessage( 0 );
-	return 1;
+    if( me.id == ME_RLinks )
+        PostQuitMessage( 0 );
+    return 1;
 }
 
 bool optionenME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
+    if( me.id == ME_RLinks )
+    {
         _o_rno->removeStyle( Knopf::Style::Erlaubt );
         _o_rnu->removeStyle( Knopf::Style::Erlaubt );
-		while( _o_rt->getZeilenAnzahl() > 1 )
-			_o_rt->removeZeile( 1 );
-		KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" ); // Tabellen Spalten: Id, Pfad, Version, Priorität
-		dat->laden();
-		int max = -1;
-		for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-		{
-			if( !dat->zFeld( i, 3 ) || dat->zFeld( i, 3 )->istGleich( "NICHT" ) || dat->zFeld( i, 3 )->istGleich( "" ) )
-				continue;
-			if( max < (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 ) )
-				max = (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 );
-		}
-		for( int i = 0; i <= max; i++ )
-		{
-			for( int j = 0; j < dat->getZeilenAnzahl(); j++ )
-			{
-				if( !dat->zFeld( j, 1 ) || dat->zFeld( j, 1 )->istGleich( "" ) )
-					continue;
-				Text *iT = new Text( "" );
-				iT->append( i );
-				if( dat->zFeld( j, 3 ) && dat->zFeld( j, 3 )->istGleich( iT ) )
-				{
-					Text *name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "spiele/" ) + 7 );
-					if( !name || !name->getLength() || !dat->zFeld( j, 1 )->hat( "spiele/" ) )
-					{
-						if( name )
-							name->release();
-						name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "Spiele/" ) + 7 );
-					}
-					if( !name || !name->getLength() || ( !dat->zFeld( j, 1 )->hat( "Spiele/" ) && !dat->zFeld( j, 1 )->hat( "spiele/" ) ) )
-					{
-						if( name )
-							name->release();
-						name = new Text( dat->zFeld( j, 1 )->getText() );
-						if( name->hat( '/' ) )
-							name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) + 1 );
-					}
-					int anz = _o_rt->getZeilenAnzahl();
-					_o_rt->addZeile( dat->zFeld( j, 0 )->getText() );
-					Text *spielN = 0;
-					if( name->positionVon( '/' ) >= 0 )
-						spielN = name->getTeilText( 0, name->positionVon( '/' ) );
-					else
-						spielN = new Text( name->getText() );
-					name = name->release();
-					TextFeld *spiel = new TextFeld();
-					spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-					spiel->setSchriftZ( _optionenF->getTSchrift() );
-					spiel->setSchriftFarbe( 0xFFFFFFFF );
-					spiel->setHintergrundFarbe( 0xFF003000 );
-					spiel->setText( spielN );
-					_o_rt->setZeichnungZ( 0, anz, spiel );
-					KontrollKnopf *erlaubt = new KontrollKnopf();
-					erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Selected );
-					erlaubt->setHintergrundFarbe( 0xFF003000 );
-					erlaubt->setSBgFarbe( 0xFF003000 );
-					erlaubt->loadData( "data/bilder/system.ltdb" );
-					erlaubt->setMausEreignis( _o_rkkME );
-					_o_rt->setZeichnungZ( 1, anz, erlaubt );
-				}
-			}
-		}
-		for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-		{
-			if( dat->zFeld( i, 3 ) && dat->zFeld( i, 3 )->istGleich( "NICHT" ) )
-			{
-				Text *name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "spiele/" ) + 7 );
-				if( !name || !name->getLength() )
-				{
-					if( name )
-						name->release();
-					name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "Spiele/" ) + 7 );
-				}
-				if( !name || !name->getLength() )
-				{
-					if( name )
-						name->release();
-					name = new Text( dat->zFeld( i, 1 )->getText() );
-					if( name->hat( '/' ) )
-						name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) );
-				}
-				int anz = _o_rt->getZeilenAnzahl();
-				_o_rt->addZeile( dat->zFeld( i, 0 )->getText() );
-				Text *spielN = 0;
-				if( name->positionVon( '/' ) >= 0 )
-					spielN = name->getTeilText( 0, name->positionVon( '/' ) );
-				else
-					spielN = new Text( name->getText() );
-				name = name->release();
-				TextFeld *spiel = new TextFeld();
-				spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-				spiel->setSchriftZ( _optionenF->getTSchrift() );
-				spiel->setSchriftFarbe( 0xFFFFFFFF );
-				spiel->setHintergrundFarbe( 0xFF003000 );
-				spiel->setText( spielN );
-				_o_rt->setZeichnungZ( 0, anz, spiel );
-				KontrollKnopf *erlaubt = new KontrollKnopf();
-				erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer );
-				erlaubt->setHintergrundFarbe( 0xFF003000 );
-				erlaubt->loadData( "data/bilder/system.ltdb" );
-				erlaubt->setMausEreignis( _o_rkkME );
-				_o_rt->setZeichnungZ( 1, anz, erlaubt );
-			}
-		}
-		dat->release();
-		InitDatei *ini = new InitDatei( "data/patch/po.ini" );
-		ini->laden();
-		if( ini->wertExistiert( "ülps" ) )
-			_o_ülps->setText( ini->zWert( "ülps" )->getText() );
-		if( ini->wertExistiert( "üle" ) )
-			_o_üle->setAuswahl( _o_üle->getEintragPos( ini->zWert( "üle" )->getThis() ) );
-		ini->release();
-		_optionenF->setPosition( 100, 100 );
-		_optionenF->addStyle( Fenster::Style::Sichtbar );
-	}
-	return 1;
+        while( _o_rt->getZeilenAnzahl() > 1 )
+            _o_rt->removeZeile( 1 );
+        KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" ); // Tabellen Spalten: Id, Pfad, Version, Priorität
+        dat->laden();
+        int max = -1;
+        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
+        {
+            if( !dat->zFeld( i, 3 ) || dat->zFeld( i, 3 )->istGleich( "NICHT" ) || dat->zFeld( i, 3 )->istGleich( "" ) )
+                continue;
+            if( max < (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 ) )
+                max = (int)TextZuInt( dat->zFeld( i, 3 )->getText(), 10 );
+        }
+        for( int i = 0; i <= max; i++ )
+        {
+            for( int j = 0; j < dat->getZeilenAnzahl(); j++ )
+            {
+                if( !dat->zFeld( j, 1 ) || dat->zFeld( j, 1 )->istGleich( "" ) )
+                    continue;
+                Text *iT = new Text( "" );
+                iT->append( i );
+                if( dat->zFeld( j, 3 ) && dat->zFeld( j, 3 )->istGleich( iT ) )
+                {
+                    Text *name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "spiele/" ) + 7 );
+                    if( !name || !name->getLength() || !dat->zFeld( j, 1 )->hat( "spiele/" ) )
+                    {
+                        if( name )
+                            name->release();
+                        name = dat->zFeld( j, 1 )->getTeilText( dat->zFeld( j, 1 )->positionVon( "Spiele/" ) + 7 );
+                    }
+                    if( !name || !name->getLength() || ( !dat->zFeld( j, 1 )->hat( "Spiele/" ) && !dat->zFeld( j, 1 )->hat( "spiele/" ) ) )
+                    {
+                        if( name )
+                            name->release();
+                        name = new Text( dat->zFeld( j, 1 )->getText() );
+                        if( name->hat( '/' ) )
+                            name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) + 1 );
+                    }
+                    int anz = _o_rt->getZeilenAnzahl();
+                    _o_rt->addZeile( dat->zFeld( j, 0 )->getText() );
+                    Text *spielN = 0;
+                    if( name->positionVon( '/' ) >= 0 )
+                        spielN = name->getTeilText( 0, name->positionVon( '/' ) );
+                    else
+                        spielN = new Text( name->getText() );
+                    name->release();
+                    TextFeld *spiel = new TextFeld();
+                    spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
+                    spiel->setSchriftZ( _optionenF->getTSchrift() );
+                    spiel->setSchriftFarbe( 0xFFFFFFFF );
+                    spiel->setHintergrundFarbe( 0xFF003000 );
+                    spiel->setText( spielN );
+                    _o_rt->setZeichnungZ( 0, anz, spiel );
+                    KontrollKnopf *erlaubt = new KontrollKnopf();
+                    erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer | KontrollKnopf::Style::Selected );
+                    erlaubt->setHintergrundFarbe( 0xFF003000 );
+                    erlaubt->setSBgFarbe( 0xFF003000 );
+                    erlaubt->loadData( "data/bilder/system.ltdb" );
+                    erlaubt->setMausEreignis( _o_rkkME );
+                    _o_rt->setZeichnungZ( 1, anz, erlaubt );
+                }
+            }
+        }
+        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
+        {
+            if( dat->zFeld( i, 3 ) && dat->zFeld( i, 3 )->istGleich( "NICHT" ) )
+            {
+                Text *name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "spiele/" ) + 7 );
+                if( !name || !name->getLength() )
+                {
+                    if( name )
+                        name->release();
+                    name = dat->zFeld( i, 1 )->getTeilText( dat->zFeld( i, 1 )->positionVon( "Spiele/" ) + 7 );
+                }
+                if( !name || !name->getLength() )
+                {
+                    if( name )
+                        name->release();
+                    name = new Text( dat->zFeld( i, 1 )->getText() );
+                    if( name->hat( '/' ) )
+                        name->remove( 0, name->positionVon( '/', name->anzahlVon( '/' ) - 1 ) );
+                }
+                int anz = _o_rt->getZeilenAnzahl();
+                _o_rt->addZeile( dat->zFeld( i, 0 )->getText() );
+                Text *spielN = 0;
+                if( name->positionVon( '/' ) >= 0 )
+                    spielN = name->getTeilText( 0, name->positionVon( '/' ) );
+                else
+                    spielN = new Text( name->getText() );
+                name->release();
+                TextFeld *spiel = new TextFeld();
+                spiel->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
+                spiel->setSchriftZ( _optionenF->getTSchrift() );
+                spiel->setSchriftFarbe( 0xFFFFFFFF );
+                spiel->setHintergrundFarbe( 0xFF003000 );
+                spiel->setText( spielN );
+                _o_rt->setZeichnungZ( 0, anz, spiel );
+                KontrollKnopf *erlaubt = new KontrollKnopf();
+                erlaubt->addStyle( KontrollKnopf::Style::Sichtbar | KontrollKnopf::Style::Erlaubt | KontrollKnopf::Style::KlickBuffer );
+                erlaubt->setHintergrundFarbe( 0xFF003000 );
+                erlaubt->loadData( "data/bilder/system.ltdb" );
+                erlaubt->setMausEreignis( _o_rkkME );
+                _o_rt->setZeichnungZ( 1, anz, erlaubt );
+            }
+        }
+        dat->release();
+        InitDatei *ini = new InitDatei( "data/patch/po.ini" );
+        ini->laden();
+        if( ini->wertExistiert( "ülps" ) )
+            _o_ülps->setText( ini->zWert( "ülps" )->getText() );
+        if( ini->wertExistiert( "üle" ) )
+            _o_üle->setAuswahl( _o_üle->getEintragPos( ini->zWert( "üle" )->getText() ) );
+        ini->release();
+        _optionenF->setPosition( 100, 100 );
+        _optionenF->addStyle( Fenster::Style::Sichtbar );
+    }
+    return 1;
 }
 
 bool oAbbrechen( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-		_optionenF->removeStyle( Fenster::Style::Sichtbar );
-	return 1;
+    if( me.id == ME_RLinks )
+        _optionenF->removeStyle( Fenster::Style::Sichtbar );
+    return 1;
 }
 
 bool _o_rtME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-		{
-			if( _o_rt->zZeichnung( 0, i ) )
-				( (TextFeld*)_o_rt->zZeichnung( 0, i ) )->removeStyle( TextFeld::Style::Hintergrund );
-			if( _o_rt->zZeichnung( 1, i ) )
-				( (KontrollKnopf*)_o_rt->zZeichnung( 1, i ) )->removeStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
-		}
-		int zeile = (int)_o_rt->getMausZeile( me.my - _o_rt->getVertikalScrollPos() );
-		if( zeile <= 0 )
-		{
-			_o_rno->removeStyle( Knopf::Style::Erlaubt );
-			_o_rnu->removeStyle( Knopf::Style::Erlaubt );
-		}
-		else
-		{
-			if( _o_rt->zZeichnung( 0, zeile ) )
-				( (TextFeld*)_o_rt->zZeichnung( 0, zeile ) )->addStyle( TextFeld::Style::Hintergrund );
-			if( _o_rt->zZeichnung( 1, zeile ) )
-				( (KontrollKnopf*)_o_rt->zZeichnung( 1, zeile ) )->addStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
-			if( zeile > 1 )
-				_o_rno->addStyle( Knopf::Style::Erlaubt );
-			else
-				_o_rno->removeStyle( Knopf::Style::Erlaubt );
-			int max = 0;
-			for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-			{
-				if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf*)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-					break;
-				max = i;
-			}
-			if( zeile < max )
-				_o_rnu->addStyle( Knopf::Style::Erlaubt );
-			else
-				_o_rnu->removeStyle( Knopf::Style::Erlaubt );
-			if( ( _o_rt->zZeichnung( 1, zeile ) && ( (KontrollKnopf*)_o_rt->zZeichnung( 1, zeile ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) ) )
-			{
-				_o_rno->removeStyle( Knopf::Style::Erlaubt );
-				_o_rnu->removeStyle( Knopf::Style::Erlaubt );
-			}
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+        {
+            if( _o_rt->zZeichnung( 0, i ) )
+                ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->removeStyle( TextFeld::Style::Hintergrund );
+            if( _o_rt->zZeichnung( 1, i ) )
+                ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->removeStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
+        }
+        int zeile = (int)_o_rt->getMausZeile( me.my - _o_rt->getVertikalScrollPos() );
+        if( zeile <= 0 )
+        {
+            _o_rno->removeStyle( Knopf::Style::Erlaubt );
+            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
+        }
+        else
+        {
+            if( _o_rt->zZeichnung( 0, zeile ) )
+                ( (TextFeld *)_o_rt->zZeichnung( 0, zeile ) )->addStyle( TextFeld::Style::Hintergrund );
+            if( _o_rt->zZeichnung( 1, zeile ) )
+                ( (KontrollKnopf *)_o_rt->zZeichnung( 1, zeile ) )->addStyle( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe );
+            if( zeile > 1 )
+                _o_rno->addStyle( Knopf::Style::Erlaubt );
+            else
+                _o_rno->removeStyle( Knopf::Style::Erlaubt );
+            int max = 0;
+            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+            {
+                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
+                    break;
+                max = i;
+            }
+            if( zeile < max )
+                _o_rnu->addStyle( Knopf::Style::Erlaubt );
+            else
+                _o_rnu->removeStyle( Knopf::Style::Erlaubt );
+            if( ( _o_rt->zZeichnung( 1, zeile ) && ( (KontrollKnopf *)_o_rt->zZeichnung( 1, zeile ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) ) )
+            {
+                _o_rno->removeStyle( Knopf::Style::Erlaubt );
+                _o_rnu->removeStyle( Knopf::Style::Erlaubt );
+            }
+        }
+    }
+    return 1;
 }
 
 bool _o_rnoME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		int zeile = -1;
-		for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-		{
-			if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld*)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
-			{
-				zeile = i;
-				break;
-			}
-		}
-		if( zeile > 1 )
-		{
-			_o_rt->setZeilePosition( zeile, zeile - 1 );
-			_o_rnu->addStyle( Knopf::Style::Erlaubt );
-		}
-		if( zeile - 1 <= 1 )
-			_o_rno->removeStyle( Knopf::Style::Erlaubt );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        int zeile = -1;
+        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+        {
+            if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
+            {
+                zeile = i;
+                break;
+            }
+        }
+        if( zeile > 1 )
+        {
+            _o_rt->setZeilePosition( zeile, zeile - 1 );
+            _o_rnu->addStyle( Knopf::Style::Erlaubt );
+        }
+        if( zeile - 1 <= 1 )
+            _o_rno->removeStyle( Knopf::Style::Erlaubt );
+    }
+    return 1;
 }
 
 bool _o_rnuME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		int zeile = -1;
-		for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-		{
-			if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld*)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
-			{
-				zeile = i;
-				break;
-			}
-		}
-		int max = 0;
-		for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-		{
-			if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf*)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-				break;
-			max = i;
-		}
-		if( zeile > 0 && zeile < max )
-		{
-			_o_rt->setZeilePosition( zeile, zeile + 1 );
-			_o_rno->addStyle( Knopf::Style::Erlaubt );
-		}
-		if( zeile + 1 >= _o_rt->getZeilenAnzahl() - 1 )
-			_o_rnu->removeStyle( Knopf::Style::Erlaubt );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        int zeile = -1;
+        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+        {
+            if( _o_rt->zZeichnung( 0, i ) && ( (TextFeld *)_o_rt->zZeichnung( 0, i ) )->hatStyle( TextFeld::Style::Hintergrund ) )
+            {
+                zeile = i;
+                break;
+            }
+        }
+        int max = 0;
+        for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+        {
+            if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
+                break;
+            max = i;
+        }
+        if( zeile > 0 && zeile < max )
+        {
+            _o_rt->setZeilePosition( zeile, zeile + 1 );
+            _o_rno->addStyle( Knopf::Style::Erlaubt );
+        }
+        if( zeile + 1 >= _o_rt->getZeilenAnzahl() - 1 )
+            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
+    }
+    return 1;
 }
 
 bool _o_rkkME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		if( ( (KontrollKnopf*)obj )->hatStyleNicht( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe ) )
-		{
-			( (KontrollKnopf*)obj )->setStyle( KontrollKnopf::Style::Selected, ( (KontrollKnopf*)obj )->hatStyleNicht( KontrollKnopf::Style::Selected ) );
-			return 1;
-		}
-		if( ( (KontrollKnopf*)obj )->hatStyle( KontrollKnopf::Style::Selected ) )
-		{
-			_o_rno->removeStyle( Knopf::Style::Erlaubt );
-			_o_rnu->removeStyle( Knopf::Style::Erlaubt );
-			int zeile = -1;
-			for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-			{
-				if( _o_rt->zZeichnung( 1, i ) == obj )
-				{
-					zeile = i;
-					break;
-				}
-			}
-			int max = 0;
-			for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-			{
-				if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf*)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-					break;
-				max = i;
-			}
-			_o_rt->setZeilePosition( zeile, max );
-		}
-		else
-		{
-			int zeile = -1;
-			for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-			{
-				if( _o_rt->zZeichnung( 1, i ) == obj )
-				{
-					zeile = i;
-					break;
-				}
-			}
-			int max = 0;
-			for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
-			{
-				if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf*)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
-					break;
-				max = i;
-			}
-			_o_rt->setZeilePosition( zeile, max + 1 );
-			if( max > 1 )
-				_o_rno->addStyle( Knopf::Style::Erlaubt );
-		}
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        if( ( (KontrollKnopf *)obj )->hatStyleNicht( KontrollKnopf::Style::Hintergrund | KontrollKnopf::Style::SelectFarbe ) )
+        {
+            ( (KontrollKnopf *)obj )->setStyle( KontrollKnopf::Style::Selected, ( (KontrollKnopf *)obj )->hatStyleNicht( KontrollKnopf::Style::Selected ) );
+            return 1;
+        }
+        if( ( (KontrollKnopf *)obj )->hatStyle( KontrollKnopf::Style::Selected ) )
+        {
+            _o_rno->removeStyle( Knopf::Style::Erlaubt );
+            _o_rnu->removeStyle( Knopf::Style::Erlaubt );
+            int zeile = -1;
+            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+            {
+                if( _o_rt->zZeichnung( 1, i ) == obj )
+                {
+                    zeile = i;
+                    break;
+                }
+            }
+            int max = 0;
+            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+            {
+                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
+                    break;
+                max = i;
+            }
+            _o_rt->setZeilePosition( zeile, max );
+        }
+        else
+        {
+            int zeile = -1;
+            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+            {
+                if( _o_rt->zZeichnung( 1, i ) == obj )
+                {
+                    zeile = i;
+                    break;
+                }
+            }
+            int max = 0;
+            for( int i = 1; i < _o_rt->getZeilenAnzahl(); i++ )
+            {
+                if( !_o_rt->zZeichnung( 1, i ) || ( (KontrollKnopf *)_o_rt->zZeichnung( 1, i ) )->hatStyleNicht( KontrollKnopf::Style::Selected ) )
+                    break;
+                max = i;
+            }
+            _o_rt->setZeilePosition( zeile, max + 1 );
+            if( max > 1 )
+                _o_rno->addStyle( Knopf::Style::Erlaubt );
+        }
+    }
+    return 1;
 }
 
 bool _o_ülpsTE( void *p, void *obj, TastaturEreignis te )
 {
-	if( te.taste == T_Links || te.taste == T_Rechts || te.taste == T_Entf || te.taste == T_BackSpace || ( te.taste >= '0' && te.taste <= '9' ) )
-		return 1;
-	return 0;
+    if( te.taste == T_Links || te.taste == T_Rechts || te.taste == T_Entf || te.taste == T_BackSpace || ( te.taste >= '0' && te.taste <= '9' ) )
+        return 1;
+    return 0;
 }
 
 bool o_okME( void *p, void *obj, MausEreignis me )
 {
-	if( me.id == ME_RLinks )
-	{
-		KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" );
-		dat->laden();
-		for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
-		{
-			for( int j = 0; j < _o_rt->getZeilenAnzahl(); j++ )
-			{
-				if( !_o_rt->zZeichnung( 1, j ) )
-					continue;
-				if( !_o_rt->zZeilenName( j )->istGleich( dat->zFeld( i, 0 )->getText() ) )
-					continue;
-				if( ( (KontrollKnopf*)_o_rt->zZeichnung( 1, j ) )->hatStyle( KontrollKnopf::Style::Selected ) )
-				{
-					Text *t = new Text();
-					t->append( j );
-					dat->zFeld( i, 3 )->setText( t );
-				}
-				else
-					dat->zFeld( i, 3 )->setText( "NICHT" );
-				break;
-			}
-		}
-		dat->speichern();
-		dat->release();
-		InitDatei *ini = new InitDatei( "data/patch/po.ini" );
-		ini->addWert( "ülps", _o_ülps->zText()->getText() );
-		ini->addWert( "üle", _o_üle->zEintragText( _o_üle->getAuswahl() )->getText() );
-		ini->speichern();
-		ini->release();
-		_optionenF->removeStyle( Fenster::Style::Sichtbar );
-	}
-	return 1;
+    if( me.id == ME_RLinks )
+    {
+        KSGTDatei *dat = new KSGTDatei( "data/dg.ksgt" );
+        dat->laden();
+        for( int i = 0; i < dat->getZeilenAnzahl(); i++ )
+        {
+            for( int j = 0; j < _o_rt->getZeilenAnzahl(); j++ )
+            {
+                if( !_o_rt->zZeichnung( 1, j ) )
+                    continue;
+                if( !_o_rt->zZeilenName( j )->istGleich( dat->zFeld( i, 0 )->getText() ) )
+                    continue;
+                if( ( (KontrollKnopf *)_o_rt->zZeichnung( 1, j ) )->hatStyle( KontrollKnopf::Style::Selected ) )
+                {
+                    Text *t = new Text();
+                    t->append( j );
+                    dat->zFeld( i, 3 )->setText( t );
+                }
+                else
+                    dat->zFeld( i, 3 )->setText( "NICHT" );
+                break;
+            }
+        }
+        dat->speichern();
+        dat->release();
+        InitDatei *ini = new InitDatei( "data/patch/po.ini" );
+        ini->addWert( "ülps", _o_ülps->zText()->getText() );
+        ini->addWert( "üle", _o_üle->zEintragText( _o_üle->getAuswahl() )->getText() );
+        ini->speichern();
+        ini->release();
+        _optionenF->removeStyle( Fenster::Style::Sichtbar );
+    }
+    return 1;
 }
 
 DWORD WINAPI runThread( void *args )
 {
-	Bildschirm *screen = (Bildschirm *)args;
-	double i = 0;
-	double tickVal = 1.0 / 60.0;
-	ZeitMesser *tstop = new ZeitMesser();
-	while( !_exitB )
-	{
-		tstop->messungStart();
-		screen->render();
-		screen->tick( tickVal );
-		Sleep( 10 );
-		if( _kbps )
-		{
-			i += tickVal * 60;
-			if( i >= 60 && _kbps )
-			{
-				screen->lock();
-				_kbps->setText( "" );
-				_kbps->zText()->append( _patcher ? ( _patcher->getDownload() / 1024 ) : 0 );
-				_kbps->zText()->append( " kb/s, " );
-				_kbps->zText()->append( (unsigned int)( ( _fortschritt->getAktionAnzahl() - _fortschritt->getAktion() ) / 1024 ) );
-				_kbps->zText()->append( " kb verbleibend..." );
-				screen->unlock();
-				i -= 60;
-			}
-		}
-		tstop->messungEnde();
-		tickVal = tstop->getSekunden() + tstop->getSekunden() - tickVal;
-	}
-	tstop->release();
-	return 0;
+    Bildschirm *screen = (Bildschirm *)args;
+    double i = 0;
+    double tickVal = 1.0 / 60.0;
+    ZeitMesser *tstop = new ZeitMesser();
+    while( !_exitB )
+    {
+        tstop->messungStart();
+        screen->render();
+        screen->tick( tickVal );
+        Sleep( 10 );
+        if( _kbps )
+        {
+            i += tickVal * 60;
+            if( i >= 60 && _kbps )
+            {
+                screen->lock();
+                _kbps->setText( "" );
+                _kbps->zText()->append( _patcher ? ( _patcher->getDownload() / 1024 ) : 0 );
+                _kbps->zText()->append( " kb/s, " );
+                _kbps->zText()->append( (unsigned int)( ( _fortschritt->getAktionAnzahl() - _fortschritt->getAktion() ) / 1024 ) );
+                _kbps->zText()->append( " kb verbleibend..." );
+                screen->unlock();
+                i -= 60;
+            }
+        }
+        tstop->messungEnde();
+        tickVal = tstop->getSekunden() + tstop->getSekunden() - tickVal;
+    }
+    tstop->release();
+    return 0;
 }
 
 int KSGStart Framework::Start( Startparam p )
 {
-	_abbruch = 0;
-	Network::Start( 10 );
+    _abbruch = 0;
+    Network::Start( 10 );
 
     if( !DateiExistiert( "data/user_options.ini" ) )
     {
@@ -484,114 +484,114 @@ int KSGStart Framework::Start( Startparam p )
         userOptions->laden();
     }
 
-	LTDBDatei *patcherBilder = new LTDBDatei();
-	patcherBilder->setDatei( new Text( "data/patch/bilder/patcher.ltdb" ) );
-	patcherBilder->leseDaten( 0 );
-	Bild *patcherRahmen = patcherBilder->laden( 0, new Text( "patcherrahmen." ) );
-	Bild *patcherHintergrund = patcherBilder->laden( 0, new Text( "patcher.png" ) );
-	Bild *playBild = patcherBilder->laden( 0, new Text( "play.png" ) );
-	Bild *playKlick = patcherBilder->laden( 0, new Text( "playklick.png" ) );
-	patcherBilder->release();
-
-	LTDBDatei *systemBilder = new LTDBDatei();
-	systemBilder->setDatei( new Text( "data/bilder/system.ltdb" ) );
-	systemBilder->leseDaten( 0 );
-	Bild *systemSchließen = systemBilder->laden( 0, new Text( "schließen.png" ) );
-	Bild *systemMinimieren = systemBilder->laden( 0, new Text( "minimieren.png" ) );
-	Bild *systemOptionen = systemBilder->laden( 0, new Text( "optionen.png" ) );
-	Bild *systemFortschrittL = systemBilder->laden( 0, new Text( "fortschrittleh" ) );
-	Bild *systemFortschrittV = systemBilder->laden( 0, new Text( "fortschrittvol" ) );
-	systemBilder->release();
-
-	LTDSDatei *normalSchrift = new LTDSDatei();
-	normalSchrift->setPfad( new Text( "data/schriften/normal.ltds" ) );
-	normalSchrift->leseDaten();
-	Schrift *sNormal = normalSchrift->ladeSchrift();
-	normalSchrift->release();
+    LTDBDatei *patcherBilder = new LTDBDatei();
+    patcherBilder->setDatei( new Text( "data/patch/bilder/patcher.ltdb" ) );
+    patcherBilder->leseDaten( 0 );
+    Bild *patcherRahmen = patcherBilder->laden( 0, new Text( "patcherrahmen." ) );
+    Bild *patcherHintergrund = patcherBilder->laden( 0, new Text( "patcher.png" ) );
+    Bild *playBild = patcherBilder->laden( 0, new Text( "play.png" ) );
+    Bild *playKlick = patcherBilder->laden( 0, new Text( "playklick.png" ) );
+    patcherBilder->release();
+
+    LTDBDatei *systemBilder = new LTDBDatei();
+    systemBilder->setDatei( new Text( "data/bilder/system.ltdb" ) );
+    systemBilder->leseDaten( 0 );
+    Bild *systemSchließen = systemBilder->laden( 0, new Text( "schließen.png" ) );
+    Bild *systemMinimieren = systemBilder->laden( 0, new Text( "minimieren.png" ) );
+    Bild *systemOptionen = systemBilder->laden( 0, new Text( "optionen.png" ) );
+    Bild *systemFortschrittL = systemBilder->laden( 0, new Text( "fortschrittleh" ) );
+    Bild *systemFortschrittV = systemBilder->laden( 0, new Text( "fortschrittvol" ) );
+    systemBilder->release();
+
+    LTDSDatei *normalSchrift = new LTDSDatei();
+    normalSchrift->setPfad( new Text( "data/schriften/normal.ltds" ) );
+    normalSchrift->leseDaten();
+    Schrift *sNormal = normalSchrift->ladeSchrift();
+    normalSchrift->release();
 
     Monitor m = getMonitor( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 );
-	WNDCLASS wc = F_Normal( p.hinst );
-	wc.lpszClassName = "Kolja-Strohm Games Patcher";
-	_frame = new WFenster();
-	_frame->setVerschiebbar( 1 );
-	_frame->erstellen( WS_POPUP, wc );
-	_frame->setSize( Punkt( 500, 500 ) );
-	_frame->setPosition( Bildschirmmitte( _frame->getThis(), m.existiert ? ( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 ) : 0 ) );
-	_frame->ladeRahmenFenster( patcherRahmen, p.hinst );
-	_frame->setMausAktion( _frameME );
-	_frame->setTastaturAktion( _frameTE );
-	_frame->setVSchließAktion( _frameSchließen );
+    WNDCLASS wc = F_Normal( p.hinst );
+    wc.lpszClassName = "Kolja-Strohm Games Patcher";
+    _frame = new WFenster();
+    _frame->setVerschiebbar( 1 );
+    _frame->erstellen( WS_POPUP, wc );
+    _frame->setSize( Punkt( 500, 500 ) );
+    _frame->setPosition( Bildschirmmitte( dynamic_cast<WFenster *>( _frame->getThis() ), m.existiert ? ( userOptions->wertExistiert( "Monitor" ) ? *userOptions->zWert( "Monitor" ) : 0 ) : 0 ) );
+    _frame->ladeRahmenFenster( patcherRahmen, p.hinst );
+    _frame->setMausAktion( _frameME );
+    _frame->setTastaturAktion( _frameTE );
+    _frame->setVSchließAktion( _frameSchließen );
     Bildschirm *screen = 0;
     if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX9" ) )
-        screen = new Bildschirm3D( _frame->getThis(), DIRECTX9 );
+        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX9 );
     else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX11" ) )
-        screen = new Bildschirm3D( _frame->getThis(), DIRECTX11 );
+        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX11 );
     else if( userOptions->wertExistiert( "GraphicAPI" ) && userOptions->zWert( "GraphicAPI" )->istGleich( "DX12" ) )
-        screen = new Bildschirm3D( _frame->getThis(), DIRECTX12 );
+        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ), DIRECTX12 );
     else
-        screen = new Bildschirm3D( _frame->getThis() );
-	screen->update();
-	screen->render();
-	_frame->setBildschirm( screen->getThis() );
-	_frame->setAnzeigeModus( 1 );
-
-	screen->lock();
-	BildZ *hintergrund = new BildZ();
-	hintergrund->setStyle( BildZ::Style::Sichtbar );
-	hintergrund->setBildZ( patcherHintergrund->getThis() );
-	hintergrund->setPosition( 0, 0 );
-	hintergrund->setSize( patcherHintergrund->getBreite(), patcherHintergrund->getHeight() );
-	screen->addMember( hintergrund );
-
-	Knopf *close = new Knopf();
-	close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	close->setHintergrundBildZ( systemSchließen->getThis() );
-	close->setKBFarbe( 0xFF000000 );
+        screen = new Bildschirm3D( dynamic_cast<WFenster *>( _frame->getThis() ) );
+    screen->update();
+    screen->render();
+    _frame->setBildschirm( dynamic_cast<Bildschirm *>( screen->getThis() ) );
+    _frame->setAnzeigeModus( 1 );
+
+    screen->lock();
+    BildZ *hintergrund = new BildZ();
+    hintergrund->setStyle( BildZ::Style::Sichtbar );
+    hintergrund->setBildZ( dynamic_cast<Bild *>( patcherHintergrund->getThis() ) );
+    hintergrund->setPosition( 0, 0 );
+    hintergrund->setSize( patcherHintergrund->getBreite(), patcherHintergrund->getHeight() );
+    screen->addMember( hintergrund );
+
+    Knopf *close = new Knopf();
+    close->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    close->setHintergrundBildZ( dynamic_cast<Bild *>( systemSchließen->getThis() ) );
+    close->setKBFarbe( 0xFF000000 );
     close->setHintergrundFarbe( 0 );
-	close->setKBStrength( 30 );
-	close->setPosition( 475, 5 );
-	close->setSize( 20, 20 );
-	close->setMausEreignis( closeME );
-	screen->addMember( close );
-
-	Knopf *minimieren = new Knopf();
-	minimieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	minimieren->setHintergrundBildZ( systemMinimieren->getThis() );
+    close->setKBStrength( 30 );
+    close->setPosition( 475, 5 );
+    close->setSize( 20, 20 );
+    close->setMausEreignis( closeME );
+    screen->addMember( close );
+
+    Knopf *minimieren = new Knopf();
+    minimieren->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    minimieren->setHintergrundBildZ( dynamic_cast<Bild *>( systemMinimieren->getThis() ) );
     minimieren->setHintergrundFarbe( 0 );
-	minimieren->setKBFarbe( 0xFF000000 );
-	minimieren->setKBStrength( 30 );
-	minimieren->setPosition( 454, 5 );
-	minimieren->setSize( 20, 20 );
-	minimieren->setMausEreignis( minimierenME );
-	screen->addMember( minimieren );
-
-	Knopf *optionen = new Knopf();
-	optionen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
-	optionen->setHintergrundBildZ( systemOptionen->getThis() );
+    minimieren->setKBFarbe( 0xFF000000 );
+    minimieren->setKBStrength( 30 );
+    minimieren->setPosition( 454, 5 );
+    minimieren->setSize( 20, 20 );
+    minimieren->setMausEreignis( minimierenME );
+    screen->addMember( minimieren );
+
+    Knopf *optionen = new Knopf();
+    optionen->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
+    optionen->setHintergrundBildZ( dynamic_cast<Bild *>( systemOptionen->getThis() ) );
     optionen->setHintergrundFarbe( 0 );
-	optionen->setKBFarbe( 0xFF000000 );
-	optionen->setKBStrength( 30 );
-	optionen->setPosition( 433, 5 );
-	optionen->setSize( 20, 20 );
-	optionen->setMausEreignis( optionenME );
-	screen->addMember( optionen );
+    optionen->setKBFarbe( 0xFF000000 );
+    optionen->setKBStrength( 30 );
+    optionen->setPosition( 433, 5 );
+    optionen->setSize( 20, 20 );
+    optionen->setMausEreignis( optionenME );
+    screen->addMember( optionen );
 
     // Main Server Adresse Laden
     Datei *dat = new Datei();
     dat->setDatei( "data/tmp/k.id" );
     int klientNummer = 0;
     dat->open( Datei::Style::lesen );
-    dat->lese( (char*)&klientNummer, 4 );
+    dat->lese( (char *)&klientNummer, 4 );
     dat->close();
     dat->setDatei( "data/tmp/m.port" );
     int serverPort = 0;
     dat->open( Datei::Style::lesen );
-    dat->lese( (char*)&serverPort, 4 );
+    dat->lese( (char *)&serverPort, 4 );
     dat->close();
     dat->setDatei( "data/tmp/m.ip" );
     dat->open( Datei::Style::lesen );
     unsigned char len = 0;
-    dat->lese( (char*)&len, 1 );
+    dat->lese( (char *)&len, 1 );
     char *ip = new char[ len + 1 ];
     ip[ len ] = 0;
     dat->lese( ip, len );
@@ -599,7 +599,7 @@ int KSGStart Framework::Start( Startparam p )
     dat->setDatei( "data/tmp/crypt.key" );
     dat->open( Datei::Style::lesen );
     len = 0;
-    dat->lese( (char*)&len, 1 );
+    dat->lese( (char *)&len, 1 );
     char *key = new char[ len + 1 ];
     key[ len ] = 0;
     dat->lese( key, len );
@@ -613,7 +613,7 @@ int KSGStart Framework::Start( Startparam p )
         WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden." ), MB_ICONERROR );
         exit( 0 );
     }
-    KSGClient::KSGNetworkCreateRegisterdMain getMainClient = ( KSGClient::KSGNetworkCreateRegisterdMain )GetProcAddress( networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN );
+    KSGClient::KSGNetworkCreateRegisterdMain getMainClient = (KSGClient::KSGNetworkCreateRegisterdMain)GetProcAddress( networkDLL, KSGNETWORK_CREATE_REGISTERD_MAIN );
     if( !getMainClient )
     {
         WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGNETWORK_CREATE_REGISTERD_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
@@ -629,167 +629,169 @@ int KSGStart Framework::Start( Startparam p )
     delete[] ip;
     delete[] key;
 
-	News *news = new News( screen, sNormal, mainClient->createNewsServerClient() );
-
-	_aktion = new TextFeld();
-	_aktion->setStyle( TextFeld::Style::Sichtbar );
-	_aktion->setSchriftZ( sNormal->getThis() );
-	_aktion->setSchriftFarbe( 0xFFFFFFFF );
-	_aktion->setText( "Ermittle änderungen..." );
-	_aktion->setPosition( 49, 403 );
-	_aktion->setSize( 502, 20 );
-	screen->addMember( _aktion->getThis() );
-
-	_kbps = new TextFeld();
-	_kbps->setStyle( TextFeld::Style::Sichtbar );
-	_kbps->setSchriftZ( sNormal->getThis() );
-	_kbps->setSchriftFarbe( 0xFFFFFFFF );
-	_kbps->setText( "0 kb/s" );
-	_kbps->setPosition( 49, 460 );
-	_kbps->setSize( 402, 20 );
-	screen->addMember( _kbps->getThis() );
-
-	_fortschritt = new FBalken();
-	_fortschritt->setStyle( FBalken::Style::Sichtbar | FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::FBild | FBalken::Style::Rahmen | FBalken::Style::Prozent | FBalken::Style::L_R );
-	_fortschritt->setRahmenFarbe( 0xFFFFFFFF );
-	_fortschritt->setHintergrundBild( systemFortschrittL->getThis() );
-	_fortschritt->setFBgBild( systemFortschrittV->getThis() );
-	_fortschritt->setSchriftZ( sNormal->getThis() );
-	_fortschritt->setSFarbe( 0xFFFFFFFF );
-	_fortschritt->setSSize( 12 );
-	_fortschritt->setPosition( 49, 428 );
-	_fortschritt->setSize( 402, 22 );
-	screen->addMember( _fortschritt->getThis() );
-
-	_play = new Knopf();
-	_play->setStyle( Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBild );
-	_play->setMausEreignis( _playME );
-	_play->setHintergrundBildZ( playBild->getThis() );
-	_play->setKlickBildZ( playKlick->getThis() );
-	_play->setPosition( 200, 466 );
-	_play->setSize( 101, 30 );
-	screen->addMember( _play->getThis() );
-
-	_optionenF = new Fenster();
-	_optionenF->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Closable | Fenster::Style::Titel | Fenster::Style::TitelBuffered |
-						  Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund | Fenster::Style::TitelHAlpha |
-						  Fenster::Style::BodyHAlpha | Fenster::Style::Rahmen | Fenster::Style::ClosingKlickBuffer |
-						  Fenster::Style::ClosingHintergrund | Fenster::Style::ClosingHAlpha | Fenster::Style::Beweglich | Fenster::Style::VScroll );
-	_optionenF->setSize( 300, 330 );
-	_optionenF->setPosition( 100, 100 );
-	_optionenF->setVSBMax( 300 );
-	_optionenF->zVScrollBar()->setKlickScroll( 10 );
-	_optionenF->zVScrollBar()->setFarbe( 0xFFFFFFFF );
-	_optionenF->zVScrollBar()->setBgFarbe( 0xF0000000, 1 );
-	_optionenF->setRBreite( 2 );
-	_optionenF->setRFarbe( 0xFFFFFFFF );
-	_optionenF->setTSchriftZ( sNormal->getThis() );
-	_optionenF->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-	_optionenF->setTitel( "Optionen" );
-	_optionenF->zTTextFeld()->setSize( 0, 20 );
-	_optionenF->setTBgFarbe( 0xF0000000 );
-	_optionenF->setTAfFarbe( 0xA0FFFFFF );
-	_optionenF->setTAfStrength( 15 );
-	_optionenF->setTSFarbe( 0xFFFFFFFF );
-	_optionenF->setSBgFarbe( 0xF0000000 );
-	_optionenF->setSKAfFarbe( 0xFFFFFFFF );
-	_optionenF->setSKAfStrength( 30 );
-	_optionenF->setKBgFarbe( 0xF0000000 );
-	_optionenF->setClosingMe( oAbbrechen );
-	screen->addMember( _optionenF->getThis() );
-
-	TextFeld *oReihenfolge = new TextFeld();
-	oReihenfolge->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
-	oReihenfolge->setSchriftZ( sNormal->getThis() );
-	oReihenfolge->setSchriftFarbe( 0xFFFFFFFF );
-	oReihenfolge->setText( "Update Reihenfolge:" );
-	oReihenfolge->setPosition( 2, 2 );
-	oReihenfolge->setSize( 276, 20 );
-	_optionenF->addMember( oReihenfolge );
-
-	_o_rt = new ObjTabelle();
-	_o_rt->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen | 
+    UIInit init = Framework::defaultUI( sNormal, screen );
+
+    News *news = new News( init, mainClient->createNewsServerClient() );
+
+    _aktion = new TextFeld();
+    _aktion->setStyle( TextFeld::Style::Sichtbar );
+    _aktion->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _aktion->setSchriftFarbe( 0xFFFFFFFF );
+    _aktion->setText( "Ermittle änderungen..." );
+    _aktion->setPosition( 49, 403 );
+    _aktion->setSize( 502, 20 );
+    screen->addMember( dynamic_cast<Zeichnung *>( _aktion->getThis() ) );
+
+    _kbps = new TextFeld();
+    _kbps->setStyle( TextFeld::Style::Sichtbar );
+    _kbps->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _kbps->setSchriftFarbe( 0xFFFFFFFF );
+    _kbps->setText( "0 kb/s" );
+    _kbps->setPosition( 49, 460 );
+    _kbps->setSize( 402, 20 );
+    screen->addMember( dynamic_cast<Zeichnung *>( _kbps->getThis() ) );
+
+    _fortschritt = new FBalken();
+    _fortschritt->setStyle( FBalken::Style::Sichtbar | FBalken::Style::Hintergrund | FBalken::Style::HBild | FBalken::Style::FBild | FBalken::Style::Rahmen | FBalken::Style::Prozent | FBalken::Style::L_R );
+    _fortschritt->setRahmenFarbe( 0xFFFFFFFF );
+    _fortschritt->setHintergrundBild( dynamic_cast<Bild *>( systemFortschrittL->getThis() ) );
+    _fortschritt->setFBgBild( dynamic_cast<Bild *>( systemFortschrittV->getThis() ) );
+    _fortschritt->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _fortschritt->setSFarbe( 0xFFFFFFFF );
+    _fortschritt->setSSize( 12 );
+    _fortschritt->setPosition( 49, 428 );
+    _fortschritt->setSize( 402, 22 );
+    screen->addMember( dynamic_cast<Zeichnung *>( _fortschritt->getThis() ) );
+
+    _play = new Knopf();
+    _play->setStyle( Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HBild | Knopf::Style::KlickBild );
+    _play->setMausEreignis( _playME );
+    _play->setHintergrundBildZ( dynamic_cast<Bild *>( playBild->getThis() ) );
+    _play->setKlickBildZ( dynamic_cast<Bild *>( playKlick->getThis() ) );
+    _play->setPosition( 200, 466 );
+    _play->setSize( 101, 30 );
+    screen->addMember( dynamic_cast<Zeichnung *>( _play->getThis() ) );
+
+    _optionenF = new Fenster();
+    _optionenF->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Closable | Fenster::Style::Titel | Fenster::Style::TitelBuffered |
+                          Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund | Fenster::Style::TitelHAlpha |
+                          Fenster::Style::BodyHAlpha | Fenster::Style::Rahmen | Fenster::Style::ClosingKlickBuffer |
+                          Fenster::Style::ClosingHintergrund | Fenster::Style::ClosingHAlpha | Fenster::Style::Beweglich | Fenster::Style::VScroll );
+    _optionenF->setSize( 300, 330 );
+    _optionenF->setPosition( 100, 100 );
+    _optionenF->setVSBMax( 300 );
+    _optionenF->zVScrollBar()->setKlickScroll( 10 );
+    _optionenF->zVScrollBar()->setFarbe( 0xFFFFFFFF );
+    _optionenF->zVScrollBar()->setBgFarbe( 0xF0000000, 1 );
+    _optionenF->setRBreite( 2 );
+    _optionenF->setRFarbe( 0xFFFFFFFF );
+    _optionenF->setTSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _optionenF->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
+    _optionenF->setTitel( "Optionen" );
+    _optionenF->zTTextFeld()->setSize( 0, 20 );
+    _optionenF->setTBgFarbe( 0xF0000000 );
+    _optionenF->setTAfFarbe( 0xA0FFFFFF );
+    _optionenF->setTAfStrength( 15 );
+    _optionenF->setTSFarbe( 0xFFFFFFFF );
+    _optionenF->setSBgFarbe( 0xF0000000 );
+    _optionenF->setSKAfFarbe( 0xFFFFFFFF );
+    _optionenF->setSKAfStrength( 30 );
+    _optionenF->setKBgFarbe( 0xF0000000 );
+    _optionenF->setClosingMe( oAbbrechen );
+    screen->addMember( dynamic_cast<Zeichnung *>( _optionenF->getThis() ) );
+
+    TextFeld *oReihenfolge = new TextFeld();
+    oReihenfolge->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
+    oReihenfolge->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    oReihenfolge->setSchriftFarbe( 0xFFFFFFFF );
+    oReihenfolge->setText( "Update Reihenfolge:" );
+    oReihenfolge->setPosition( 2, 2 );
+    oReihenfolge->setSize( 276, 20 );
+    _optionenF->addMember( oReihenfolge );
+
+    _o_rt = new ObjTabelle();
+    _o_rt->setStyle( ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Erlaubt | ObjTabelle::Style::Rahmen |
                      ObjTabelle::Style::Raster | ObjTabelle::Style::VScroll );
-	_o_rt->setPosition( 2, 24 );
-	_o_rt->setSize( 276, 150 );
-	_o_rt->setRahmenBreite( 1 );
-	_o_rt->setRahmenFarbe( 0xFFFFFFFF );
-	_o_rt->setRasterBreite( 1 );
-	_o_rt->setRasterFarbe( 0xFFFFFFFF );
-	_o_rt->setVertikalKlickScroll( 10 );
-	_o_rt->setMausEreignis( _o_rtME );
-	_o_rt->addSpalte( "Spiel" );
-	_o_rt->addSpalte( "Erlaubt" );
-	_o_rt->setSpaltenBreite( 0, 237 );
-	_o_rt->setSpaltenBreite( 1, 20 );
-	_o_rt->addZeile( "Überschrift" );
-	_o_rt->setZeilenHeight( 0, 15 );
-	TextFeld *ortSpielT = new TextFeld();
-	ortSpielT->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
-	ortSpielT->setSchriftZ( sNormal->getThis() );
-	ortSpielT->setSchriftFarbe( 0xFFFFFFFF );
-	ortSpielT->setText( "Spiel" );
-	_o_rt->setZeichnungZ( 0, 0, ortSpielT );
-	_optionenF->addMember( _o_rt->getThis() );
-
-	_o_rno = new Knopf();
-	_o_rno->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	_o_rno->setPosition( 76, 176 );
-	_o_rno->setSize( 100, 20 );
-	_o_rno->setText( "nach Oben" );
-	_o_rno->setSchriftZ( sNormal->getThis() );
-	_o_rno->setMausEreignis( _o_rnoME );
-	_optionenF->addMember( _o_rno->getThis() );
-
-	_o_rnu = new Knopf();
-	_o_rnu->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	_o_rnu->setPosition( 178, 176 );
-	_o_rnu->setSize( 100, 20 );
-	_o_rnu->setText( "nach Unten" );
-	_o_rnu->setSchriftZ( sNormal->getThis() );
-	_o_rnu->setMausEreignis( _o_rnuME );
-	_optionenF->addMember( _o_rnu->getThis() );
-
-	TextFeld *oLimit = new TextFeld();
-	oLimit->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
-	oLimit->setSchriftZ( sNormal->getThis() );
-	oLimit->setSchriftFarbe( 0xFFFFFFFF );
-	oLimit->setText( "Übertragungslimit pro Sekunde:" );
-	oLimit->setPosition( 2, 200 );
-	oLimit->setSize( 276, 20 );
-	_optionenF->addMember( oLimit );
-
-	_o_ülps = new TextFeld();
-	_o_ülps->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
-	_o_ülps->setPosition( 2, 222 );
-	_o_ülps->setSize( 100, 20 );
-	_o_ülps->setRahmenFarbe( 0xFF00FF00 );
-	_o_ülps->setSchriftZ( sNormal->getThis() );
-	_o_ülps->setText( "" );
-	_o_ülps->setSchriftFarbe( 0xFFFFFFFF );
-	_o_ülps->setSchriftSize( 12 );
-	_o_ülps->setAlphaFeldFarbe( 0x5500FF00 );
-	_o_ülps->setAlphaFeldStrength( -5 );
-	_o_ülps->setTastaturEreignis( _o_ülpsTE );
-	_optionenF->addMember( _o_ülps->getThis() );
-
-	_o_üle = new AuswahlBox();
-	_o_üle->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer |
-					  AuswahlBox::Style::MausBuffer | AuswahlBox::Style::Hintergrund );
-	_o_üle->setPosition( 104, 222 );
-	_o_üle->setSize( 55, 20 );
-	_o_üle->setSchriftZ( sNormal->getThis() );
-	_o_üle->setRahmenFarbe( 0xFFFFFFFF );
-	_o_üle->setHintergrundFarbe( 0xFF000000 );
-	_o_üle->setAuswAlphaFeldFarbe( 0x5500FF00 );
-	_o_üle->setAuswAlphaFeldStrength( -5 );
-	_o_üle->setMausAlphaFeldFarbe( 0x2200FF00 );
-	_o_üle->setMausAlphaFeldStrength( -5 );
-	_o_üle->setMausEreignis( _ret1ME );
-	_o_üle->setTastaturEreignis( _ret1TE );
-	_o_üle->addEintrag( "kb/s" );
-	_o_üle->addEintrag( "mb/s" );
-	_optionenF->addMember( _o_üle->getThis() );
+    _o_rt->setPosition( 2, 24 );
+    _o_rt->setSize( 276, 150 );
+    _o_rt->setRahmenBreite( 1 );
+    _o_rt->setRahmenFarbe( 0xFFFFFFFF );
+    _o_rt->setRasterBreite( 1 );
+    _o_rt->setRasterFarbe( 0xFFFFFFFF );
+    _o_rt->setVertikalKlickScroll( 10 );
+    _o_rt->setMausEreignis( _o_rtME );
+    _o_rt->addSpalte( "Spiel" );
+    _o_rt->addSpalte( "Erlaubt" );
+    _o_rt->setSpaltenBreite( 0, 237 );
+    _o_rt->setSpaltenBreite( 1, 20 );
+    _o_rt->addZeile( "Überschrift" );
+    _o_rt->setZeilenHeight( 0, 15 );
+    TextFeld *ortSpielT = new TextFeld();
+    ortSpielT->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center );
+    ortSpielT->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    ortSpielT->setSchriftFarbe( 0xFFFFFFFF );
+    ortSpielT->setText( "Spiel" );
+    _o_rt->setZeichnungZ( 0, 0, ortSpielT );
+    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rt->getThis() ) );
+
+    _o_rno = new Knopf();
+    _o_rno->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    _o_rno->setPosition( 76, 176 );
+    _o_rno->setSize( 100, 20 );
+    _o_rno->setText( "nach Oben" );
+    _o_rno->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _o_rno->setMausEreignis( _o_rnoME );
+    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rno->getThis() ) );
+
+    _o_rnu = new Knopf();
+    _o_rnu->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    _o_rnu->setPosition( 178, 176 );
+    _o_rnu->setSize( 100, 20 );
+    _o_rnu->setText( "nach Unten" );
+    _o_rnu->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _o_rnu->setMausEreignis( _o_rnuME );
+    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_rnu->getThis() ) );
+
+    TextFeld *oLimit = new TextFeld();
+    oLimit->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::VCenter );
+    oLimit->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    oLimit->setSchriftFarbe( 0xFFFFFFFF );
+    oLimit->setText( "Übertragungslimit pro Sekunde:" );
+    oLimit->setPosition( 2, 200 );
+    oLimit->setSize( 276, 20 );
+    _optionenF->addMember( oLimit );
+
+    _o_ülps = new TextFeld();
+    _o_ülps->setStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Erlaubt | TextFeld::Style::Rahmen | TextFeld::Style::Buffered | TextFeld::Style::VCenter );
+    _o_ülps->setPosition( 2, 222 );
+    _o_ülps->setSize( 100, 20 );
+    _o_ülps->setRahmenFarbe( 0xFF00FF00 );
+    _o_ülps->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _o_ülps->setText( "" );
+    _o_ülps->setSchriftFarbe( 0xFFFFFFFF );
+    _o_ülps->setSchriftSize( 12 );
+    _o_ülps->setAlphaFeldFarbe( 0x5500FF00 );
+    _o_ülps->setAlphaFeldStrength( -5 );
+    _o_ülps->setTastaturEreignis( _o_ülpsTE );
+    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_ülps->getThis() ) );
+
+    _o_üle = new AuswahlBox();
+    _o_üle->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::AuswahlBuffer |
+                      AuswahlBox::Style::MausBuffer | AuswahlBox::Style::Hintergrund );
+    _o_üle->setPosition( 104, 222 );
+    _o_üle->setSize( 55, 20 );
+    _o_üle->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    _o_üle->setRahmenFarbe( 0xFFFFFFFF );
+    _o_üle->setHintergrundFarbe( 0xFF000000 );
+    _o_üle->setAuswAlphaFeldFarbe( 0x5500FF00 );
+    _o_üle->setAuswAlphaFeldStrength( -5 );
+    _o_üle->setMausAlphaFeldFarbe( 0x2200FF00 );
+    _o_üle->setMausAlphaFeldStrength( -5 );
+    _o_üle->setMausEreignis( _ret1ME );
+    _o_üle->setTastaturEreignis( _ret1TE );
+    _o_üle->addEintrag( "kb/s" );
+    _o_üle->addEintrag( "mb/s" );
+    _optionenF->addMember( dynamic_cast<Zeichnung *>( _o_üle->getThis() ) );
 
     bool exitPatcher = 0;
 
@@ -798,8 +800,8 @@ int KSGStart Framework::Start( Startparam p )
     o_repair->setPosition( 5, 254 );
     o_repair->setSize( 100, 20 );
     o_repair->setText( "Reparieren" );
-    o_repair->setSchriftZ( sNormal->getThis() );
-    o_repair->setMausEreignis( [ mainClient, &exitPatcher ]( void *p, void *o, MausEreignis me )
+    o_repair->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    o_repair->setMausEreignis( [mainClient, &exitPatcher]( void *p, void *o, MausEreignis me )
     {
         if( me.id == ME_RLinks )
         {
@@ -819,76 +821,78 @@ int KSGStart Framework::Start( Startparam p )
             DateiRemove( "data/versionen.ini" );
             _patcher->release();
             exitPatcher = 0;
-            _patcher = new Patcher( (FBalken *)_fortschritt->getThis(), (TextFeld *)_aktion->getThis(), (Knopf *)_play->getThis(), &exitPatcher, mainClient->createPatchServerClient() );
+            _patcher = new Patcher( dynamic_cast<FBalken *>( _fortschritt->getThis() ), dynamic_cast<TextFeld *>( _aktion->getThis() ), dynamic_cast<Knopf *>( _play->getThis() ), &exitPatcher, mainClient->createPatchServerClient() );
             _patcher->startPatch();
         }
         return 1;
     } );
     _optionenF->addMember( o_repair );
 
-	Knopf *o_ok = new Knopf();
-	o_ok->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
-	o_ok->setPosition( 178, 284 );
-	o_ok->setSize( 100, 20 );
-	o_ok->setText( "Fertig" );
-	o_ok->setSchriftZ( sNormal->getThis() );
-	o_ok->setMausEreignis( o_okME );
-	_optionenF->addMember( o_ok );
+    Knopf *o_ok = new Knopf();
+    o_ok->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Buffered | Knopf::Style::KlickBuffer | Knopf::Style::Rahmen );
+    o_ok->setPosition( 178, 284 );
+    o_ok->setSize( 100, 20 );
+    o_ok->setText( "Fertig" );
+    o_ok->setSchriftZ( dynamic_cast<Schrift *>( sNormal->getThis() ) );
+    o_ok->setMausEreignis( o_okME );
+    _optionenF->addMember( o_ok );
 
-	screen->unlock();
+    screen->unlock();
 
-	DWORD threadId;
-	HANDLE handle = CreateThread( NULL, 0, runThread, screen, 0, &threadId );
+    DWORD threadId;
+    HANDLE handle = CreateThread( NULL, 0, runThread, screen, 0, &threadId );
 
-	_patcher = new Patcher( (FBalken*)_fortschritt->getThis(), (TextFeld*)_aktion->getThis(), (Knopf*)_play->getThis(), &exitPatcher, mainClient->createPatchServerClient() );
-	_patcher->startPatch();
+    _patcher = new Patcher( dynamic_cast<FBalken *>( _fortschritt->getThis() ), dynamic_cast<TextFeld *>( _aktion->getThis() ), dynamic_cast<Knopf *>( _play->getThis() ), &exitPatcher, mainClient->createPatchServerClient() );
+    _patcher->startPatch();
 
-	StartNachrichtenSchleife();
+    StartNachrichtenSchleife();
 
-	_exitB = 1;
-	WaitForSingleObject( handle, INFINITE );
+    _exitB = 1;
+    WaitForSingleObject( handle, INFINITE );
 
-	news->release();
+    news->warteAufThread( 10000 );
+    news->ende();
+    news->release();
 
     exitPatcher = 1;
-	_patcher->warteAufPatch( INFINITE );
-	int returnVal = _patcher->getReturn();
-	_patcher->release();
-
-	_optionenF->release();
-	_o_rt->release();
-	_o_rno->release();
-	_o_rnu->release();
-	_o_ülps->release();
-	_o_üle->release();
-
-	_fortschritt->release();
-	_aktion->release();
-	_kbps->release();
-	_play->release();
-	sNormal->release();
-
-	patcherRahmen->release();
-	patcherHintergrund->release();
-	playBild->release();
-	playKlick->release();
-	systemSchließen->release();
-	systemMinimieren->release();
-	systemOptionen->release();
-	systemFortschrittL->release();
-	systemFortschrittV->release();
-
-	screen->release();
-	_frame->setBildschirm( 0 );
-	_frame->zerstören();
-	_frame->release();
+    _patcher->warteAufPatch( INFINITE );
+    int returnVal = _patcher->getReturn();
+    _patcher->release();
+
+    _optionenF->release();
+    _o_rt->release();
+    _o_rno->release();
+    _o_rnu->release();
+    _o_ülps->release();
+    _o_üle->release();
+
+    _fortschritt->release();
+    _aktion->release();
+    _kbps->release();
+    _play->release();
+    sNormal->release();
+
+    patcherRahmen->release();
+    patcherHintergrund->release();
+    playBild->release();
+    playKlick->release();
+    systemSchließen->release();
+    systemMinimieren->release();
+    systemOptionen->release();
+    systemFortschrittL->release();
+    systemFortschrittV->release();
+
+    screen->release();
+    _frame->setBildschirm( 0 );
+    _frame->zerstören();
+    _frame->release();
     mainClient->release();
     userOptions->release();
-	Network::Exit();
+    Network::Exit();
 
-	DateiPfadErstellen( new Text( "data/tmp/keinabsturz" ) );
+    DateiPfadErstellen( new Text( "data/tmp/keinabsturz" ) );
 
-	if( _abbruch )
-		return 0;
-	return returnVal;
+    if( _abbruch )
+        return 0;
+    return returnVal;
 }