Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mein Delphi-Style (https://www.delphipraxis.net/134200-mein-delphi-style.html)

BUG 18. Mai 2009 16:32

Re: Mein Delphi-Style
 
Um bei Hansas Beispiel zu bleiben:
Zitat:

Zitat von Hansa
unsortiert in ein Buch einkleben.

Vielleicht doch, dann aber nur solange bis er eine bestimmte Marke sucht :stupid:
Dann wird er ein paar Sortierungen (Jahr - Ort - ka, sammle keine Briefmarken) ausprobieren und dann die wählen die ihm am Besten gefällt und diese dann mit der Zeit verfeinern.

Der gute Stil muss sich also entwickeln und da ist es zwar hilfreich, dass mangelnde Formatierung angemahnt wird, aber ständig darauf herumzureiten stört imho die Entwicklung eines Stilbewusstseins.


MfG,
Bug

Satty67 18. Mai 2009 16:50

Re: Mein Delphi-Style
 
Um vielleicht von der muss alles/muss nichts Diskussion weg zu kommen...

Man könnte ja eine Rangliste erstellen, welche Styleguides den Code deutlich lesbarer machen und welche dann nur noch marginal Verbesserungen bringen und evtl. weniger wichtig sind. Zumindest die wichtigen Punkte könnte man sich dann aneignen...

Einrückung sehe ich mit am wichtigsten (wobei wohl wieder die Sache mit begin ungeklärt bleiben wird) ;)

Der.Kaktus 18. Mai 2009 16:56

Re: Mein Delphi-Style
 
..da auch mal meinen Senf dazu geben moechte...
also ich finde, dass ja gewisse Tools..Castalia etc. auch in einer gewissen Form "markieren"..die sieht , nicht nur weil es meiner entspricht, auch sehr uebersichtlich aus und ich denke mal, dass die Firma sicher auch gewisse Standards genutzt hat um sie in dieser Art zu visualisieren. ;-)

Win32.API 18. Mai 2009 17:11

Re: Mein Delphi-Style
 
Zitat:

Zitat von Luckie
Bei mir würde das so aussehen:
Delphi-Quellcode:
procedure TFtpBrowser.DeleteFile(AFile: String; IsDir: Boolean);
begin
  if (IsDir and (AFile <> '.') and (AFile <> '..')) then
  begin
    try
      RemoveFilesAndDir(...);
    except
      // Fehlerbehandlung
    end;
  end
  else if (not IsDir) then
  begin
    try
      Deletefile(..);
    except
      // Fehlerbehandlung
    end;
  end;
end;

Schonmal nicht schlecht, ich würde es aber so bevorzugen:

Delphi-Quellcode:
procedure TFtpBrowser.DeleteFile(AFile: String; IsDir: Boolean);
const
  strRemoveFileError = 'Could not remove %s %s';
var
  strErrorMessage: string;
begin
  try
    if (IsDir) then
      if ((AFile <> '.') and (AFile <> '..')) then
        Deletefile(..);
    else
      Deletefile(..);
  except
    if (IsDir) then
      strErrorMessage := Format(strRemoveFileError, ['directory', AFile])
    else
      strErrorMessage := Format(strRemoveFileError, ['file', AFile]);

    TriggerLogEvent(strErrorMessage, etError);
  end;
end;
Grüße,
Win32

DeddyH 18. Mai 2009 17:14

Re: Mein Delphi-Style
 
Das wird Delphi aber nicht kompilieren ("; nicht erlaubt vor einem else") ;)

Win32.API 18. Mai 2009 17:20

Re: Mein Delphi-Style
 
War ja auch nur schnell zusammen getippt, hier gehts ja schließlich ums Prinzip :cheer:

Nighthawk1310 18. Mai 2009 17:36

Re: Mein Delphi-Style
 
Also bei mir würde der Beispiel-Code so aussehen:

