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
Seite 11 von 14   « Erste     91011 1213     Letzte » 
Benutzerbild von chaosben
chaosben
Registriert seit: 27. Apr 2005
Geschichte & Hintergrund
Ende 2009 entstand hier und im TUO-Repository die TZintBarcode-Komponente. Das war ein Compilat der Zint-Bibliothek als 32bit-Windows-DLL und die dazu passenden Delphi Wrapper-Klassen und Komponenten.
Zint ist ein C-Projekt von Robin Stuart, einem sehr netten Entwickler aus UK.
Nach einer Weile starb das original Zint-Projekt (und damit auch die Weiterentwicklung unserer Komponente) weil Robin das Projekt nicht mehr unterstützte.
Ende Mai 2012 kam wieder frischer Wind in das Zint-Projekt, auch durch den Fork (was auch gleichzeitig der aktuelle Stand der Dinge ist) von Ismael Luceno auf github.
Da wir externe Abhängigkeiten(in diesem Fall die zint.dll) nicht gern haben, entschieden wir uns (nach Absprache mit Robin), den originalen C-Code nach Pascal zu übersetzen.
Dabei gelten 2 Regeln:
  1. So nah wie möglich am originalen C-Code bleiben, damit Bugfixes und Features möglichst einfach übernommen werden können
  2. So Pascal wie möglich, damit auch die FreePascal-Gemeinde (und damit möglichst viele Plattformen) etwas davon hat.
Und damit sind wir im Heute angekommen. Die Übersetzung ist vollständig erledigt und nun warten wir auf euer Feedback.

Was es ist
Dies ist eine native Pascal-Implementation der Zint-Bibliothek zur Erstellung von verschiedenen 1D- und 2D-Barcodes.

Download
Den Code gibts per SVN.
Lizenz
Apache License 2.0

Was im Moment geht
Zur Zeit sind folgende Codes verfügbar:
  • 2of5Matrix, 2of5Industrial, 2of5Interleaved, 2of5IATA, 2of5Datalogic
  • Deutsche Post Leitcode, Deutsche Post Identcode
  • EAN128, Code128, Code128B, NVE18, ITF14, EAN14
  • Datamatrix
  • Maxicode
  • Code 11, Code 39, Pharmacentral (PZN), Extended Code39, Code93
  • Pharmacode, 2-Track-Pharmacode, Codabar, Code32
  • Australia Post Code, Australia Post Reply Code, Australia Post Route Code, Australia Post Redirect Code
  • Aztec, Azrunes
  • Code16k
  • Code49
  • Composites: EAN128
  • QR-Code, MicroQR-Code
  • Gridmatrix
  • Plessey, MSI-Plessey
  • EAN13, EAN5, EAN2, UPCA, UPCE, ISBN
  • Telepen,
  • [Korea|Dutch|Japan]Post
  • GS1-Databar
Folgende Rendering-Ziele werden im Moment unterstützt:
  • TCanvas (Delphi, FMX, Lazarus)
  • TMetafile (Delphi)
  • TlmfImage (Lazarus)
  • TBitmap (Delphi, FMX, Lazarus)
  • SVG nativ (Delphi, FMX, Lazarus)

Was noch fehlt
  • Firebird-UDF (man darf doch mal träumen, oder?)

Danke für die Mitarbeit (Ideen, Bugs, ...)
Fragen, Anregungen, Issues
Falls ihr dergleichen habt, schreibt sie bitte in den Issue-Tracker oder auch in diesen Thread (falls eine akute Google-Allergie besteht ). In der Regel sollte sich eine Lösung finden lassen.
Wünsche, die in Form einer PayPal-Zahlung ankommen, werden bevorzugt bearbeitet.

Viel Spass!
Angehängte Grafiken
 
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von chaosben ( 9. Feb 2014 um 08:45 Uhr)
 
Carsten2

 
Delphi 4 Standard
 
#101
  Alt 28. Okt 2013, 16: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

 
Delphi 4 Standard
 
#102
  Alt 28. Okt 2013, 19: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

 
Delphi XE2 Professional
 
#103
  Alt 29. Okt 2013, 10: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
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#104
  Alt 29. Okt 2013, 14:24
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:
  //dummy : array[0..4] of Integer;//Alt
  dummy : array[0..5] of Integer;//Neu
da cc_width > 3 sein kann und da macht es hier bum:
Code:
    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];
keine gute Fehlerbehebung
Kann man mit Error wohl besser abfangen...
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#105
  Alt 30. Okt 2013, 08:09
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?
Benjamin Schwarze
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#106
  Alt 30. Okt 2013, 11:32
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:
if cc_width > 4 then cc_width := 4; //Neu
Der Fehler liegt vorher - ein cc_width grösser 4.

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];

Geändert von Carsten2 (30. Okt 2013 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#107
  Alt 30. Okt 2013, 12:45
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;
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#108
  Alt 31. Okt 2013, 11:21
Sehr gut! Danke für die gute Zuarbeit.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#109
  Alt 31. Okt 2013, 20:48
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
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#110
  Alt 31. Okt 2013, 22:12
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;
  Mit Zitat antworten Zitat
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 03:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf