UDF für .ini-Dateien (Sortieren, suchen, tauschen)

  • Hi!

    Ich habe für ein Projekt mal eine ziemlich komplizierte Funktion für .ini-Dateien geschrieben, bevor ich drauf kam, die aufzudröseln. Das habe ich jetzt gemacht und dachte, andere könnten das auch gebrauchen. Falls nicht schon jemand eine bessere Variante geschrieben hat, könnt ihr sie (Einige könnten überflüssig oder komplizierter sein) gerne unter Verweis auf mich -Quellcode reicht - benutzen. Hier die Beschreibung der wichtigsten Funktionen:

    _IniFindKey(): Sucht übereinstimmenden Key in der ini-Datei und gibt die zugehörigen Daten in einem Array zurück.
    _IniFindValue(): Sucht übereinstimmenden Value in der ini-Datei und gibt die zugehörigen Daten in einem Array zurück.
    _IniInsertSection(): Fügt eine Section an der angegebenen Stelle ein.
    _IniInsertKey(): Fügt einen Key und Value an der angegebenen Stelle in der Section ein.
    _IniSortAll(): Sortiert alle Einträge in der ini-Datei.
    _IniSortSections(): Sortiert alle Sections in der ini-Datei.
    _IniSortSectionKeys(): Sortiert alle Keys einer Section.
    _IniKeySectionSwap(): Verschiebt einen Key zwischen Sections.

    Hier die UDF:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name:_IniExists($sFile)
    ; Description: Prüft, ob eine ini-Datei besteht
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniExists($sFile)
    If Not FileExists($sFile) Or StringRight($sFile, 4) <> ".ini" Then
    Return 0
    Else
    Return 1
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name:_IniSectionExists($sFile, $sIniSection)
    ; Description: Prüft, ob eine bestimmte Section in der ini-Datei besteht
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection ist die gesuchte Section.
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniSectionExists($sFile, $sIniSection)
    IniReadSection($sFile, $sIniSection)
    If @error Then Return 0
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name:_IniKeyExists($sFile, $sIniSection, $sIniKey)
    ; Description: Prüft, ob ein bestimmter Key in der ini-Datei besteht
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection ist die Section des gesuchten Keys.
    ;$sIniKey ist der gesuchte Key.
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniKeyExists($sFile, $sIniSection, $sIniKey)
    $var = IniRead($sFile, $sIniSection, $sIniKey, "error")
    If $var = "error" Then Return 0
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name:_IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
    ; Description: Prüft, ob ein bestimmter Value in der ini-Datei besteht
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection ist die Section des gesuchten Keys.
    ;$sIniKey ist der Key des gesuchten Values.
    ;$sIniValue ist der gesuchte Value.
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
    $var = IniRead($sFile, $sIniSection, $sIniKey, "error")
    If $var = $sIniValue Then Return 1
    Return 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name:_IniFindKey($sFile, $sIniKey, [$fStrInStr])
    ; Description: Sucht übereinstimmenden Key in der ini-Datei und gibt die
    ;zugehörigen Daten in einem Array zurück.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniKey ist der gesuchte Key.
    ;$fStrInStr gibt an, ob
    ;0 = $sIniKey ist der vollständige gesuchte Key (Default)
    ;1 = $sIniKey ist eine Teilzeichenkette des gesuchten Keys
    ; Return Value(s): Erfolg - Gibt ein Array zurück, das die Sections und Values aller
    ;übereinstimmenden Daten enthält.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ; Remarks:
    ; $Array[0][0] enthält die Anzahl der gefundenen Keys. $Array[1][0] enthält die Section
    ; des ersten gefundenen Keys, $Array[1][1] enthält den Value des ersten gefundenen Keys.
    ; $Array[n][0] und $Array[n][1] enthalten die entsprechenden Daten der folgenden gefundenen
    ; Keys.
    ; Ist $fStrInStr gleich 1, enthält $Array[1][2] den vollständigen Name des gefundenen Keys,
    ; $Array[n][2] die entsprechenden vollständigen Namen der weiteren gefundenen Keys.
    ;
    ;===============================================================================
    Func _IniFindKey($sFile, $sIniKey, $fStrInStr=0)
    Dim $aArray[1][1]
    $aArray[0][0] = 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSections = IniReadSectionNames($sFile)
    If @error Then Return 0 ;Keine Datei gefunden
    For $i_sec = 1 To $aSections[0] ;Schleife der Sections
    Local $aKeys = IniReadSection($sFile, $aSections[$i_sec])
    For $i_key = 1 To $aKeys[0][0] ;Schleife der Keys
    If $fStrInStr = 0 And $aKeys[$i_key][0] = $sIniKey Then ;Nicht case-sensitive
    $aArray[0][0] += 1 ;Setzt den Counter für das Array
    ReDim $aArray[$aArray[0][0]+1][2]
    $aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Counter für die Section
    $aArray[$aArray[0][0]][1] = $aKeys[$i_key][1] ;Setzt den Counter für den Value
    ElseIf $fStrInStr = 1 And StringInStr($aKeys[$i_key][0], $sIniKey) Then ;Nicht case-sensitive
    $aArray[0][0] += 1 ;Setzt den Counter für das Array
    ReDim $aArray[$aArray[0][0]+1][3] ;TODO: Ist das +2 wirklich richtig?
    $aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Counter für die Section
    $aArray[$aArray[0][0]][1] = $aKeys[$i_key][1] ;Setzt den Counter für den Value
    $aArray[$aArray[0][0]][2] = $aKeys[$i_key][0] ;Setzt den Wert für den kompletten Key
    EndIf
    Next
    Next
    If $aArray[0][0] = 0 Then Return 0
    If $aArray[0][0] > 0 Then Return $aArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniFindValue($sFile, $sIniValue, [$fStrInStr])
    ; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
    ;zugehörigen Daten in einem Array zurück.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniValue ist der gesuchte Value.
    ;$fStrInStr gibt an, ob
    ;0 = $sIniKey ist der vollständige gesuchte Key (Default)
    ;1 = $sIniKey ist eine Teilzeichenkette des gesuchten Keys
    ; Return Value(s): Erfolg - Gibt ein Array zurück, das die Sections und Keys aller
    ;übereinstimmenden Daten enthält.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ; Remarks:
    ; $Array[0][0] enthält die Anzahl der gefundenen Values. $Array[1][0] enthält die Section
    ; des ersten gefundenen Values, $Array[1][1] enthält den Key des ersten gefundenen Values.
    ; $Array[n][0] und $Array[n][1] enthalten die entsprechenden Daten der folgenden gefundenen
    ; Values.
    ; Ist $fStrInStr gleich 1, enthält $Array[1][2] den vollständigen Name des gefundenen Values,
    ; $Array[n][2] die entsprechenden vollständigen Namen der weiteren gefundenen Values.
    ;
    ;===============================================================================
    Func _IniFindValue($sFile, $sIniValue, $fStrInStr=0)
    Dim $aArray[1][1]
    $aArray[0][0] = 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSections = IniReadSectionNames($sFile)
    If @error Then Return 0 ;Keine Datei gefunden
    For $i_sec = 1 To $aSections[0] ;Schleife der Sections
    Local $aKeys = IniReadSection($sFile, $aSections[$i_sec])
    For $i_key = 1 To $aKeys[0][0] ;Schleife der Keys
    If $fStrInStr = 0 And $aKeys[$i_key][1] = $sIniValue Then ;Nicht case-sensitive
    $aArray[0][0] += 1 ;Setzt den Counter für das Array
    ReDim $aArray[$aArray[0][0]+1][2]
    $aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Wert für die Section
    $aArray[$aArray[0][0]][1] = $aKeys[$i_key][0] ;Setzt den Wert für den Key
    ElseIf $fStrInStr = 1 And StringInStr($aKeys[$i_key][1], $sIniValue) Then ;Nicht case-sensitive
    $aArray[0][0] += 1 ;Setzt den Counter für das Array
    ReDim $aArray[$aArray[0][0]+1][3] ;TODO: Ist das +2 wirklich richtig?
    $aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Wert für die Section
    $aArray[$aArray[0][0]][1] = $aKeys[$i_key][0] ;Setzt den Wert für den Key
    $aArray[$aArray[0][0]][2] = $aKeys[$i_key][1] ;Setzt den Wert für den kompletten Value
    EndIf
    Next
    Next
    If $aArray[0][0] = 0 Then Return 0
    If $aArray[0][0] > 0 Then Return $aArray
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniInsertSection($sFile, $sIniSection, $sData, $nIndex)
    ; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
    ;zugehörigen Daten in einem Array zurück.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection ist die einzufügende Section
    ;$sIniData ist der Datenbestand der einzufügenden Section.
    ;$sIniIndex die Position innerhalb der ini-Datei, an der die
    ;Section eingefügt werden soll (Index beginnt bei 1).
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück und setzt @error.
    ;@error=1 Ini-Datei nicht vorhanden
    ;@error=2 Section existiert bereits
    ;@error=3 Falscher Index
    ; Author(s): unearth
    ; Remarks:
    ; Sollen mit $sData mehr als ein Key eingegeben werden, müssen die Keys mit
    ; @LF getrennt werden
    ;
    ;===============================================================================
    Func _IniInsertSection($sFile, $sIniSection, $sData, $nIndex)
    Local $aSections = IniReadSectionNames($sFile)
    If @error Then Return 0
    If Not _IniExists($sFile) Then
    SetError(1) ;@error=1 Ini-Datei nicht vorhanden
    Return 0
    EndIf
    If _IniSectionExists($sFile, $sIniSection) Then
    SetError(2) ;@error=2 Section existiert bereits
    Return 0
    EndIf
    If $nIndex < 0 Or $nIndex > $aSections[0] Then
    SetError(3) ;@error=3 Falscher Index
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    IniWriteSection($sFile, $sIniSection, $sData) ;Hängt die neue Section zunächst hinten an
    For $i = $nIndex To $aSections[0] ;Löscht die Sections, die später unter der eingefügten Section liegen sollen. Hängt sie dann der Reihe nach wieder an.
    Local $aKeys = IniReadSection($sFile, $aSections[$i])
    IniDelete($sFile, $aSections[$i])
    For $i_key = 1 To $aKeys[0][0]
    IniWrite($sFile, $aSections[$i], $aKeys[$i_key][0],$aKeys[$i_key][1])
    Next
    Next
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniInsertKey($sFile, $sIniSection, $sIniKey, $sIniValue, $nIndex)
    ; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
    ;zugehörigen Daten in einem Array zurück.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection ist die einzufügende Section
    ;$sIniKey ist der einzufügende Key.
    ;$sIniValue ist der Value des einzufügenden Keys.
    ;$sIniIndex die Position innerhalb der ini-Datei, an der der
    ;Key eingefügt werden soll (Index beginnt bei 1).
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück und setzt @error.
    ;@error=1 Ini-Datei nicht vorhanden
    ;@error=2 Section existiert bereits
    ;@error=3 Key existiert bereits
    ;@error=4 Falscher Index
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniInsertKey($sFile, $sIniSection, $sIniKey, $sIniValue, $nIndex)
    Local $aArrayVec1
    Local $aArrayVec2

    [/autoit] [autoit][/autoit] [autoit]

    $aKeys = IniReadSection($sFile, $sIniSection)
    If @error Then Return 0
    If Not _IniExists($sFile) Then
    SetError(1) ;@error=1 Ini-Datei nicht vorhanden
    Return 0
    EndIf
    If Not _IniSectionExists($sFile, $sIniSection) Then
    SetError(2) ;@error=2 Section nicht vorhanden
    Return 0
    EndIf
    If _IniKeyExists($sFile, $sIniSection, $sIniKey) Then
    SetError(3) ;@error=3 Key existiert bereits
    Return 0
    EndIf
    If $nIndex < 0 Or $nIndex > $aKeys[0][0] Then
    SetError(4) ;@error=4 Falscher Index
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aKeys[0][0] ;Löscht die bisherigen Werte in der Section
    IniDelete($sFile, $sIniSection, $aKeys[$i][0])
    Next
    Dim $aArrayVec1[$aKeys[0][0]+1] ;Den ersten Vektor von §aKeys als eigenständiges Array erstellen = Enthält die Keys
    $aArrayVec1[0] = $aKeys[0][0]+1
    For $i = 1 To $aKeys[0][0]
    $aArrayVec1[$i] = $aKeys[$i][0]
    Next
    Dim $aArrayVec2[$aKeys[0][0]+1] ;Den zweiten Vektor von §aKeys als eigenständiges Array erstellen = Enthält die Values
    $aArrayVec2[0] = $aKeys[0][0]+1
    For $i = 1 To $aKeys[0][0]
    $aArrayVec2[$i] = $aKeys[$i][1]
    Next
    _ArrayInsert($aArrayVec1, $nIndex, $sIniKey)
    _ArrayInsert($aArrayVec2, $nIndex, $sIniValue)
    $aKeys = "" ;Hebt das ursprüngliche Array auf, um es neu erstellen zu können
    Dim $aKeys[$aArrayVec1[0]+1][$aArrayVec2[0]+1] ;Erstellt das Array mit dem eingefügten Key und dessen Value neu
    $aKeys[0][0] = $aArrayVec1[0]
    For $i = 1 To $aKeys[0][0]
    $aKeys[$i][0] = $aArrayVec1[$i]
    $aKeys[$i][1] = $aArrayVec2[$i]
    Next
    For $i = 1 To $aKeys[0][0] ;Schreibt die neuen Daten in die Section
    IniWrite($sFile, $sIniSection, $aKeys[$i][0], $aKeys[$i][1])
    Next
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniSortAll($sFile, $fDescendingSections, $fDescendingKeys)
    ; Description: Sortiert alle Einträge in der ini-Datei.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$fDescendingSections gibt an, ob
    ;0 = Sections werden aufsteigend sortiert(Default)
    ;1 = Sections werden absteigend sortiert
    ;$fDescendingKeys gibt an, ob
    ;0 = Keys werden aufsteigend sortiert(Default)
    ;1 = Keys werden absteigend sortiert
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniSortAll($sFile, $fDescendingSections=0, $fDescendingKeys=0)
    ;Ist die Integrität gestört, werden Daten eventuell gelöscht
    If _IniSortSections($sFile, $fDescendingSections) = 0 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSections = IniReadSectionNames($sFile)
    For $i_sec = 1 To $aSections[0]
    If _IniSortSectionKeys($sFile, $aSections[$i_sec], $fDescendingKeys) = 0 Then Return 0
    Next
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniSortSections($sFile, $fDescending)
    ; Description: Sortiert alle Sections in der ini-Datei.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$fDescending gibt an, ob
    ;0 = Sections werden aufsteigend sortiert(Default)
    ;1 = Sections werden absteigend sortiert
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniSortSections($sFile, $fDescending=0)
    ;Ist die Integrität der INI gestört, werden Daten eventuell gelöscht
    If $fDescending > 1 Then $fDescending = 1
    If $fDescending < 1 Then $fDescending = 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSections = IniReadSectionNames($sFile)
    If @error Then Return 0
    _ArraySort($aSections, $fDescending, 1) ;Sortiert die Sections
    For $i_sec = 1 To $aSections[0] ;Schreibt die Sections um
    $aKeys = IniReadSection($sFile, $aSections[$i_sec])
    IniDelete($sFile, $aSections[$i_sec]) ;Alte Position löschen
    For $i_key = 1 To $aKeys[0][0]
    IniWrite($sFile, $aSections[$i_sec], $aKeys[$i_key][0],$aKeys[$i_key][1]) ;Neue Position schreiben
    Next
    Next
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniSortSectionKeys($sFile, $sIniSection, $fDescending)
    ; Description: Sortiert alle Keys einer Section.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniSection gibt an, in welcher Section die Keys sortiert werden.
    ;$fDescending gibt an, ob
    ;0 = Keys werden aufsteigend sortiert(Default)
    ;1 = Keys werden absteigend sortiert
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniSortSectionKeys($sFile, $sIniSection, $fDescending=0)
    ;Ist die Integrität der INI gestört, werden Daten eventuell gelöscht
    Local $aKeys

    [/autoit] [autoit][/autoit] [autoit]

    If $fDescending > 1 Then $fDescending = 1
    If $fDescending < 1 Then $fDescending = 0

    [/autoit] [autoit][/autoit] [autoit]

    $aKeys = IniReadSection($sFile, $sIniSection)
    If @error Then Return 0
    For $i_key = 1 To $aKeys[0][0]
    IniDelete($sFile, $sIniSection, $aKeys[$i_key][0])
    Next
    _ArraySort($aKeys, $fDescending, 1, 0, 2) ;Sortieren
    For $i_key = 1 To $aKeys[0][0]
    IniWrite($sFile, $sIniSection, $aKeys[$i_key][0], $aKeys[$i_key][1])
    Next
    Return 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _IniKeySectionSwap($sFile, $sIniKey, $sIniSection1, $sIniSection2)
    ; Description: Verschiebt einen Key zwischen Sections.
    ; Parameter(s): $sFile ist der Pfad zur ini-Datei.
    ;$sIniKey gibt den zu verschiebenden Key an.
    ;$sIniSection1 gibt die aktuelle Section des Keys an.
    ;$sIniSection2 gibt die zukünftige Section des Keys an.
    ; Return Value(s): Erfolg - Gibt 1 zurück.
    ; Fehler - Gibt 0 zurück.
    ; Author(s): unearth
    ;
    ;===============================================================================
    Func _IniKeySectionSwap($sFile, $sIniKey, $sIniSection1, $sIniSection2)
    ;TODO = Später noch um _IniKeyInsert-Funktion mit Indexierung ergänzen?
    If Not _IniExists($sFile) Or Not _IniKeyExists($sFile, $sIniSection1, $sIniKey) Or Not _IniSectionExists($sFile, $sIniSection2) Then Return 0 ;Prüft, ob die Voraussetzungen bestehen

    [/autoit] [autoit][/autoit] [autoit]

    $sIniValue = IniRead($sFile, $sIniSection1, $sIniKey, "error")
    If @error Then Return 0
    IniDelete($sFile, $sIniSection1, $sIniKey)
    IniWrite($sFile, $sIniSection2, $sIniKey, $sIniValue) ;siehe TODO
    Return 1
    EndFunc

    [/autoit]

    Im Anhang eine Zip mit ini-Datei zum Testen. Falls Fehler drin sind - Feedback willkommen.

    Grüße unearth

    2 Mal editiert, zuletzt von unearth (13. Dezember 2007 um 17:03)

  • Muss

    [autoit]

    Func _IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
    $var = IniRead($sFile, $sIniSection, $sIniKey, "error")
    If $var = $sIniValue Then Return 1
    Return 0
    EndFunc

    [/autoit]


    Nicht

    [autoit]

    Func _IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
    $var = IniRead($sFile, $sIniSection, $sIniKey, "error")
    If $var = $sIniValue Then Return 1
    Else;<- Das hat gefehlt
    Return 0
    EndFunc

    [/autoit]


    sein?
    Edit:Ne doch nicht.

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

    Einmal editiert, zuletzt von Fast2 (13. Dezember 2007 um 20:56)