Delphi-Quellcode:
  if k=kMax then
     A[k] := A[k-1] / A[k]
 
  if a=0 then
     Result := 0 
  else
     if a>0 then
        Result := 1 
     else
        Result := -1;

  if Sender=mnPrintGraphOben then
     h:= ro            // 'Drucken|Graph oben'
  else
     h:= rm;           // 'Drucken|Graph unten'                      

  for k:= 0 to kMax do
      A[k]:= 0;

  for i := 1 to iMax do
      begin
      temp := A[i];
      A[i] := B[i];
      B[i]:= temp;
      end;

  for i:= 2 to m do
      begin
      for k:= 1 to i-1 do
          B[i]:= B[i] - A[r(i,k)] * B[k];

      B[i]:= B[i] / Abs(A[r(i,i)])
      end;

  with Image1.Canvas do
       begin
       MoveTo(DL, D0 - Round(sy * (F(xMin)-yMin)));
       
       for i:= 0 to 320 do
           begin
           x:= xMin + i * dx;
           LineTo(DL + 2 * i, D0 - Round(sy * (F(x)-yMin)))
           end;
       end;
und eine Procedure/Function muss nicht unbedingt auf eine Bildschirmseite passen.
Das wichtigste ist, dass man es lesen und verstehen kann. Sprich, wenn man scrollen muss, dann
darf es nicht sein, dass man alle paar Zeilen zurück zu den Deklarationen der Variablen springen muss um
sich zu errinnern, was DL, D0, ro oder rm nochmal bedeutet. Wenn ich Code sehe (meiner oder auch anderer Herkunft), dann möchte ich schon direkt (vor allem nach längerer Nichtbetrachtung) sofort sehen was dort "fabriziert" wurde und was es bedeutet.

Beispiel (Nodes mit Farbverlauf im VST zeichnen):
Delphi-Quellcode:
     if (Node = vstMainList.HotNode) then
        begin
        TargetCanvas.Pen.Color  := $00FAF0D8; //$0049CFF5;
        cl1 := $00FDFAF4;
        cl2 := $00FDF5E8;
        end;

     if (Node = vstMainList.FocusedNode) then
        begin
        TargetCanvas.Pen.Color  := $00FDDE99; //$000C66D3;
        cl1 := $00FDF8F1;
        cl2 := $00FCEFD5;
        end;

     if ((vstMainList.HotNode = vstMainList.FocusedNode) and (Node = vstMainList.HotNode)) then
        begin
        TargetCanvas.Pen.Color  := $00FDDE99; //$0049CFF5;
        cl1 := $00FEF7E9;
        cl2 := $00F6E4C0;
        end;

     ....
     ....
     ....

     if (Column = 0) or (Column = vstMainList.Header.Columns.Count - 1) then
        begin
        rcTemp := CellRect;
        dec(rcTemp.Bottom, 1);

        if (Column = 0) then
           rcTemp.Left := rcTemp.Right - 4;

        if (Column = vstMainList.Header.Columns.Count - 1) then
           rcTemp.Right := rcTemp.Left + 4;

        if (vstMainList.Selected[Node]) or (Node = vstMainList.HotNode) then
           eqComps.DrawGradient(TargetCanvas, rcTemp, False, [cl1, cl2]);
        end;
Ich habe die Kommentare mal entfernt, aber ich denke, dass der Code relativ einfach zu vertstehen ist.
Auch wenn es nur ein Auszug ist.
Meine Variablennamen wähle ich eigentlich immer so, dass man aus ihnen Typ und Verwendungszweck erkennen kann.
rcTemp im Beispiel wird mehrmals an unterschiedlicher Stelle benutzt und immer wieder mal neu belegt.

pNodeDataUser und pNodeDataWorkplace im Folgenden lassen schon erkennen, dass es Node-Daten sind für Benutzer oder Arbeitsplätze auch ohne das dafür eine weitere Erläuterung notwendig wäre, abgesehen vom "wozu?".

Delphi-Quellcode:
     if Node.Dummy = 98 then
        begin
        pNodeDataUser := vstMainList.GetNodeData(Node);
        sTemp := GetWorkplaceNumberFromID(pNodeDataUser.lRefWorkplaceID);
        ....
        ....
        ....
        end;

     if Node.Dummy = 99 then
        begin
        pNodeDataWorkplace := vstMainList.GetNodeData(Node);
        ....
        ....
        ....
        end;
Variablen sollten abgesehen davon nur am Deklarationsort einmal etwas genauer beschrieben werden.
Mitten im Code macht es wenig Sinn, es sei denn die Namen der Variablen sind Nichtssagend.

