Java TXT Datei auslesen und abschneiden und in ArrayList speichern

uniek123

Cadet 1st Year
Registriert
Aug. 2012
Beiträge
10
Hallo Leute,

Ich habe ein kleines Problem mit Java Eclipse Programmieren, bin zwar noch Anfänger mit Programmierung, bitte euch um Hilfe.

Meine Aufgabe ist Txt Datei lesen, suchen nach einem String und mit split in ArrayList speichern.

TXT Datei sieht so aus:

KI_ 133 abc : 100 def
LL_ name : 9|1@1+ (11,12) [1|0] "" abc

Ergebnis möchte ich LL_ String auslesen:

tmpList[0] = LL_
tmpList[1] = name
tmpList[2] = 9
tmpList[3] = 1
tmpList[4] = 1
tmpList[5] = +
tmpList[6] = 11
tmpList[7] = 12
tmpList[8] = 1
tmpList[9] = 0
tmpList[10] = ""
tmpList[11] = abc

mein Code:
public class LL_ {

String Signal_Name;
int Start_Bit;
int Signal_Size;
String Byte_Order;
String Value_Type;
double Faktor, Offset;
double Minimum, Maximum;
String Unit;
String Receiver;

}

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.util.ArrayList;

public class Test2 {

public static void main(String[] args) {
// TODO Auto-generated method stub
try{
DataInputStream fin = new DataInputStream(new BufferedInputStream(new FileInputStream("test.txt")));
String tmp = new String();
ArrayList<LL_> sgTmp = new ArrayList<LL_>();

while((tmp = fin.readLine())!=null){
String delimeters = "[\\s:|||@|(|)|,\\s*|\\[\\s*\\s*|\\]\\s*]+";
//Analyze the string
String[] tmpList = tmp.split(delimeters);
if(tmpList[0].equalsIgnoreCase("LL_")){
LL_ lk = new LL_();
lk.Signal_Name = tmpList[1];


sg.Start_Bit = Integer.parseInt(tmpList[2]);
sg.Signal_Size = Integer.parseInt(tmpList[3]);

//Byte_order 0-Intel 1-Motorola
if(tmpList[4] == "0"){
tmpList[4] = "Intel";
sg.Byte_Order = tmpList[5];
}else if(tmpList[4] == "1"){
tmpList[4] = "Motorola";
sg.Byte_Order = tmpList[5];
}
//SG Value Type +=unsigned -=signed
if(tmpList[5]=="+"){
tmpList[5] = "unsigned";
sg.Value_Type = tmpList[5];
}else if(tmpList[5]=="-"){
tmpList[5] = "signed";
sg.Value_Type = tmpList[5];
}

sg.Faktor = Double.parseDouble(tmpList[6]);
sg.Offset = Double.parseDouble(tmpList[7]);
sg.Minimum = Double.parseDouble(tmpList[8]);
sg.Maximum = Double.parseDouble(tmpList[9]);
sg.Unit = tmpList[10];
sg.Receiver = tmpList[11];
int i=0;
while(tmpList[i + 12]!=null){
sg.Receiver = tmpList[i+12];
i++;
}
sgTmp.add(sg);
System.out.println(lk.Start_Bit);
}

}
}catch(Exception e){
e.printStackTrace();
}
}
}

Frage:
1. wie kann ich 1+ trennen zu 1 und +
2. Ich habe probiert mir System.out.println(lk.Startbit) aber es passiert nicht, sollte 9 sein
 
Moin, ich post jetzt hier mal Step-by-Step, bin grad selbst noch am Code schreiben.
Als Anfang mal die LL Klasse:

Code:
/**
 * This class delivers an immutable implementation for the LL data encapsulation.
 */
public final class LL {

	// Members ****************************************************************

	private final String signalName;
	private final int startBit;
	private final int signalSize;
	private final String byteOrder;
	private final String valueType;
	private final double factor;
	private final double offset;
	private final double minimum;
	private final double maximum;
	private final String unit;
	private final String receiver;

	// Construction ***********************************************************

	public LL(final String signalName, final int startBit, final int signalSize,
		final String byteOrder, final String valueType, final double factor,
		final double offset, final double minimum, final double maximum,
		final String unit, final String receiver) {
		super();
		this.signalName = signalName;
		this.startBit = startBit;
		this.signalSize = signalSize;
		this.byteOrder = byteOrder;
		this.valueType = valueType;
		this.factor = factor;
		this.offset = offset;
		this.minimum = minimum;
		this.maximum = maximum;
		this.unit = unit;
		this.receiver = receiver;
	}

	// Member Access **********************************************************

	public String getSignalName() {
		return signalName;
	}

	public int getStartBit() {
		return startBit;
	}

	public int getSignalSize() {
		return signalSize;
	}

	public String getByteOrder() {
		return byteOrder;
	}

	public String getValueType() {
		return valueType;
	}

	public double getFactor() {
		return factor;
	}

	public double getOffset() {
		return offset;
	}

	public double getMinimum() {
		return minimum;
	}

	public double getMaximum() {
		return maximum;
	}

	public String getUnit() {
		return unit;
	}

	public String getReceiver() {
		return receiver;
	}

	// Overriding default behaviour *******************************************

	/**
	 * {@inheritDoc}
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((byteOrder == null) ? 0 : byteOrder.hashCode());
		long temp;
		temp = Double.doubleToLongBits(factor);
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits(maximum);
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits(minimum);
		result = prime * result + (int)(temp ^ (temp >>> 32));
		temp = Double.doubleToLongBits(offset);
		result = prime * result + (int)(temp ^ (temp >>> 32));
		result = prime * result + ((receiver == null) ? 0 : receiver.hashCode());
		result = prime * result + ((signalName == null) ? 0 : signalName.hashCode());
		result = prime * result + signalSize;
		result = prime * result + startBit;
		result = prime * result + ((unit == null) ? 0 : unit.hashCode());
		result = prime * result + ((valueType == null) ? 0 : valueType.hashCode());
		return result;
	}

	/**
	 * {@inheritDoc}
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof LL)) {
			return false;
		}
		final LL other = (LL)obj;
		if (byteOrder == null) {
			if (other.byteOrder != null) {
				return false;
			}
		}
		else if (!byteOrder.equals(other.byteOrder)) {
			return false;
		}
		if (Double.doubleToLongBits(factor) != Double.doubleToLongBits(other.factor)) {
			return false;
		}
		if (Double.doubleToLongBits(maximum) != Double.doubleToLongBits(other.maximum)) {
			return false;
		}
		if (Double.doubleToLongBits(minimum) != Double.doubleToLongBits(other.minimum)) {
			return false;
		}
		if (Double.doubleToLongBits(offset) != Double.doubleToLongBits(other.offset)) {
			return false;
		}
		if (receiver == null) {
			if (other.receiver != null) {
				return false;
			}
		}
		else if (!receiver.equals(other.receiver)) {
			return false;
		}
		if (signalName == null) {
			if (other.signalName != null) {
				return false;
			}
		}
		else if (!signalName.equals(other.signalName)) {
			return false;
		}
		if (signalSize != other.signalSize) {
			return false;
		}
		if (startBit != other.startBit) {
			return false;
		}
		if (unit == null) {
			if (other.unit != null) {
				return false;
			}
		}
		else if (!unit.equals(other.unit)) {
			return false;
		}
		if (valueType == null) {
			if (other.valueType != null) {
				return false;
			}
		}
		else if (!valueType.equals(other.valueType)) {
			return false;
		}
		return true;
	}

	/**
	 * {@inheritDoc}
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		final StringBuilder builder = new StringBuilder();
		builder.append("LL [signalName=");
		builder.append(signalName);
		builder.append(", startBit=");
		builder.append(startBit);
		builder.append(", signalSize=");
		builder.append(signalSize);
		builder.append(", byteOrder=");
		builder.append(byteOrder);
		builder.append(", valueType=");
		builder.append(valueType);
		builder.append(", factor=");
		builder.append(factor);
		builder.append(", offset=");
		builder.append(offset);
		builder.append(", minimum=");
		builder.append(minimum);
		builder.append(", maximum=");
		builder.append(maximum);
		builder.append(", unit=");
		builder.append(unit);
		builder.append(", receiver=");
		builder.append(receiver);
		builder.append("]");
		return builder.toString();
	}

}

Den Code für den FileWriter schreibe ich gerade noch, kommt in der nächsten Stunde hinterher.

Greetings
Ergänzung ()

Edit 1:

So hier nun das Interface für den File Reader:

Code:
import java.util.List;

public interface LLFileReader {

	/**
	 * Reads a file from the given {@code absolutePath} and returns
	 * the values as a {@link List} of {@link LL}s.
	 * @param absolutePath the absolute path of the file
	 * @return the {@code List} of {@code LL} values
	 */
	List<LL> readFile(String absolutePath);

}
 
Zuletzt bearbeitet:
danke sehr Don.Dope, du hast mein Leben gerettet. Wenn ich noch weitere Frage habe, kann ich dann an dich wenden? Ich wäre sehr dankbar...

Mit dem Code, der du geschrieben hast, bin noch am Lesen, aber komme ich auch nicht zur Recht. Zu fortgeschritten...

Was habe ich in meinem Code falsch gemacht?

Kann du mir bitte das hier erklären?

final int prime = 31;95. int result = 1; result = prime * result + ((byteOrder == null) ? 0 : byteOrder.hashCode());

warum da 31 sein sollte, und was berechnest du da mit result
 
Hi, ja kein Problem, kannst dich gern an mich wenden.
Also zunächst ein paar Erklärungen:

Die Klasse LL habe ich immutable implementiert, sprich, alle Instanzvariablen werden nur beim bauen einer Instanz angelegt und sind danach nicht mehr veränderlich.
Warum? Das hat einfach den Sinn, wenn man Objekte zwischen verschiedenen Threads hin und her schiebt muss man sich um Synchronisierung kümmern um sicherzustellen dass jeder den aktuellsten "Stand" des Objektes hat.
Verwendet man hingegen immutable Objekte (Strings sind in Java auch immutable, z.b. liefert String.substring() immer einen neuen String zurück) muss man sich darum nicht kümmern.
Hier noch ein weiterführender Link dazu.
Natürlich kannst Du die Klasse erweitern und Methoden hinzufügen um Werte zu ändern, dabei muss man lediglich darauf achten immer ein neues Objekt zurückzuliefern.
Hier ein Beispiel:

Code:
	public LL setSignalName(final String signalName) {
		return new LL(signalName, this.startBit, this.signalSize, this.byteOrder,
			this.valueType, this.factor, this.offset, this.minimum, this.maximum,
			this.unit, this.receiver);
	}
Ergänzung ()

So weiter im Text mit der LL Klasse, also immutable Implementierung hatten wir bereits.
Wie genau funktioniert das nun?

Schritt 1: Hier gibt es nichts zu vererben, bitte gehen sie weiter
Die Klasse ist final; sprich es kann keine Ableitungen davon geben

Schritt 2: Meine Daten gehören mir, wenn Du sie willst, dann frag gefälligst!
2. Alle Instanzvariablen sind private final; sprich nicht direkt von außen ansprechbar und müssen bereits bei der Konstruktion einer Instanz gesetzt werden

Wenn Du nun den Klassenrumpf getippelt hast (inklusive der Instanzvariablen), ist der Rest einfach und dir wird viel von Eclipse abgenommen.

Schritt 3: Vom bauen und Konstruieren
-Setz den Cursor an eine Stelle im Code unterhalb der Instanzvariablen
-Wähle in Eclipse im Menu Source, den Menüpunkt Generate Constructor using Fields...
-Im dann aufploppenden Fenster überprüfst du nochmal, dass auch alle Instanzvaribalen angehakt sind und klickst auf OK
-Tada, da haben wir den Konstruktor, bequem von Eclipse generiert, ohne alles umständlich tippen zu müssen

Schritt 4: Objekt, wie ist denn dein wertes Befinden?
Da ja alle Instanzvariablen private sind, brauchen wir eine Möglichkeit, von außen zugreifen zu können, Stichwort Getter. Also wieder Eclipse die Arbeit machen lassen:
-Setze den Cursor an eine Stelle im Code unterhalb des Konstruktors
-Wähle in Eclipse im Menu Source, den Menüpunkt Generate Getters and Setters...
-Im dann aufploppenden Fenster klickst Du auf den Button Select Getters welcher sich rechts oben neben der Liste der Instanzmember befindet (zur Erinnerung: Es sind nur Getter möglich, weil alle Instanzwerte bereits zum Zeitpunkt der Konstruktion einer Instanz angegeben werden müssen) und schlussendlich auf OK
-Tada, alle Getter wurden generiert und sind schön nacheinander aufgereiht.

Schritt 5: Alle schön in einer Reihe, und hier bloß keine Äpfel mit Birnen vergleichen!
Wenn man Objekte miteinander vergleicht, oder in sog. Collections ablegt, tut man sich leicht wenn die Klassen die beiden Methoden hashCode() und equals() überschreiben; ich geh jetzt mal nicht weiter drauf ein, hier noch ein weiterführender Link.
Lange Rede kurzer Unsinn, ich habe den Code für die beiden Methoden auch nicht selbst geschrieben, sondern mir generieren lassen, Eclipse sei Dank. How to:
-Setze den Cursor an eine Stelle unter den Gettern
-Wähle im Menu Source den Menüpunkt Generate hashCode() and equals()...
-Im nun aufploppenden Fenster überprüfst Du nochmal alle Instanzvariablen angehakt sind und klickst OK (Zum Verständnis: Jede angehakte Instanzvariable zählt qausi als Vergleichsmerkmal wenn zwei Objekte einer Klasse miteinander verglichen werden sollen. Hast Du Instanzvaribalen die nicht zum Vergleich taugen, dann deselektiere diese)
-Zapzarap, nun haben wir auch die ominöse hashCode() und equals() Methode von Eclipse generiert bekommen

Schritt 6: Objekt, sag mir wer Du bist
Wenn man etwas über den Zustand der Instanzvariablen eines Objekts wissen will, wäre es nicht toll, wenn man einfach System.out.println(LLObjekt) schreiben könnte?
Sicherlich wäre es das, das ist es auch! Also machen wirs doch einfach.
Konkret geht es hier um die toString() Methode. Auch diese kann man sich selbstverständlich generieren lassen ;)
-Setze den Cursor unterhalb der equals() Methode
-Wähle im MenüSource den Menüpunkt Generate toString()...
-Im nun aufploppenden Fenster selektierst du alle Instanzvariablen die Du in deinem String mit sehen möchtest (per default: alle)
-Überprüfe, dass in der Checkbox CodeStyle der Wert StringBuilder/StringBuffer ausgewählt ist und klicke abschließend auf OK
-Und schon haben wir eine toString() Methode und können zukünfig System.out.println(LLObjekt) schreiben und bekommen alle Werte schön formatiert ausgegeben.

Lessons learned:
Für die Klasse habe ich lediglich 2 Zeilen Code (+ je eine pro Instanzvariable) geschrieben, und den Rest von Eclipse generieren lassen. Gerade als Anfänger erkennt man oftmals nicht die Mächtigkeit, aber wenn man sich daran gewöhnt möchte man es nicht mehr missen.
Ergänzung ()

uniek123 schrieb:
Was habe ich in meinem Code falsch gemacht?
Programmatisch "falsch" ist deine LL_ Klasse jetzt nicht unbedingt gewesen, aber sie hat einige Java-Code-Styles verletzt (zb CamelCase Schreibweise für Instanzvariablen, keine privaten Instanzvariablen verwendet (Stichwort: Kapselung, Getter/Setter) etc.).
Deshalb habe ich die Klasse als Musterbeispiel für mehrere Sachen umgemodelt:
1. Java Code Style (Schreibweisen, Kapselung)
2. Codegenerierung mit Eclipse
3. Good-Practises (Immutable implementeriung, hashCode(), equals(), toString())
Ergänzung ()

P.S.: Omg, ich will hier weder als Komiker noch als Oberlehrer rüberkommen, aber ich finde eine etwas lockerere Schreibweise sowohl angenehmer zu schreiben als auch zu lesen. Und zu meinen Hinweisen die ich dir gebe, es handelt sich hier lediglich um Hinweise und Sachen die ich aus meiner inzwischen 6 jährigen Java-Programmierung gelernt habe und ich als hilfreich erachte. Allerdings ist das nicht in Stein gemeißelt.

So gleich gehts weiter zum Interface.
 
Zuletzt bearbeitet:
ich möchte mich noch mal bei dir, don.dope bedanken... danke sehhrrrr... toll erklärt, besser geht nicht
 
Kein Problem. Helfe gern.

Also nochmal kurze Zusammenfassung was wir schon haben.

1. Wir haben die Datenkapsel mit der LL Klasse.
2. Wir haben ein Interface was die Schnittstelle des Programms beschreibt.

Was direkt zum nächsten Thema führt:

Arbeitsteilung bitte!
Man neigt dazu in einem ersten schnell "hingerotzten" Programmierversuch immer erstmal alles in eine, bzw wenige Klassen reinzupacken um schnell zu einem Ergebnis zu kommen.
Das ist *trommelwirbel* falsch.. ;)
Man sollte sich zu Beginn erstmal grundlegende Gedanken machen, was das Programm denn genau können soll.
Du schriebst folgendes:
uniek123 schrieb:
Meine Aufgabe ist Txt Datei lesen, suchen nach einem String und mit split in ArrayList speichern.

TXT Datei sieht so aus:

KI_ 133 abc : 100 def
LL_ name : 9|1@1+ (11,12) [1|0] "" abc
Also lass uns das doch mal in möglichst kleine Einzelteile zerbrechen:
1. Das Programm muss Textdateien auslesen können
2. Die Textdateien haben ein bestimmtes Format welches ausgewertet werden muss
3. Das Ergebnis soll in einer Liste zurückgegeben werden

Die Nummer 3 habe ich dann als Ausganspunkt für die Schnittstellenbeschreibung genommen:

Code:
import java.util.List;

public interface LLFileReader {

	/**
	 * Reads a file from the given {@code absolutePath} and returns
	 * the values as a {@link List} of {@link LL}s.
	 * @param absolutePath the absolute path of the file
	 * @return the {@code List} of {@code LL} values
	 */
	List<LL> readFile(String absolutePath);

}

Das ist die einzige (!!!) Methode die von außen ansprechbar sein sollte.
Der Aufrufer sollte nicht wissen wie genau das Programm jetzt das Datei-lesen bewerkstelligt, noch wie die Auswertung einer Zeile funktioniert. Alles was er sagt ist "Ich hab hier eine Datei, die liegt an Pfad X; lies mir die mal bitte aus und gib mir die Werte zurück".
Aber wozu hier ein Interface? Interface, wortwörtlich übersetzt, bedeutet Schnittstelle.
Man kann es aber auch als "Vertrag" bezeichnen. Es gibt viele Beispiele in der Java Sprache selbst:
Code:
List<String> aListOfStrings = new ArrayList<String>();
Die Variable aListOfStrings wird über das Interface List deklariert, und mit einer neuen Instanz von ArrayList initialisiert.
Und nun? Nunja, jedes mal wenn man jetzt aListOfStrings verwendet, kann man nur auf die Methoden zugreifen, die auch im Interface List beschrieben sind.
Wozu das Ganze? Um flexibler bei der Implementierung zu sein! ArrayList ist ja nicht die einzige Implementierung von List, da gäbe es noch LinkedList, SubList, Unmodifiablelist etc. etc.
Zurück zum Beispiel:
Wir definieren ein Interface um dem Aufrufer eine Schnittstelle zu unserem Programm zu bieten. Dadurch, dass der Aufrufer sich auf die Schnittstelle bezieht, sind wir frei die eigentliche Implementierung so zu bauen und zu ändern wie wir wollen.
Sollte sich z.B. mal das Format deiner Textdatei ändern, kannst Du das in der Implementierung machen, ohne die Schnittstelle anpassen zu müssen.
So erklärt sich also Punkt 3, wie die Schnittstelle entstand.

Kommen wir zu den verbleibenden Punkten und damit auch Arbeitsteilung:
1. Das Programm muss Textdateien auslesen können
2. Die Textdateien haben ein bestimmtes Format welches ausgewertet werden muss

Es ist sinnvoll diese getrennten Anforderungen auch in getrennte Klassen zu packen.
Warum? Darum:
-Separation of Concerns
-Bessere Wartbarkeit
-Bessere Lesbarkeit

So, damit Du nun auch mal ein bisschen was zu tun hast, hier 2 Aufgaben für dich:

Schreibe 2 Interfaces die Funktionalität von Anforderung 1 und 2 deklarieren (Tipp: Beide haben je nur eine Methode)

Soweit erstmal, ich versuch jetzt mal solang die Implementierung für das Aufsplitten zu schreiben, hast Du vielleicht mal ne komplette Textdatei die Du posten kannst, damit ich was zum testen hab?

Greetings
 
Also meine Hauptaufgabe ist ein Programm schreiben, das von TXT Datei in Excel-Tabelle umwandelt.

Dann habe ich mir überlegt:
1. ich muss erst mal ein Read TXT Datei Programm erstellen
2. Dann eine bestimmte TXT Datei importieren und eine xls-Datei erstellen.

als Beispiel: (TXT Datei test.txt)

KI_ 840 AUK: 4 Air
LL_ Front_Crash : 0|1@1+ (1,0) [0|1] "A" Gat
LL_ Heck_Crash : 1|1@1+ (1,0) [0|1] "" Gat
LL_ Seiten_Crash_Fahrer : 2|1@1+ (1,0) [0|1] "" Gat
LL_ Seiten_Crash_Beifahrer : 3|1@1+ (1,0) [0|1] "B" Gat

KI_ 1360 DRF: 3 Air
LL_ CHK_Airbag2 : 0|8@1+ (1,0) [0|255] "" Gat
LL_ Belegerkenn_hinten_Fahrer : 8|2@1+ (1,0) [0|3] "" Gat
LL_ Belegerkenn_hinten_Beifa : 10|2@1+ (1,0) [0|3] "" Gat
LL_ Belegerkenn_hinten_Mitte : 12|2@1+ (1,0) [0|3] "" Gat

KI_ 882 GHJ: 8 Gat
LL_ Leerlaufdreh_Erhoeh : 0|2@1+ (1,0) [0|3] "" DME_MED9_1_4003
LL_ Anforderung_HSH : 2|1@1+ (1,0) [0|1] "" Vector__XXX
LL_ Abschaltstufen : 3|3@1+ (1,0) [0|7] "" Vector__XXX
LL_ Lastabwurf_Rueckmeldung : 6|2@1+ (1,0) [0|3] "" Vector__XXX

wobei KI_ ist Message, 840 ist ID, AUK ist Name, 4 ist Bitlänge, Air ist Transmitter
LL_ ist Signal und die unteren LL_ gehören zu oberem KI_
LL_ ist Signal, Front_Cash ist Name, 0 ist Startbit, 1 ist Signalsize, 1 ist Motorola, + signed usw...

Ich versuche jetzt 2 Interfaces zu schreiben, die du mir als Aufgabe gegeben hast. Danke noch mal
 
Ahhh, jetzt kommt ja immer mehr ans Licht^^
Lass mich raten, das Format der Textdatei kannst Du nicht ändern, oder?
Und gibt es Pro KI_ immer 4 LL_ Messages oder können das beliebig viele sein?
Weil ich glaub da müssen wir noch ne KI Klasse einführen.
 
KI_ kann mehr oder weniger LL_ haben und die Textdatei kann auch nicht geändert werden


Ich habe nur einen kleinen Schnitt von test.txt kopiert.

interface MyInterface1
{
List<LL> readFile(String absolutePath);
}

interface MyInterface2
{
public void Format();
}

Ich weiss nicht, was du damit meinst. Habe versucht, aber denke es ist falsch :D:D
 
Zuletzt bearbeitet:
also gänzlich falsch war es nicht^^

ich dachte eher an sowas:

Code:
public interface SimpleFileReader {
 List<String> readFileLineByLine(String filePath);
}

und:

Code:
public interface LLStringParser {
 List<LL> parseLLStrings(List<String> listLLStrings);
}

Morgen mach ich mal weiter, für heute zu müde ;)
 
Zuletzt bearbeitet:
Danke noch mal für die Hilfe...

Ach ich wusste das Ergebnis so sein sollte :p aber mehr weniger in dieser Richtung
Ich warte dann auf dein Nextcode :p
 
Zurück
Oben