Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi ID3Tag einer String-Variable zuweisen (https://www.delphipraxis.net/15589-id3tag-einer-string-variable-zuweisen.html)

Lordnightmaere 31. Jan 2004 22:12


ID3Tag einer String-Variable zuweisen
 
Hallöchen...

Habe hier folgendes Szenario:

Delphi-Quellcode:

...

type
  TID3Tag = Record
    ID: String[3];
    Titel: String;
    Artist: String;
    Album: String;
    Year: String;
    Comment: String;
    Genre: Byte;
  end;

...

function ReadID3Tag(FileName: String): TID3Tag;
var
  FS: TFileStream;
  Buffer: Array [1..128] of Char;
begin
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    FS.Seek(-128, soFromEnd);
    FS.Read(Buffer, 128);
    with Result do
    begin
      ID := Copy(Buffer, 1, 3);
      Titel := Copy(Buffer, 4, 30);
      Artist := Copy(Buffer, 34, 30);
      Album := Copy(Buffer, 64, 30);
      Year := Copy(Buffer, 94, 4);
      Comment := Copy(Buffer, 98, 30);
      Genre := Ord(Buffer[128]);
    end;
  finally
    FS.Free;
  end;
end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  with ReadID3Tag('c:\lied.mp3') do
  begin
    S := Artist + ' - ' + Titel;
  end;
end;

...
So... Wenn ich das ganze jetzt so laufen lasse steht in der Variable S nur der Artist. Der Bindestrich und der Titel fehlen. Einem Label kann ich das so auch nicht zuordnen. Folgender Code funktioniert wiederrum:

Delphi-Quellcode:

...

procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
begin
  with ReadID3Tag('c:\lied.mp3') do
  begin
    Label1.Caption := Artist;
    Label2.Caption := Titel;
    S := Label1.Caption + ' - ' + Label2.Caption;
  end;
end;

...
Wie kann ich der Variable S ohne diesen Umweg das ganze zuweisen?


mfg

~Lordnightmaere~

chris 1. Feb 2004 09:32

Re: ID3Tag einer String-Variable zuweisen
 
hi,

ich verstehe zwar nicht warum das nicht funktionieren soll, aber
ich würde sagen mit zwei weiteren variablen anstelle der labels.

Delphi-Quellcode:
var
  S, A, T: String;
begin
  with ReadID3Tag('c:\lied.mp3') do
  begin
    A := Artist;
    T := Titel;
    S := A + ' - ' + T
  end
end

Lordnightmaere 1. Feb 2004 11:16

Re: ID3Tag einer String-Variable zuweisen
 
Hi...

habe es jetzt mit den 2 zusätzlichen Variablen probiert aber geht leider immer noch nicht.

Delphi-Quellcode:
...

var
  S, A, T: String;
begin
  with ReadID3Tag('c:\lied.mp3') do
  begin
    A := Artist;
    T := Titel;
    S := A + ' - ' + T
    ShowMessage(S); // <--- Ergebnis ist nur der Artist
    S := T + ' - ' + A;
    ShowMessage(S); // <--- Ergebnis ist nur der Titel
  end
end

...
Wenn ich jetzt versuche die Länge des Strings (S) mit StrLen zu ermitteln:

Delphi-Quellcode:
...

ShowMessage(IntToStr(StrLen(S)));

...
dann Kommt folgende Fehlermeldung:

Inkompatibele Typen: 'String' und 'PAnsiChar'

Vieleicht weiss jemand ne Lösung dafür.


mfg

~Lordnightmaere~

chris 1. Feb 2004 11:28

Re: ID3Tag einer String-Variable zuweisen
 
hi,

probiers hiermit

Delphi-Quellcode:
str(s)
dann sollte es auch im ersten fall klappen, würde ich sagen

gothic_mike 1. Feb 2004 11:40

Re: ID3Tag einer String-Variable zuweisen
 
Zitat:

Zitat von Lordnightmaere
Hallöchen...

Habe hier folgendes Szenario:

Delphi-Quellcode:
    S := Artist + ' - ' + Titel;
Wie kann ich der Variable S ohne diesen Umweg das ganze zuweisen?


mfg

~Lordnightmaere~

versuch mal folgenden code, ich glaube, dass du irgendwelche steuerzeichen aus dem ID3-Tag mit kopierst:

Delphi-Quellcode:
    S := Trim(Artist) + ' - ' + Trim(Titel);

Lordnightmaere 1. Feb 2004 11:42

Re: ID3Tag einer String-Variable zuweisen
 
:wall: :wall: :wall: !?#?! Argh !?#?! :wall: :wall: :wall:

Mit Str(S) gehts leider immernoch nicht *verzweifel*. Wenn ich...

S := Str(Artist)

versuche kommt eine sehr ausführliche Fehlermeldung -> "Inkompatible Typen".

HILFÄÄÄ!!


mfg

~Lordnightmaere~

Lordnightmaere 1. Feb 2004 11:47

Re: ID3Tag einer String-Variable zuweisen
 
Ups da war einer schneller ;-) :hello: DANKE gothic_mike!!!!! Damit funktioniert es!!! :dancer: DANKE DANKE DANKE

