![]() |
Datenbank: Access und ARDRecord-File • Version: 2005 • Zugriff über: godb (ADO)
Datensatz über Record -> in Access über SQL, Fehler? Idee
Liste der Anhänge anzeigen (Anzahl: 1)
hi!
Ich hab ein Problem mit meinem Quelltext... Ich hab ein Programm gebastelt, welches mir ermöglicht datensätze aus einer mir unbekannten-Datenbank auszulesen und diese auf den Bildschirm zu schreiben. Funzt...
Delphi-Quellcode:
program ARDReader;
{$APPTYPE CONSOLE} uses SysUtils; type TARDRecord = packed record ID: array[1..13] of Char; Anrede: array[1..13] of Char; Art: array[1..13] of Char; Kunde: array[1..61] of Char; Name: array[1..87] of Char; Strasse: array[1..61] of Char; PLZ: array[1..10] of Char; Ort: array[1..41] of Char; Tel: array[1..21] of Char; Mobil: array[1..21] of Char; Buffer: array[1..102] of Char; Datum: array[1..16] of Char; Preis: array[1..16] of Char; Feld1: array[1..1] of Char; Feld2: array[1..6] of Char; Anzahl: array[1..6] of Char; Feld3: array[1..61] of Char; Feld4: array[1..61] of Char; end; var ARDFile: file of TARDRecord; ARDRecord: TARDRecord; RecordCount: Integer = 0; begin AssignFile(ARDFile, 'C:\Dokumente und Einstellungen\Herr Boo\Desktop\evilbird\KUNDEN.ARD'); Reset(ARDFile); WriteLn('Größe pro Datensatz: ' + IntToStr(SizeOf(TARDRecord)) + ' Byte'); WriteLn; while not Eof(ARDFile) do begin Read(ARDFile, ARDRecord); WriteLn( ARDRecord.ID + ARDRecord.Anrede + ARDRecord.Art + ARDRecord.Kunde + ARDRecord.Name + ARDRecord.Strasse + ARDRecord.PLZ + ARDRecord.Ort + ARDRecord.Tel + ARDRecord.Mobil + ARDRecord.Buffer + ARDRecord.Datum + ARDRecord.Preis + ARDRecord.Feld1 + ARDRecord.Feld2 + ARDRecord.Anzahl + ARDRecord.Feld3 + ARDRecord.Feld4); Inc(RecordCount); end; WriteLn; WriteLn('Anzahl der Datensätze: ' + IntToStr(RecordCount)); CloseFile(ARDFile); ReadLn; end. Aber wenn ich das in Delphi 2005 implementiere dann bekomm ich nach 5-7 sek. eine meldung: First chance exception at $7C81EB33. Exception class EOleException with message 'Das Feld ist zu klein für die Datenmenge, die Sie hinzufügen wollten. Versuchen Sie, weniger Daten einzufügen'. Process ServiceReport.exe (1688) ich habs nich so ganz kapiert. Hab auch schon alles mögliche ausprobiert, um den Record wieder leer zu machen, aber ich bekomms nich hin... Is da was falsch? hab ich mir da was dummes ausgedacht, oder kommt das so hin? Ich hab die Fremd-Datenbank und die Access als Zip dran gehängt.. mein Quelltext sieht so aus:
Delphi-Quellcode:
könnt ihr das bitte mal ausprobieren, oder sieht jemand schon einen fehler??? Ich bin echt voll verwirrt deswegen... Ich komm einfach nich drauf was da falsch is und es lässt mir seit heute nahmittag keine ruhe, weil ich vor 1 monat oder so davon ausging, das das schon funktioniert....
type
TARDRecord = packed record ID: array[1..13] of Char; Anrede: array[1..13] of Char; Art: array[1..13] of Char; Kunde: array[1..61] of Char; Name: array[1..87] of Char; Strasse: array[1..61] of Char; PLZ: array[1..10] of Char; Ort: array[1..41] of Char; Tel: array[1..21] of Char; Mobil: array[1..21] of Char; Buffer: array[1..102] of Char; Datum: array[1..16] of Char; Preis: array[1..16] of Char; Feld1: array[1..1] of Char; Feld2: array[1..6] of Char; Anzahl: array[1..6] of Char; Feld3: array[1..61] of Char; Feld4: array[1..61] of Char; end; type TData = class(TDataModule) Connection: TADOConnection; ClientsTable: TADOTable; InstructionsTable: TADOTable; InstructionsTableID: TAutoIncField; InstructionsTableCID: TWideStringField; InstructionsTableState: TIntegerField; InstructionsTableUser: TIntegerField; InstructionsTableDate: TWideStringField; InstructionsTableHardeware: TWideStringField; InstructionsTableManufactor: TWideStringField; InstructionsTableSN: TWideStringField; InstructionsTableSpecification: TWideStringField; InstructionsTableOwn: TIntegerField; InstructionsTableMoreInformation: TMemoField; InstructionsTableErrorActions: TWideStringField; InstructionsTableErrorTime: TWideStringField; InstructionsTableErrorMoreInfo: TMemoField; ClientsTableID: TWideStringField; ClientsTableAnrede: TWideStringField; ClientsTableName: TWideStringField; ClientsTableStreet: TWideStringField; ClientsTablePLZ: TWideStringField; ClientsTableCity: TWideStringField; ClientsTableHomePhone: TWideStringField; ClientsTableMobilePhone: TWideStringField; ClientsTableField3: TWideStringField; ClientsTableField4: TWideStringField; UsersTable: TADOTable; UsersTableID: TAutoIncField; UsersTableUser: TWideStringField; ClientsDS: TDataSource; InstructionsDS: TDataSource; UsersDS: TDataSource; ClientsQuery: TADOQuery; InstrucionsQuery: TADOQuery; UsersQuery: TADOQuery; private { Private declarations } public { Public declarations } function SyncDatabase: Boolean; end; var Data: TData; ARDFile: file of TARDRecord; ARDRecord: TARDRecord; RecordCount: Integer = 0; function TData.SyncDatabase: Boolean; var Fp: String; f: File of Byte; DataArray: Array[1..20] of string; begin Fp := 'C:\Dokumente und Einstellungen\Herr Boo\Desktop\evilbird\KUNDEN.ARD'; //Ini.ReadString('Settings', 'SyncFilePath', ''); AssignFile(ARDFile, Fp); Reset(ARDFile); ClientsQuery.SQL.Clear; ClientsQuery.SQL.Add('DELETE * FROM Clients'); ClientsQuery.ExecSQL; while not Eof(ARDFile) do begin Read(ARDFile, ARDRecord); ClientsQuery.SQL.Clear; ClientsQuery.SQL.Add('INSERT INTO clients (ID, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4)'); ClientsQuery.SQL.Add('VALUES (:var1, :var2, :var3, :var4, :var5, :var6, :var7, :var8, :var9, :var10)'); DataArray[1] := ARDRecord.ID; DataArray[2] := ARDRecord.Anrede; DataArray[3] := ARDRecord.Name; DataArray[4] := ARDRecord.Strasse; DataArray[5] := ARDRecord.PLZ; DataArray[6] := ARDRecord.Ort; DataArray[7] := ARDRecord.Tel; DataArray[8] := ARDRecord.Mobil; DataArray[9] := ARDRecord.Feld3; DataArray[10] := ARDRecord.Feld4; ClientsQuery.Parameters.ParamByName('var1').Value := DataArray[1]; ClientsQuery.Parameters.ParamByName('var2').Value := DataArray[2]; ClientsQuery.Parameters.ParamByName('var3').Value := DataArray[3]; ClientsQuery.Parameters.ParamByName('var4').Value := DataArray[4]; ClientsQuery.Parameters.ParamByName('var5').Value := DataArray[5]; ClientsQuery.Parameters.ParamByName('var6').Value := DataArray[6]; ClientsQuery.Parameters.ParamByName('var7').Value := DataArray[7]; ClientsQuery.Parameters.ParamByName('var8').Value := DataArray[8]; ClientsQuery.Parameters.ParamByName('var9').Value := DataArray[9]; ClientsQuery.Parameters.ParamByName('var10').Value := DataArray[10]; ClientsQuery.ExecSQL; Inc(Recordcount); end; CloseFile(ARDFile); end; Ich danke euch fürs lesen und noch vielmehr für ideen, anregungen, vorschläge, oder gar hinweise... codein ;) |
Re: Datensatz über Record -> in Access über SQL, Fehler?
Hallo,
sieh Dir mal die Definition der Relation CLIENTS an. Der Fehler könnte daran liegen, dass mindestens eines der String-Felder in Clients auf eine zu kleine Maximallänge begrenzt ist, um den entsprechenden Wert aus diesem ARD-Record aufzunehmen. Das ganze funktioniert halt nur so lange, wie die Strings aus der Quelldatei nicht zu lang sind. Hilft das weiter? |
Re: Datensatz über Record -> in Access über SQL, Fehler?
aber das is ja das problem: kein feld des Records is länger als 102 Zeichen. und die Datenbank is dach diesem Muster (nach dem Muster der Längen der Felder des Records) erstellt. Das bedeutet, das es nicht möglich ist, das ein Feld zu klein für den Inhalt des Records ist.
Aber könnte es sein, das der Record nicht neu beschrieben wird, sondern die nächste Zeichenkette dran gehängt wird?? Ich hab die Idee gehabt, weil wenn das Programm abstürtz kann man bei Delphi2005 einsehen was in den Variablen gespeichert is. In der ARDRecord sind die Daten ja Array-Mäßig gespeichert. ARDRecord.ID besteht aus (#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0) nichts... ?!? Warum.. An der Stelle Sollten diese 13 Plätze die Zahlen für die KundenNummern speichern. Ich kann das nicht verstehen.... Buitte helft mir. Ich muss das unbedingt bald fdertig haben... :( Ich könnte echt heulen.... Ich hab hier noch die Erstellung der Datenbank zur Laufzeit... Für die die wissen möchten, wie die Access-DB aussieht...
Delphi-Quellcode:
Gibt es eigendlich möglichkeiten, das anders zu implementieren?? Weil ADOX is unter Delphi 2005 nich verfügbar.. oder ich finde es einfach nicht. Kennt jemand Möglicherweise einen anderen Weg eine Access Datenbank zur Laufzeit zu erstellen?
function TEDM.SetupDB(Database: String): Boolean;
var ADOXCatalog: _Catalog; ADOXTable: _Table; ADOXColumn: _ColumnDisp; ColName: OLEVariant; DSN: String; begin DSN := Format('%s%s',[cCONNECTSTRING, Database]); ADOXCatalog := CoCatalog.Create; ADOXCatalog.Create(DSN); // Clients ADOXTable := CoTable.Create; ADOXTable.ParentCatalog := ADOXCatalog; ADOXTable.Name := 'Clients'; ColName:='ID'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'ClientNumber'; ColName:='Anrede'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Gender'; ColName:='Name'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Name'; ColName:='Street'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Street'; ColName:='PLZ'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Nullable'].Value := True; ADOXColumn.Properties['Description'].Value := 'PLZ'; ColName:='City'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'City'; ColName:='HomePhone'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'PhoneNumber at Home'; ADOXColumn.Properties['Jet OLEDB:Allow Zero Length'].Value := True; ADOXColumn.Properties['Default'].Value := '(unknown)'; ColName:='MobilePhone'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'PhoneNumber at Mobile'; ADOXColumn.Properties['Jet OLEDB:Allow Zero Length'].Value := True; ADOXColumn.Properties['Default'].Value := '(unknown)'; ColName:='Field3'; ADOXTable.Columns.Append(ColName, adVarWChar, 75); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Addon3'; ColName:='Field4'; ADOXTable.Columns.Append(ColName, adVarWChar, 75); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Addon4'; ADOXCatalog.Tables.Append(ADOXTable); // Instrunctions ADOXTable := CoTable.Create; ADOXTable.ParentCatalog := ADOXCatalog; ADOXTable.Name := 'Instructions'; ColName := 'ID'; ADOXTable.Columns.Append(ColName, adInteger, 10); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['AutoIncrement'].Value := True; ADOXColumn.Properties['Description'].Value := 'Id of Dataset'; ADOXTable.Keys.Append('ID', adKeyPrimary, ColName, '', ''); ColName:='CID'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'ClientNumber'; ColName:='State'; ADOXTable.Columns.Append(ColName, adInteger, 1); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Nullable'].Value := True; ADOXColumn.Properties['Description'].Value := 'Status'; ColName:='User'; ADOXTable.Columns.Append(ColName, adInteger, 1); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'User'; ColName:='Date'; ADOXTable.Columns.Append(ColName, adVarWChar, 100); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Date and Time'; ColName:='Hardeware'; ADOXTable.Columns.Append(ColName, adVarWChar, 150); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Hardeware'; ColName:='Manufactor'; ADOXTable.Columns.Append(ColName, adVarWChar, 100); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Manufactor'; ColName:='SN'; ADOXTable.Columns.Append(ColName, adVarWChar, 100); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'SerialNumber'; ColName:='Specification'; ADOXTable.Columns.Append(ColName, adVarWChar, 100); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Specification'; ColName:='Own'; ADOXTable.Columns.Append(ColName, adInteger, 1); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Nullable'].Value := True; ADOXColumn.Properties['Description'].Value := 'Own Hardware'; ColName:='MoreInformation'; ADOXTable.Columns.Append(ColName, adLongVarWChar, 1000); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'More Informations'; ColName:='ErrorActions'; ADOXTable.Columns.Append(ColName, adVarWChar, 50); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Action of Error'; ColName:='ErrorTime'; ADOXTable.Columns.Append(ColName, adVarWChar, 150); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Time of Error'; ColName:='ErrorMoreInfo'; ADOXTable.Columns.Append(ColName, adLongVarWChar, 2000); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Info of Error'; ADOXCatalog.Tables.Append(ADOXTable); // Users ADOXTable := CoTable.Create; ADOXTable.ParentCatalog := ADOXCatalog; ADOXTable.Name := 'Users'; ColName := 'ID'; ADOXTable.Columns.Append(ColName, adInteger, 6); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['AutoIncrement'].Value := True; ADOXColumn.Properties['Description'].Value := 'Id of User'; ADOXTable.Keys.Append('ID', adKeyPrimary, ColName, '', ''); ColName:='User'; ADOXTable.Columns.Append(ColName, adVarWChar, 30); ADOXColumn := ADOXTable.Columns.Item[ColName] as _ColumnDisp; ADOXColumn.Properties['Description'].Value := 'Name of User'; ADOXCatalog.Tables.Append(ADOXTable); SetupDB := true; end; Danke, Codein |
Re: Datensatz über Record -> in Access über SQL, Fehler?
hat echt keiner eine ahnung, woran es liegen könnte??
|
Re: Datensatz über Record -> in Access über SQL, Fehler?
Halle an alle...
Ich weiss nich woran es liegt, möglicherweise kann mich hier keiner leiden, oder ihr habt alle was zu tun, oder es möchte einfach keiner helfen, aber ich sehe mich diesem Problem hilflos ausgeliefert. Ich finde den Fehler einfach nicht. Kann nicht bitte jemand mit mal helfen. Ich schaff das nicht und ich muss das fertig bekomm, sonst kann ich mir gleich nen strick nehmen.. :cry: Bitte, wer kurz zeit hat, ich möchte nur wissen, ob ihr den gleichen fehler bei euch zu hause bekommt. Ich bin mir nämlich sicher, das dieser quelltext in Delphi 7 funktioniert hat. Ich schreibe das hier nicht aus spass, sondern, weil ich wirklich am verzweifeln bin. Bitte helft mir... bitte codein |
Re: Datensatz über Record -> in Access über SQL, Fehler?
Zitat:
Also: SQL-Anweisung sollten ausserhalb einer Schleife zusammengebaut werden.
Delphi-Quellcode:
ClientsQuery.SQL.Clear;
ClientsQuery.SQL.Add('INSERT INTO clients (ID, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4)'); ClientsQuery.SQL.Add('VALUES (:var1, :var2, :var3, :var4, :var5, :var6, :var7, :var8, :var9, :var10)'); while not Eof(ARDFile) do begin Read(ARDFile, ARDRecord); ....... ClientsQuery.ExecSQL; // IN der Schleife nur noch benutzen ... end; |
Re: Datensatz über Record -> in Access über SQL, Fehler?
ich hab jetzt den quelltext wie folgt umgeändert:
Delphi-Quellcode:
Die Fehlermeldung bleibt jedoch die gleiche :cry: ... kann nich jemand mal mit Delphi 7 ausprobieren, ob da der gleiche Fehler auftritt? Bitte..
function TMain.SyncDatabase: Boolean;
var Fp: String; f: File of Byte; begin SyncDatabase := TRUE; Fp := 'C:\Dokumente und Einstellungen\Tilo\Desktop\micha\ServiceReport\Kunden.ard'; AssignFile(ARDFile, Fp); Reset(ARDFile); ClientsQuery.SQL.Clear; ClientsQuery.SQL.Add('DELETE * FROM Clients'); ClientsQuery.ExecSQL; ClientsQuery.SQL.Clear; ClientsQuery.SQL.Add('INSERT INTO clients (ID, Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4)'); ClientsQuery.SQL.Add('VALUES (:var1, :var2, :var3, :var4, :var5, :var6, :var7, :var8, :var9, :var10)'); while not Eof(ARDFile) do begin Read(ARDFile, ARDRecord); Data.cnumber := ARDRecord.cnumber; Data.cpre := ARDRecord.cpre; Data.cname := ARDRecord.cname; Data.cstreet := ARDRecord.cstreet; Data.cplz := ARDRecord.cplz; Data.ccity := ARDRecord.ccity; Data.ctel := ARDRecord.ctel; Data.cmobil := ARDRecord.cmobile; Data.cfield3 := ARDRecord.cfield3; Data.cfield4 := ARDRecord.cfield4; ClientsQuery.Parameters.ParamByName('var1').Value := Data.cnumber; ClientsQuery.Parameters.ParamByName('var2').Value := Data.cpre; ClientsQuery.Parameters.ParamByName('var3').Value := Data.cname; ClientsQuery.Parameters.ParamByName('var4').Value := Data.cstreet; ClientsQuery.Parameters.ParamByName('var5').Value := Data.cplz; ClientsQuery.Parameters.ParamByName('var6').Value := Data.ccity; ClientsQuery.Parameters.ParamByName('var7').Value := Data.ctel; ClientsQuery.Parameters.ParamByName('var8').Value := Data.cmobil; ClientsQuery.Parameters.ParamByName('var9').Value := Data.cfield3; ClientsQuery.Parameters.ParamByName('var10').Value := Data.cfield4; // Inc(Recordcount); ProgressBar.Position := Recordcount * 100 div FileSize(ARDFile); ProgressBar.Update; ClientsQuery.ExecSQL; end; CloseFile(ARDFile); ProgressBar.Position := 0; end; Codein |
Re: Datensatz über Record -> in Access über SQL, Fehler?
Zitat:
Irgend einer deiner 10 Parameter wird wohl zu lang sein. Du solltest alle Leerzeichen aus deinen Eingangsdaten mit Trim wegschneiden:
Delphi-Quellcode:
Wenn alle Stricke reisen, dann gibt es noch die Möglichkeit anstelle von INSERT eine SELECT-Anweisung zu verwenden:
ClientsQuery.Parameters.ParamValues['var1'] := Trim(DataArray[1]);
Delphi-Quellcode:
Diese Vorgehensweise ist zwar langsamer, dafür sorgen aber die TField-Komponenten im Hintergrund dafür, dass die String-Felder nicht "überfüllt" werden können.
ClientsQuery.SQL.Text := 'SELECT [ID], Anrede, Name, Street, PLZ, City, HomePhone, MobilePhone, Field3, Field4 FROM clients WHERE 0=1';
// das Feld ID könnte ein reserviertes Wort sein, deshalb in eckige [] ClientsQuery.Open; ... // später in der Schleife ClientsQuery.Append; ClientsQuery['ID'] := Trim(DataArray[1]); ClientsQuery['Anrede'] := Trim(DataArray[2]); ... ClientsQuery.Post; |
Re: Datensatz über Record -> in Access über SQL, Fehler?
danke. Ich habs jetzt hinbekommen...
Die Prozedur funtioniert jetzt mit der Select-Anweisung. Das ist aber net so schlimm, das es länger dauert, weil der Kundenstamm eh nur dann updegatet wird, wenn es nötig ist... :wink: ich danke dir.. Du hast mir echt ein schönes Weihnachtsgeschenk bereitet... Ich muss jetzt nur noch rausfinden, warum es unter delphi 2005 kein ADOX gibt... bzw. warum ich es nich finden kann. codein |
Re: Datensatz über Record -> in Access über SQL, Fehler?
ADOX mußt du dir schon selbst importieren. Bei Delphi 7 wie ich es auf meiner
![]() Grüße Mikhal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
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 by Thomas Breitkreuz