Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Überprüfen ob Datei vorhanden

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lestat



Anmeldungsdatum: 20.12.2005
Beiträge: 3

BeitragVerfasst am: 20.12.2005, 22:16    Titel: Überprüfen ob Datei vorhanden Antworten mit Zitat

Ich will überprüfen ob eine Datei vorhanden ist

So hab ich es bissher:

Zitat:

...
4 ON ERROR GOTO FEHLER
OPEN "profil.sav" FOR INPUT AS 1
vorhanden:
DO
LINE INPUT #1, name$
LOOP UNTIL EOF(1)
CLOSE 1
PRINT "Das Profil"; name$; "wird dabei ?berschrieben."
PRINT "M”chten sie ihr Profil behalten und trotzdem ein neues Spiel beginnen, m?ssen sie vorher eine Sicherheitskopie der .sav Dateien machen"
PRINT
PRINT "Profil wirklich ?berschreiben?";
COLOR 11, 0
INPUT "(B)est„tigen / (A)bbrechen"; frage$
IF frage$ = "b" THEN start
IF frage$ = "B" THEN start
GOTO 1
END

nichtvorhanden:
PRINT
PRINT "Es ist kein Spielstand vorhanden!"
SLEEP
GOTO 1
END

FEHLER:
IF ERR = 53 THEN RESUME nichtvorhanden



Da gibt er immer aus: "Marke nicht definiert" (Makiert ist hierbei ON)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Devilkevin
aka Kerstin


Anmeldungsdatum: 11.11.2004
Beiträge: 2532
Wohnort: nähe Mannheim

BeitragVerfasst am: 20.12.2005, 22:24    Titel: Antworten mit Zitat

Hi, dazu gibts was in der MonsterFAQ auf Qbasic.de!!

Zitat:
Das geht gemäß folgender Befehlssequenz:
ON ERROR GOTO Handler
INPUT "Welche Datei ist auf ihre Existenz hin zu prüfen? ",datnam$
OPEN "I", #1, datnam$
CLOSE #1
GOTO Ende
Handler:
PRINT "Datei ";datnam$;"nicht gefunden!"
RESUME Ende
Ende:

Wichtig ist, dass die Datei sequenziell im INPUT-Modus geöffnet wird, denn im OUTPUS-Modus würde sie einfach erstellt werden.


Gibt noch mehr möglichkeiten, einfach in die MonsterFAQ (link oben) schauen.
_________________
www.piratenpartei.de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Lestat



Anmeldungsdatum: 20.12.2005
Beiträge: 3

BeitragVerfasst am: 20.12.2005, 22:40    Titel: Antworten mit Zitat

Ich frage mich immernoch wo der Fehler bei mir liegt.. ist ja nicht so, dass ich mich vorher nicht informiert habe, bevor ich hier gepostet habe happy
Hab das nun mal so übernommen wie es in deinem Quote steht... und wieder:
Marke nicht definiert traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.12.2005, 22:52    Titel: Antworten mit Zitat

Also der Code klappt bei mir einwandfrei verwundert :
Code:

ON ERROR GOTO Handler
INPUT "Welche Datei ist auf ihre Existenz hin zu prüfen? ",datnam$
OPEN "I", #1, datnam$
CLOSE #1
GOTO Ende
Handler:
PRINT "Datei ";datnam$;"nicht gefunden!"
RESUME Ende
Ende:


jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 20.12.2005, 23:11    Titel: Antworten mit Zitat

Vielleicht als Verfeinerung: Von VBScript her bin ich mir eigentlich die FileExists()-Methode gewöhnt.

In QB lässt sich ansonsten eine gleichwertige FUNCTION programmieren:

http://beilagen.dreael.ch/QB/DATEXIST.BAS

Kleine Unschönheit: QB erlaubt den Error-Handler nur ins Hauptprogramm zu platzieren statt innerhalb der FUNCTION.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.12.2005, 23:26    Titel: Antworten mit Zitat

Kann man nicht unter PDS
Code:
ON LOCAL ERROR

