drawing a Barcode without a Barcode font

Mike Bonner bonnmike at gmail.com
Sat Jul 21 00:22:05 CEST 2018


Hey Mark (or anyone?)
Feel like writing up a widget for this (with lots of comments) as an
instructional? (Plus the fact that it'd be a very useful widget in its own
right)

BTW wow.  I toss out a short little ugly hunk of code and you all make it
into something so much better.

On Fri, Jul 20, 2018 at 3:08 PM Mark Wieder via use-livecode <
use-livecode at lists.runrev.com> wrote:

> On 07/20/2018 04:31 AM, Matthias Rebbe via use-livecode wrote:
> > We tried here with iPhone and also with an USB scanner. Both devices
> scanned the code successfully.
> >
> > I have just finished a program for shipment. It fetches customer and
> invoice data from the accounting software and creates then the shipment
> labels including a Code25i barcode and a QR code. The carrier is
> Trans-o-Flex. I need to send some sample labels to their IT department.
> They will check if the labels are readable by their scanners. But i am now
> confident, that this will work on their side also.
>
> Cool. I played around with Mattias' version of Mike's excellent code a
> bit. Here's my take. Note that you really only need one graphic image to
> work with - here's how to do it with a single invisible filled rectangle
> graphic (I kept the name "narrowB"). This takes a string of numbers and
> generates the intermediate string and bar code.
>
> -- 2of5 barcode
>
> constant kBarCodeHeight = 69
> constant kBarCodeWidth = 360
> constant kInitialTopLeft = "60,286" -- defines where the first bar is
> placed
> constant kGapBetweenBars = 0
> constant kBarCodeGroupName = "barcode2of5"
>
> local sLast
> local sWideWidth
>
> on mouseUp
>     local tNumberString
>     local tConvertedNumberString
>     local tBarWidth
>
>     set the height of graphic "narrowB" to kBarCodeHeight
>     put field "barcodeNumber" into tNumberString
>
>     -- need a checksum as the last digit?
>     -- put checksumFrom (field "barcodeNumber") after tNumberString
>
>     -- calculate the expected bar widths
>     put convertNumberString(tNumberString) into tConvertedNumberString
>     put barWidthFrom(tConvertedNumberString) into tBarWidth
>     set the width of graphic "narrowB" to tBarWidth
>     put tBarWidth * 2 into sWideWidth
>     makeBarCodeFrom tConvertedNumberString
>     -- add the number string to the barcode if it's not already on the form
>     displayBarCodeNumber
> end mouseUp
>
> function barWidthFrom pNumberString
>     local tHowManyChars
>     local tTestString
>
>     put pNumberString into tTestString
>     replace "n" with empty in tTestString
>     put length (tTestString) + length (pNumberString) into tHowManyChars
>     return kBarCodeWidth / tHowManyChars
> end barWidthFrom
>
> on makeBarCodeFrom pChars
>     local tIsFilled
>
>     lock screen
>     if there is a group kBarCodeGroupName then
>        delete group kBarCodeGroupName
>     end if
>     put empty into sLast
>
>     create group kBarCodeGroupName
>     set the height of group kBarCodeGroupName to kBarCodeHeight
>     set the width of group kBarCodeGroupName to kBarCodeWidth
>     put true into tIsFilled
>     repeat for each char tChar in pChars
>        copy graphic "narrowB" to group kBarCodeGroupName
>        switch tChar
>           case "w"
>              set the width of the last graphic to sWideWidth
>              break
>        end switch
>        if tIsFilled then
>           set the visible of the last graphic to true
>        end if
>        put not tIsFilled into tIsFilled
>        if sLast is empty then
>           set the topleft of the last graphic to kInitialTopLeft
>        else
>           set the topleft of the last graphic to horAdjust(kGapBetweenBars)
>        end if
>        put the short id of the last graphic into sLast -- the id of the
> most recently placed bar
>     end repeat
>
>     unlock screen
> end makeBarCodeFrom
>
> command displayBarCodeNumber
>     copy field "barCodeNumber" to group kBarCodeGroupName
>     set the opaque of the last field to false
>     set the showborder of the last field to false
>     set the textalign of the last field to "center"
>     set the top of the last field to the bottom of group kBarCodeGroupName
>     set the width of the last field to the width of group kBarCodeGroupName
>     set the left of the last field to item 1 of kInitialTopLeft
> end displayBarCodeNumber
>
> function horAdjust pGap
>     local tGap
>
>     put the topright of graphic id sLast into tGap
>     set the itemdelimiter to ","
>     add pGap to item 1 of tGap
>     return tGap
> end horAdjust
>
> local sConversionArray
>
> command initializeConversionArray
>     put "nnWWn" into sConversionArray["0"]
>     put "WnnnW" into sConversionArray["1"]
>     put "nWnnW" into sConversionArray["2"]
>     put "WWnnn" into sConversionArray["3"]
>     put "nnWnW" into sConversionArray["4"]
>     put "WnWnn" into sConversionArray["5"]
>     put "nWWnn" into sConversionArray["6"]
>     put "nnnWW" into sConversionArray["7"]
>     put "WnnWn" into sConversionArray["8"]
>     put "nWnWn" into sConversionArray["9"]
> end initializeConversionArray
>
> function convertNumberString pNumberString
>     local tWidthString
>     local tString1, tString2
>     local x, y
>
>     initializeConversionArray
>     put "nnnn" into tWidthString -- four-bar start code
>     if the number of chars in pNumberString mod 2 is 1 then
>        put "0" before pNumberString
>     end if
>     -- need to interleave two chars at a time
>     repeat with x=1 to length (pNumberString) step 2
>        put sConversionArray[char x of pNumberString] into tString1
>        put sConversionArray[char x+1 of pNumberString] into tString2
>        repeat with y=1 to 5
>           put char y of tString1 & char y of tString2 after tWidthString
>        end repeat
>     end repeat
>     put "wnn" after tWidthString -- three-bar stop code
>     return tWidthString
> end convertNumberString
>
> function checksumFrom pNumberString
>     local tEvenNumbers, tOddNumbers
>     local tChecksum
>     local tResult
>
>     repeat with x=1 to length (pNumberString) step 2
>        add char x of pNumberString to tOddNumbers
>        add char x+1 of pNumberString to tEvenNumbers
>     end repeat
>     put tOddNumbers * 3 + tEvenNumbers into tChecksum
>     switch tChecksum mod 10
>        case 10
>           put 0 into tResult
>           break
>        default
>           put 10 - (tChecksum mod 10) into tResult
>     end switch
>     return tResult
> end checksumFrom
>
> --
>   Mark Wieder
>   ahsoftware at gmail.com
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>


More information about the use-livecode mailing list