negaH 1. Feb 2004 12:01

Re: ID3Tag einer String-Variable zuweisen
 
Wenn ich deinen Code richtig vestanden habe, dann sind die ID3 Tag felder alle mit fester Länge codiert ?

Dann müsste die hier funktionieren:

Delphi-Quellcode:
type
  PID3Tag = ^TID3Tag;
  TID3Tag = record
    ID: String;
    Title: String;
    Artist: String;
    Album: String;
    Year: String;
    Comment: String;
    Genre: Byte;  
  end;


function ReadID3Tag(const FileName: String): TID3Tag;

  function StrLPas(Value: PChar; Len: Integer): String;
   
    function Min(A,B: Integer): Integer;
    begin
      if A <= B then Result := A
        else Result := B;
    end;

  begin
    SetString(Result, Value, Min(Len, StrLen(Value)));
    Result := Trim(Result);
  end;
 
type
  TID3Struct = packed record
    ID: array[0..2] of Char;          //   3
    Title: array[0..29] of Char;      //  33
    Artist: array[0..29] of Char;     //  63
    Album: array[0..29] of Char;      //  93 
    Year: array[0..3] of Char;        //  97
    Comment: array[0..29] of Char;    // 127
    Genre: Byte;                      // 128
  end;

var
  Tag: TID3Struct;
begin
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - SizeOf(Tag);
    Read(Tag, SizeOf(Tag));
  finally
    Free;
  end;
  with Tag do
  begin
    Result.ID := StrLPas(ID, SizeOf(ID));
    Result.Title := StrLPas(Title, SizeOf(Title));
    Result.Artist := StrLPas(Artist, SizeOf(Artist));
    Result.Album := StrLPas(Album, SizeOf(Album));
    Result.Year := StrLPas(Year, SizeOf(Year));
    Result.Comment := StrLPas(Comment, SizeOf(Comment));
    Result.Genre := Genre;
  end;
end;
Leider ist der MP3 ID3 Tag so ziemlich die schlechteste Struktur die ein Programmierer sich einfallen lassen kann. Sie benutzt keine Variable Length Felder, keine Null Terminierten Chars oder eben keine PASCAL typischen Längenbasierten Strings. D.h. egal ob man in C/C++ oder PASCAL oder sonstwas programmiert, man muß IMMER eine Konvertierung der gelesenen Daten vorsehen. Dabei ist es zusätzlich noch wichtig Leerzeichen oder eventuelle Nullterminatoren zu berücksichtigen. Der ID3 ist eben eine ziemlich unprofessionelle Sache, dies merkt man auch daran das am ID3 "Standard" so viele Änderungen vorgenommen wurden.

Hier eine Version die eher C Typisch ist:

Delphi-Quellcode:
type
  TID3Tag = record
   // diese Struktur erweitert die Char arrays um ein Zeichen für Nullterminator,
   // somit muß sie Feld für Feld gelesen und geschrieben werden, da ID3 eben diese Terminatoren NICHT speichert.
    ID: array[0..3] of Char;          
    Title: array[0..30] of Char;      
    Artist: array[0..30] of Char;    
    Album: array[0..30] of Char;      
    Year: array[0..4] of Char;        
    Comment: array[0..30] of Char;    
    Genre: Byte;                      
  end;

function ReadID3Tag(const FileName: String): TID3Tag;
begin
  FillChar(Result, SizeOf(Result), 0);
  with TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone) do
  try
    Position := Size - 128;
    Read(Result.ID, 3);
    Read(Result.Title, 30);
    Read(Result.Artist, 30);
    Read(Result.Album, 30);
    Read(Result.Year, 4);
    Read(Result.Comment, 30);
    Read(Result.Genre, 1);
  finally
    Free;
  end;
end;
Gruß Hagen

edosoft 25. Sep 2004 09:12

Re: ID3Tag einer String-Variable zuweisen
 
Das geht ganz einfach:
(wenn du aus einer datei mit nem TFileStream was innen String auslesen willst musst dus IMMER so machen)

Delphi-Quellcode:
var
fs:tfilestream;
s:string;
begin
[..]
fs.seek(-128,sofromend);
//jetzt musst du eben net gleich in den string lesen sondern erst mal den stringso lang machen wieviel text du auslesen willst - z.b. 3 bytes, da die erste info von id3 3 bytes lang ist ("TAG")
SetLength(S, 3);
//oder S:=stringofchar(#0, 3);
// oder s:='  ';
//ist auch egal welchen buchstaben S enthält kannst also z.b. auch S:='ABC', wird ja eh überschrieben
fs.read(s[1], 3);
//du musst halt unbedingt "S[1]" angeben, sonst gehts net, weis au net warum aber es ist halt so...
showmessage(s);
edit1.text:=s;
[..]
end
und wie gesagt, so musst dus immer machen wenn du ne datei innen sting lesen willst.
:mrgreen:

-hope it helps

Muetze1 25. Sep 2004 20:31

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

Zitat:

Zitat von negaH
Leider ist der MP3 ID3 Tag so ziemlich die schlechteste Struktur die ein Programmierer sich einfallen lassen kann. Sie benutzt keine Variable Length Felder, keine Null Terminierten Chars oder eben keine PASCAL typischen Längenbasierten Strings. D.h. egal ob man in C/C++ oder PASCAL oder sonstwas programmiert, man muß IMMER eine Konvertierung der gelesenen Daten vorsehen. Dabei ist es zusätzlich noch wichtig Leerzeichen oder eventuelle Nullterminatoren zu berücksichtigen. Der ID3 ist eben eine ziemlich unprofessionelle Sache, dies merkt man auch daran das am ID3 "Standard" so viele Änderungen vorgenommen wurden.

Das trifft nur auf den ID3 Tag v1.0 und v1.1 zu!

MfG
Muetze1

edosoft 25. Sep 2004 23:32

Re: ID3Tag einer String-Variable zuweisen
 
jo stimmt aber id3 v2 benütz ich ungern weil er langsam ist...

scp 26. Sep 2004 01:15

Re: ID3Tag einer String-Variable zuweisen
 
[ot]
Und ID3v2 hat diesen lustigen Int28, ansonsten ist er besser gelungen.
Nur bringt das nix, sich auf einen festzulegen (wenn man die mp3s nicht selbst erstellt oder ändert), weil manchmal ist v1 drin, manchmal v2, manchmal beide.
[/ot]

edosoft 26. Sep 2004 08:40

Re: ID3Tag einer String-Variable zuweisen
 
jo
also ich mein des so:

bei meiner mp3 datenbank hab ich alle id3 v.2 tags gelöscht und nur interpret unt titel mit v1.1 gespeichert.
drum hab ich auch die meisten programme so gebaut dass sie in erster linie 1.1 lesen weil doch fast jede datei ein 1.0/1.1 tag hat.
(sowieso ist v2 scheisse weil man da immer die ganze datei verschieben muss um den täg ein buchstabe länger zu machen oder so, ist deshalb halt ziemlich langsam.


gibts eigentlich en unterschied zwischen 1.0 und 1.1?

achja und gibts eben dafür ne funktion beim TStream(TFileStram) dass ich an der cursorposition sag mer mal 10 bytes einfügen kann?
(weil mit .Write(S[1], Length(S)) überschreibt er ja...

Muetze1 26. Sep 2004 14:50

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

- Viele gute ID3v2 Tagger schreiben Nullbytes nach dem Tag bis zur ersten Frame des MP3's so dass man diesen Platz für veränderte Tags nutzen kann - ohne die Datei umzukopieren. Z.B. Winamp

- Unteschied ID3v1.0 und ID3v1.1: v1.0 hat keine Tracknumber und der Comment ist 30 Zeichen lang. ID3v1.1 hat die Tracknummer und der Comment ist 28 Zeichen lang.

MfG
Muetze1

edosoft 26. Sep 2004 15:31

Re: ID3Tag einer String-Variable zuweisen
 
@mütze:
jo das mit der tracknummer hab ich auch schon rausgefunden, trotzdem danke.
sollte man des jetzt so machen:
Delphi-Quellcode:
if (comment[29] = #0) and (comment[30] > #0) then TrackNummer := Ord(comment[30])
else TrackNummer := 0;
oder?

und zum innen filestream oder so ein paar bites einfügen gibts gar keine funktion?
muss ich dann den rest der datei inne variable(string oder so) kopieren und dann wieder schreiben?(da musses doch was komfortableres gebn...)

Muetze1 26. Sep 2004 20:00

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

Das mit der Tracknummer ist haargenau richtig - keine Einwände. Ansonsten kannst du auch gerne mal ein Blick in meine MP3Lib werfen auf meine HP - diese liegt da samt Quellen zur freien Nutzung.

Und mit dem Schreiben von Freiraum bei den ID3v2 Tags:

1. Wenn der Tag schon vorhanden ist, dann findest du diesen Zwischenraum ja raus, weil
1a) entweder der ID3 Header diesen freien Platz mit einschliesst (also in seiner Längenangabe mit enthält), oder
1b) die erste Frame weit später zu finden ist als direkt nach dem Ende des ID3 Tags
und wenn das irgendwie der Fall ist, dann musst du entscheiden, ob der neue Tag da noch reinpasst oder nicht. Wenn ja, dann kannst du doch einfach schreiben - ins Originalfile. Wenn nicht, dann musst du wiederrum den schon angesprochenen langsamen Weg nehmen, genauso wenn...

2. kein ID3v2 Tag vorhanden ist, dann musst auch diesen Weg einmal gehen und das dementsprechend anlegen.

Nun noch was dazu zum programmieren:

1. ein TStream Nachfahre bietet einem die einfache Methode CopyFrom() - damit kann man leicht nach schreiben des Tags den alten Inhalt (also die Frames, die Musik) hinten anhängen.
2. Man kann bei einem TMemoryStream, TFileStream, etc einfach die Property Size setzen und somit auch nach alleinigen schreiben des ID3v2 Tags die Datei vergrössern und dann z.B. die Daten mittels CopyFrom() anhängen.

Ich muss dazu noch gestehen, das meine ID3 Lib das ganze mit den freien Bytes beim Editieren/Schreiben noch nicht unterstützt - ich habe es aber ebend in die ToDo List aufgenommen. Als nächstes kommt aber erstmal UniCode Support, der schon halb fertig ist und bei vielen Tags funktioniert...

MfG
Muetze1

edosoft 26. Sep 2004 20:55

Re: ID3Tag einer String-Variable zuweisen
 
ok thänks

-mal bissle OT:
du weist net zufällig wo ich ne strukturinfo vom Xing tag und vom FhG tag finden kann?
(oder ne gscheite möglichkeit ohne die beiden tags die länge vonnem VBR zusammenzurechnen)? :mrgreen: :mrgreen:

Muetze1 26. Sep 2004 23:54

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

Die beiden Strukturen habe ich nicht - die brauche ich nicht und will sie nicht benutzen in meiner Lib. Auch der Frauenhofer Codec kann VBR und der benutzt nicht den Xing Tag, daher ist es auch nicht sicher bei einem VBR immer die Spielzeit heraus zu bekommen. Am besten den Playtime Tag auslesen wenn vorhanden bei ID3v2 oder ansonsten einfach die Frames durchrennen und dann einfach schnell zählen bzw. rechnen mit den einzelnen Bitraten der Frames. Wenn du willst, dann kann ich dir hier einen Source geben der bei einem MP3 von Frame zu Frames durchgeht und immer den Frame Header dekodiert - da kannst du dir dann in 2 Minuten eine kleine Routine draus stricken um die Spiellänge zu berechnen...

MfG
Muetze1

edosoft 27. Sep 2004 05:35

Re: ID3Tag einer String-Variable zuweisen
 
ja aber des problem ist ja dann dasses halt so langgeht oder?
ích hab des mal ausprobiert da hat des glaub über 15 sekunden gebraucht für son lied.
vielleicht hab ich auch bloß bissle langsame such algorythmen kannst mir mal schicken wie du den header suchen würdest?
(ich probier des heut mittag nommal aus und poste dann die schnellste methode...)

achja, da wär noch was: :dp:



(und mit den xing tags: des würd ich ja dann auch so machen dasses nach den XING sucht und nur wenn die nicht da sind halt die frames durchzählt weils dann einfach schneller geht)

Muetze1 28. Sep 2004 08:31

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

Das Projekt werde ich heute abend dann mal hochladen - gestern hatte ich es versäumt...

MfG
Muetze1

Muetze1 28. Sep 2004 20:39

Re: ID3Tag einer String-Variable zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!

So, ich habe es denn nun endlich geschafft und im Anhang ist dann nun dieser "MP3 Frame Springer". Es ist eine simple kleine Routine, ohne Abfrage wegen dem Ende (z.B. ID3v1.x Tag) oder Anfang. Auch Leerbytes zwischen den Frames werden nicht beachtet - aber das sollte eh nicht vorkommen. Zur Sicherheit könnte man natürlich noch nach dem Header suchen, aber was solls. Es ist soweit nur ein "Proof-Of-Concept" - und das Konzept klappte...

MfG
Muetze1

edosoft 29. Sep 2004 19:07

Re: ID3Tag einer String-Variable zuweisen
 
hmm...

des programm braucht bei meinem laptop (233 MHz -> übertaktet auf 280) geht des doch ziemlich lang(~3-5sekunden)

eigentlich sollte des aber doch möglich sein bei ner VBR die länge zumindest im zehntelsek. zu bestimmen.

(beispiel: du kennst vielleicht BPM-Studio(profi dj player) das programm schreibt sich wenns en vbr lied hat eine "indexdatei" wo alle bitraten drin stehen so dass du dann genau spulen und so kannst. do ne indexdatei zu erstellen geht aber bei mir wpohl net länger als ne halbe sekunde, wohl eher kürzer.) also muss es doch irgnedwie möglich sein die frames schneller durchzugucken...




nochmal was ganz anderes: ich hab in der schule bemerkt-da war delphi5 und c++ builder installiert-dass c++ irgenden besseren compiler hat.
und zwar:
bei delphi ist ja ne datei mit der VCL so etwa mindestens 300 kb groß.
wenn ich da c++ builder start, gui GENAU gleich wie bei delphi, auch die komponenten und properties und so sind alles genau gleich.

also hab ich mal bei beiden programmen eine "standard application" da erstellt(leeres projekt+eine TForm) dann beide kompiliert.
ergebnis: die delphi .exe war 380 kb groß, die c++ .exe bloß 25 (!) kb...



jetzt die frage: WARUM?!?

Muetze1 30. Sep 2004 10:50

Re: ID3Tag einer String-Variable zuweisen
 
Moin!

Zu dem Programm: Wie gesagt, nur ein Proof-Of-Concept, um zu beweisen, das man sich von Frame zu Frame hangeln kann. Es ist völligst unoptimiert, weil im Normalfall ist es tödlich für die Geschwindigkeit die Position um 2 Bytes zurück zu setzen oder ähnliche Dinge. Daher kann man da bestimmt noch viel optimieren, aber darum ging es mir bei dem Programm nicht.

Und zu dem C++Builder Programm: Weil bei der C++Builder Datei garantiert die Runtime Packages extern verlinkt sind und nicht mit eincompiliert. Glaube mir, die C++Builder EXE werden genauso gross. Schon alleine die VCL ist komplett die gleiche...

MfG
Muetze1

edosoft 7. Okt 2004 20:43

Re: ID3Tag einer String-Variable zuweisen
 
juta tag... :cheers:


a) die kompilierte exe vom c++ builder (F9) hatte aber bloß 24 kb... gaanz sicher!

b) ich dachte immer dass delphi da assembler code generiert und gar keine runtimes benötigt(ausser windows halt?!?)

c) noch was kanz andres: also.
ich hab den internetanschluss annem wlanruter.
jetzt will ich 4 meiner pcs da anschließen und da mir das wlan für 4 pcs zu teuer wird dachte ich ich vernetz die 4 pcs über ethernet(mit switch) und tu das ganze wieder aufs wlan rüberbrückken. :zwinker: (TRICK 17!!)

sone wlanbrücke hab ich aber net unter 60-70 euro gefunden und da dachte ich mir ich kauf ne lankarte 100mbit für 3,5 euro und ne wlankarte 54 mbit für 25 euro.

jetzt wie ich des rüberbrücken kann: des müsst ja wohl mit fli4l gehen (linux, quasi auf einer diskette->keine festpladde benötigt, http://fli4l.de/).
da hab ich gedacht :gruebel: vielleicht kann ich da den alten 486 mit 66 mhz nehmen, der kommt noch komplett ohne kühlung aus und das alte AT netzteil machtg auch fast kein lärm und notfalls reichts wohl wenn ich den lüfter raus und den deckel weg mach.
:?: : reichen 66 mhz wohl zum des wlan auf des ethernet rüberbrücken?
also maximal 54 mbit, aber weil des schon bissle weit weg ist vom router und so komm ich vielleicht noch auf 30-40mbit.( :kotz: )

thnx in advance! :mrgreen: :mrgreen:

tommie-lie 7. Okt 2004 21:43

Re: ID3Tag einer String-Variable zuweisen
 
Zum ganz anderen: Es ist üblich, daß man für eine neue Frage einen neuen Thread eröffnet, damit das Forum übersichtlich bleibt. Oder würdest du nach einem Netzwerkproblem in einem Thread unter dem Titel "ID3Tag einer String-Variable zuweisen" suchen? ;-)