verwenden? Das sollte doch das gleiche bewirken, oder?

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Lestat



Anmeldungsdatum: 20.12.2005
Beiträge: 3

BeitragVerfasst am: 21.12.2005, 00:24    Titel: Antworten mit Zitat

dreael hat Folgendes geschrieben:

Kleine Unschönheit: QB erlaubt den Error-Handler nur ins Hauptprogramm zu platzieren statt innerhalb der FUNCTION.


Dort lag der Hund begraben.. grinsen

Vielen Dank! lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.12.2005, 22:36    Titel: Antworten mit Zitat

on local error gibts nur in vb... ich vermisse es auch sehr in fb...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 22.12.2005, 00:21    Titel: Antworten mit Zitat

Sers!

on local error geht auch in fb. musst halt mit "-ex" compilieren.
siehe auch die "onerror.bas" im examples-verzeichnis.

Gruß
Lutz böse Ifer[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 22.12.2005, 06:41    Titel: Antworten mit Zitat

Zitat:
Kann man nicht unter PDS
Code:
ON LOCAL ERROR
verwenden? Das sollte doch das gleiche bewirken, oder? (jb)

Zitat:

on local error gibts nur in vb... (jojo)


Auszug aus der PDS-Hilfe:
Zitat:

ON [LOCAL] ERROR {GOTO line | RESUME NEXT | GOTO 0}

■ LOCAL Used to indicate an error-handling routine in the
same procedure. If not used, module-level error handlers
are indicated.


BTW: Wie schon drael zutreffenderweise schrieb, gibt es elegantere Methoden, um die (Nicht-)Existenz einer Datei zu prüfen. Fehlerbehandlungsroutinen sollten IMO nur dann eingesetzt werden, wenn es wirklich keine andere Möglichkeit gibt, eine bestimmte Bedingung explizit auszutesten. Unter anderem auch deshalb, weil das durch Fehlerbehandlungsroutinen bedingte Herumspringen quer durch den Code ein Programm nicht unbedingt "lesbarer" macht.
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 22.12.2005, 20:08    Titel: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerkt... Antworten mit Zitat

Dazu habe ich mir Folgendes für die QB-MonsterFAQ vorgemerkt...

-------------------------------------------------------------------------------------

Frage deutsch
~~~~~~~~~~~~~~~~
Wie stelle ich fest, ob eine Datei existiert?


Question English
~~~~~~~~~~~~~~~~
How to figure out whether a file is existing or not?


Antwort 1
~~~~~~~~~~~~~~~~
[ von Andreas Meile im QB-Forum, 2004 ]

Weil in QB so etwas wie file_exists() aus der Programmiersprache PHP fehlt,
würde ich doch dafür eine kleine Ersatz-FUNCTION wie folgt implementieren:

Code:

'********************************************************
' FILEXIST.EXE = Testet ob eine Datei existiert
' ============
' Dieses QBasic-Programm stellt fest, ob eine Datei
' mit dem angegebenen Pfad- und Dateinamen existiert.
' Es ist ein einfacher Ersatz f?r file_exists() aus PHP
'
' (c) Andreas Meile, 25.10.2004
'    ("Dreael"; qbasicde@dreael.ch)
'********************************************************
'
DECLARE FUNCTION DateiExistiert% (d$)
'
INPUT "Dateiname"; d$
'
IF DateiExistiert(d$) THEN
  PRINT "Datei "; d$; " existiert."
ELSE
  PRINT "Datei "; d$; " gibt es nicht!"
END IF
'
END
'
Fehler:
ex% = 0
RESUME NEXT
'
FUNCTION DateiExistiert% (d$)
  SHARED ex%
'
  ex% = -1
  ON ERROR GOTO Fehler
  OPEN d$ FOR INPUT AS 1
  CLOSE 1
  ON ERROR GOTO 0
  DateiExistiert% = ex%
END FUNCTION


Leider muss der Error-Handler bei Q(uick)Basic (hier die Befehlssequenz nach
"Fehler:") im Hauptprogramm platziert sein und daf nicht in einer SUB oder
FUNCTION untergebracht sein.


Antwort 2
~~~~~~~~~~~~~
[ von Thomas Antoni, 26.10.2004 ]


So kann man prüfen, ob eine Datei vorhanden ist:

*** Variante 1:
Bei sequentiellen Dateien, die zum Lesen geöffnet werden, Fehler
"Datei nicht gefunden" abfragen entsprechend dem folgenden Bei-
spiel:

Code:
             
'*********************************************************************
' SEQERROR.BAS = Stellt fest, ob eine sequentielle Datei vorhanden ist
' ============
' (C) Thomas Antoni, 15.5.2005
'*********************************************************************
ON ERROR GOTO fehler
INPUT "Welche Datei wollen Sie oeffnen "; dateiname$
OPEN dateiname$ FOR INPUT AS #1
GOTO weiter
fehler: PRINT "Datei nicht vorhanden!"
INPUT "Geben Sie den korrekten Dateinamen ein"; dateiname$
RESUME   'Ruecksprung zum fehlerverursachenden Befehl
weiter: PRINT "Datei ist vorhanden"
  '... Hier folgen die weiteren Befehle




*** Variante 2: Bei allen anderen Dateiarten: Dateilänge auf "0" abfragen:

Code:
IF LOF (<Dateinr. ohne #>) > 0 THEN ... 'Dateilänge > 0 ?

Funktioniert bei Direktzugriffs-Dateien und binären Dateien. Bei
sequentiellen Dateien nur in der Zugriffsart OUTPUT verwendbar.

**** Variante 3: Prüfen, ob ein definiertes Datum rücklesbar ist, siehe
TOP96.BAS (bei Direktzugriffs-Dateien). Wenn "0" ausge-
lesen wird, ist die Datei nicht vorhanden.


Welche der genannten Variante sinnvoll ist, hängt von der Dateiart und
der Zugriffsart ab.


Antwort 3
~~~~~~~~~~~~~
[ von im QB-Forum, 26.10.2004 ]


Wenn der Dateiname nicht als Variable im Programm gebraucht wird, kann man eine
Batchdatei oder als Shell-Befehl das ganze recht einfach machen.

*** Codebeispiel mit SHELL:
Code:

  SHELL "if exist c:\file.dat del c:\file.dat"


*** Codebeispiel mit einer Batchdatei namens loesch.bat:

Inhalt der Batchdatei loesch.bat:
Code:
 
  if exist %1 del %1

Inhalt QB-Programms, das die Batchdatei loesch.bat aufruft:
Code:

  SHELL "loesch c:\file.dat"

-------------------------------------------------------------------------------------
_________________
+++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 22.12.2005, 22:32    Titel: Re: Dazu habe ich mir Folgendes für die MonsterFAQ vorgemerk Antworten mit Zitat

Thomas Antoni hat Folgendes geschrieben:
*** Variante 2: Bei allen anderen Dateiarten: Dateilänge auf "0" abfragen:

Code:
IF LOF (<Dateinr. ohne #>) > 0 THEN ... 'Dateilänge > 0 ?

Funktioniert bei Direktzugriffs-Dateien und binären Dateien. Bei
sequentiellen Dateien nur in der Zugriffsart OUTPUT verwendbar.

Grundsätzlich korrekt recherchiert, aber von solchen Methoden rate ich wiederum eher ab, denn ich will ja nicht jedesmal einen Schreibzugriff verursachen (Datei neu anlegen), wenn ich eigentlich nur die Existenz prüfen will, sonst habe ich schlussendlich die reinste Müllhalde mit solchen 0-Byte-Dateien auf der Diskette/Festplatte/Server-Netzlaufwerk...

Daher sollte man grundsätzlich bei OPEN .. FOR BINARY vorher ein in ON ERROR GOTO eingeklemmtes OPEN ... FOR INPUT AS machen, um einen Schreibzugriff zu vermeiden, sonst gibt es Probleme bei z.B. einer schreibgeschützten Diskette.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 23.12.2005, 15:03    Titel: Antworten mit Zitat

Hier der "direkte" (und dabei relativ einfache) Weg über DOS-Interrupt &H21 - ohne unnötige Schreibaktivitäten bzw. Fehlerbehandlungsroutinen.

Zu beachten:
1. QB mit dem Parameter /l starten - andernfalls kann CALL INTERRUPT nicht ausgeführt werden.
2. Unter PDS letzte Zeile von Pkt. 2 (wie dort vorgeschlagen) abändern.
Code:
DEFINT A-Z

DECLARE FUNCTION DateiVorhanden% (rtDateiName$)

TYPE typRegister
  AX AS INTEGER
  BX AS INTEGER
  CX AS INTEGER
  DX AS INTEGER
  BP AS INTEGER
  SI AS INTEGER
  DI AS INTEGER
  Flags AS INTEGER
  DS AS INTEGER
  ES AS INTEGER
END TYPE
DIM SHARED uRegister AS typRegister

TYPE typDTA
  Reserviert    AS STRING * 21
  Attribut      AS STRING * 1
  DateiZeit     AS STRING * 2
  DateiDatum    AS STRING * 2
  DateiGroesse  AS LONG
  DateiName     AS STRING * 13
END TYPE
DIM SHARED uDTA AS typDTA

CLS
PRINT "PRUEFEN AUF EXISTENZ EINER DATEI"
PRINT
INPUT "  Geben Sie bitte Pfad/Dateiname ein: ", tDateiName$
PRINT
IF DateiVorhanden%(tDateiName$) THEN
  PRINT "  Datei vorhanden!"
ELSE
  PRINT "  Datei nicht gefunden!"
END IF
WHILE LEN(INKEY$) = 0
WEND
END

DEFINT A-Z
FUNCTION DateiVorhanden% (rtDateiName$)

  '1. Neuen DOS-DTA einrichten
  uRegister.DX = VARPTR(uDTA)
  uRegister.DS = VARSEG(uDTA)
  uRegister.AX = &H1A00
  CALL InterruptX(&H21, uRegister, uRegister)

  '2. Suchabfrage formulieren
  tDateiName$ = rtDateiName$ + CHR$(0)  'ASCIIZ-String erzeugen
  uRegister.AX = &H4E00                 'DOS-Service "Suchen von Dateien"
  uRegister.CX = 39                     'Attribut-Kombination fuer "beliebige Datei"
  uRegister.DX = SADD(tDateiName$)      'Adresse des Suchbegriffs
  uRegister.DS = VARSEG(tDateiName$)    'Segment des Suchbegriffs (QB 4.5)
  'uRegister.DS = SSEG(tDateiName$)     'Segment des Suchbegriffs (PDS)

  '3. Suche starten
  CALL InterruptX(&H21, uRegister, uRegister)

  '4. Suchergebnis auswerten
  IF uRegister.Flags AND 1 THEN
    DateiVorhanden = 0
  ELSE
    DateiVorhanden = -1
  END IF

END FUNCTION


Download von Quellcode + EXE: http://rapidshare.de/files/9687941/DateiDa.zip.html
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 03.05.2006, 11:14    Titel: Antworten mit Zitat

Guten Morgen!

Zur oben gestellten Problematik hätte ich ebenfalls eine Frage.
Meine Entwicklungsumgebung gestaltet sich etwas anders (siehe SIG).

Leider steht mir kein INPUT-Modus in der OPEN-Anweisung zur Verfügung.

Bisdato habe ich die Existenz einer Datei immer folgendermaßen gelöst:
Code:

OPEN Datname$ AS #datFile%
    FIELD #datFile%, 20 AS DateienD$
    DATlaenge% = LOF(#datFile%)
CLOSE #datFile%

IF DATlaenge% > 0 THEN
    PRINT "DAT ist da";
ELSE
    PRINT "DAT ist nicht da";
    KILL Datname$
END IF

Gibt es einen anderen Weg die Überprüfung zu tätigen ohne einen
wie oben schon erwähnt: "Schreibzugriff verursachen (Datei neu anlegen)"?

Desweiteren würde ich gerne in Erfahrung bringen, wie ich eine ausführbare Datei
auf Ihre Existenz prüfen kann. In meinem Fall wäre dies: .PD4
(ohne dabei über den Error-Handler gehen zu müssen -> "File not found")

Vielen Dank im Voraus für Eure Antworten.

Gruß
studio
_________________
Entwicklungsumgebung:
---------------------------
Hardware: Denso BHT 300 / SATO Etikettendrucker (MB 200)
Software: BHT-Basic (Ähnlichkeiten zu MSDOS-Basic)
Infos: ftp://www.denso-id.de/Documents/Manuals/Programmers_Manuals/Denso_OS/BHT300_Programmers_Manual_E.pdf


Zuletzt bearbeitet von studio am 03.05.2006, 12:06, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 03.05.2006, 11:56    Titel: Antworten mit Zitat

du kannst immer hingehen und einfach DIR in ne datei umleiten und auslesen:
Code:
SHELL "dir *.pd4 /zusatzparameterwiesdiramliebstenis > c:\temp.txt"
OPEN "c:\temp.txt" FOR INPUT AS #irgendwas
'dann eben aus #irgendwas das ergebnis von dir auslesen worin alle vorhandenen dateien stehen sollten
CLOSE #irgendwas
KILL "c:\temp.txt"

das wäre zumindest unter QB die Alternativmethode die eben noch umständlicher ist als das mit dem error verursachen, dafür produziert man damit aber auch nicht gezielt fehler was so manchem vielleicht lieber ist zwinkern
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
studio



Anmeldungsdatum: 08.08.2005
Beiträge: 34

BeitragVerfasst am: 03.05.2006, 12:19    Titel: Antworten mit Zitat

Hallo!

Vielen Dank für Deine Antwort.

MisterD hat Folgendes geschrieben:
du kannst immer hingehen und einfach DIR in ne datei umleiten und auslesen:
Code:
SHELL "dir *.pd4 /zusatzparameterwiesdiramliebstenis > c:\temp.txt"
OPEN "c:\temp.txt" FOR INPUT AS #irgendwas
'dann eben aus #irgendwas das ergebnis von dir auslesen worin alle vorhandenen dateien stehen sollten
CLOSE #irgendwas
KILL "c:\temp.txt"

das wäre zumindest unter QB die Alternativmethode die eben noch umständlicher ist als das mit dem error verursachen, dafür produziert man damit aber auch nicht gezielt fehler was so manchem vielleicht lieber ist zwinkern


SHELL und FOR INPUT in der OPEN-Anweisung stehen mir bei meinem
BASIC Derivat leider nicht zur Verfügung. Somit kann ich Deine Hilfe
nicht in die Tat umsetzen.

Ziel:
Sobald "ANZTMP.PD4" vorhanden ist, diese umzubenennen durch "ANZ.PD4"

Aktuell habe ich es so gelöst:
Code:

   ON ERROR GOTO FEHLER
   ...
   OLDNAME$ = "ANZTMP.PD4"
   NEWNAME$ = "ANZ.PD4"
   CALL "FILE.FN3" .fcRename OLDNAME$, NEWNAME$
   IF error$ = "1" THEN
       BEEP ,,2,0
       error$ = "0"
       LOCATE 1,7 : PRINT "NIX DA";
   ELSE
       LOCATE 1,7 : PRINT "IST DA";
       KILL "ANZTMP.PD4"
   END IF

FEHLER
    error$ = "1"
    RESUME NEXT


Bei dieser Variante warte ich allerdings auf einen Fehler.

Über Alternativen würde ich mich sehr freuen.

Gruß
studio
_________________
Entwicklungsumgebung:
---------------------------
Hardware: Denso BHT 300 / SATO Etikettendrucker (MB 200)
Software: BHT-Basic (Ähnlichkeiten zu MSDOS-Basic)
Infos: ftp://www.denso-id.de/Documents/Manuals/Programmers_Manuals/Denso_OS/BHT300_Programmers_Manual_E.pdf
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz