AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Set of WideChar (TDynamicCharSet)
Thema durchsuchen
Ansicht
Themen-Optionen

Set of WideChar (TDynamicCharSet)

Ein Thema von himitsu · begonnen am 9. Dez 2009 · letzter Beitrag vom 22. Apr 2010
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
So, ich hab mir heute mal ein WideChar-Set zusammengebastelt,
da ja die normalen Sets nicht mit Unicode arbeiten.

Ja, ich kenn IWidecharSet von Peter Below (http://www.delphipraxis.net/internal....php?p=1006898),
allerdings hab ich damit ein kleines Problem. Hauptsächlich, daß dieses immer mehr als 8 KB pro Set belegt
und ich für ein Projekt mehrere/viele Sets benötige.

Also ist ein "Set" mit dynamischer Speicherverwaltung entstanden.
Dieses belegt pro "Set" jeweils etwa 8 Byte bis 8,02 KB, zuzüglich einem Standardencoding für's Ansi, wenn man eines angibt und dank der Referenzzählung bei dynamischen Arrays und Interfaces wird beim Kopieren sowieso nochmal Speicher eingespart.

Zusätzlich wurde es als Operator-Record ausgelegt, anstatt als Objekt/Interface:
Welche den Vorteil hat, daß es grundsätzlich fast wie ein "normales" (Ansi)CharSet verwendbar ist.

> Leider stellen die Operatoren keinen IN-Operator zur Verfügung.

Aber abgesehn von IN und den Functionen Include und Exclude (welche sich aber leicht zusammenstellen lassen) wird alles Mögliche unterstützt.
Die Operatoren + - und *, sowie die Vergleichsoperatoren < <= = >= > <> und zusätzlich noch OR, AND, XOR und NOT.
Nja, und dann gibt es noch einige weitere Befehle und Typumwandlungen...

Inzwischen wurde auch ein Enumerator verbaut, so daß For-In-Schleifen genutzt werden können.
Delphi-Quellcode:
Var C: Char;
For C in HexNumerals do S := S + C;
// S = '0123456789ABCDEFabcdef'
// da HexNumerals = ['0'..'9', 'A'..'F', 'a'..'f']
Delphi-Quellcode:
// Achtung: dieser Code wurde einen wesentlichen/wichtigen Anteil reduziert

TSetRelation = (srEqual, srIsSubset, srIsSuperset, srOverlap, srDisjunct);

TDynamicCharSet = Record
Private
  _Map: TDCSDynMap;
  _Encoding: TEncoding;
Public
  Property DefaultEncoding: TEncoding;
  Procedure Fill(CharSet: TSysCharSet; Encoding: TEncoding);
  Procedure Fill(CharSet: TDynamicCharSet);
  Procedure Fill(CharSet: TDCSMap);
  Procedure Fill(Char: AnsiChar; Encoding: TEncoding);
  Procedure Fill(Char: WideChar);
  Procedure Fill(First, Last: AnsiChar; Encoding: TEncoding);
  Procedure Fill(First, Last: WideChar);
  Procedure Fill(S: RawByteString; Encoding: TEncoding; AllowCharGroups: Boolean);
  Procedure Fill(S: UTF8String; AllowCharGroups: Boolean);
  Procedure Fill(S: UnicodeString; AllowCharGroups: Boolean);
  Procedure FillAll;
  Procedure Invert;
  Procedure Clear;

  Function IsEmpty: Boolean;
  Function IsFull: Boolean;
  Function LowChar: WideChar;
  Function HighChar: WideChar;
  Function CountChars: Integer;

  Function GetAsSysCharSet(Encoding: TEncoding): TSysCharSet;
  Function GetAsMap: TDCSMap;
  Function GetAsAnsiString(Encoding: TEncoding): RawByteString;
  Function GetAsUTF8String: UTF8String;
  Function GetAsString: UnicodeString;
  Function GetAllChars: UnicodeString;

  Function ContainsAnyChar (S: RawByteString; Encoding: TEncoding): Boolean;
  Function ContainsAnyChar (S: UTF8String): Boolean;
  Function ContainsAnyChar (S: UnicodeString): Boolean;
  Function ContainsAllChars (S: RawByteString; Encoding: TEncoding): Boolean;
  Function ContainsAllChars (S: UTF8String): Boolean;
  Function ContainsAllChars (S: UnicodeString): Boolean;
  Function ContainsOnlyThisChars(S: RawByteString; Encoding: TEncoding): Boolean;
  Function ContainsOnlyThisChars(S: UTF8String): Boolean;
  Function ContainsOnlyThisChars(S: UnicodeString): Boolean;

  Function Compare (CharSet: TSysCharSet; Encoding: TEncoding): TSetRelation;
  Function Compare (CharSet: TDynamicCharSet): TSetRelation;
  Function Contains(Char: AnsiChar; Encoding: TEncoding): Boolean;
  Function Contains(Char: WideChar): Boolean;
  Function Compare (First, Last: AnsiChar; Encoding: TEncoding): TSetRelation;
  Function Compare (First, Last: WideChar): TSetRelation;
  Function Compare (S: RawByteString; Encoding: TEncoding): TSetRelation;
  Function Compare (S: UTF8String): TSetRelation;
  Function Compare (S: UnicodeString): TSetRelation;
  Procedure Include (CharSet: TSysCharSet; Encoding: TEncoding);
  Procedure Include (CharSet: TDynamicCharSet);
  Procedure Include (Char: AnsiChar; Encoding: TEncoding);
  Procedure Include (Char: WideChar);
  Procedure Include (First, Last: AnsiChar; Encoding: TEncoding);
  Procedure Include (First, Last: WideChar);
  Procedure Include (S: RawByteString; Encoding: TEncoding);
  Procedure Include (S: UTF8String);
  Procedure Include (S: UnicodeString);
  Procedure Exclude (CharSet: TSysCharSet; Encoding: TEncoding);
  ...
  Procedure Exclude (S: UnicodeString);
  Procedure Intersect (CharSet: TSysCharSet; Encoding: TEncoding);
  ...
  Procedure Intersect (S: UnicodeString);
  Procedure ExclusiveOr(CharSet: TSysCharSet; Encoding: TEncoding);
  ...
  Procedure ExclusiveOr(S: UnicodeString);

  Function GetEnumerator: TDCSEnumerator;
Public
  Class Operator Implicit(CharSet: TSysCharSet): TDynamicCharSet;
  Class Operator Implicit(CharSet: TDCSMap): TDynamicCharSet;
  Class Operator Implicit(S: RawByteString): TDynamicCharSet;
  Class Operator Implicit(S: UTF8String): TDynamicCharSet;
  Class Operator Implicit(S: UnicodeString): TDynamicCharSet;

  Class Operator Explicit(CharSet: TSysCharSet): TDynamicCharSet;
  Class Operator Explicit(CharSet: TDCSMap): TDynamicCharSet;
  Class Operator Explicit(S: RawByteString): TDynamicCharSet;
  Class Operator Explicit(S: UTF8String): TDynamicCharSet;
  Class Operator Explicit(S: WideString): TDynamicCharSet;
  Class Operator Explicit(S: UnicodeString): TDynamicCharSet;

  Class Operator Explicit(CharSet: TDynamicCharSet): TSysCharSet;
  Class Operator Explicit(CharSet: TDynamicCharSet): TDCSMap;
  Class Operator Explicit(CharSet: TDynamicCharSet): RawByteString;
  Class Operator Explicit(CharSet: TDynamicCharSet): UTF8String;
  Class Operator Explicit(CharSet: TDynamicCharSet): WideString;
  Class Operator Explicit(CharSet: TDynamicCharSet): UnicodeString;

  Class Operator Equal (Oper1, Oper2: TDynamicCharSet): Boolean;
  Class Operator NotEqual (Oper1, Oper2: TDynamicCharSet): Boolean;
  Class Operator LessThan (Oper1, Oper2: TDynamicCharSet): Boolean;
  Class Operator LessThanOrEqual (Oper1, Oper2: TDynamicCharSet): Boolean;
  Class Operator GreaterThan (Oper1, Oper2: TDynamicCharSet): Boolean;
  Class Operator GreaterThanOrEqual(Oper1, Oper2: TDynamicCharSet): Boolean;

  Class Operator Add (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator Subtract (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator Multiply (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator BitwiseAnd(Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator BitwiseOr (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator BitwiseXor(Oper1, Oper2: TDynamicCharSet): TDynamicCharSet;
  Class Operator LogicalNot(CharSet: TDynamicCharSet): TDynamicCharSet;
End;

Const Signs: TDynamicCharSet = (); // ['-', '+']
  DecimalDigits: TDynamicCharSet = (); // ['0'..'9']
  Numbers: TDynamicCharSet = (); // Signs + DecimalDigits
  FloatChars: TDynamicCharSet = (); // Numbers + [DecimalSeparator]
  SciFloatChars: TDynamicCharSet = (); // FloatChars + ['e', 'E']
  OctalNumerals: TDynamicCharSet = (); // ['0'..'7']
  HexNumerals: TDynamicCharSet = (); // ['0'..'9', 'A'..'F', 'a'..'f']
  FirstIdentifierChars: TDynamicCharSet = (); // ['A'..'Z', 'a'..'z', '_']
  IdentifierChars: TDynamicCharSet = (); // ['A'..'Z', 'a'..'z', '0'..'9', '_']
  EditOperations: TDynamicCharSet = (); // [^C, ^V, ^X, Backspace]
  AsciiControlChars: TDynamicCharSet = (); // [#0..#31, #127]
  AsciiChars: TDynamicCharSet = (); // [#0..#127]
  AsciiTextChars: TDynamicCharSet = (); // [Tab, LF, CR, Space..#127]

  // The following constants are dependent on the existing unicode system of the OS.
  ControlChars: TDynamicCharSet = (); // [#1..#$1F, #$7F..#$9F, #$70F and other]
  BlankChars: TDynamicCharSet = (); // [#9, ' ', #160, #$3000, #$FEFF]
  SpaceChars: TDynamicCharSet = (); // [#9..#$D, ' ', #$85 and other]
  Digits: TDynamicCharSet = (); // '0123456789¹²³' and other digit chars
  HexDigits: TDynamicCharSet = (); // HexNumerals + Bold:HexNumerals
  Numeric: TDynamicCharSet = (); // copy of "Digits"
  Letters: TDynamicCharSet = (); // LowerCaseLetters + UpperCaseLetters
  LowerCaseLetters: TDynamicCharSet = (); // all lowercase characters
  UpperCaseLetters: TDynamicCharSet = (); // all uppercase characters
  Alpha: TDynamicCharSet = (); // any linguistic character
  AlphaNum: TDynamicCharSet = (); // Alpha + Digits
  NonAlphaNum: TDynamicCharSet = (); // AllChars - AlphaNum
  Punctuation: TDynamicCharSet = (); // '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~' and other
  Printable: TDynamicCharSet = (); // graphic characters and blanks
  AllChars: TDynamicCharSet = (); // Printable + ControlChars
Das Ganze setzt natürlich mindenstens Delphi 2009 voraus,
aber notfalls könnte man es auch unter Delphi 2006, 2007, sowie Turbo Delphi zu laufen bekommen.

PS: nicht über meine Konstanten wundern ... nach außen Konstante und nach innen nicht, da es doch typisierte Konstanten sind, welche in Delphi ja eh keine "echten" Konstanten sind.

Und wenn falls es wer mal braucht, dann ließe sich bestimmt auch noch ein "Set of Integer" erstellen, mit einer zusätzlichen dynamischen Untergrenze, allerdings sollten dann die Werte nicht all zu "weit" auseinander liegen, wobei es auch dafür eine Lösung gäbe ... also mehrere Wertebereiche/Sets in Einem.

Jetzt aber noch ein Problem
Und zwar scheint es irgendwo einen Bufferoverrun oder Dergleichen zu geben.
Schon bei der Initialisierung der Konstanten kommt es offiziell zu einem OutOfMemory (in D2009+),
welches allerdings davon stammt, daß der Speichermanager (FastMM) defekte Verwaltungsdaten so anzeigt.
(hab über 'ne Strunde nach dem Speicherleck gesucht und mich gleichzeitig gewundert, warum der Taskmanager meint es wäre noch genügend frei)

Es wäre also schön, wenn da noch mit jemand reingucken könnte und mir eventuell einen Tipp gibt.
Bin den Code jetzt schon mehrmals nochmal komplett durchgegangen und konnte keinen noch Fehler finden, welcher dafür verantwortlich sein könnte.


[edit]
Grad gemerkt, daß hier die Bereichsprüfung nicht aktiv war (dabei hatte ich es doch in den Optionen aktiviert )
na mal sehn, was sich jetzt findet.

[edit 10.12.2009 v1.1]
Was so ein kleines -1 alles ausrichten kann,
aber nun gibt es schonmal keine Exceptions mehr.
Jetzt kann ich endlich gucken, ob es auch wirklich so arbeitet, wie geplant.

[edit 13.01.2010 v1.2]
das Problem mit dem nichtinitialisiertem Standardencoding ( Beitrag #3 bis #6 ) wurde behoben

[add 10.02.2010 v1.3]
kleinere Erweiterungen und Änderungen an den Konstanten ... siehe Beitrag #7
sowie Fehlerbereinigung und hinzugefügter Enumerator ... siehe Beitrag #8

[edit 11.02.2010 v1.4]
Eingangspost überarbeitet und kleine Neuerungen hinzugefügt ... siehe letzes Edit in Beitrag #8

[edit 12.02.2010 v1.5]
schonwieder was Neues > siehe Beitrag #9

[edit 13.02.2010 v1.6]
'nen kleinen Fehler ausgebesserst, welcher bei einem Fill das DefaultEncoding nicht richtig übernahm und so zu einer Exception führte.
Auserdem wurde .FullClear und .ReadOnly eingefügt.
Leider wird der ReadOnly-Status mitkopiert, wenn man ein SET per := kopiert.

[edit 13.02.2010 v1.7]
Fehlerbeseitigung (siehe #15)

[edit 08.04.2010 v1.8]
restliche Fehler beseitigt ... alle neuen Prüfungen meinen jetzt es sei alles OK


[edit 33.04.2010 v2.2]
Ups, hab grade gemerkt, daß ich die Fehlerbeseitigung dieses saublöden Compilerfehlers
http://qc.embarcadero.com/wc/qcmain.aspx?d=44634
http://www.delphipraxis.net/internal...t.php?t=176345
noch nicht hochgeladen hatte.
Angehängte Dateien
Dateityp: zip dynamic_sets_143.zip (1,21 MB, 73x aufgerufen)
$2B or not $2B
 
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#11
  Alt 21. Feb 2010, 12:34
Moin, ich wollte mal fragen, ob überhaupt jemand diese sogenannten Surrogate Pairs nutzt und ob es sich lohnen würde diese mit auszuwerten?

Die obere Grenze des Arrays läßt sich ja leicht erweitern, welches aber nichts am bisherigen Speicherverbauch ändern würde.
(abesehn von invertierten Sets, welche dann natürlich doppelt so groß wären)



Einige der Pascalcodes in ASM flottere ASM-Codes umzuwandeln werde ich vorerst noch lassen.
(noch mindestens bis nach den Testläufen eines anderen Projektes, welches diese Sets nutzt)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#12
  Alt 25. Feb 2010, 20:27
Nur was kleines Kosmetisches:
  • die Konstanten sind in eine abstrakte Klasse gewandert
    hatte keine Lust für jede einzelne eine eigene Initialisierungsprozedur zu schreiben und da machten sich Property ganz gut
  • die Konstanten werden erst bei der ersten Verwendung initialisiert
    es belegen also nicht mehr immer alle Konstanten den Speicher, sondern nur noch die Verwendeten

Hmmm, es scheint wohl keiner die Surrogate Pairs zu nutzen oder weiß erst garnicht was das ist.
(dabei sind die voll genial ... ich wollte schon immer mal Dominosteine als Schriftzeichen haben )
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#13
  Alt 3. Mär 2010, 16:39
So, einiges der neuen Version (2.x) wurde ja inzwischen immer mal wieder in der alten Version (1.x) integriert, aber nun isses mal so weit.

Eigentlich isses ja 'ne Version 3.x, aber der ältere überarbeitet Entwurf war viel zu umständlich, so daß ich gleich nochmal neu anfing und demnach die Versionsnummer öffentlich erst garnicht weiterzählte.

Hab das komplette Speichermanagement umgestellt, so daß das alte Initialisierungsproblem (siehe 6#) garnicht mehr vorkommen kann und ich diesbezüglich weniger Aufwand hab, um dieses abzufangen.

- das SET ist jetzt noch 'nen Haut speichersparender
- und die "Konstanten" werden nicht mehr beim Programmstart erstellt,
sondern erst wenn benötigt
- das mit den Konstanten wurde in der alten Version 1.7 wieder zurückgebaut
(gab da 'n kleines Problem und ich hab's halt nur noch in einer Version suchen und beheben wollen)

Außerdem besteht der Record jetzt nur noch aus dem dynamischen Array, so daß dieses jetzt seitens Delphi wie ein Integer verwaltet werden kann, bzw. wie ein einfaches dynamisches Array, welches z.B. eine optimalere Übergabe als Parameter ermöglicht (paßt ja nun in ein Register rein).

Zusätzlich sind auch schon Teile etwas optimiert (häßliches ASM eben)

Nja, so einige manuelle Test verliefen erfolgreich.
Aber 'nen "richtigen" Unittest muß ich noch fertigstellen, um da ganz sicher zu sein.
(sind ja nur noch ~31 Prozeduren/Funktionen zu testen, von den fast 140 Öffentlichen)

Im Post #1 befindet sich nun also eine Zip, mit der "alten" 1.7 und der "neuen" 2.0.
Falls jemand Fehler entdeckt, so möge Er/Sie es bitte melden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#14
  Alt 5. Mär 2010, 17:05


Wißt ihr wie vieß ein winziger Fehler in einer Testroutine sein kann?

Hatte zwar vorher unmassen an Möglichkeiten in der .Compare-Routine erfolgreich getestet, aber zwei winzige Sondefälle übersehn.

In der Annahme, daß .Compare also funktioniert, ging ich nun also davon aus, daß etwas Anderes 'ne Macke hatt, welche ich einfach nicht fand.

Also Compare war futsch, das Andere ging vermutlich (jedenfalls bis dahin, wo ich es versuchte zum Laufen zu bringen).

Im Unitstest hab ich jetzt erstmal die beiden Wichigstens Vergleiche/Prüfungen (Equal und Compare) durch selbstprüfende Varianten ersetzt, welche weiterhin .Compare nutzen.
Somit wird weiterhin Compare geprüft (auch dieser gemeine Sonderfall, aber es gibt bei den Püfungen keine Falschmeldungen mehr.

Nja, ich hoofe mal die letzen Macken demnächst wegzubekommen, aber da ich die nächsten 2 Wochen etwas ausgelastet und kurz angebunden bin, werd' ich nicht viel Zeit hierfür haben.


Meine aktuellen Codes sind dennoch oben mit angehangen und die 3 Blöcke mit dem {} davor, in der UnitTest.dpr, sind die mir bekannten Problemstellen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#15
  Alt 12. Mär 2010, 13:00
So, alle bekannten Fehler wurden endlich beseitigt. (Download siehe oben)

Codeoptimierungen werde ich jetzt aber nicht mehr vornehmen können.
(sowas muß mindestens bis übernächste Woche warten, also bis ich wieder von der LBM zurück bin)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#16
  Alt 8. Apr 2010, 16:37
Joar, was soll ich sagen?

Ich hatte inzwischen mal (hoffentlich) die letzen Fehler ausgemerzt,
welche nach Reperatur der Prüffunktionen aufgetaucht sind.

Nachfoldendes ist unwichtig ... steht nur hier , damit ich den Link nicht vergeß.
Außerdem hab ich es auch mal im CodeCentral zur Diskusion gestellt ... mal sehn ob da noch jemand was dazu sagt.
https://forums.codegear.com/thread.jspa?threadID=35565
http://cc.embarcadero.com/item/27670
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

 
Delphi 12 Athens
 
#17
  Alt 8. Apr 2010, 17:15
Zitat von himitsu:
http://cc.embarcadero.com/item/27670
Das ist alles, was ich da zu sehen bekomme:
Unavailable Submission
Sorry, you don't have access to this submission. Please see similar submissions for 3rdRail and Source Code, and other submissions by Frank Semmling.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#18
  Alt 8. Apr 2010, 17:21
OK, die Frage ob du im EDN eingeloggt bist, hat sich dort über's Forum schon geklärt,

aber sonst wüßte ich nicht ob und wo ich da was "freigeben" oder umstellen muß?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

 
Delphi 12 Athens
 
#19
  Alt 8. Apr 2010, 18:05
Wenn du mal auf eine meiner Submissions gehst http://cc.embarcadero.com/Item/26127, dann steht unter dem Download-Button:

Zitat:
To download this, you must have registered:
Your existing free membership
Was steht denn bei dir?

Bei den Eigenschaften der Submission habe ich bei Copyright: "No significant restrictions" und bei Terms "Embarcadero use at your own risk disclaimer" angegeben.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#20
  Alt 22. Apr 2010, 13:13
Ups, da hatte ich doch glatt vergessen die letzte Version hochzuladen,
in welcher dieser saublöde Compilerfehler (defekte Referenzzählung
http://www.delphipraxis.net/internal...t.php?t=176345 )
behoben/umgangen wurde.

Und nun noch ein kleiner "Gag":
Das kleinste (vom Code her) und schnellste WideCharSet der Welt.
Delphi-Quellcode:
Type TWideCharRec = Record
    Lo: AnsiChar;
    Hi: Byte;
  End;
  TTinyWideCharSet = Record
    Sets: Array[Byte] of TSysCharSet;
    Procedure Include(C: WideChar); Inline;
    Procedure Exclude(C: WideChar); Inline;
    Function Test (C: WideChar): Boolean; Inline;
    Procedure Clear; Inline;
  End;

Procedure TTinyWideCharSet.Include(C: WideChar);
  Begin
    System.Include(Sets[TWideCharRec(C).Hi], TWideCharRec(C).Lo);
  End;

Procedure TTinyWideCharSet.Exclude(C: WideChar);
  Begin
    System.Exclude(Sets[TWideCharRec(C).Hi], TWideCharRec(C).Lo);
  End;

Function TTinyWideCharSet.Test(C: WideChar): Boolean;
  Begin
    Result := TWideCharRec(C).Lo in Sets[TWideCharRec(C).Hi];
  End;

Procedure TTinyWideCharSet.Clear;
  Var i: Byte;

  Begin
    For i := 0 to 255 do Sets[i] := [];
  End;
Es kann nicht viel, kennt kein Ansi, aber es ist dafür klein und komplett fehlerunanfällig.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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