Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   TDBXTypes.WideString-Wertetyp (https://www.delphipraxis.net/172444-tdbxtypes-widestring-wertetyp.html)

gee21 3. Jan 2013 23:50

Datenbank: MySQL • Version: 4.1 • Zugriff über: dBExpress

TDBXTypes.WideString-Wertetyp
 
Hallo alle zusammen.

Habe ein Programm das auf einen MySQL Datenbank auf einem HP Server zugreifen soll (Werte lesen und ändern).
Dank diesem Forum konnte ich nun einen Verbindung mit dem Server herstellen. (Nach einer Installation eines älteren Connectors (libmysql.dll +php_mysql)

Nun ist es aber leider so, dass ich teils Informationen aus der Datenbank abrufen kann doch bei den meisten kommt eine Fehlemeldung und bricht ab:

Auf TDBXTypes.ZSTRING-Wertetyp kann nicht als TDBXTypes.WideString-Wertetyp zugegriffen werden.

So sieht der Code aus der es verursacht:
Delphi-Quellcode:
var
  FieldNamesList: TStringList;
  SQLStmt: String;
  I: Integer;
begin
  // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
  CheckBoxActive.Enabled := True;
  ButtonApply.Enabled := True;
  TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen

  // Feldnamen (Spaltennamen) für diese Tabelle abrufen.
  FieldNamesList := TStringList.Create;
  FieldNamesList.Clear;
  SQLConnection1.GetFieldNames(TableName, FieldNamesList);

  // Select-SQL-Anweisung für alle Felder erstellen.
  if FieldNamesList.Count > 0 then
  begin
   SQLStmt := 'select ';
   for I := 0 to FieldNamesList.Count - 1 do
   begin
     SQLStmt := SQLStmt + FieldNamesList[I] + ',';
   end;
   SQLStmt[Length(SQLStmt)] := ' ';
   SQLStmt := SQLStmt + 'from '+TableName;
  end
  else
   // Feldnamen nicht gefunden, daher '*' verwenden
   SQLStmt := 'select * from '+TableName;
  FreeAndNil(FieldNamesList);

  // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen.
  EditSQL.Text := SQLStmt;
  // CommandText auf SQL-Anweisung setzen.
  SQLDataSet1.CommandText := EditSQL.Text;
  if ClientDataSet1.Active then
   ClientDataSet1.Close;
  ClientDataSet1.Open;
  CheckBoxActive.Checked := True;
end;

Ich habe diesen Code von folgendem Toutorial. Da ich noch ein ziemmlicher Anfänger bin :-)

http://docwiki.embarcadero.com/RADSt..._aktualisieren




Wer kann mir helfen?

Bernhard Geyer 3. Jan 2013 23:52

AW: TDBXTypes.WideString-Wertetyp
 
Welche Delphi-Version?
Könnte mir vorstellen das die dbExpress-Version nicht mit der libmysql-DLL zusammenspielt.

Am wenigsten Probleme hat man mit den TDataset-Nachfahren von DevArt. Kosten zwar ein paar €, verhindern aber das man zu schnell graue Haare bekommt oder sie sich ausreißt :-)

gee21 4. Jan 2013 00:00

AW: TDBXTypes.WideString-Wertetyp
 
Hallo Danke für die schnelle Antwort.

Ich habe Delphi 2009 Prof. 12.0.3170.16989

Graue Haare will ich zwar nicht aber vielleicht gibt es doch eine Lösung ohne weitere Komponenten oder so? ;-)

Volker Z. 4. Jan 2013 00:07

AW: TDBXTypes.WideString-Wertetyp
 
Grüezi mitenand,

Delphi-Quellcode:
  if FieldNamesList.Count > 0 then
  begin
   SQLStmt := 'select ';
   for I := 0 to FieldNamesList.Count - 1 do
   begin
     SQLStmt := SQLStmt + FieldNamesList[I] + ','; // Kann es hier sein, dass Dein SQL-Statement select Name1, Name2, ... NameN, <- Komma beachten generiert
   end;
   SQLStmt[Length(SQLStmt)] := ' ';
   SQLStmt := SQLStmt + 'from '+TableName; // und hier // select [..], <- Komma beachten from TableName und es scheppert?
  end
Gruß

gee21 4. Jan 2013 00:13

AW: TDBXTypes.WideString-Wertetyp
 
Ja hoi

Auch noch da? :-)

Hmm das kann natürlich sein. Aber ehrlich gesagt falls dies so wäre, wie müsste man es richtig machen?:oops:

Volker Z. 4. Jan 2013 00:23

AW: TDBXTypes.WideString-Wertetyp
 
Ja noch da,

Zitat:

Hmm das kann natürlich sein. Aber ehrlich gesagt falls dies so wäre, wie müsste man es richtig machen?
Versuch mal folgendes:

Delphi-Quellcode:
var
  s : string;
begin
  if FieldNamesList.Count > 0 then
    begin
      SQLStmt := 'select ';
      for I := 0 to FieldNamesList.Count - 1 do
        if s = '' then
          s := FieldNamesList[I]
        else
          s := s + ',' + FieldNamesList[I];
      SQLStmt := SQLStmt + [B]s[/B] + ' from '+TableName;
    end
end
Gruß

gee21 4. Jan 2013 00:30

AW: TDBXTypes.WideString-Wertetyp
 
Hmm jetzt hab ich leider folgende Meldung:

You have an error in your SQL syntax; check the Manual that
corresponds to your MySQL Server Version for the right Syntax to use
near from product_related' at line 1.


:?:

gee21 4. Jan 2013 00:33

AW: TDBXTypes.WideString-Wertetyp
 
Oh ich merke gerade das die alte Meldung in den meisten Fällen auch noch kommt. Je nach Eintrag in der Datenbank kommt die eine oder andere Meldung

Volker Z. 4. Jan 2013 00:34

AW: TDBXTypes.WideString-Wertetyp
 
Hallo,

kannst Du mal das SQL postend

Gruß

gee21 4. Jan 2013 00:37

AW: TDBXTypes.WideString-Wertetyp
 
Wie meinst du das? (SQL Posten)? :oops:peinlich:oops:

Volker Z. 4. Jan 2013 00:44

AW: TDBXTypes.WideString-Wertetyp
 
Hallo,

wenn du einen Breakpoint bei

Delphi-Quellcode:
SQLStmt := SQLStmt + s + ' from '+TableName;
setzt und dann den "Inhhalt" der Variable SQLStmt postest (an den Wert kommst Du in den lokalen Variablen SQLStmt markieren, rechte Maustaste, Untesuchen).

Gruß

gee21 4. Jan 2013 00:51

AW: TDBXTypes.WideString-Wertetyp
 
Hallo

Habe nicht gesehen dass es schon eine zweite seite gibt. Ok ich glaube ich habe das gemacht was du geschrieben hast ;-)

Es steht: SQLsTmt: string $18F418 : $58E54C
SQLStmt 'select'

Gruess

Volker Z. 4. Jan 2013 00:57

AW: TDBXTypes.WideString-Wertetyp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

sorry es ist wohl doch schon etwas spät. Ich meinte eigentlich den Wert, der neben SQLStmt steht (siehe Screenshot)

Gruß

gee21 4. Jan 2013 01:04

AW: TDBXTypes.WideString-Wertetyp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Volker Z. (Beitrag 1197559)
Hallo,

sorry es ist wohl doch schon etwas spät. Ich meinte eigentlich den Wert, der neben SQLStmt steht (siehe Screenshot)

Gruß

Ja also da steht bei mir nur: 'select'
Ach und danke für deine Geduld ;-)

Anhang 38339

Volker Z. 4. Jan 2013 01:17

AW: TDBXTypes.WideString-Wertetyp
 
Hallo,

am Screenshot kann ich sehen, dass zwar s auf category_id bzw. SQLStmt auf select steht. Soweit sieht alles ganz gut aus. Was ich leider nicht sehen kann ist der else Zweig.

Gruß

gee21 4. Jan 2013 01:20

AW: TDBXTypes.WideString-Wertetyp
 
Liste der Anhänge anzeigen (Anzahl: 1)
So müsste es besser sein

Delphi-Quellcode:
  // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
  CheckBoxActive.Enabled := True;
  ButtonApply.Enabled := True;
  TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen

  // Feldnamen (Spaltennamen) für diese Tabelle abrufen.
  FieldNamesList := TStringList.Create;
  FieldNamesList.Clear;
  SQLConnection1.GetFieldNames(TableName, FieldNamesList);




   if FieldNamesList.Count > 0 then
     begin
       SQLStmt := 'select ';
       for I := 0 to FieldNamesList.Count - 1 do
         if s = '' then
           s := FieldNamesList[I]
         else
           s := s + ',' + FieldNamesList[I];
     SQLStmt := SQLStmt + s + ' from '+TableName;
     end

  else
   // Feldnamen nicht gefunden, daher '*' verwenden
   SQLStmt := 'select * from '+TableName;
  FreeAndNil(FieldNamesList);

  // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen.
  EditSQL.Text := SQLStmt;
  // CommandText auf SQL-Anweisung setzen.
  SQLDataSet1.CommandText := EditSQL.Text;
  if ClientDataSet1.Active then
   ClientDataSet1.Close;
  ClientDataSet1.Open;
  CheckBoxActive.Checked := True;

end;

Volker Z. 4. Jan 2013 01:31

AW: TDBXTypes.WideString-Wertetyp
 
Hallo,

ist ist wohl definitiv zu spät für mich :) Setzte den Braikpoint doch mal

Delphi-Quellcode:
  if FieldNamesList.Count > 0 then
     begin
       SQLStmt := 'select ';
       for I := 0 to FieldNamesList.Count - 1 do
         if s = '' then
           s := FieldNamesList[I]
         else
           s := s + ',' + FieldNamesList[I];
     SQLStmt := SQLStmt + s + ' from '+TableName;
//-> genua hier    end
und poste dann den Wert von SQLStmt

Gruß

gee21 4. Jan 2013 01:38

AW: TDBXTypes.WideString-Wertetyp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm merkwürdig. er hält nicht an. dafür kann ich nun wesentlich mehr einträge abrufen ohne Fehlermeldung. bei ein paar einträgen kommt aber immer noch .

gee21 4. Jan 2013 01:39

AW: TDBXTypes.WideString-Wertetyp
 
Aber jetzt crasht das Programm manchmal (Freeze)

Du ich muss mal schlafen gehen. Ich mach dann morgen weiter.

Keine Ahnung was jetzt los ist und das Programm einfriert, manchmal schon beim Verbinden.

Danke dir.

Volker Z. 4. Jan 2013 01:46

AW: TDBXTypes.WideString-Wertetyp
 
Hallo,

Delphi-Quellcode:
  if FieldNamesList.Count > 0 then
     begin
       SQLStmt := 'select ';
       for I := 0 to FieldNamesList.Count - 1 do
         if s = '' then
           s := FieldNamesList[I]
         else
           s := s + ',' + FieldNamesList[I];
     SQLStmt := SQLStmt + s + ' from '+TableName;
    end // <- also du setzt hier an dieser Stelle Deinen Breakpoint
Was für ein Wert steht dann in SQLstmt?

Gruß

gee21 4. Jan 2013 01:50

AW: TDBXTypes.WideString-Wertetyp
 
Es friert eben leider das Programm ein bevor ich zu der funtion komme,

gee21 4. Jan 2013 01:51

AW: TDBXTypes.WideString-Wertetyp
 
Merkwürdig jetzts gings wieder als wäre nichts gewesen. jedoch hält er beim brekpoint nicht an....?

Volker Z. 4. Jan 2013 01:57

AW: TDBXTypes.WideString-Wertetyp
 
Hallo gee21,

poste doch mal Deine kompletten Sourcen, ich kuck dann morgen (morgen ist ja schon heute) mal drüber. Vielleicht finde ich ja dann den bösen Buben, der da querschießt.

Gruß

gee21 4. Jan 2013 02:05

AW: TDBXTypes.WideString-Wertetyp
 
Hallo Volker

Das ist ja mega lieb. DAnke dir vielmals. Ich glaube das müsste von dieser form alles sein.

Delphi-Quellcode:
Unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, WideStrings, DBXMySql, SqlExpr, FMTBcd, DBClient,
  Provider, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls,DBXDataExpressMetaDataProvider,iniFiles, strUtils,cdsfield,
  DBXTrace;

type
  Tform6 = class(TForm)
    SQLConnection1: TSQLConnection;
    ComboBoxConnections: TComboBox;
    Label1: TLabel;
    EditSQL: TEdit;
    EditFilter: TEdit;
    CheckBoxActive: TCheckBox;
    DBNavigator1: TDBNavigator;
    ButtonApply: TButton;
    listbox1: TListBox;
    DBGrid1: TDBGrid;
    SQLDataSet1: TSQLDataSet;
    DataSetProvider1: TDataSetProvider;
    ClientDataSet1: TClientDataSet;
    DataSource1: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure ComboBoxConnectionsCloseUp(Sender: TObject);
    procedure listbox1DblClick(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure CheckBoxActiveClick(Sender: TObject);
    procedure ClientDataSet1BeforeClose(DataSet: TDataSet);
    procedure ButtonApplyClick(Sender: TObject);
    procedure EditFilterChange(Sender: TObject);
    procedure EditFilterEnter(Sender: TObject);
    procedure EditFilterExit(Sender: TObject);
    procedure EditSQLChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  TableName: String;
    AllTables: TStringList; //Liste der Datenbanktabellen
    FMetaDataProvider: TDBXDataExpressMetaDataProvider;
     MemoForm: TFormCurrentField;
  public
function MatchFilter(FilterStr, TestStr: String): Boolean;
    procedure PopulateListBox;
  end;
  const
  sDefaultFilterText = 'Filter (* as wild)';
var
  form6: Tform6;

implementation

{$R *.dfm}

procedure Tform6.PopulateListBox;
// AllTables muss auf die Liste der Tabellen für die aktive Datenbankverbindung gesetzt werden.
var
  I: Integer;
begin
  ListBox1.Items.Clear;
  for I := 0 to AllTables.Count - 1 do
  begin
    // Wenn kein Filter vorhanden ist oder die Tabelle dem Filter entspricht, Tabelle dem Listenfeld hinzufügen.
    if (EditFilter.Text = sDefaultFilterText) or MatchFilter(EditFilter.Text, AllTables[I]) then
      ListBox1.Items.Add(FMetaDataProvider.QuoteIdentifierIfNeeded(AllTables[I]));
  end;

  // Wenn das Listenfeld Einträge enthält, soll es aktiviert werden.
  if ListBox1.Count > 0 then
    ListBox1.Enabled := True;
end;


function Tform6.MatchFilter(FilterStr, TestStr: String): Boolean;
var
  Pattern, EndPattern, TempStr: String;
  WildPos: Integer;
begin
  Result := True;
  if FilterStr = '' then
    Exit;

  // Whitespace entfernen und in Großbuchstaben umwandeln.
  Pattern := UpperCase(Trim(FilterStr));
  EndPattern := ''; //nichts bis gefunden

  // Auf Platzhalter überprüfen
  WildPos := AnsiPos('*', Pattern);
  if WildPos <> 0 then
  begin
    if WildPos < Length(Pattern) then //letztes Zeichen
      EndPattern := Copy(Pattern, WildPos+1, MaxInt); //beliebiger Text nach Platzhalter
    Pattern := Copy(Pattern, 1, WildPos-1);
  end;

  if (Pattern <> '') and (AnsiPos(Pattern, UpperCase(TestStr)) <> 1) then
    Result := False
  else if EndPattern <> '' then
  begin
    TempStr := AnsiRightStr(TestStr, Length(EndPattern));
    if AnsiPos(EndPattern, UpperCase(TempStr)) <> 1 then
      Result := False;
  end;
end;


procedure Tform6.ButtonApplyClick(Sender: TObject);

var
  X, Y: Integer;
begin
  // Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt.
  ClientDataSet1.ApplyUpdates(-1);
  Y := Self.Top + Self.ButtonApply.Top;
  X := Self.Left + Self.ButtonApply.Left;

  // Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen.
  if MessageDlgPos('Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes then
  begin
    ClientDataSet1.Close;
    ClientDataSet1.Open;
  end;

end;

procedure Tform6.CheckBoxActiveClick(Sender: TObject);
begin
ClientDataSet1.Active := CheckBoxActive.Checked

end;

procedure Tform6.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
  // Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben.
  if Assigned(MemoForm) then
  begin
   MemoForm.DBMemoCurrentField.DataField := '';
    if MemoForm.Visible then
      MemoForm.Close;
  end;

end;

procedure Tform6.ComboBoxConnectionsCloseUp(Sender: TObject);
begin
  // Wurde eine Auswahl getroffen?
  if ComboBoxConnections.ItemIndex = -1 then
    Exit;

  // Hilfsobjekte initialisieren.
  if not Assigned(AllTables) then
    AllTables := TStringList.Create;
  if Assigned(FMetaDataProvider) then
    FreeAndNil(FMetaDataProvider);

  // Falls eine geöffnete Verbindung vorhanden ist, soll sie geschlossen werden. Anzeigen, dass die Verbindung nicht aktiv ist.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  CheckBoxActive.Checked := False;

  // Die ausgewählte Datenbankverbindung öffnen.
  SQLConnection1.ConnectionName := ComboBoxConnections.Items[ComboBoxConnections.ItemIndex];
  SQLConnection1.LoadParamsOnConnect := True;
  SQLConnection1.LoginPrompt := False;
  SQLConnection1.Open;
  SQLConnection1.GetTableNames(AllTables, False); //Liste der Tabellen aus der Datenbank abrufen

  // Metadaten für die ausgewählte Verbindung ermitteln.
  FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create;
  FMetaDataProvider.Connection := sqlconnection1.DBXConnection; //auf die geöffnete Verbindung setzen
  FMetaDataProvider.Open;

  // Das Listenfeld mit den Tabellen dieser Datenbankverbindung füllen.
  PopulateListBox;

  // Status einiger Dialogfeldelemente initialisieren.
  SQLDataSet1.CommandText := '';
  EditSQL.Text := '';
  CheckBoxActive.Enabled := False;
  ButtonApply.Enabled := False;
end;


procedure Tform6.EditFilterChange(Sender: TObject);
begin
  if SQLConnection1.Connected then
    PopulateListBox; //Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen

end;

procedure Tform6.EditFilterEnter(Sender: TObject);
begin
EditFilter.Text := '';

end;

procedure Tform6.EditFilterExit(Sender: TObject);
begin
if EditFilter.Text = '' then
    EditFilter.Text := 'Filter (* as wild)';

end;

procedure Tform6.EditSQLChange(Sender: TObject);
begin
SQLDataSet1.CommandText := EditSQL.Text;

end;

procedure Tform6.FormDestroy(Sender: TObject);
begin
  // Die Verbindung schließen.
  if SQLConnection1.Connected then
    SQLConnection1.Close;
  // Objekte freigeben.
  if Assigned(FMetaDataProvider) then
    FreeAndNil(FMetaDataProvider);
  if Assigned(MemoForm) then
    FreeAndNil(MemoForm);
  if Assigned(AllTables) then
    FreeAndNil(AllTables);

end;



procedure Tform6.DBGrid1CellClick(Column: TColumn);

begin
  if ClientDataSet1.Active then
  begin
    // Wenn das Formular nicht angezeigt wird, wird es erstellt.
    if not Assigned(MemoForm) then
    begin
      MemoForm := TFormCurrentField.Create(Self);
      MemoForm.DBMemoCurrentField.DataSource := DataSource1; //Datenquelle festlegen
    end;

    // Formular genau unterhalb des Hauptdialogfeldes positionieren.
    MemoForm.Top := Self.Top+Self.Height;
    MemoForm.Left := Self.Left;

    MemoForm.Visible := False;
    MemoForm.Visible := True;
    MemoForm.DBMemoCurrentField.DataField := Column.FieldName;
    // Im Titel Informationen über das Feld anzeigen
    MemoForm.Caption := Format('Field Name: %s / Record Num: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
    MemoForm.Width := Self.Width;


end;
end;


procedure tform6.FormCreate(Sender: TObject);

var
  IniFile: TIniFile;
  SectionsList: TStringList; //für die Verbindungsliste
  TempStr: String;
  I: Integer;
begin

  EditFilter.Text := sDefaultFilterText;
  // Informationen über die aktuellen Datenbankverbindungen ermitteln
  IniFile := TIniFile.Create(GetConnectionRegistryFile);

  // Eine Liste der verfügbaren Datenbankverbindungen ermitteln
  SectionsList := TStringList.Create;
  IniFile.ReadSections(SectionsList);

  // Die Verbindungen in das Kombinationsfeld einfügen
  // Jede gültige Verbindung sollte mit den Zeichen 'CONNECTION' enden.
  // Nur diese Verbindungen werden hinzugefügt.
  SectionsList.Sort;
  for I := 0 to SectionsList.Count - 1 do
  begin
   TempStr := UpperCase(AnsiRightStr(SectionsList[I], Length('connection')));
   if TempStr = 'CONNECTION' then
   begin
     ComboBoxConnections.Items.Add(SectionsList[I]);
   end;
  end;

  // Nicht mehr benötigte Objekte freigeben
  FreeAndNil(IniFile);
  FreeAndNil(SectionsList);


end;

procedure tForm6.listbox1DblClick(Sender: TObject);
var
   s : string;
  FieldNamesList: TStringList;
  SQLStmt: String;
  I: Integer;
begin
  // Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
  CheckBoxActive.Enabled := True;
  ButtonApply.Enabled := True;
  TableName := ListBox1.Items[ListBox1.ItemIndex]; //Tabellennamen abrufen

  // Feldnamen (Spaltennamen) für diese Tabelle abrufen.
  FieldNamesList := TStringList.Create;
  FieldNamesList.Clear;
  SQLConnection1.GetFieldNames(TableName, FieldNamesList);




   if FieldNamesList.Count > 0 then
     begin
       SQLStmt := 'select ';
       for I := 0 to FieldNamesList.Count - 1 do
         if s = '' then
           s := FieldNamesList[I]
         else
           s := s + ',' + FieldNamesList[I];
     SQLStmt := SQLStmt + s + ' from '+TableName;
     end

  else
   // Feldnamen nicht gefunden, daher '*' verwenden
   SQLStmt := 'select * from '+TableName;
  FreeAndNil(FieldNamesList);

  // SQL-Anweisung zum Abrufen aller Tabellendaten erstellen.
  EditSQL.Text := SQLStmt;
  // CommandText auf SQL-Anweisung setzen.
  SQLDataSet1.CommandText := EditSQL.Text;
  if ClientDataSet1.Active then
   ClientDataSet1.Close;
  ClientDataSet1.Open;
  CheckBoxActive.Checked := True;

end;

end.


Falls du noch schlafen gehst, :-) wünsche ich gute Nacht & Danke für alles


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 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