AW: [Bibliothek] Barcode für Delphi (Zint)
@matashen
Du darfst nich Colorbox1.Color nehmen sondern Colorbox1.Selected. Dann geht's Gruß... 0815achim Hoppla! Sehe gerade das es in der Demo von Marco bereits richtig drin steht. |
AW: [Bibliothek] Barcode für Delphi (Zint)
Ach ja, danke.
Ab und zu steht man einfach sowas von daneben |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler, die ich gefunden habe:
zint.pas in function hibc:
Code:
in function ZBarcode_Encode:
//for i := 1 to _length do
for i := 0 to _length-1 do //geändert Inc(counter, posn(TECHNETIUM, source[i])) ;
Code:
zint_aztec.pas
if (symbol.input_mode = GS1_MODE) then
begin //for i := 1 to _length do for i := 0 to _length-1 do //geändert begin in function aztec_runes:
Code:
//strcpy(binary_string, '');
for i := 0 to 28-1 do binary_string[i]:=#0;//geändert
Code:
wer veröffentlicht weitere? Danke!
if (ecc_codewords[4 - i] and v) <> 0 then binary_string[j] := '1' else
//binary_string[j + 1] := '0'; binary_string[j] := '0';//geändert |
AW: [Bibliothek] Barcode für Delphi (Zint)
Zunächst an Chaosben an den anderen des Teams: Klasse Arbeit! :thumb:
Mir ist da auch ein kleiner Fehler in Micro-QR aufgefallen: Bei Auswahl der "Version 4" kommt es zu einer Zugriffsverletzung. Ich denke der Fehler liegt daran, dass bei der Umwandlung von "TmqVersion" zu Option_2 Version 1 den Wert 1 hat usw. intern wird aber mit den Werten 0 bis 3 gearbeitet. Wert 4 führt daher zu dem Fehler, ich vermute daher auch, dass bei Auswahl von "Version 2" in Wirklichkeit Version 3 angezeigt wird. Der Fehler ist meine Meinung nach in "zint_qr.pas" in Funktion "microqr" (Zeile 2451):
Delphi-Quellcode:
// Get version from user if((symbol.option_2 >= 1) and (symbol.option_2 <= 4)) then begin if(symbol.option_2 >= autoversion) then //version := symbol.option_2; Originalzeile version := symbol.option_2 - 1; // geändert end; In der gleichen Funktion vorher in Zeile 2405 ist vermutlich auch was falsch, was aber nicht so gravierend ist:
Delphi-Quellcode:
Sollte der 2. Vergleich nicht "symbol.option_1 <= 4" lauten, macht in meinen Augen mehr Sinn.
// Eliminate possible versions depending on error correction level specified
ecc_level := LEVEL_L; if((symbol.option_1 >= 1) and (symbol.option_2 <= 4)) then ecc_level := symbol.option_1; Ich hoffe, ich habe Euch damit weitergeholfen ... |
AW: [Bibliothek] Barcode für Delphi (Zint)
für MICRO QR gibt es meiner Meinung nach keine Feherkorr. HIGH.
mqv4 ist so also obsolet.
Code:
// Get version from user
if((symbol.option_2 >= 1) and (symbol.option_2 <= 3)) then // geänderet
Code:
Ja Chaosben, vielen Dank für die Arbeit!:thumb:
// Eliminate possible versions depending on error correction level specified
ecc_level := LEVEL_L; if((symbol.option_1>=1)and(symbol.option_1<=3))then ecc_level:=symbol.option_1;// geänderet |
AW: [Bibliothek] Barcode für Delphi (Zint)
Wird der Code wirklich gezeichnet?
Falls ja, dann bin ich gespannt wie das auf kleinen Etiketten ausschaut und gelesen werden kann. Unsere Erfahrung auf z.b Zebra GK420&Co das es nicht funktioniert. Bei einer Etikettengröße von z.b 30x25mm nicht oder nur sehr schlecht lesbar. Meisten Handscanner schmeißen das Handtuch ( wenn nicht vorher der Kassierer den Scanner geworfen hat :lol: ). Wir sind daher auf Schriftarten umgestiegen und haben die jeweiligen Algorithmen einprogrammiert. Ich lasse mich aber gern eines bessere belehren. Die Schriftartenlogik beherbergt auch so ihre Probleme. LG Sven |
AW: [Bibliothek] Barcode für Delphi (Zint)
weiterer Fehler
ZINT_QR.PAS in function evaluate
Code:
// Test 4: Proportion of dark modules in entire symbol
dark_mods := 0; for x := 0 to size - 1 do begin //for y := 0 to size do begin // geändert for y := 0 to size - 1 do begin // geändert |
AW: [Bibliothek] Barcode für Delphi (Zint)
Hallo zusammen,
Und vielen Dank für die Fehlersuche. Ich werde mir das am Montag mal anschauen. Es wäre in der Zwischenzeit schön, wenn ihr die Fehlermeldung Bugtracker bei Google Code Posten könntet. Unserer Ansicht nach ist das der richtige Ort dafür. Ausserdem können wir dort gezielt auf jeden Fehler eingehen. Schönes Wochenende Von Marco |
AW: [Bibliothek] Barcode für Delphi (Zint)
Danke für die Lobe und die Fehler! :)
Ausnahmsweise machen wir das heute mal kurz und unbürokratisch. Die Bugs sind in der aktuellen Revision gefixt. Alles was ihr noch so findet, könnt ihr dann bitte hier posten. Und nächste Woche sitzt dann Marco an der Hotline und ich mache Urlaub. :-D |
AW: [Bibliothek] Barcode für Delphi (Zint)
Liebe Leut'
ich bin nicht bei Google und will es auch nicht sein.:thumb: Ich verstehe leider nicht, warum hier nicht der richtige Ort sein soll, um auf Fehler im Quellcode hinzuweisen. Gibt es eine andere (Google-)freie Möglichkeit?:coder: |
AW: [Bibliothek] Barcode für Delphi (Zint)
Nagut ... alle, die eine akute Google-Allergie haben, können auch in diesem Thread posten.
|
AW: [Bibliothek] Barcode für Delphi (Zint)
Google Code hat wahrscheinlich genauso viele Lorbeeren verspielt wie Sourceforge. Viele sind deshalb zu Github abgewandert. Mir ist das aber weitgehend Jacke wie Hose, ich bleibe wohl bei SF, nach kleineren Ausflügen zu GC mit mäßigen Ergebnissen.
Insofern ist es nicht schlecht, wenn man auch hier Feedback geben kann. Aus Sicht der Maintainer wäre es bei GC aber sicher einfacher. |
AW: [Bibliothek] Barcode für Delphi (Zint)
Danke:thumb:
in unit zint_render_canvas; ClearBackground mit Rectangle und Pen verursacht verschobenen Hintergrund... (besonders bei kleiner Module-Grösse wie 1 auf TMetafilecanvas sichtbar) Besser wie in DrawRect FillRect benutzen:
Code:
procedure TZintRenderTargetCanvas.ClearBackground(
const AParams: TZintClearBackgroundParams); begin FCanvas.Brush.Color:=FBGColor; FCanvas.Brush.Style:=bsSolid; //Canvas.Pen.Style:=psSolid; //geändert //FCanvas.Pen.Color:=FBGColor; //geändert //FCanvas.Rectangle(Round(AParams.X), //geändert FCanvas.FillRect(Rect(Round(AParams.X), //geändert Round(AParams.Y), Round(AParams.X + AParams.Width), Round(AParams.Y + AParams.Height) )//geändert ); |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler
in unit zint_gs1 in function ugs1_verify: "reduced" in ustrcpy benötigt Länge von "temp"...
Code:
if (strlen(temp) < src_len + 5) then
begin SetLength(reduced, src_len + 5); //hinzugefügt ustrcpy(reduced, ArrayOfCharToArrayOfByte(temp)); Result := 0; exit; end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Danke!
Ist nun gefixt. Der Fehler lag sogar noch höher. :) |
AW: [Bibliothek] Barcode für Delphi (Zint)
Danke zurück!:)
Aztec mit GS-1 funktioniert nicht richtig. Fehler nicht gefunden! in Function aztec_text_process: Es fiel mir auf: 2 While-Schleifen in Repeat-Until geändert. z.B.: "while (i < (maplength - 1) do begin" ist aber etwas anderes als "until not (i < (map_length - 1));" Warum "if (gs1 <> 0) and (i = 1) then" statt "if(gs1 && (i == 0)) { " wie in aztec.c Das alles verursacht aber nicht den Fehler: in bctester_de.exe ergibt "[28] 1234567" mit zint.pas "2#8 1234567" mit zint.dll "]z128 1234567" "]z1" ist wohl richtig, da es FNC1 ist. Wer hat da eine Idee? |
AW: [Bibliothek] Barcode für Delphi (Zint)
Hallo Leute,
ich bin mir nicht sicher, aber ich denke in "zint_maxicode.pas" sind noch ein paar Fehler drin. Zuvor aber eine kurze Erläuterung über Maxicode Mode2 und Mode3, für die, die sich da nicht so auskennen. Wenn ich es richtig verstanden habe, sind bei Mode2 und Mode3 in Primary u.a. die Postleitzahl kodiert: Primary hat eine feste Länge von 15 Zeichen: Mode2: 9 Ziffern (Postcode) + 3 Ziffern (Ländernummer) + 3 Ziffern (Class of Service) Mode3: 6 Alphanumerische Zeichen (Postcode) + 3 Leerstellen(?*) + 3 Ziffern (Ländernummer) + 3 Ziffern (Class of Service) ?* = Bin mir nicht sicher, da ich nirgends gefunden habe, dass die "Lücke" mit Leerstellen aufgefüllt werden müssen oder bei Mode3 die Ländernnummer und Class of Service sich direkt hinter dem Postcode stehen. Die Routine geht aber davon aus, dass der Ländercode immer an den Stellen 10 bis 12 steht. Nun zu den vermutlichen Fehlern: In der Funktion "maxicode":
Delphi-Quellcode:
da "primary" 0-indexiert ist, müsste es aber wie folgt lauten:
for i := 10 to 14 do
begin { check that country code and service are numeric } if ((symbol.primary[i] < '0') or (symbol.primary[i] > '9')) then begin
Delphi-Quellcode:
fast direkt dahinter:
for i := 9 to 14 do // geändert
begin { check that country code and service are numeric } if ((symbol.primary[i] < '0') or (symbol.primary[i] > '9')) then begin
Delphi-Quellcode:
Die for-Schleife müßte entsprechen ebenfalls wie folgt lauten:
postcode := symbol.primary;
if (mode = 2) then begin for i := 1 to 10 do if (postcode[i] = ' ') then postcode[i] := #0; end else if (mode = 3) then postcode[7] := #0;
Delphi-Quellcode:
Wenn aber ein 9-stelliger Postcode angegeben ist, dann gibt es keine Leerstelle in der Variablen "postcode" und da nicht nur die ersten 9 Stellen von "primary" nach "postcode" kopiert wurden, sondern der komplette Inhalt von "postcode" stehen da nun 15 Ziffer hintereinander, was falsch ist.
for i := 0 to 9 do
Meiner Ansicht nach müßte es wie folgt lauten:
Delphi-Quellcode:
Bin auch der Meinung, dass es ebenfalls einen Fehler in Funktion "maxi_do_primary_3" gibt, der aber nicht so dramatisch ist:
if (mode = 2) then
begin for i := 0 to 9 do // geändert if (postcode[i] = ' ') then postcode[i] := #0; postcode[10] := #0; // neu end else if (mode = 3) then postcode[7] := #0;
Delphi-Quellcode:
In dem Zusammenhang ist mir aufgefallen, dass man bei "ZintTest.exe" nirgends den Wert von Primary eingeben kann (oder ich hab's nicht gefunden :?:)
h := ustrlen(postcode);
to_upper(postcode); // for i := 1 to h do falsch? for i := 0 to h-1 do // oder ? begin if ((Chr(postcode[i]) >= 'A') and (Chr(postcode[i]) <= 'Z')) then { (Capital) letters shifted to Code Set A values } Dec(postcode[i], 64); if (postcode[i] = 27) or (postcode[i] = 31) or (postcode[i] = 33) or (postcode[i] >= 59) then { Not a valid postcode character } postcode[i] := 32; { Input characters lower than 27 (NUL - SUB) in postcode are interpreted as capital letters in Code Set A (e.g. LF becomes 'J') } end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Nachtrag zu meiner letzten Antwort:
In "zint_maxicode.pas" in Funktion "maxicode":
Delphi-Quellcode:
Da habe ich es jetzt selber nicht ganz richtig gemacht und auch noch einen Fehler eingebaut :oops:
postcode := symbol.primary;
if (mode = 2) then begin for i := 0 to 9 do // geändert if (postcode[i] = ' ') then postcode[i] := #0; postcode[10] := #0; // neu end else if (mode = 3) then postcode[7] := #0; countrystr[0] := symbol.primary[9]; countrystr[1] := symbol.primary[10]; countrystr[2] := symbol.primary[11]; countrystr[3] := #0; servicestr[0] := symbol.primary[12]; servicestr[1] := symbol.primary[13]; servicestr[2] := symbol.primary[14]; servicestr[3] := #0; Die for-Schleife muss natürlich "for i := 0 to 8" und die Zuweisung "postcode[9] := #0;" lauten. Da "postcode" und "symbol.primary" beides dynamische Arrays sind, zeigen nach der Zuweisung "postcode := symbol.primary;" beide Variablen auf den gleichen Speicher. Daher überschreibt die Anweisung "postcode[9] := #0;" implizit den den Wert "symbol.primary[9]" und macht dadurch "countrystr[0]" falsch. Also muss entwender die Zuweisung "postcode := symbol.primary;" richtig "postcode := copy(symbol.primary);" lauten oder der Code muss umgestellt werden. Jetzt hoffentlich richtig:
Delphi-Quellcode:
Sorry für das Chaos! :wink:
postcode := copy(symbol.primary);
if (mode = 2) then begin for i := 0 to 8 do // geändert if (postcode[i] = ' ') then postcode[i] := #0; postcode[9] := #0; // neu end else if (mode = 3) then postcode[7] := #0; countrystr[0] := symbol.primary[9]; countrystr[1] := symbol.primary[10]; countrystr[2] := symbol.primary[11]; countrystr[3] := #0; servicestr[0] := symbol.primary[12]; servicestr[1] := symbol.primary[13]; servicestr[2] := symbol.primary[14]; servicestr[3] := #0; |
AW: [Bibliothek] Barcode für Delphi (Zint)
ja genau!
in function maxicode
Code:
//postcode := symbol.primary;//geändert
for i := 0 to 8 do postcode[i] := symbol.primary[i];/geändert postcode[9] := #0;//geändert |
AW: [Bibliothek] Barcode für Delphi (Zint)
ja gefunden:!: - den Fehler in code32 :-D
unit zint_medical; in { Italian Pharmacode } function code32
Code:
{ Look up values in 'Tabella di conversione' }
//SetLength(tabella, 32);//Alt SetLength(tabella, 33);//Neu |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler nicht gefunden::(
EAN-14 und NVE-18: mit "1234567" Unterschied mit zint.pas und zint.dll mit "1234568" ist das Ergebnis jedoch gleich. Liegt wohl an check_digit bzw. nve_check im den Funktionen ean_14 bzw. nve_18 in der Unit zint_code128.pas Hat einer eine Idee:?: In Maxicode Mode 3 gibt es auch den Unterschied mit zint.pas und zint.dll: z.B. Data "123456" und Primary "123456000123123":!: |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler gefunden::):)
EAN-14 und NVE-18: in ean_14 und nve_18 in der Unit zint_code128.pas in function nve_18
Code:
in function ean_14
//if((i and 1) <> 0) then //Alt
if((i and 1) = 0) then //Neu Inc(total_sum, 2 * StrToInt(Chr(source[i])));
Code:
:lol:
//if ((i and 1) <> 0) then //Alt
if ((i and 1) = 0) then //Neu Inc(count, 2 * StrToInt(Chr(source[i]))); |
AW: [Bibliothek] Barcode für Delphi (Zint)
Vielen Dank (mal wieder) für die gute Zuarbeit!
Die gefixte Version ist im SVN. Noch ein paar Kommentare:
|
AW: [Bibliothek] Barcode für Delphi (Zint)
Vielen Dank!
gerade zeigt der Zeiger erneut ins Leere::( tritt in Composite EAN Linear mit Primary-Länge kleiner 12 auf: unit zint_composite; { CC-A 2D component } function cc_a(
Code:
da cc_width > 3 sein kann und da macht es hier bum:
//dummy : array[0..4] of Integer;//Alt
dummy : array[0..5] of Integer;//Neu
Code:
keine gute Fehlerbehebung :(
for j := 0 to 4 do //Alt
if cc_width > 4 then cc_width := 4; //Neu for j := 0 to 5 do //Neu dummy[j] := 0; for j := 0 to cc_width - 1 do dummy[j + 1] := codeWords[i * cc_width + j]; Kann man mit Error wohl besser abfangen...:?: |
AW: [Bibliothek] Barcode für Delphi (Zint)
Das kann ich grad nicht nachvollziehen.
Wenn cc_width gleich 4 ist, dann läuft die Schleife (j) bis 3 (cc_width - 1) und schreibt maximal an die Stelle 4 (j + 1). Das ist sollte das dummy-array aber vertragen. Kannst du mal bitte die Daten (Primary und Daten) posten, mit denen der Fehler auftritt? |
AW: [Bibliothek] Barcode für Delphi (Zint)
ja stimmt.
aber cc_width kann grösser 4 sein. zB. bei Data: "[78] 1234" Primary: "12345678905" Vielleicht gibt es die Werte nicht, aber ich möchte bei falschen Werten den "Absturz" verhindern. Zint Barcode Studio 2.4 verabschiedet sich bei diesen Werten ganz.:( So mogel' ich simpler ;-)
Code:
Der Fehler liegt vorher - ein cc_width grösser 4.
if cc_width > 4 then cc_width := 4; //Neu
Nützt alles nichts. Die Werte lassen bei Mode CC-B das Programm in die Knie gehen. Und zwar diesmal hier: function cc_b:
Code:
for j := 0 to symbol.option_2 - 1 do
dummy[j + 1] := chainemc[i * symbol.option_2 + j]; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler/Absturz abgefangen::)
function composite:
Code:
case symbol.symbology of
{ Determine width of 2D component according to ISO/IEC 24723 Table 1 } BARCODE_EANX_CC: begin case pri_len of 7, { EAN-8 } 10, { EAN-8 + 2 } 13: { EAN-8 + 5 } cc_width := 3; 12, { EAN-13 } 15, { EAN-13 + 2 } 18: { EAN-13 + 5 } cc_width := 4; else //Neu begin //Neu concat(symbol.errtxt, 'Input wrong length in linear component'); //Neu result := ZERROR_INVALID_DATA; exit; //Neu end; //Neu end; end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Sehr gut! Danke für die gute Zuarbeit. :-D
|
AW: [Bibliothek] Barcode für Delphi (Zint)
function maxicode(
postcode[9] := #0; wurde vergessen, sonst gibt's Probleme in maxi_do_primary_2.
Code:
ArrayCopy(postcode, symbol.primary);
postcode[9] := #0;//Neu if (mode = 2) then begin //for i := 0 to 9 do //Neu for i := 0 to 8 do //Neu |
AW: [Bibliothek] Barcode für Delphi (Zint)
Deswegen wurde in maxicode latin1_process nochmals aufgerufen:
function latin1_process
Code:
if (source[i] = $C2) then
begin preprocessed[j] := source[i + 1]; if (preprocessed[j] < 128) then begin //Neu Inc(j); next := i + 2; end; //Neu end; if(source[i] = $C3) then begin preprocessed[j] := source[i + 1] + 64; if (preprocessed[j] < 128) then begin //Neu Inc(j); next := i + 2; end; //Neu end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Danke!
Das mit dem Array_Copy und dem #0 an 9. Stelle habe ich gefixt. Deinen zweiten Vorschlag in der latin1_process verstehe ich nicht. Kannst du mir das ein bisschen erklären? (bin grad schwer von Begriff) |
AW: [Bibliothek] Barcode für Delphi (Zint)
Das Ergebnis von latin1_process soll sein, dass jedes preprocessed[j] kleiner 128 ist!
Ist es aber erst bei zweimaligem Aufruf der Funktion oder eben mit meiner Änderung. Teste es mit einem "ü"! Der veränderte latin1_process meldet den Fehler beim ersten Aufruf. Oh je, ich lese gerade "ü" gehört zu latin-1. Also vergesst meine Änderung! Deswegen exitiert jetzt der Fehler nur in der zint.dll bei Maxicode. |
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler in unit zint_upcean
in function eanx local_source kann länger als 20 sein: So tritt der Zeigerfehler jedenfalls nicht mehr auf!? tritt auf mit BARCODE_EANX_CC Primary "012345678905+123", also falscher Add-on Länge...
Code:
in upcean.c ebenfalls bis <=!?
//SetLength(local_source, 20);//Alt
SetLength(local_source, 41);//Neu //for reader := 0 to ustrlen(local_source) do //Alt // if (source[reader] = Ord('+')) then with_addon := TRUE;//Alt for reader := 0 to ustrlen(local_source) - 1 do //Neu if (local_source[reader] = Ord('+')) then with_addon := TRUE;//Neu in procedure upce noch einen:
Code:
in upcean.c ebenfalls bis <=!?
//for i := 0 to ustrlen(source) do //Alt
for i := 0 to ustrlen(source)-1 do //Neu case Chr(parity[i]) of 'A': lookup(NEON, EANsetA, source[i], dest); 'B': lookup(NEON, EANsetB, source[i], dest); end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Sehr gut! Danke! :)
|
AW: [Bibliothek] Barcode für Delphi (Zint)
Fehler in allen Composite Symbols
in Mode CC B bzw CC C: Der PDF417-Part ist nicht identisch mit dem der Zint.dll im Mode CC A ist alles OK! 2. mehrere Zeigerfehler bei zsRSS_EXPSTACK Data: "[28]1" oder "[28]123456" meine Korrekturen, die Absturz verhindern, aber ein bisschen willkürlich sind: unit zint_rss; function rss_binary_string:
Code:
function rssexpanded:
SetLength(general_field, strlen(source) + 10);//geändert + 10
SetLength(general_field_type, strlen(source) + 10);//geändert + 10 SetLength(padstring, 40 + 10);//geändert + 10
Code:
3. Fehler korrigiert:
SetLength(reduced, src_len + 20);//geändert + 20
SetLength(binary_string, 7 * src_len + 7 * 20);//geändert + 7 * 20 function rss_binary_string:
Code:
4: begin concat(binary_string, '0101'); read_posn := strlen(source); end;
//5: begin concat(binary_string, '0110XX'); read_posn := 20; end;//Alt 5: begin concat(binary_string, '01100XX'); read_posn := 20; end;//Neu 6: begin concat(binary_string, '01101XX'); read_posn := 23; end; |
AW: [Bibliothek] Barcode für Delphi (Zint)
Björk: It's so quiet...
Habe bisher den Fehler in den Composites nicht gefunden! Oder ist da gar keiner mehr? ;-) |
AW: [Bibliothek] Barcode für Delphi (Zint)
Theoretisch sollte es keine Fehler mehr geben. ;)
|
AW: [Bibliothek] Barcode für Delphi (Zint)
Leider gibt es bei mir eine Differenz zwischen Theorie und Praxis ;-)
Alle Composites mit Modus CC-B unterscheiden sich weiterhin von denen mit der Zint.dll. ... und ich weiss nicht warum :-( |
AW: [Bibliothek] Barcode für Delphi (Zint)
Da hat einer aber mal wieder Recht gehabt! ;)
Diese Differenzen sollten jetzt nicht mehr auftreten. |
AW: [Bibliothek] Barcode für Delphi (Zint)
Schön, dass die Differenzen verschwunden sind. ;-)
Der Fehler lag also in der zint_pdf417.pas! Vielen Dank für die neuerliche Verbindung von Theorie und Praxis! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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