Einzelnen Beitrag anzeigen

HighBaer

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

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