AGB  ·  Datenschutz  ·  Impressum  







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

[Bibliothek] Barcode für Delphi (Zint)

Ein Thema von chaosben · begonnen am 27. Nov 2009 · letzter Beitrag vom 24. Okt 2020
Antwort Antwort
Seite 10 von 14   « Erste     8910 1112     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)
 
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#91
  Alt 17. Okt 2013, 12:37
Nagut ... alle, die eine akute Google-Allergie haben, können auch in diesem Thread posten.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

 
Delphi 10.4 Sydney
 
#92
  Alt 17. Okt 2013, 12:52
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.
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#93
  Alt 17. Okt 2013, 13:26
Danke

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
                        );
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#94
  Alt 21. Okt 2013, 21:19
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;
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

 
Delphi XE2 Professional
 
#95
  Alt 22. Okt 2013, 08:06
Danke!
Ist nun gefixt. Der Fehler lag sogar noch höher.
Benjamin Schwarze
  Mit Zitat antworten Zitat
Carsten2

 
Delphi 4 Standard
 
#96
  Alt 22. Okt 2013, 15:37
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?
  Mit Zitat antworten Zitat
HighBaer

 
Delphi 11 Alexandria
 
#97
  Alt 23. Okt 2013, 12: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

 
Delphi 11 Alexandria
 
#98
  Alt 23. Okt 2013, 12: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

 
Delphi 4 Standard
 
#99
  Alt 23. Okt 2013, 22: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

 
Delphi 4 Standard
 
#100
  Alt 25. Okt 2013, 15: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
Antwort Antwort
Seite 10 von 14   « Erste     8910 1112     Letzte »    


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 20: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