AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [Bibliothek] Barcode für Delphi (Zint)

[Bibliothek] Barcode für Delphi (Zint)

Ein Thema von chaosben · begonnen am 27. Nov 2009 · letzter Beitrag vom 24. Okt 2020
Antwort Antwort
HighBaer

Registriert seit: 11. Aug 2008
Ort: Köln
8 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 23. Okt 2013, 11:07
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:
    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
da "primary" 0-indexiert ist, müsste es aber wie folgt lauten:
Delphi-Quellcode:
    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
fast direkt dahinter:

Delphi-Quellcode:
    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;
Die for-Schleife müßte entsprechen ebenfalls wie folgt lauten:
      for i := 0 to 9 do 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.

Meiner Ansicht nach müßte es wie folgt lauten:
Delphi-Quellcode:
    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;
Bin auch der Meinung, dass es ebenfalls einen Fehler in Funktion "maxi_do_primary_3" gibt, der aber nicht so dramatisch ist:

Delphi-Quellcode:
  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;
In dem Zusammenhang ist mir aufgefallen, dass man bei "ZintTest.exe" nirgends den Wert von Primary eingeben kann (oder ich hab's nicht gefunden )
  Mit Zitat antworten Zitat
HighBaer

Registriert seit: 11. Aug 2008
Ort: Köln
8 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 23. Okt 2013, 11:34
Nachtrag zu meiner letzten Antwort:

In "zint_maxicode.pas" in Funktion "maxicode":

Delphi-Quellcode:
    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;
Da habe ich es jetzt selber nicht ganz richtig gemacht und auch noch einen Fehler eingebaut

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:
    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;
Sorry für das Chaos!
  Mit Zitat antworten Zitat
Carsten2

Registriert seit: 14. Jun 2010
22 Beiträge
 
Delphi 4 Standard
 
#3

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 23. Okt 2013, 21:54
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
  Mit Zitat antworten Zitat
Carsten2

Registriert seit: 14. Jun 2010
22 Beiträge
 
Delphi 4 Standard
 
#4

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 25. Okt 2013, 14:00
ja gefunden - den Fehler in code32

unit zint_medical;
in { Italian Pharmacode }
function code32

Code:
 { Look up values in 'Tabella di conversione' }
  //SetLength(tabella, 32);//Alt
  SetLength(tabella, 33);//Neu
  Mit Zitat antworten Zitat
Carsten2

Registriert seit: 14. Jun 2010
22 Beiträge
 
Delphi 4 Standard
 
#5

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 28. Okt 2013, 15:33
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"
  Mit Zitat antworten Zitat
Carsten2

Registriert seit: 14. Jun 2010
22 Beiträge
 
Delphi 4 Standard
 
#6

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 28. Okt 2013, 18:17
Fehler gefunden:
EAN-14 und NVE-18:

in ean_14 und nve_18 in der Unit zint_code128.pas

in function nve_18
Code:
    //if((i and 1) <> 0) then //Alt
    if((i and 1) = 0) then //Neu
      Inc(total_sum, 2 * StrToInt(Chr(source[i])));
in function ean_14
Code:
    //if ((i and 1) <> 0) then //Alt
    if ((i and 1) = 0) then //Neu
      Inc(count, 2 * StrToInt(Chr(source[i])));
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

AW: [Bibliothek] Barcode für Delphi (Zint)

  Alt 29. Okt 2013, 09:37
Vielen Dank (mal wieder) für die gute Zuarbeit!
Die gefixte Version ist im SVN.

Noch ein paar Kommentare:
  • Fehler in aztec_text_process: Ja, der Index müsste der Bösewicht gewesen sein.
  • Fehler in maxicode: Ja, da waren die Indices falsch. Für Mode 3 muss man die ersten Zeichen selbst mit Leerzeichen auf 9 Stellen auffüllen. Und die Zuweisung der Arrays war wirklich blöd.
  • Fehler in code32: Wird jetzt (wie im C-Code) auf die Länge 34 gesetzt.
  • Checksumme in EAN14/NVE18: Die alte Variante (über zint.dll) beinhaltet noch den Original-Bug. Die zint.pas sollte es ganz richtig machen.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 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-2025 by Thomas Breitkreuz