C++ Builder Snippets  

Barcodes generieren, anzeigen, drucken:
 
  • Umfangreiche Informationen über Barcodes finden Sie auf der Barcode1.org-Seite.

  • Folgendes Beispiel basiert auf der Open Source Bibliothek GNU Barcode Library von Alessandro Rubini. Diese Bibliothek unterstützt derzeit 11 gängige Strichcode-Arten. Die Bibliothek ist in Standard-C geschrieben und für die Ausgabe der Barcodes auf Post Script Druckern konzipiert. Die Kodier-Algorithmen der GNU-Barcode Bibliothek können aber dank der Platformunabhängigkeit des Codes ohne Anpassungen auch unter C++ Builder eingesetzt werden.


  • Um die GNU-Barcode-Bibliothek unter C++ Builder nutzen zu können sind nur wenige Schritte notwendig:

    1. Entpacken Sie die Dateien aus barcode-0.97.tar.gz in ihr Projekt- oder ein beliebiges anderes Verzeichnis auf der Festplatte.

    2. Wählen Sie im Hauptmenü [Projekt -> Dem Projekt hinzufügen] und übernehmen Sie die Dateien ps.c, code128.c, code39.c, ean.c, i25.c, library.c, plessey.c, codabar.c, code93.c, pcl.c aus dem Gnu-Barcode-Verzeichnis in ihr Projekt.

    3. Nun muss nur noch die Anweisung #include "gnu-barcode\barcode.h" in Ihre Quellcode-Dateien eingebunden werden (Pfadangabe aus dem Beispielprojekt).

Screenshot des Beispielprojekts

Folgende Funktion nutzt die Kodieralgorithmen der Gnu-Barcode-Library um Strichcodes zu erzeugen und auf beliebigen TCanvas auszugeben:

//---------------------------------------------------------------------------
// Funktion CreateBarcode() generiert den Übergabeparametern entsprechenden
// Barcode und zeichnet diesen ggf. auf der übergebenen TCanvas-Instanz
//---------------------------------------------------------------------------
// Übergabeparameter:
// AnsiString slStr - zu kodierender String
//
// int ilEncoding   - Barcode-Typ (siehe Datei gnu-barcode\barcode.h),
//                    kann folgende Werte annehmen:
//
//                    BARCODE_ANY    (Automatische Auswahl)
//                    BARCODE_EAN    (EAN)
//                    BARCODE_UPC    (UPC = 12 Ziffer EAN)
//                    BARCODE_ISBN   (ISBN-Code = EAN13)
//                    BARCODE_39     (Code 39)
//                    BARCODE_128    (Code 128 A,B,C -> automatische Aswahl)
//                    BARCODE_128C   (Code 128, kompakte Form für die Ziffern)
//                    BARCODE_128B   (Code 128, alle druckbare ASCII-Zeichen)
//                    BARCODE_I25    (Interleaved 2 of 5, nur Ziffern)
//                    BARCODE_93     (Code 93)
//
// TCanvas* pCanvas - Zeiger auf die TCanvas-Instanz, auf der der gezeichnet
//                    Strichcode werden soll (z.B. Form1->Canvas,
//                    Printer()->Canvas etc.)
// int ilTop        - Koordinaten der linken oberen Ecke des
// int ilLeft         Barcode-Rechtecks in Pixel !
//
// int ilHeight     - die Höhe des Barcode-Rechecks in Pixel, wird hier 0
//                    übergeben, wird kein Strichcode gezeichnet, die
//                    Breite wird korrekt zurückgegeben
//
// int ilSingleBarWidth - die Breite eines einfachen Strichs
//
// AnsiString &slInfo - in diesen String wird die verwendete Kodierung und
//                      der kodierte Text geschrieben
//---------------------------------------------------------------------------
// Rückgabewert: die Breite des erzeugten Strichcodes in Pixel als Integer
//---------------------------------------------------------------------------
// Hinweis: soll NUR die Breite des Strichcodes ermittelt werden, muss der
//          CreateBarcode() im Parameter ilHeight 0 übergeben werden
//
//---------------------------------------------------------------------------
int CreateBarcode(AnsiString slStr, int ilEncoding, TCanvas* pCanvas,
  int ilTop, int ilLeft, int ilHeight, int ilSingleBarWidth, AnsiString &slInfo)
{
  Barcode_Item* pBarcode;         // Zeiger auf die Barcode_Item-Instanz
  int ilBarXPos = -1;             // X-Position des Strichs in Pixel
  int ilCurrentWidth = 0;         // für die Breite des akt. Striches/Leerraums

  // Barcode-Instanz initialisieren:
  pBarcode=Barcode_Create(slStr.c_str());

  // Barcode gem. Vorgaben erzeugen:
  if(pBarcode && Barcode_Encode(pBarcode, ilEncoding) >= 0)
  {
    // String Barcode->partial parsen und:
    AnsiString slCode = pBarcode->partial;
    for (int ilChar=2; ilChar <= slCode.Length(); ilChar++)
    {
      // Sonderfälle: '+' und '-'
      if(slCode[ilChar] != '+' && slCode[ilChar] != '-')
      {
        // ilCurrentWidth ist die Breite des Striches oder Leerraums
        if(isdigit(slCode[ilChar]))
          ilCurrentWidth = (slCode[ilChar]-'0')*ilSingleBarWidth;
        else ilCurrentWidth = (slCode[ilChar]-'a'+1)*ilSingleBarWidth;

        // Falls ein Strich gezeichnet werden soll:
        if (ilChar%2 == 0 && ilHeight)
        {
          pCanvas->Rectangle(ilBarXPos+ilLeft, ilTop,
            ilBarXPos+ilCurrentWidth+ilLeft, ilTop+ilHeight);
        }
        // X-Position inkrementieren:
        ilBarXPos += ilCurrentWidth;
      }
      else ilChar++;
    }

    // Folgende Anweisungen füllen den Info-String mit Kodieruings-
    // und Text-Informationen:
    AnsiString slTextInfo = AnsiString(pBarcode->textinfo);
    slInfo = AnsiString(pBarcode->encoding).UpperCase() + ", Text: ";
    bool blIgnore = true;

    // Den Text aus dem Infostring ausparsen:
    for(int ilChar = 1; ilChar <= slTextInfo.Length(); ilChar++)
    {
      if(slTextInfo[ilChar] == ':')
      {
        if(!blIgnore) slInfo += slTextInfo[ilChar+1];
        blIgnore = !blIgnore;
      }
    }
  }
  Barcode_Delete(pBarcode); // Speicher aufräumen
  return ilBarXPos;
}

Anwendungsbeispiel:
//---------------------------------------------------------------------------
// Barcode in die Zwischenablage kopieren
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnClipboardClick(TObject *Sender)
{
  // TBitmap-Instanz zum Zeichnen des Bacodes erzeugen:
  Graphics::TBitmap *pBitmap = new Graphics::TBitmap();

  // Grösse der Bitmap festlegen
  pBitmap -> Height = 100;

  // Barcode-Breite in Pixel bestimmen und der Bitmap zuweisen:
  pBitmap->Width = CreateBarcode("www.bytesandmore.de",BARCODE_128B,
    NULL,0,0,0,2,EmptyStr);

  // Canvas-"Pinselfarbe" festlegen:
  pBitmap->Canvas->Brush->Color = clBlack;

  // String für die Barcode-Information:
  AnsiString slInfo = EmptyStr;

  // Barcode generieren:
  if(CreateBarcode("www.bytesandmore.de", BARCODE_128B, pBitmap->Canvas,
    0, 0, pBitmap->Height,2, slInfo) > 0)
  {
    // Die erzeugte Bitmap in die Zwischenablage kopieren:
    Clipboard()->Assign(pBitmap);
  }

  // Bitmap freigeben:
  if(pBitmap) { delete pBitmap; pBitmap = 0; }
}


  Download BCB5
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann