Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekte zur Laufzeit erzeugen (https://www.delphipraxis.net/180410-objekte-zur-laufzeit-erzeugen.html)

Luki206 18. Mai 2014 18:14

Objekte zur Laufzeit erzeugen
 
Hi DP

Meine Überschrift trift es nicht ganz da ich ja schon einmal etwas in der Richtung gefragt hatte nur hat das jetzt nichts damit zu tun.

Mein Problem: Ich möchte auf einem zweiten Formular zum Programm start Buttons erzeugen nur, da das Fenster noch nicht erzeugt ist, bekomme ich folgende Fehlermeldung:
Code:
Im Projekt Projekt1.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x006c439b: read of address 0x000003e0' aufgetreten
Ich habe das zweite Formular aus der Erstellungsreihenfolge herausgenommen und will es selbst erzeugen mit Form.Create nur bekomme ich dabei den Fehler.

Hier ist mein Code:

Delphi-Quellcode:
unit open;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ValEdit, Vcl.StdCtrls,
  Vcl.ExtCtrls, Vcl.DBCtrls, Vcl.DBGrids, Data.DB, Datasnap.DBClient;

type
  TFrmOpen = class(TForm)
    Button1: TButton;
    Button2: TButton;
    DS: TDataSource;
    CDS: TClientDataSet;
    CDSspeise: TStringField;
    CDSpreis: TFloatField;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure GenerateButton;
  private
    { Private-Deklarationen }
    LBe: Boolean;
    LBut: array of TButton;
  public
    { Public-Deklarationen }
  end;

var
  FrmOpen: TFrmOpen;

implementation

{$R *.dfm}

uses scan, use;

procedure TFrmOpen.Button1Click(Sender: TObject);
begin
if not LBe then begin
FrmOpen.Width := 609;
LBe := true;
end else begin
 FrmOpen.Width := 369;
 Lbe:= false;
end;
end;

procedure TFrmOpen.Button2Click(Sender: TObject);
begin
FrmScan.Show;
end;

procedure TFrmOpen.FormCreate(Sender: TObject);
begin
Lbe := false;
CDS.FileName := 'custom.xml';
if FileExists(CDS.FileName) then begin
  CDS.LoadFromFile(CDS.FileName);
  GenerateButton;
end else begin
  CDS.CreateDataSet;
end;
end;

procedure TFrmOpen.GenerateButton;
var i: Integer;
begin
CDS.First;
 for i := 0 to CDS.RecNo do begin
   LBut[i] := TButton.Create(FrmUse.BoxScro);
   LBut[i].Parent := FrmUse.BoxScro;
   LBut[i].Left := 20 + ((LBut[i].Height + 10) * i);
   LBut[i].Height := 20;
   if (i >= 5) then LBut[i].Height := 20 + ((LBut[i].Height + 10) * i);
   LBut[i].Caption := CDS.FieldByName('test').Value;
   CDS.Next;
 end;
end;

end.
Danke im Voraus.

Luki :spin:

himitsu 18. Mai 2014 18:28

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von Luki206 (Beitrag 1259215)
mit Form.Create nur bekomme ich dabei den Fehler.

...

Hier ist mein Code:

Sicher daß das der Code ist?

Ich finde das Form.Create garnicht.


Und sicher daß du Form.Create meinst und nicht TForm.Create?

Luki206 18. Mai 2014 18:42

AW: Objekte zur Laufzeit erzeugen
 
ja ich meinte TForm.Create und komischer weise ist das jetzt verschwunden :shock: :gruebel: jetzt ist's richtig:
Delphi-Quellcode:
procedure TFrmOpen.FormCreate(Sender: TObject);
begin
Lbe := false;
CDS.FileName := 'custom.xml';
if FileExists(CDS.FileName) then begin
  CDS.LoadFromFile(CDS.FileName);
  TFrmUse.Create(self);
  GenerateButton;
end else begin
  CDS.CreateDataSet;
end;
end;
es war nur in der procedure. Jetzt setzt er den Pointer bei
Code:
LBut[i] := TButton.Create(FrmUse.BoxScro);
als Fehler

Sir Rufo 18. Mai 2014 18:44

AW: Objekte zur Laufzeit erzeugen
 
Und wann wird der Wert von
Delphi-Quellcode:
FrmUse
gesetzt?

Luki206 18. Mai 2014 18:59

AW: Objekte zur Laufzeit erzeugen
 
Ich weiß gerade nicht was du mit 'Wert' meinst? :gruebel:

Perlsau 18. Mai 2014 21:10

AW: Objekte zur Laufzeit erzeugen
 
FrmUse ist doch eine Variable, nicht wahr? Variablen kann man Werte zuweisen, wenn ich mich nicht irre. In deinem Code findet diese Zuweisung nicht statt. Du greifst aber auf FrmUse zu, was dann einen Fehler auslöst.

Übrigens: Meines Wissens nach hat man dir schon gefühlte hundert Mal dringend empfohlen, deinen Quellcode ordentlich zu formatieren. Das kann ja kein Mensch entziffern! Wieso ignorierst du das nach 8 Monaten in diesem Forum noch immer hartnäckig?

Popov 18. Mai 2014 22:15

AW: Objekte zur Laufzeit erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab hier eine Funktion aus einem meiner Projekte rauskopiert (und angepasst), die auch Fenster dynamisch erzeugt. Die "Blaupause" für die Formulare (man kann unendlich davon erzeugen) wird nicht automatisch erzeugt, sondern ist nur verfügbar.

Luki206 19. Mai 2014 14:17

AW: Objekte zur Laufzeit erzeugen
 
Ok danke, aber das trift es jetzt auch nicht ganz.. Ich habe jetzt noch einmal etwas ausprobiert bei dem beim erscheinen des Formulars die Komponenten erzeugt werden. Nur bekomme ich bei den Buttons also bei
Delphi-Quellcode:
LBut[i] := TButton.Create(ScrollBox);
den Fehler den ich oben beschrieben habe.

@Perlsau: ich habe es eigentlich versucht einen 'ordentlichen' Code zu schreiben.. Was genau ist das was man fast nicht entziffern kann? :gruebel:

PS: Hier ist die procedure die ich ausführe wenn das Fenster sichtbar wird:
Delphi-Quellcode:
procedure TFrmUse.GenerateButton;
var i: Integer;
begin
BoxScro := TScrollBox.Create(TabAbrech);
BoxScro.Align := alClient;
BoxScro.BorderStyle := bsNone;
FrmOpen.CDS.First;
 for i := 1 to FrmOpen.CDS.RecNo do begin
   LBut[i] := TButton.Create(BoxScro);
   LBut[i].Parent := BoxScro;
   LBut[i].Left := 20 + ((LBut[i].Height + 10) * i);
   LBut[i].Height := 20;
   if (i >= 5) then LBut[i].Height := 20 + ((LBut[i].Height + 10) * i);
   LBut[i].Caption := FrmOpen.CDS.FieldByName('speise').Value;
   FrmOpen.CDS.Next;
 end;
end;
Ich erzeuge auch gleich eine ScrollBox nur das ist nicht das Problem... Oder sollte ich gleich das ganze Projekt hochladen?

mkinzler 19. Mai 2014 14:28

AW: Objekte zur Laufzeit erzeugen
 
-BoxScro hat keinen Parent.
-Wann wird frmUse erzeugt?
-Wo und wie ist LBut[] delartiert?
...

Popov 19. Mai 2014 14:45

AW: Objekte zur Laufzeit erzeugen
 
Delphi-Quellcode:
unit Unit1;

...

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.GenerateButton;
  Form2.Show;
end;
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    PageControl1: TPageControl;
    TabAbrech: TTabSheet;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    BoxScro: TScrollBox;
    LBut: array[0..3] of TButton;
  public
    { Public-Deklarationen }
    procedure GenerateButton;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.GenerateButton;
var
  i: Integer;
begin
  BoxScro := TScrollBox.Create(TabAbrech);
  BoxScro.Parent := TabAbrech; //<<<<<<<<<<<<<<<<<<<<<
  BoxScro.Align := alClient;
  BoxScro.BorderStyle := bsNone;
  //FrmOpen.CDS.First;
  for i := 1 to High(Self.LBut) do //FrmOpen.CDS.RecNo do
  begin
    LBut[i] := TButton.Create(BoxScro);
    LBut[i].Parent := BoxScro;
    LBut[i].Left := 20 + ((LBut[i].Height + 10) * i);
    LBut[i].Height := 20;
    if (i >= 5) then
      LBut[i].Height := 20 + ((LBut[i].Height + 10) * i);
    LBut[i].Caption := IntToStr(LBut[i].Left); // FrmOpen.CDS.FieldByName('speise').Value;
    //FrmOpen.CDS.Next;
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  PageControl1.Align := alClient;
end;

end.

Luki206 19. Mai 2014 14:48

AW: Objekte zur Laufzeit erzeugen
 
-BoxScro hat jetzt einen Parent

-FrmUse steht in der Erstellungsreihenfolge als zweites und wird durch FrmUse.Show; aufgerufen

-LBut liegt in private und ist so deklariert:
Code:
LBut: array of TButton;

mkinzler 19. Mai 2014 14:52

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

-LBut liegt in private und ist so deklariert:
Code:
LBut: array of TButton
;
Dann solltest du den Array auch dimensionieren

Delphi-Quellcode:
setLength( LBut, FrmOpen.CDS.RecNo+1);

Jumpy 19. Mai 2014 14:55

AW: Objekte zur Laufzeit erzeugen
 
Delphi-Quellcode:
  LBut[i].Left := 20 + ((LBut[i].Height + 10) * i);
  LBut[i].Height := 20;
  if (i >= 5) then LBut[i].Height := 20 + ((LBut[i].Height + 10) * i);
Ist jetzt nicht zum eigentlichen Problem, weil mMn die Hälfte der Infos fehlen, die man bräuchte, um einen vernünftigen Rat zu erteilen. Daher nur zum obigen Codeschnipsel:

Wieso hängt die linke Position von der Höhe ab (die dazu erst noch in der nächsten Zeile gegeben wird? Wie wird die wohl vorher gewesen sein?).

Button für i>5 werden größer??? Sollte hier Top gemeint sein???

Luki206 19. Mai 2014 15:17

AW: Objekte zur Laufzeit erzeugen
 
Ok ich habe alles jetzt noch einmal bearbeitet, habe die Länge des Array's gesetzt und habe auch die Fehler mit dem was Jumpy angesprochen hat beseitigt. Nur wird nur ein Button erzeugt. die prozedure sieht jetzt so aus:
Delphi-Quellcode:
procedure TFrmUse.GenerateButton;
var i: Integer;
begin
BoxScro := TScrollBox.Create(TabAbrech);
BoxScro.Parent := TabAbrech;
BoxScro.ParentBackground := true;
BoxScro.Align := alClient;
BoxScro.BorderStyle := bsNone;
FrmOpen.CDS.First;
 for i := 1 to High(Self.LBut) do begin
   LBut[i] := TButton.Create(BoxScro);
   LBut[i].Parent := BoxScro;
   LBut[i].Left := 20 + 2*(i+1);
   LBut[i].Top := 30;
   if (i >= 5) then LBut[i].Top := 30 + 2*(i+1);
   LBut[i].Caption := FrmOpen.CDS.FieldByName('speise').Value;
   FrmOpen.CDS.Next;
 end;
end;

DeddyH 19. Mai 2014 15:25

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Delphi-Quellcode:
for i := 1 to High(Self.LBut) do begin

Sicher, dass das so stimmt?

Sir Rufo 19. Mai 2014 15:28

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von DeddyH (Beitrag 1259384)
Zitat:

Delphi-Quellcode:
for i := 1 to High(Self.LBut) do begin

Sicher, dass das so stimmt?

Eben, wer
Delphi-Quellcode:
high
sagt muss auch
Delphi-Quellcode:
fisch
- äh
Delphi-Quellcode:
low
sagen.
Delphi-Quellcode:

for i := low( Self.LBut ) to high( Self.LBut ) do

Zoot 19. Mai 2014 15:29

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von Luki206 (Beitrag 1259382)
Delphi-Quellcode:
   ...
   LBut[i].Left := 20 + 2*(i+1); // also 24, 26, 28 ... ???
   ...
   if (i >= 5) then LBut[i].Top := 30 + 2*(i+1); // also 42, 44, 46, 48 ???
   ...


Welche Breite haben die Buttons, wenn 2 pixel später schon der nächste beginnt?
Und die Oberkante wird für i>5 immer größer??

mkinzler 19. Mai 2014 15:30

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Ja, ich bin mir sicher: Nein!
Delphi-Quellcode:
procedure TFrmUse.GenerateButton;
var i: Integer;
begin
BoxScro := TScrollBox.Create(TabAbrech);
BoxScro.Parent := TabAbrech;
BoxScro.ParentBackground := true;
BoxScro.Align := alClient;
BoxScro.BorderStyle := bsNone;
FrmOpen.CDS.First;
setLength( LBut, FrmOpen.CDS.RecNo+1);
for i := 1 to FrmOpen.CDS.RecNo do
begin
   LBut[i] := TButton.Create(BoxScro);
   LBut[i].Parent := BoxScro;
   ...
   FrmOpen.CDS.Next;
 end;
end;

Luki206 19. Mai 2014 15:38

AW: Objekte zur Laufzeit erzeugen
 
Ok danke, nur bekomme ich jetzt nur 2 Button..

DeddyH 19. Mai 2014 15:40

AW: Objekte zur Laufzeit erzeugen
 
RecNo, nicht RecordCount? Ich persönlich würde aber sowieso einer Liste (TObjectList/TComponentList) den Vorzug geben, einfach mit First/Next über die Datenmenge iterieren und den neuen Button mit Add() der Liste hinzufügen, das ist weniger Gefummel und schneller dürfte es auch sein.

mkinzler 19. Mai 2014 15:41

AW: Objekte zur Laufzeit erzeugen
 
Sind die Button wirklich nur 2*2 Pixel groß?

Luki206 19. Mai 2014 15:43

AW: Objekte zur Laufzeit erzeugen
 
Natürlich nicht :D habe jetzt das so gemacht:
Delphi-Quellcode:
LBut[i].Left := 20 + (2*LBut[i].Width*i);
Nur wie du das jetzt gemeint hattest bekomme ich jetzt immer noch nur ein Button oder hatte das einen anderen Sinn?

mkinzler 19. Mai 2014 15:46

AW: Objekte zur Laufzeit erzeugen
 
Vorher wurden die Buttons im Abstand von 2 Pixeln plaziert.
Das selbige gilt natürlich auch für Top (senkrecht)
Wieviele Einträge hat die Datenbank?

Luki206 19. Mai 2014 15:53

AW: Objekte zur Laufzeit erzeugen
 
Jetzt hat sie vier aber das soll ja natürlich variabel sein

mkinzler 19. Mai 2014 15:56

AW: Objekte zur Laufzeit erzeugen
 
Schau dir doch die Erzeugung Schritt für Schritt im Debugger an

Luki206 19. Mai 2014 16:17

AW: Objekte zur Laufzeit erzeugen
 
Hmm.. ich habe gerade ein Mysterium entdeckt das ich mir nicht erklären kann, wenn ich das Formular schließe und dann wieder öffne wird immer wieder ein Button erzeugt :shock:

Edit: Beim ausführen mit dem Debugger ist mir aufgefallen das er nur einmal die Schleife durchgeht und am Schluss dann zu end springt ohne weitere Knöpfe zu erstellen..

Luki206 19. Mai 2014 17:16

AW: Objekte zur Laufzeit erzeugen
 
Ich habe jetzt auch ein wenig herumgebastelt nur wird immer noch nur ein Button erzeugt. Wie müsste ich das machen das wirklich alle Buttons auf einmal erstellt werden?

Dalai 19. Mai 2014 18:19

AW: Objekte zur Laufzeit erzeugen
 
Die Anzahl deiner Buttons hängt ja offensichtlich von FrmOpen.CDS.RecNo ab. Es wäre also eine richtig gute Idee, einfach mal im Debugger zu schauen, welchen Wert diese Variable hat. Alles andere ist Rumraterei.

MfG Dalai

Popov 19. Mai 2014 18:34

AW: Objekte zur Laufzeit erzeugen
 
Sollte das mit Debuger zu kompliziert sein, einfach ein
Delphi-Quellcode:
ShowMessage(IntToStr(i));
nach
Delphi-Quellcode:
for i :=
setzten. Man wird dann zwar ständig unterbrochen, wenn es sonst nicht klappt...

Luki206 19. Mai 2014 19:35

AW: Objekte zur Laufzeit erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hat geklappt, lag an dem
Delphi-Quellcode:
CDS.RecNo
es muss aber sein wie es DaddyH gesagt hatte mit
Delphi-Quellcode:
CDS.RecordCount
sein. Geht jetzt :thumb:

Bekomme ich aber eine kleine Erklärung zum Debugger weil ich lese da nur irgendwelche Dollarzeichen mit Zahlen

Edit: Weil ich habe auch noch nichts damit anfangen können

Sir Rufo 19. Mai 2014 19:48

AW: Objekte zur Laufzeit erzeugen
 
Das ist ja auch nur der Aufruf-Stack. Es gibt aber noch ein Fenster, wo du dir die Werte der lokalen Variablen ansehen kannst.

Luki206 19. Mai 2014 19:51

AW: Objekte zur Laufzeit erzeugen
 
Hmm.. Habe ich nicht bzw. ich finde diese nicht. Kann es sein dass das Fenster in der Starter herausgenommen wurde?

Sir Rufo 19. Mai 2014 19:53

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von Luki206 (Beitrag 1259425)
Hmm.. Habe ich nicht bzw. ich finde diese nicht. Kann es sein dass das Fenster in der Starter herausgenommen wurde?

Kann sein ... hier der Link zur Debugger-Dokumentation
(oder du hast das Fenster ausgeblendet)

Ok, laut Feature-Matrix (Seite 11) ist das nicht dabei (der gesamte Debugger ist gefühlt nicht dabei)

Luki206 19. Mai 2014 19:57

AW: Objekte zur Laufzeit erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Aus der Liste mit den Fenstern habe ich nur die ersten drei.. Dann ist das nicht dabei... Jetzt habe ich aber noch ein Problem. Wenn ich das Formular mit den darauf erzeugten Buttons aufrufe und wieder schließe passiert nichts nur erst wenn ich die komplette Anwendung beenden will bekomme ich eine Fehlermeldung mit Inhalt:

mkinzler 19. Mai 2014 20:35

AW: Objekte zur Laufzeit erzeugen
 
Das ist auch nicht der Debugger

Popov 19. Mai 2014 20:49

AW: Objekte zur Laufzeit erzeugen
 
Das beste für dich (@ TE) wäre STRG+ALT+L.

Damit rufst du Liste der lokalen Variablen inkl. Werten auf. Im Gegensatz zu Überwachte Ausdrücke STRG+ALT+W muss man bei lokalen Variablen nichts machen. Es werden einfach alle angezeigt.

Übrigens, was nicht angezeigt wird, ist nicht da. Das Fenster zeigt nur Werte an die vorhanden sind, nicht aber die, die wegoptimiert wurden.

Perlsau 20. Mai 2014 03:14

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von Luki206 (Beitrag 1259367)
@Perlsau: ich habe es eigentlich versucht einen 'ordentlichen' Code zu schreiben.. Was genau ist das was man fast nicht entziffern kann? :gruebel:

Zum Beispiel schreibst du begin immer ans Ende der Zeile. Das ist unübersichtlich. Begin und End kapseln einen Begin-End-Block. Wenn du diesen beiden Tokens immer eine eigene Zeile spendierst, wird das Ganze viel übersichtlicher und somit auch lesbarer. Schau dir doch einmal die Codezeilen der anderen Mitglieder an:
Delphi-Quellcode:
if Voraussetzung then do
begin
  MeinCode1;
  MeinCode2;
end;
statt:
Delphi-Quellcode:
if Voraussetzung then do begin
MeinCode1;
MeinCode2;
end;

himitsu 20. Mai 2014 04:06

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von mkinzler (Beitrag 1259432)
Das ist auch nicht der Debugger

Nicht vergessen, er hat nur die abgespeckte Starter, aber auch da sollte man sich Variableninhalte ansehen können. (hoff' ich doch)
  • Hints zu Variablen im Quellcode fehlen
  • und Eines der beiden Variablenfenster fehlt (hab nur vergessen Welches es war, aber hier im Forum gibt es ja Ersatz dafür)
    Ich glaub allerdings es waren die lokalen Variablen, aber dann müsste es hoffentlich noch die "überwachten Ausdrücke" geben. (oder halt andersrum)

Und wenn nicht, dann muß er sich halt an das ShowMessage-Debugging gewöhnen, bzw. mit OutputDebugStrings+Ereignisprotokoll arbeiten.


PS: Ich schreibe das Begin auch immer ans Ende, anstatt es "sinnlos" eine eigene Zeile besetzen zu lassen,
ABER mit einer ordentlichen Einrückung gibt es da IMHO keinerlei Probleme damit.
Delphi-Quellcode:
if Voraussetzung then begin
  MeinCode1;
  MeinCode2;
end;
Und nur weil das am Anfang steht, wird es nicht gleich übersichtlicher. :angel2:
Delphi-Quellcode:
if Voraussetzung then
begin
MeinCode1;
MeinCode2;
end;
Ich würde ihm ja den delphieigenen Codeformatter empfehlen, aber auch den baute man aus der Starter aus. :wall: (wenn man es nicht selber hinbekommt: ab und an mal ein beherztes Strg+D und gut ist)

Zoot 20. Mai 2014 06:46

AW: Objekte zur Laufzeit erzeugen
 
Zitat:

Zitat von himitsu (Beitrag 1259452)
Und nur weil das am Anfang steht, wird es nicht gleich übersichtlicher. :angel2:
Delphi-Quellcode:
if Voraussetzung then
begin
MeinCode1;
MeinCode2;
end;

Und warum rückst du in dem beispiel nicht vernünftig ein (so wie perlsau oben)?

Delphi-Quellcode:
if Voraussetzung then
begin
  MeinCode1;
  MeinCode2;
end;

Luki206 20. Mai 2014 07:03

AW: Objekte zur Laufzeit erzeugen
 
Da mir jetzt drei Leute das ein und selbe gesagt haben werde ich das berücksichtigen :mrgreen:

@Popov: Das mit dem STRG+ALT+L habe ich ja schon ausprobiert und es passiert einfach nichts weil die das ja leider ausgebaut hatten... :(

Und was ist jetzt mit der Fehlermeldung die kommt wenn der Speicher freigegeben werden soll?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr.
Seite 1 von 3  1 23      

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