Fazit für mich:
Bis jetzt sind auch andere, die mit meinem Code etwas machen mussten gut und schnell (ohne große Erklärungen)
damit zurechtgekommen. Und das ist die Hauptsache.

Der.Kaktus 18. Mai 2009 17:51

Re: Mein Delphi-Style
 
Zitat:

Zitat von Nighthawk1310
Also bei mir würde der Beispiel-Code so aussehen:
...

..waer mir sehr!!! unuebersichtlich..meine Meinung 8)

jbg 18. Mai 2009 17:52

Re: Mein Delphi-Style
 
Zitat:

Zitat von Nighthawk1310
Delphi-Quellcode:
///...
     if (Column = 0) or (Column = vstMainList.Header.Columns.Count - 1) then
        begin
        rcTemp := CellRect;
        dec(rcTemp.Bottom, 1);

        if (Column = 0) then
           rcTemp.Left := rcTemp.Right - 4;

        if (Column = vstMainList.Header.Columns.Count - 1) then
           rcTemp.Right := rcTemp.Left + 4;

        if (vstMainList.Selected[Node]) or (Node = vstMainList.HotNode) then
           eqComps.DrawGradient(TargetCanvas, rcTemp, False, [cl1, cl2]);
        end;

Gehört das "end;" jetzt zu "if (vstMainList.Selected[Node])" ? Zumindest würde ich das beim Überfliegen des Codes so sehen und somit den Code falsch verstehen.



Ich hätte da noch eine Idee, wie man einrücken kann:
1. Man nehme die aktuelle Uhrzeit mit Sekundenanzeige
2. Rechne Sekunden modulo 8
3. Das Erbegbnis ist die Anzahl der Leerzeichen die man zum einrücken der aktuellen Zeile benutzt. Solchen Code gibt es wirklich.

Nighthawk1310 18. Mai 2009 17:57

Re: Mein Delphi-Style
 
Zitat:

Zitat von jbg
Gehört das "end;" jetzt zu "if (vstMainList.Selected[Node])" ? Zumindest würde ich das beim Überfliegen des Codes so sehen und somit den Code falsch verstehen.

Ja. Denn "end"'s nach "if" benötigen auch immer ihr "begin". und der Block/die Einrückung zeigt es auch.
Im anderen Fall wäre es 3 leerzeichen weiter eingerückt + "begin" in der Zeile nach dem "then".

EWeiss 18. Mai 2009 18:09

Re: Mein Delphi-Style
 
na ja ich würde es direkt unter IF schreiben.
Bei tieferen abfragen würde ich nicht mehr erkennen wozu der Block gehört.

Auch (gewohnheit aus VB) setze ich hinter dem "End"

Delphi-Quellcode:
begin
..
end; // Column
So sehe ich direkt zu welcher abfrage dieser Block gehört.

gruss Emil

Nighthawk1310 18. Mai 2009 18:45

Re: Mein Delphi-Style
 
Zitat:

Zitat von EWeiss
na ja ich würde es direkt unter IF schreiben.
Bei tieferen abfragen würde ich nicht mehr erkennen wozu der Block gehört.

Auch (gewohnheit aus VB) setze ich hinter dem "End"

Delphi-Quellcode:
begin
..
end; // Column
So sehe ich direkt zu welcher abfrage dieser Block gehört.

gruss Emil

Ist auch nicht ganz uninteressant :)

sirius 18. Mai 2009 19:32

Re: Mein Delphi-Style
 
  1. Ich finde es interessant, wie viele hier diese "begin-Problematik" kennen. Ich hatte es anfangs auch in eine Zeile mit if..then oder for..to..do geschrieben. Anfangs fand ich sogar die Lesbarkeit stark beeinträchtigt, wenn ich, wie hier im Forum und überhaupt üblich das begin am Anfang einer neuen Zeile fand. Ich habe teilweise, um den Code leichter lesen zu können, ihn aus dem Forum hier rauskopiert und erstmal formatiert :D Darüber bin ich hinweg, ich schreibe jetzt auch das begin auf eine einzelne Zeile. Auch weil die neueren IDEs von Delphi dies in den Templates haben. Und man kann sich problemlos umgewöhnen.
  2. Ich sehe das der TE sein Formatierungswissen anscheinend aus Mathematikbüchern, wie er selbst sagt, hat. Ich wusste nicht, wie grausam die Mathematiker schreiben. Aber so einen Quelltext würde ich keinem zumuten. Es mag ja sein, wenn man kurz ein einzelnes Script in Matlab nach dieser Formatierung tippt, aber bitte nicht für längere Programme. Auch die "GoTo-s" des TE in seinen Quellcodes sprechen (mal wieder) gegen die Mathematikbücher.
    Die sogenannten OOP-Gurus, die der TE eingangs erwähnte, meinten nicht, dass, wenn man eine Methode auf einem Bildschirm sehen soll, alles auf eine Zeile zu schreiben. Es ging ihnen vielmehr um die Anzahl der Befehle je Methode. Ich überfliege grad ein Einsteigerbuch für Java (so ein kostenloses ebook). Da steht:
    Zitat:

    In einer Deklarationsanweisung können Sie mehrere Variablen gleichen Typs deklarieren. Die Variablennamen sind durch Kommata getrennt aufzulisten. Es ist allerdings aus Gründen der besseren Lesbarkeit und zu Dokumentationszwecken unüblich, mehrere Variablen in einer einzigen Anweisung [Anmerk.: also in einer Zeile] zu deklarieren.
    Lieber TE. Sie sollten sich vielleicht nicht so sehr auf die Mathematikbücher verlassen. Für die mathematische Seite sind sie bestimmt super (ich hoffe sie haben die Quelltexte nicht nur herauskopiert -> Copyright), aber einen sauberen Programmierstil bekommt man damit anscheinend nicht. (Die Erfahrungen hier im Forum sprechen ja Bände; und Sie kennen bestimmt den Autofahrerwitz mit den Geisterfahrern)

stoxx 18. Mai 2009 20:21

Re: Mein Delphi-Style
 
Zitat:

Auch (gewohnheit aus VB) setze ich hinter dem "End"


Delphi-Quellcode:
begin
..
end; // Column


das hab ich früher auch mal gemacht, ist aber mit dem CNPack total überflüssig geworden, CNPack macht ja jedes "begin" und "end" schön bunt und in jeder Ebene mit einer anderen Farbe.
CNPack verbindet das "begin" und "end" von einem Block auch schön mit einem senkrechten Strich.
Seitdem hat sich das irgendwie ergeben, dass ich überall dahinterschreibe, von welchem begin das end stammt .. :-)

Hansa 18. Mai 2009 21:26

Re: Mein Delphi-Style
 
Zitat:

Zitat von Nighthawk1310
...Das wichtigste ist, dass man es lesen und verstehen kann. Sprich, wenn man scrollen muss, dann
darf es nicht sein, dass man alle paar Zeilen zurück zu den Deklarationen der Variablen springen muss um
sich zu errinnern, was DL, D0, ro oder rm nochmal bedeutet...

OT : erst mal, eine Variable DO kann es wohl kaum geben. :mrgreen: Gut, dann eben DL. Ist nämlich vielfach unbekannt : Was ist das jetzt ? Man halte <STRG> gedrückt und wandere mit der Maus über den Source bis zum DL (wird dann blau) und jetzt Linksklick. Schon ist man bei der Deklaration von DL. Um jetzt nicht mühselig zurückscrollen zu müssen, setzt man vorher bei der betreffenden DL-Zeile eine Sprungmarke: <STRG> <K> <1> Und kommt mit <STRG> <Q> <1> wieder direkt an diese Stelle.

Die Muhkuh 18. Mai 2009 21:31

Re: Mein Delphi-Style
 
Eine Variable Do kann es geben und dank dem ganzen Insight-Zeug reicht meist schon ein Überfahren der Variable mit dem Cursor.

Namenloser 18. Mai 2009 21:32

Re: Mein Delphi-Style
 
Zitat:

Zitat von Hansa
OT : erst mal, eine Variable DO kann es wohl kaum geben.

D0 schon, DO eher nicht.

Die Muhkuh 18. Mai 2009 21:33

Re: Mein Delphi-Style
 
D0 und DO kann es geben.

stoxx 18. Mai 2009 21:35

Re: Mein Delphi-Style
 
Zitat:

Man halte <STRG> gedrückt und wandere mit der Maus über den Source bis zum DL (wird dann blau) und jetzt Linksklick. Schon ist man bei der Deklaration von DL. Um jetzt nicht mühselig zurückscrollen zu müssen, setzt man vorher bei der betreffenden DL-Zeile eine Sprungmarke
warum sooooo umständlich ?? :mrgreen:
Gar nix erst Maus.
Einfach auf das Wort gehen ALT+Pfeil hoch drücken. Wenn man wieder zurück will ALT-PFEIL LINKS

:-)

Muetze1 18. Mai 2009 21:47

Re: Mein Delphi-Style
 
Zitat:

Zitat von stoxx
Einfach auf das Wort gehen ALT+Pfeil hoch drücken. Wenn man wieder zurück will ALT-PFEIL LINKS

Warum so inkonsequent? Einfach ALT+Cursor Links bzw. ALT+Cursor Rechts. Also bittem hoch und links kannste doch keinem vernünftig erklären geschweige denn begründen... 8)

Question_mark 18. Mai 2009 21:58

Re: Mein Delphi-Style
 
Hallo,

Der TE Dipl Pysiker Karl August Ernst von Provokation mag ja in der Mathematik durchaus bewandert sein, aber sollte doch lieber auf das Programmieren (jedenfalls in diesem Stil) verzichten..
Das Beispiel in Thread #1 zeugt von übelstem Programmierstil und ist Spaghetticode par excellence. Die Intention könnte natürlich sein, ich programmiere Spaghetti und kein anderer versteht es ohne großen Aufwand. Damit kann man sich unentbehrlich machen :gruebel:

Als Kunde würde ich sowas nicht abnehmen. Ich denke aber , dieser Beitrag war eher provokativ gemeint. Und wenn der TE das hier ernst gemeint hat, sollte er etwas anderes rauchen :corky:

Gruß

Question_mark

stoxx 18. Mai 2009 23:29

Re: Mein Delphi-Style
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von stoxx
Einfach auf das Wort gehen ALT+Pfeil hoch drücken. Wenn man wieder zurück will ALT-PFEIL LINKS

Warum so inkonsequent? Einfach ALT+Cursor Links bzw. ALT+Cursor Rechts. Also bittem hoch und links kannste doch keinem vernünftig erklären geschweige denn begründen... 8)


wie meinst Du das? ALT + CURSOR HOCH ist "Deklaration suchen"
ALT + CURSOR LINKS ist "zurück Navigieren im Quelltext"

also wieder zurück an die Stellen, wo man schonmal war

ALT + CURSOR RECHTS + "Navigation wieder nach vorn"

hmm .. hab ich was falsches gesagt?

Muetze1 19. Mai 2009 00:26

Re: Mein Delphi-Style
 
Nehme alles zurück und behaupte... gar nichts.

Hansa 19. Mai 2009 00:50

Re: Mein Delphi-Style
 
Bei dir geht das ? :shock:

Delphi-Quellcode:
var do : Integer;
Ergibt bei mir lediglich folgende Fehlermeldung :

Zitat:

[Fehler] Form1.pas(61): Bezeichner erwartet, aber 'DO' gefunden
Das bezieht sich hier drauf :

Zitat:

Zitat von Die Muhkuh
Eine Variable Do kann es geben und dank dem ganzen Insight-Zeug reicht meist schon ein Überfahren der Variable mit dem Cursor.

Und das hinter dem "d" ist keine <NULL>. Über solches Ungemach stehen übrigens auch einige Passagen in Borland-Style-guide, bzw. was man nicht machen sollte. :zwinker:

Muetze1 19. Mai 2009 01:29

Re: Mein Delphi-Style
 
Dann setz mal ein & vor den Bezeichner...

Hansa 19. Mai 2009 01:56

Re: Mein Delphi-Style
 
Ich kann auch ein x davorsetzen. 8) & wird nicht akzeptiert, aber es ist auch irrelevant.

Zitat:

[Fehler] Form1.pas(61): Ungültiges Zeichen in Eingabedatei: '&' ($26)

Muetze1 19. Mai 2009 02:29

Re: Mein Delphi-Style
 
Zitat:

Zitat von Hansa
Ich kann auch ein x davorsetzen. 8) & wird nicht akzeptiert, aber es ist auch irrelevant.

Zitat:

[Fehler] Form1.pas(61): Ungültiges Zeichen in Eingabedatei: '&' ($26)

Tja, dann haste wohl ein älteres Delphi... Seit dem Rebuild mit dem D2005 funktioniert dieser Weg einwandfrei. Getestet aktuell unter RAD2007. Welches Delphi missbrauchst du so?

Hansa 19. Mai 2009 03:07

Re: Mein Delphi-Style
 
Eine Variable &DO zu deklarieren, das habe ich auf deine Veranlassung hin getestet mit D7. Selber würde ich nie auf eine solche Idee kommen. :mrgreen: Als D8 geschädigter versuche ich das gar nicht erst mit der Nachfolge Beta davon, genannt BDS2005. Allerdings : mit D2009 dürften solche Konstrukte schon gehen. ABER : Du hast mit dieser Idee ein völlig neues Spielfeld eröffnet. 8) Was ist mit dem Styleguide anzufangen im Zeichen von Unicode ?? Wird mir hier allerdings langsam wirklich zu OT-lastig.

mkinzler 19. Mai 2009 05:37

Re: Mein Delphi-Style
 
Das wurde wegen der .Net-Unterstützung eingeführt, um Uberschneidungen von Delphibezeichnern mit dem Framework zu umgehen

Chemiker 19. Mai 2009 05:53

Re: Mein Delphi-Style
 
Hallo,

das Zeichen & gibt’s schon seit Delphi 5, zu mindestens in ASM-Code, in normalen Pascal – Code habe ich es nie verwendet.

Bis bald Chemiker

mkinzler 19. Mai 2009 06:33

Re: Mein Delphi-Style
 
Dieses "Quoten" müsste mit D7 eingeführt worden sein

Nighthawk1310 19. Mai 2009 08:35

Re: Mein Delphi-Style
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Nighthawk1310
...Das wichtigste ist, dass man es lesen und verstehen kann. Sprich, wenn man scrollen muss, dann
darf es nicht sein, dass man alle paar Zeilen zurück zu den Deklarationen der Variablen springen muss um
sich zu errinnern, was DL, D0, ro oder rm nochmal bedeutet...

OT : erst mal, eine Variable DO kann es wohl kaum geben. :mrgreen: Gut, dann eben DL. Ist nämlich vielfach unbekannt : Was ist das jetzt ? Man halte <STRG> gedrückt und wandere mit der Maus über den Source bis zum DL (wird dann blau) und jetzt Linksklick. Schon ist man bei der Deklaration von DL. Um jetzt nicht mühselig zurückscrollen zu müssen, setzt man vorher bei der betreffenden DL-Zeile eine Sprungmarke: <STRG> <K> <1> Und kommt mit <STRG> <Q> <1> wieder direkt an diese Stelle.


Von DO war auch nicht die Rede, aber von D0 (0=Null).

Tyrael Y. 19. Mai 2009 08:39

Re: Mein Delphi-Style
 
Der Beste Code-Style ist der, den ICH persönlich am Besten lesen kann.

Zu 95% werde ich meinen selbst geschriebenen Code lesen und niemand anderes.
Es ist also vorrangig wichtig, daß ich mit diesem Style gut zurecht komme.

In einem Team sollte man sich trotzdem auf einen Style einigen und diesen konsequent durchziehen.

Nighthawk1310 19. Mai 2009 09:04

Re: Mein Delphi-Style
 
Zitat:

Zitat von Tyrael Y.
...
In einem Team sollte man sich trotzdem auf einen Style einigen und diesen konsequent durchziehen.

...denn sonst wird das Wort "Team" unweigerlich ad absurdum geführt.

DeddyH 19. Mai 2009 09:12

Re: Mein Delphi-Style
 
Alles schon mal dagewesen

mschaefer 19. Mai 2009 09:42

Re: Mein Delphi-Style
 
Moin, moin,

Wenn man sich auf einen Stil einigt, den ein automatischer Formatierer auch hinbekommt, kann man einges Konfliktpotenzial entschärfen..

Grüße // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.
Seite 3 von 3     123   

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