Zu 1.: Mag ja sein, ich kann dir auch eine Delphi-VCL-Anwendung geben, die 23kB groß ist, aber die läuft dann (genauso wie deine BCB-VCL-Anwendung) nur mit den Runtime-Bibliotheken von Borland (namentlich vclXX.bpl, vclshlctrlsXX.bpl im Systemverzeichnis (und früher hießen die glaub' ich noch anders)).
Schau mal in den Einstellungen zu den Packages (bei Delphi in den Projekteinstellungen zu finden), da müsstest du das einlinken der Packages aktivieren können, daß ist deine BCB-EXE genauso groß wie eine Delphi-EXE.

Zu 2.: Jeder Compiler generiert irgendwo Assembler-Code, der anschließend assembliert wird. Und Delphi benötigt auch nicht zwangsweise irgendwelche externen Packages neben der ausführbaren Datei. Aber man kann Delphi dazu bewegen, welche zu benötigen, wodurch die EXE zwar kleiner wird, man dafür aber die gleiche Datenmenge an zusätzlichen Dateien weiterreichen muss.

edosoft 8. Okt 2004 13:44

Re: ID3Tag einer String-Variable zuweisen
 
tach tommie-lie

ahja ok.
genau das wollte ich wissen.
:coder2: endlich mal jemand der die dinge sagt mit worten die ich auch versteh *g*



und zu dem argument mit dem neuen thread:
weist irgendwann hab ich dann mitm mütze1 einen thread über 30 seiten und in der dp-statistik steht dann "größter off-topic thread im forum: ID3Tag einer String-Variable zuweisen".
:mrgreen: :mrgreen:



( :arrow: aber zu dem netzwerkproblem weist net zufällig auch was?)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz