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@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 > ahsoftw...@gmail.com > > _______________________________________________ > use-livecode mailing list > use-livecode@lists.runrev.com > Please visit this url to subscribe, unsubscribe and manage your > subscription preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode > _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode