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

Reply via email to